diff --git a/artifacts/json/AddressUtils.json b/artifacts/json/AddressUtils.json index e4ecceff..e12ba54e 100644 --- a/artifacts/json/AddressUtils.json +++ b/artifacts/json/AddressUtils.json @@ -287,5 +287,5 @@ }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:48.037Z" + "updatedAt": "2018-10-09T17:45:35.426Z" } \ No newline at end of file diff --git a/artifacts/json/BasicToken.json b/artifacts/json/BasicToken.json index 31f70752..44a25a2b 100644 --- a/artifacts/json/BasicToken.json +++ b/artifacts/json/BasicToken.json @@ -1435,5 +1435,5 @@ }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:48.048Z" + "updatedAt": "2018-10-09T17:45:35.453Z" } \ No newline at end of file diff --git a/artifacts/json/ClockAuction.json b/artifacts/json/ClockAuction.json index 1578e5b0..60a69448 100644 --- a/artifacts/json/ClockAuction.json +++ b/artifacts/json/ClockAuction.json @@ -323,15 +323,15 @@ "type": "event" } ], - "bytecode": "0x606060405260008060146101000a81548160ff021916908315150217905550341561002957600080fd5b60405160408061176d833981016040528080519060200190919080519060200190919050506000336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061271082111515156100a157600080fd5b816002819055508290508073ffffffffffffffffffffffffffffffffffffffff166301ffc9a7639a20483d7c0100000000000000000000000000000000000000000000000000000000026000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001915050602060405180830381600087803b151561018357600080fd5b6102c65a03f1151561019457600080fd5b5050506040518051905015156101a957600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050611571806101fc6000396000f3006060604052600436106100d0576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806327ebe40a146100d55780633f4ba83a14610132578063454a2ab31461015f5780635c975abb146101775780635fd8c710146101a457806378bd7935146101b957806383b5ff8b146102385780638456cb5914610261578063878eb3681461028e5780638da5cb5b146102b157806396b5a75514610306578063c55d0f5614610329578063dd1b7a0f14610360578063f2fde38b146103b5575b600080fd5b34156100e057600080fd5b610130600480803590602001909190803590602001909190803590602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506103ee565b005b341561013d57600080fd5b610145610513565b604051808215151515815260200191505060405180910390f35b61017560048080359060200190919050506105d8565b005b341561018257600080fd5b61018a61060c565b604051808215151515815260200191505060405180910390f35b34156101af57600080fd5b6101b761061f565b005b34156101c457600080fd5b6101da600480803590602001909190505061072a565b604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b341561024357600080fd5b61024b61084d565b6040518082815260200191505060405180910390f35b341561026c57600080fd5b610274610853565b604051808215151515815260200191505060405180910390f35b341561029957600080fd5b6102af600480803590602001909190505061091a565b005b34156102bc57600080fd5b6102c46109ec565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561031157600080fd5b6103276004808035906020019091905050610a11565b005b341561033457600080fd5b61034a6004808035906020019091905050610aad565b6040518082815260200191505060405180910390f35b341561036b57600080fd5b610373610aea565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103c057600080fd5b6103ec600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b10565b005b6103f66114c7565b600060149054906101000a900460ff1615151561041257600080fd5b846fffffffffffffffffffffffffffffffff168514151561043257600080fd5b836fffffffffffffffffffffffffffffffff168414151561045257600080fd5b8267ffffffffffffffff168314151561046a57600080fd5b6104743387610be5565b151561047f57600080fd5b6104893387610cd1565b60a0604051908101604052808373ffffffffffffffffffffffffffffffffffffffff168152602001866fffffffffffffffffffffffffffffffff168152602001856fffffffffffffffffffffffffffffffff1681526020018467ffffffffffffffff1681526020014267ffffffffffffffff16815250905061050b8682610de1565b505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561057057600080fd5b600060149054906101000a900460ff16151561058b57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a16001905090565b600060149054906101000a900460ff161515156105f457600080fd5b6105fe8134610fc6565b506106093382611165565b50565b600060149054906101000a900460ff1681565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806106cd57508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156106d857600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505090505050565b60008060008060008060036000888152602001908152602001600020905061075181611241565b151561075c57600080fd5b8060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a90046fffffffffffffffffffffffffffffffff168260010160109054906101000a90046fffffffffffffffffffffffffffffffff168360020160009054906101000a900467ffffffffffffffff168460020160089054906101000a900467ffffffffffffffff16836fffffffffffffffffffffffffffffffff169350826fffffffffffffffffffffffffffffffff1692508167ffffffffffffffff1691508067ffffffffffffffff169050955095509550955095505091939590929450565b60025481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108b057600080fd5b600060149054906101000a900460ff161515156108cc57600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a16001905090565b60008060149054906101000a900460ff16151561093657600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561099157600080fd5b6003600083815260200190815260200160002090506109af81611241565b15156109ba57600080fd5b6109e8828260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661126f565b5050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600360008481526020019081526020016000209150610a3282611241565b1515610a3d57600080fd5b8160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a9e57600080fd5b610aa8838261126f565b505050565b600080600360008481526020019081526020016000209050610ace81611241565b1515610ad957600080fd5b610ae2816112bd565b915050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610b6b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515610be257806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b60008273ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e846000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515610c9757600080fd5b6102c65a03f11515610ca857600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8330846040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1515610dc957600080fd5b6102c65a03f11515610dda57600080fd5b5050505050565b603c816060015167ffffffffffffffff1610151515610dff57600080fd5b806003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060408201518160010160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160020160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050507fa9c8dfcda5664a5a124c713e386da27de87432d5b668e79458501eb296389ba78282602001516fffffffffffffffffffffffffffffffff1683604001516fffffffffffffffffffffffffffffffff16846060015167ffffffffffffffff166040518085815260200184815260200183815260200182815260200194505050505060405180910390a15050565b6000806000806000806000600360008a81526020019081526020016000209550610fef86611241565b1515610ffa57600080fd5b611003866112bd565b945084881015151561101457600080fd5b8560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169350611044896113b0565b600085111561109e576110568561146c565b925082850391508373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050151561109d57600080fd5b5b84880390503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015156110e357600080fd5b7f4fcc30d90a842164dd58501ab874a101a3749c3d4747139cefe7c876f4ccebd2898633604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a184965050505050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b151561122957600080fd5b6102c65a03f1151561123a57600080fd5b5050505050565b6000808260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16119050919050565b611278826113b0565b6112828183611165565b7f2809c7e17bf978fbc7194c0a694b638c4215e9140cacc6c38ca36010b45697df826040518082815260200191505060405180910390a15050565b600080600090508260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16421115611316578260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16420390505b6113a88360010160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168460010160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168560020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1684611487565b915050919050565b60036000828152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160006101000a8154906fffffffffffffffffffffffffffffffff02191690556001820160106101000a8154906fffffffffffffffffffffffffffffffff02191690556002820160006101000a81549067ffffffffffffffff02191690556002820160086101000a81549067ffffffffffffffff0219169055505050565b6000612710600254830281151561147f57fe5b049050919050565b600080600080858510151561149e578693506114bc565b8787039250858584028115156114b057fe5b05915081880190508093505b505050949350505050565b60a060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff16815250905600a165627a7a72305820f759c533282cebad644f11849cc385d815d8ac8f5b16a62fd97ebe545108eeb90029", - "deployedBytecode": "0x6060604052600436106100d0576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806327ebe40a146100d55780633f4ba83a14610132578063454a2ab31461015f5780635c975abb146101775780635fd8c710146101a457806378bd7935146101b957806383b5ff8b146102385780638456cb5914610261578063878eb3681461028e5780638da5cb5b146102b157806396b5a75514610306578063c55d0f5614610329578063dd1b7a0f14610360578063f2fde38b146103b5575b600080fd5b34156100e057600080fd5b610130600480803590602001909190803590602001909190803590602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506103ee565b005b341561013d57600080fd5b610145610513565b604051808215151515815260200191505060405180910390f35b61017560048080359060200190919050506105d8565b005b341561018257600080fd5b61018a61060c565b604051808215151515815260200191505060405180910390f35b34156101af57600080fd5b6101b761061f565b005b34156101c457600080fd5b6101da600480803590602001909190505061072a565b604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b341561024357600080fd5b61024b61084d565b6040518082815260200191505060405180910390f35b341561026c57600080fd5b610274610853565b604051808215151515815260200191505060405180910390f35b341561029957600080fd5b6102af600480803590602001909190505061091a565b005b34156102bc57600080fd5b6102c46109ec565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561031157600080fd5b6103276004808035906020019091905050610a11565b005b341561033457600080fd5b61034a6004808035906020019091905050610aad565b6040518082815260200191505060405180910390f35b341561036b57600080fd5b610373610aea565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103c057600080fd5b6103ec600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b10565b005b6103f66114c7565b600060149054906101000a900460ff1615151561041257600080fd5b846fffffffffffffffffffffffffffffffff168514151561043257600080fd5b836fffffffffffffffffffffffffffffffff168414151561045257600080fd5b8267ffffffffffffffff168314151561046a57600080fd5b6104743387610be5565b151561047f57600080fd5b6104893387610cd1565b60a0604051908101604052808373ffffffffffffffffffffffffffffffffffffffff168152602001866fffffffffffffffffffffffffffffffff168152602001856fffffffffffffffffffffffffffffffff1681526020018467ffffffffffffffff1681526020014267ffffffffffffffff16815250905061050b8682610de1565b505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561057057600080fd5b600060149054906101000a900460ff16151561058b57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a16001905090565b600060149054906101000a900460ff161515156105f457600080fd5b6105fe8134610fc6565b506106093382611165565b50565b600060149054906101000a900460ff1681565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806106cd57508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156106d857600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505090505050565b60008060008060008060036000888152602001908152602001600020905061075181611241565b151561075c57600080fd5b8060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a90046fffffffffffffffffffffffffffffffff168260010160109054906101000a90046fffffffffffffffffffffffffffffffff168360020160009054906101000a900467ffffffffffffffff168460020160089054906101000a900467ffffffffffffffff16836fffffffffffffffffffffffffffffffff169350826fffffffffffffffffffffffffffffffff1692508167ffffffffffffffff1691508067ffffffffffffffff169050955095509550955095505091939590929450565b60025481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108b057600080fd5b600060149054906101000a900460ff161515156108cc57600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a16001905090565b60008060149054906101000a900460ff16151561093657600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561099157600080fd5b6003600083815260200190815260200160002090506109af81611241565b15156109ba57600080fd5b6109e8828260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661126f565b5050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600360008481526020019081526020016000209150610a3282611241565b1515610a3d57600080fd5b8160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a9e57600080fd5b610aa8838261126f565b505050565b600080600360008481526020019081526020016000209050610ace81611241565b1515610ad957600080fd5b610ae2816112bd565b915050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610b6b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515610be257806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b60008273ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e846000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515610c9757600080fd5b6102c65a03f11515610ca857600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8330846040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1515610dc957600080fd5b6102c65a03f11515610dda57600080fd5b5050505050565b603c816060015167ffffffffffffffff1610151515610dff57600080fd5b806003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060408201518160010160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160020160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050507fa9c8dfcda5664a5a124c713e386da27de87432d5b668e79458501eb296389ba78282602001516fffffffffffffffffffffffffffffffff1683604001516fffffffffffffffffffffffffffffffff16846060015167ffffffffffffffff166040518085815260200184815260200183815260200182815260200194505050505060405180910390a15050565b6000806000806000806000600360008a81526020019081526020016000209550610fef86611241565b1515610ffa57600080fd5b611003866112bd565b945084881015151561101457600080fd5b8560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169350611044896113b0565b600085111561109e576110568561146c565b925082850391508373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050151561109d57600080fd5b5b84880390503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015156110e357600080fd5b7f4fcc30d90a842164dd58501ab874a101a3749c3d4747139cefe7c876f4ccebd2898633604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a184965050505050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b151561122957600080fd5b6102c65a03f1151561123a57600080fd5b5050505050565b6000808260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16119050919050565b611278826113b0565b6112828183611165565b7f2809c7e17bf978fbc7194c0a694b638c4215e9140cacc6c38ca36010b45697df826040518082815260200191505060405180910390a15050565b600080600090508260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16421115611316578260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16420390505b6113a88360010160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168460010160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168560020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1684611487565b915050919050565b60036000828152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160006101000a8154906fffffffffffffffffffffffffffffffff02191690556001820160106101000a8154906fffffffffffffffffffffffffffffffff02191690556002820160006101000a81549067ffffffffffffffff02191690556002820160086101000a81549067ffffffffffffffff0219169055505050565b6000612710600254830281151561147f57fe5b049050919050565b600080600080858510151561149e578693506114bc565b8787039250858584028115156114b057fe5b05915081880190508093505b505050949350505050565b60a060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff16815250905600a165627a7a72305820f759c533282cebad644f11849cc385d815d8ac8f5b16a62fd97ebe545108eeb90029", + "bytecode": "0x606060405260008060146101000a81548160ff021916908315150217905550341561002957600080fd5b60405160408061176d833981016040528080519060200190919080519060200190919050506000336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061271082111515156100a157600080fd5b816002819055508290508073ffffffffffffffffffffffffffffffffffffffff166301ffc9a7639a20483d7c0100000000000000000000000000000000000000000000000000000000026000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001915050602060405180830381600087803b151561018357600080fd5b6102c65a03f1151561019457600080fd5b5050506040518051905015156101a957600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050611571806101fc6000396000f3006060604052600436106100d0576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806327ebe40a146100d55780633f4ba83a14610132578063454a2ab31461015f5780635c975abb146101775780635fd8c710146101a457806378bd7935146101b957806383b5ff8b146102385780638456cb5914610261578063878eb3681461028e5780638da5cb5b146102b157806396b5a75514610306578063c55d0f5614610329578063dd1b7a0f14610360578063f2fde38b146103b5575b600080fd5b34156100e057600080fd5b610130600480803590602001909190803590602001909190803590602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506103ee565b005b341561013d57600080fd5b610145610513565b604051808215151515815260200191505060405180910390f35b61017560048080359060200190919050506105d8565b005b341561018257600080fd5b61018a61060c565b604051808215151515815260200191505060405180910390f35b34156101af57600080fd5b6101b761061f565b005b34156101c457600080fd5b6101da600480803590602001909190505061072a565b604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b341561024357600080fd5b61024b61084d565b6040518082815260200191505060405180910390f35b341561026c57600080fd5b610274610853565b604051808215151515815260200191505060405180910390f35b341561029957600080fd5b6102af600480803590602001909190505061091a565b005b34156102bc57600080fd5b6102c46109ec565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561031157600080fd5b6103276004808035906020019091905050610a11565b005b341561033457600080fd5b61034a6004808035906020019091905050610aad565b6040518082815260200191505060405180910390f35b341561036b57600080fd5b610373610aea565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103c057600080fd5b6103ec600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b10565b005b6103f66114c7565b600060149054906101000a900460ff1615151561041257600080fd5b846fffffffffffffffffffffffffffffffff168514151561043257600080fd5b836fffffffffffffffffffffffffffffffff168414151561045257600080fd5b8267ffffffffffffffff168314151561046a57600080fd5b6104743387610be5565b151561047f57600080fd5b6104893387610cd1565b60a0604051908101604052808373ffffffffffffffffffffffffffffffffffffffff168152602001866fffffffffffffffffffffffffffffffff168152602001856fffffffffffffffffffffffffffffffff1681526020018467ffffffffffffffff1681526020014267ffffffffffffffff16815250905061050b8682610de1565b505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561057057600080fd5b600060149054906101000a900460ff16151561058b57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a16001905090565b600060149054906101000a900460ff161515156105f457600080fd5b6105fe8134610fc6565b506106093382611165565b50565b600060149054906101000a900460ff1681565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806106cd57508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156106d857600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505090505050565b60008060008060008060036000888152602001908152602001600020905061075181611241565b151561075c57600080fd5b8060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a90046fffffffffffffffffffffffffffffffff168260010160109054906101000a90046fffffffffffffffffffffffffffffffff168360020160009054906101000a900467ffffffffffffffff168460020160089054906101000a900467ffffffffffffffff16836fffffffffffffffffffffffffffffffff169350826fffffffffffffffffffffffffffffffff1692508167ffffffffffffffff1691508067ffffffffffffffff169050955095509550955095505091939590929450565b60025481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108b057600080fd5b600060149054906101000a900460ff161515156108cc57600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a16001905090565b60008060149054906101000a900460ff16151561093657600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561099157600080fd5b6003600083815260200190815260200160002090506109af81611241565b15156109ba57600080fd5b6109e8828260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661126f565b5050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600360008481526020019081526020016000209150610a3282611241565b1515610a3d57600080fd5b8160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a9e57600080fd5b610aa8838261126f565b505050565b600080600360008481526020019081526020016000209050610ace81611241565b1515610ad957600080fd5b610ae2816112bd565b915050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610b6b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515610be257806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b60008273ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e846000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515610c9757600080fd5b6102c65a03f11515610ca857600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8330846040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1515610dc957600080fd5b6102c65a03f11515610dda57600080fd5b5050505050565b603c816060015167ffffffffffffffff1610151515610dff57600080fd5b806003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060408201518160010160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160020160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050507fa9c8dfcda5664a5a124c713e386da27de87432d5b668e79458501eb296389ba78282602001516fffffffffffffffffffffffffffffffff1683604001516fffffffffffffffffffffffffffffffff16846060015167ffffffffffffffff166040518085815260200184815260200183815260200182815260200194505050505060405180910390a15050565b6000806000806000806000600360008a81526020019081526020016000209550610fef86611241565b1515610ffa57600080fd5b611003866112bd565b945084881015151561101457600080fd5b8560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169350611044896113b0565b600085111561109e576110568561146c565b925082850391508373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050151561109d57600080fd5b5b84880390503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015156110e357600080fd5b7f4fcc30d90a842164dd58501ab874a101a3749c3d4747139cefe7c876f4ccebd2898633604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a184965050505050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b151561122957600080fd5b6102c65a03f1151561123a57600080fd5b5050505050565b6000808260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16119050919050565b611278826113b0565b6112828183611165565b7f2809c7e17bf978fbc7194c0a694b638c4215e9140cacc6c38ca36010b45697df826040518082815260200191505060405180910390a15050565b600080600090508260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16421115611316578260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16420390505b6113a88360010160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168460010160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168560020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1684611487565b915050919050565b60036000828152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160006101000a8154906fffffffffffffffffffffffffffffffff02191690556001820160106101000a8154906fffffffffffffffffffffffffffffffff02191690556002820160006101000a81549067ffffffffffffffff02191690556002820160086101000a81549067ffffffffffffffff0219169055505050565b6000612710600254830281151561147f57fe5b049050919050565b600080600080858510151561149e578693506114bc565b8787039250858584028115156114b057fe5b05915081880190508093505b505050949350505050565b60a060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff16815250905600a165627a7a72305820e9a2845f8c846e00135c0d081d4ad724caba24d3df35d5a08e25a3dda738758a0029", + "deployedBytecode": "0x6060604052600436106100d0576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806327ebe40a146100d55780633f4ba83a14610132578063454a2ab31461015f5780635c975abb146101775780635fd8c710146101a457806378bd7935146101b957806383b5ff8b146102385780638456cb5914610261578063878eb3681461028e5780638da5cb5b146102b157806396b5a75514610306578063c55d0f5614610329578063dd1b7a0f14610360578063f2fde38b146103b5575b600080fd5b34156100e057600080fd5b610130600480803590602001909190803590602001909190803590602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506103ee565b005b341561013d57600080fd5b610145610513565b604051808215151515815260200191505060405180910390f35b61017560048080359060200190919050506105d8565b005b341561018257600080fd5b61018a61060c565b604051808215151515815260200191505060405180910390f35b34156101af57600080fd5b6101b761061f565b005b34156101c457600080fd5b6101da600480803590602001909190505061072a565b604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b341561024357600080fd5b61024b61084d565b6040518082815260200191505060405180910390f35b341561026c57600080fd5b610274610853565b604051808215151515815260200191505060405180910390f35b341561029957600080fd5b6102af600480803590602001909190505061091a565b005b34156102bc57600080fd5b6102c46109ec565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561031157600080fd5b6103276004808035906020019091905050610a11565b005b341561033457600080fd5b61034a6004808035906020019091905050610aad565b6040518082815260200191505060405180910390f35b341561036b57600080fd5b610373610aea565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103c057600080fd5b6103ec600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b10565b005b6103f66114c7565b600060149054906101000a900460ff1615151561041257600080fd5b846fffffffffffffffffffffffffffffffff168514151561043257600080fd5b836fffffffffffffffffffffffffffffffff168414151561045257600080fd5b8267ffffffffffffffff168314151561046a57600080fd5b6104743387610be5565b151561047f57600080fd5b6104893387610cd1565b60a0604051908101604052808373ffffffffffffffffffffffffffffffffffffffff168152602001866fffffffffffffffffffffffffffffffff168152602001856fffffffffffffffffffffffffffffffff1681526020018467ffffffffffffffff1681526020014267ffffffffffffffff16815250905061050b8682610de1565b505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561057057600080fd5b600060149054906101000a900460ff16151561058b57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a16001905090565b600060149054906101000a900460ff161515156105f457600080fd5b6105fe8134610fc6565b506106093382611165565b50565b600060149054906101000a900460ff1681565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806106cd57508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156106d857600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505090505050565b60008060008060008060036000888152602001908152602001600020905061075181611241565b151561075c57600080fd5b8060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a90046fffffffffffffffffffffffffffffffff168260010160109054906101000a90046fffffffffffffffffffffffffffffffff168360020160009054906101000a900467ffffffffffffffff168460020160089054906101000a900467ffffffffffffffff16836fffffffffffffffffffffffffffffffff169350826fffffffffffffffffffffffffffffffff1692508167ffffffffffffffff1691508067ffffffffffffffff169050955095509550955095505091939590929450565b60025481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108b057600080fd5b600060149054906101000a900460ff161515156108cc57600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a16001905090565b60008060149054906101000a900460ff16151561093657600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561099157600080fd5b6003600083815260200190815260200160002090506109af81611241565b15156109ba57600080fd5b6109e8828260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661126f565b5050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600360008481526020019081526020016000209150610a3282611241565b1515610a3d57600080fd5b8160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a9e57600080fd5b610aa8838261126f565b505050565b600080600360008481526020019081526020016000209050610ace81611241565b1515610ad957600080fd5b610ae2816112bd565b915050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610b6b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515610be257806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b60008273ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e846000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515610c9757600080fd5b6102c65a03f11515610ca857600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8330846040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1515610dc957600080fd5b6102c65a03f11515610dda57600080fd5b5050505050565b603c816060015167ffffffffffffffff1610151515610dff57600080fd5b806003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060408201518160010160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160020160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050507fa9c8dfcda5664a5a124c713e386da27de87432d5b668e79458501eb296389ba78282602001516fffffffffffffffffffffffffffffffff1683604001516fffffffffffffffffffffffffffffffff16846060015167ffffffffffffffff166040518085815260200184815260200183815260200182815260200194505050505060405180910390a15050565b6000806000806000806000600360008a81526020019081526020016000209550610fef86611241565b1515610ffa57600080fd5b611003866112bd565b945084881015151561101457600080fd5b8560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169350611044896113b0565b600085111561109e576110568561146c565b925082850391508373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050151561109d57600080fd5b5b84880390503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015156110e357600080fd5b7f4fcc30d90a842164dd58501ab874a101a3749c3d4747139cefe7c876f4ccebd2898633604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a184965050505050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b151561122957600080fd5b6102c65a03f1151561123a57600080fd5b5050505050565b6000808260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16119050919050565b611278826113b0565b6112828183611165565b7f2809c7e17bf978fbc7194c0a694b638c4215e9140cacc6c38ca36010b45697df826040518082815260200191505060405180910390a15050565b600080600090508260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16421115611316578260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16420390505b6113a88360010160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168460010160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168560020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1684611487565b915050919050565b60036000828152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160006101000a8154906fffffffffffffffffffffffffffffffff02191690556001820160106101000a8154906fffffffffffffffffffffffffffffffff02191690556002820160006101000a81549067ffffffffffffffff02191690556002820160086101000a81549067ffffffffffffffff0219169055505050565b6000612710600254830281151561147f57fe5b049050919050565b600080600080858510151561149e578693506114bc565b8787039250858584028115156114b057fe5b05915081880190508093505b505050949350505050565b60a060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff16815250905600a165627a7a72305820e9a2845f8c846e00135c0d081d4ad724caba24d3df35d5a08e25a3dda738758a0029", "sourceMap": "55210:5355:18:-;;;54337:5;54316:26;;;;;;;;;;;;;;;;;;;;55864:329;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55996:31;816:10;808:5;;:18;;;;;;;;;;;;;;;;;;55954:5;55946:4;:13;;55938:22;;;;;;;;55981:4;55970:8;:15;;;;56044:11;55996:60;;56074:17;:35;;;55501:10;55494:18;;56074:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56066:71;;;;;;;;56169:17;56147:19;;:39;;;;;;;;;;;;;;;;;;55864:329;;;55210:5355;;;;;;", "deployedSourceMap": "55210:5355:18:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57259:856;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54943:126;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58307:223;;;;;;;;;;;;;;;;;;54316:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56458:352;;;;;;;;;;;;;;59705:493;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45099:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54735:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59338:256;;;;;;;;;;;;;;;;;;;;;;;;;;622:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58796:289;;;;;;;;;;;;;;;;;;;;;;;;;;60323:239;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44927:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1156:140;;;;;;;;;;;;;;;;;;;;;;;;;;;;57259:856;57877:22;;:::i;:::-;54475:6;;;;;;;;;;;54474:7;54466:16;;;;;;;;57641:14;57625:32;;57607:14;:50;57599:59;;;;;;;;57708:12;57692:30;;57676:12;:46;57668:55;;;;;;;;57769:9;57754:26;;57741:9;:39;57733:48;;;;;;;;57800:27;57806:10;57818:8;57800:5;:27::i;:::-;57792:36;;;;;;;;57838:29;57846:10;57858:8;57838:7;:29::i;:::-;57902:166;;;;;;;;;57923:7;57902:166;;;;;;57952:14;57902:166;;;;;;57989:12;57902:166;;;;;;58023:9;57902:166;;;;;;58054:3;57902:166;;;;;57877:191;;58078:30;58090:8;58100:7;58078:11;:30::i;:::-;57259:856;;;;;;:::o;54943:126::-;54992:4;969:5;;;;;;;;;;;955:19;;:10;:19;;;947:28;;;;;;;;54629:6;;;;;;;;;;;54621:15;;;;;;;;55017:5;55008:6;;:14;;;;;;;;;;;;;;;;;;55032:9;;;;;;;;;;55058:4;55051:11;;54943:126;:::o;58307:223::-;54475:6;;;;;;;;;;;54474:7;54466:16;;;;;;;;58457:25;58462:8;58472:9;58457:4;:25::i;:::-;;58492:31;58502:10;58514:8;58492:9;:31::i;:::-;58307:223;:::o;54316:26::-;;;;;;;;;;;;;:::o;56458:352::-;56504:18;56763:8;56533:19;;;;;;;;;;;56504:49;;56599:5;;;;;;;;;;;56585:19;;:10;:19;;;:59;;;;56634:10;56620:24;;:10;:24;;;56585:59;56564:90;;;;;;;;56774:10;:15;;:29;56790:4;:12;;;56774:29;;;;;;;;;;;;;;;;;;;;;;;56763:40;;56458:352;;:::o;59705:493::-;59791:14;59815:21;59846:19;59875:16;59901:17;59935:23;59961:16;:26;59978:8;59961:26;;;;;;;;;;;59935:52;;60005:21;60018:7;60005:12;:21::i;:::-;59997:30;;;;;;;;60054:7;:14;;;;;;;;;;;;60078:7;:21;;;;;;;;;;;;60109:7;:19;;;;;;;;;;;;60138:7;:16;;;;;;;;;;;;60164:7;:17;;;;;;;;;;;;60037:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59705:493;;;;;;;;:::o;45099:23::-;;;;:::o;54735:124::-;54785:4;969:5;;;;;;;;;;;955:19;;:10;:19;;;947:28;;;;;;;;54475:6;;;;;;;;;;;54474:7;54466:16;;;;;;;;54810:4;54801:6;;:13;;;;;;;;;;;;;;;;;;54824:7;;;;;;;;;;54848:4;54841:11;;54735:124;:::o;59338:256::-;59445:23;54629:6;;;;;;;;;;;54621:15;;;;;;;;969:5;;;;;;;;;;;955:19;;:10;:19;;;947:28;;;;;;;;59471:16;:26;59488:8;59471:26;;;;;;;;;;;59445:52;;59515:21;59528:7;59515:12;:21::i;:::-;59507:30;;;;;;;;59547:40;59562:8;59572:7;:14;;;;;;;;;;;;59547;:40::i;:::-;59338:256;;:::o;622:20::-;;;;;;;;;;;;;:::o;58796:289::-;58864:23;58966:14;58890:16;:26;58907:8;58890:26;;;;;;;;;;;58864:52;;58934:21;58947:7;58934:12;:21::i;:::-;58926:30;;;;;;;;58983:7;:14;;;;;;;;;;;;58966:31;;59029:6;59015:20;;:10;:20;;;59007:29;;;;;;;;59046:32;59061:8;59071:6;59046:14;:32::i;:::-;58796:289;;;:::o;60323:239::-;60401:7;60424:23;60450:16;:26;60467:8;60450:26;;;;;;;;;;;60424:52;;60494:21;60507:7;60494:12;:21::i;:::-;60486:30;;;;;;;;60533:22;60547:7;60533:13;:22::i;:::-;60526:29;;60323:239;;;;:::o;44927:40::-;;;;;;;;;;;;;:::o;1156:140::-;969:5;;;;;;;;;;;955:19;;:10;:19;;;947:28;;;;;;;;1245:1;1225:22;;:8;:22;;;;1221:69;;;1271:8;1263:5;;:16;;;;;;;;;;;;;;;;;;1221:69;1156:140;:::o;45656:157::-;45731:4;45796:9;45755:50;;:19;;;;;;;;;;;:27;;;45783:8;45755:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:50;;;45747:59;;45656:157;;;;:::o;46053:176::-;46166:19;;;;;;;;;;;:32;;;46199:6;46207:4;46213:8;46166:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46053:176;;:::o;46852:489::-;47082:9;47061:8;:17;;;:30;;;;47053:39;;;;;;;;47132:8;47103:16;:26;47120:8;47103:26;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47151:183;47187:8;47218;:22;;;47210:31;;47263:8;:20;;;47255:29;;47306:8;:17;;;47298:26;;47151:183;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46852:489;;:::o;47687:2629::-;47765:7;47837:23;48279:13;48459:14;48938:21;48994:22;49934:17;47863:16;:26;47880:8;47863:26;;;;;;;;;;;47837:52;;48170:21;48183:7;48170:12;:21::i;:::-;48162:30;;;;;;;;48295:22;48309:7;48295:13;:22::i;:::-;48279:38;;48349:5;48335:10;:19;;48327:28;;;;;;;;48476:7;:14;;;;;;;;;;;;48459:31;;48635:24;48650:8;48635:14;:24::i;:::-;48741:1;48733:5;:9;48729:918;;;48962:18;48974:5;48962:11;:18::i;:::-;48938:42;;49027:13;49019:5;:21;48994:46;;49605:6;:15;;:31;49621:14;49605:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48729:918;49967:5;49954:10;:18;49934:38;;50172:10;:19;;:30;50192:9;50172:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50240:46;50258:8;50268:5;50275:10;50240:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50304:5;50297:12;;47687:2629;;;;;;;;;;:::o;46461:174::-;46579:19;;;;;;;;;;;:28;;;46608:9;46619:8;46579:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46461:174;;:::o;50637:125::-;50708:4;50753:1;50732:8;:18;;;;;;;;;;;;:22;;;50724:31;;50637:125;;;:::o;47396:183::-;47474:24;47489:8;47474:14;:24::i;:::-;47508:28;47518:7;47527:8;47508:9;:28::i;:::-;47546:26;47563:8;47546:26;;;;;;;;;;;;;;;;;;47396:183;;:::o;51057:613::-;51141:7;51164:21;51188:1;51164:25;;51403:8;:18;;;;;;;;;;;;51397:24;;:3;:24;51393:95;;;51459:8;:18;;;;;;;;;;;;51453:24;;:3;:24;51437:40;;51393:95;51505:158;51539:8;:22;;;;;;;;;;;;51505:158;;51575:8;:20;;;;;;;;;;;;51505:158;;51609:8;:17;;;;;;;;;;;;51505:158;;51640:13;51505:20;:158::i;:::-;51498:165;;51057:613;;;;:::o;50434:101::-;50502:16;:26;50519:8;50502:26;;;;;;;;;;;;50495:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50434:101;:::o;53613:482::-;53673:7;54083:5;54072:8;;54063:6;:17;:25;;;;;;;;54056:32;;53613:482;;;:::o;51918:1601::-;52110:7;52803:23;53118:25;53394:19;52477:9;52459:14;:27;;52455:1058;;;52635:12;52628:19;;;;52455:1058;52859:14;52836:12;52829:45;52803:71;;53197:9;53172:14;53146:16;:41;:61;;;;;;;;53118:89;;53441:18;53423:14;53416:43;53394:65;;53489:12;53474:28;;51918:1601;;;;;;;;;;:::o;55210:5355::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", "source": "pragma solidity 0.4.18;\n\n/**\n The following contract code, titled KittyCore, was written by Cryptokitties and published\n and retrieved from https://etherscan.io/address/0x06012c8cf97bead5deae237070f9587f8e7a266d#code.\n\n It is included in the current project for test purposes, to ensure that our collateralizer can\n handle ERC721 tokens created by the KittyCore contract.\n*/\n\n/**\n * @title KittiesOwnable\n * @dev The KittiesOwnable contract has an owner address, and provides basic authorization control\n * functions, this simplifies the implementation of \"user permissions\".\n */\ncontract KittiesOwnable {\n address public owner;\n\n\n /**\n\t * @dev The KittiesOwnable constructor sets the original `owner` of the contract to the sender\n\t * account.\n\t */\n function KittiesOwnable() {\n owner = msg.sender;\n }\n\n\n /**\n\t * @dev Throws if called by any account other than the owner.\n\t */\n modifier onlyOwner() {\n require(msg.sender == owner);\n _;\n }\n\n\n /**\n\t * @dev Allows the current owner to transfer control of the contract to a newOwner.\n\t * @param newOwner The address to transfer ownership to.\n\t */\n function transferOwnership(address newOwner) onlyOwner {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n\n}\n\n\n\n/// @title Interface for contracts conforming to ERC-721: Non-Fungible Tokens\n/// @author Dieter Shirley (https://github.com/dete)\ncontract KittiesERC721 {\n // Required methods\n function totalSupply() public view returns (uint256 total);\n function balanceOf(address _owner) public view returns (uint256 balance);\n function ownerOf(uint256 _tokenId) external view returns (address owner);\n function approve(address _to, uint256 _tokenId) external;\n function transfer(address _to, uint256 _tokenId) external;\n function transferFrom(address _from, address _to, uint256 _tokenId) external;\n\n // Events\n event Transfer(address from, address to, uint256 tokenId);\n event Approval(address owner, address approved, uint256 tokenId);\n\n // Optional\n // function name() public view returns (string name);\n // function symbol() public view returns (string symbol);\n // function tokensOfOwner(address _owner) external view returns (uint256[] tokenIds);\n // function tokenMetadata(uint256 _tokenId, string _preferredTransport) public view returns (string infoUrl);\n\n // ERC-165 Compatibility (https://github.com/ethereum/EIPs/issues/165)\n function supportsInterface(bytes4 _interfaceID) external view returns (bool);\n}\n\n\n// // Auction wrapper functions\n\n\n// Auction wrapper functions\n\n\n\n\n\n\n\n/// @title SEKRETOOOO\ncontract GeneScienceInterface {\n /// @dev simply a boolean to indicate this is the contract we expect to be\n function isGeneScience() public pure returns (bool);\n\n /// @dev given genes of kitten 1 & 2, return a genetic combination - may have a random factor\n /// @param genes1 genes of mom\n /// @param genes2 genes of sire\n /// @return the genes that are supposed to be passed down the child\n function mixGenes(uint256 genes1, uint256 genes2, uint256 targetBlock) public returns (uint256);\n}\n\n\n\n\n\n\n\n/// @title A facet of KittyCore that manages special access privileges.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyAccessControl {\n // This facet controls access control for CryptoKitties. There are four roles managed here:\n //\n // - The CEO: The CEO can reassign other roles and change the addresses of our dependent smart\n // contracts. It is also the only role that can unpause the smart contract. It is initially\n // set to the address that created the smart contract in the KittyCore constructor.\n //\n // - The CFO: The CFO can withdraw funds from KittyCore and its auction contracts.\n //\n // - The COO: The COO can release gen0 kitties to auction, and mint promo cats.\n //\n // It should be noted that these roles are distinct without overlap in their access abilities, the\n // abilities listed for each role above are exhaustive. In particular, while the CEO can assign any\n // address to any role, the CEO address itself doesn't have the ability to act in those roles. This\n // restriction is intentional so that we aren't tempted to use the CEO address frequently out of\n // convenience. The less we use an address, the less likely it is that we somehow compromise the\n // account.\n\n /// @dev Emited when contract is upgraded - See README.md for updgrade plan\n event ContractUpgrade(address newContract);\n\n // The addresses of the accounts (or contracts) that can execute actions within each roles.\n address public ceoAddress;\n address public cfoAddress;\n address public cooAddress;\n\n // @dev Keeps track whether the contract is paused. When that is true, most actions are blocked\n bool public paused = false;\n\n /// @dev Access modifier for CEO-only functionality\n modifier onlyCEO() {\n require(msg.sender == ceoAddress);\n _;\n }\n\n /// @dev Access modifier for CFO-only functionality\n modifier onlyCFO() {\n require(msg.sender == cfoAddress);\n _;\n }\n\n /// @dev Access modifier for COO-only functionality\n modifier onlyCOO() {\n require(msg.sender == cooAddress);\n _;\n }\n\n modifier onlyCLevel() {\n require(\n msg.sender == cooAddress ||\n msg.sender == ceoAddress ||\n msg.sender == cfoAddress\n );\n _;\n }\n\n /// @dev Assigns a new address to act as the CEO. Only available to the current CEO.\n /// @param _newCEO The address of the new CEO\n function setCEO(address _newCEO) external onlyCEO {\n require(_newCEO != address(0));\n\n ceoAddress = _newCEO;\n }\n\n /// @dev Assigns a new address to act as the CFO. Only available to the current CEO.\n /// @param _newCFO The address of the new CFO\n function setCFO(address _newCFO) external onlyCEO {\n require(_newCFO != address(0));\n\n cfoAddress = _newCFO;\n }\n\n /// @dev Assigns a new address to act as the COO. Only available to the current CEO.\n /// @param _newCOO The address of the new COO\n function setCOO(address _newCOO) external onlyCEO {\n require(_newCOO != address(0));\n\n cooAddress = _newCOO;\n }\n\n /*** KittiesPausable functionality adapted from OpenZeppelin ***/\n\n /// @dev Modifier to allow actions only when the contract IS NOT paused\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /// @dev Modifier to allow actions only when the contract IS paused\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /// @dev Called by any \"C-level\" role to pause the contract. Used only when\n /// a bug or exploit is detected and we need to limit damage.\n function pause() external onlyCLevel whenNotPaused {\n paused = true;\n }\n\n /// @dev Unpauses the smart contract. Can only be called by the CEO, since\n /// one reason we may pause the contract is when CFO or COO accounts are\n /// compromised.\n /// @notice This is public rather than external so it can be called by\n /// derived contracts.\n function unpause() public onlyCEO whenPaused {\n // can't unpause if contract was upgraded\n paused = false;\n }\n}\n\n\n\n\n/// @title Base contract for CryptoKitties. Holds all common structs, events and base variables.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBase is KittyAccessControl {\n /*** EVENTS ***/\n\n /// @dev The Birth event is fired whenever a new kitten comes into existence. This obviously\n /// includes any time a cat is created through the giveBirth method, but it is also called\n /// when a new gen0 cat is created.\n event Birth(address owner, uint256 kittyId, uint256 matronId, uint256 sireId, uint256 genes);\n\n /// @dev Transfer event as defined in current draft of ERC721. Emitted every time a kitten\n /// ownership is assigned, including births.\n event Transfer(address from, address to, uint256 tokenId);\n\n /*** DATA TYPES ***/\n\n /// @dev The main Kitty struct. Every cat in CryptoKitties is represented by a copy\n /// of this structure, so great care was taken to ensure that it fits neatly into\n /// exactly two 256-bit words. Note that the order of the members in this structure\n /// is important because of the byte-packing rules used by Ethereum.\n /// Ref: http://solidity.readthedocs.io/en/develop/miscellaneous.html\n struct Kitty {\n // The Kitty's genetic code is packed into these 256-bits, the format is\n // sooper-sekret! A cat's genes never change.\n uint256 genes;\n\n // The timestamp from the block when this cat came into existence.\n uint64 birthTime;\n\n // The minimum timestamp after which this cat can engage in breeding\n // activities again. This same timestamp is used for the pregnancy\n // timer (for matrons) as well as the siring cooldown.\n uint64 cooldownEndBlock;\n\n // The ID of the parents of this kitty, set to 0 for gen0 cats.\n // Note that using 32-bit unsigned integers limits us to a \"mere\"\n // 4 billion cats. This number might seem small until you realize\n // that Ethereum currently has a limit of about 500 million\n // transactions per year! So, this definitely won't be a problem\n // for several years (even as Ethereum learns to scale).\n uint32 matronId;\n uint32 sireId;\n\n // Set to the ID of the sire cat for matrons that are pregnant,\n // zero otherwise. A non-zero value here is how we know a cat\n // is pregnant. Used to retrieve the genetic material for the new\n // kitten when the birth transpires.\n uint32 siringWithId;\n\n // Set to the index in the cooldown array (see below) that represents\n // the current cooldown duration for this Kitty. This starts at zero\n // for gen0 cats, and is initialized to floor(generation/2) for others.\n // Incremented by one for each successful breeding action, regardless\n // of whether this cat is acting as matron or sire.\n uint16 cooldownIndex;\n\n // The \"generation number\" of this cat. Cats minted by the CK contract\n // for sale are called \"gen0\" and have a generation number of 0. The\n // generation number of all other cats is the larger of the two generation\n // numbers of their parents, plus one.\n // (i.e. max(matron.generation, sire.generation) + 1)\n uint16 generation;\n }\n\n /*** CONSTANTS ***/\n\n /// @dev A lookup table indicating the cooldown duration after any successful\n /// breeding action, called \"pregnancy time\" for matrons and \"siring cooldown\"\n /// for sires. Designed such that the cooldown roughly doubles each time a cat\n /// is bred, encouraging owners not to just keep breeding the same cat over\n /// and over again. Caps out at one week (a cat can breed an unbounded number\n /// of times, and the maximum cooldown is always seven days).\n uint32[14] public cooldowns = [\n uint32(1 minutes),\n uint32(2 minutes),\n uint32(5 minutes),\n uint32(10 minutes),\n uint32(30 minutes),\n uint32(1 hours),\n uint32(2 hours),\n uint32(4 hours),\n uint32(8 hours),\n uint32(16 hours),\n uint32(1 days),\n uint32(2 days),\n uint32(4 days),\n uint32(7 days)\n ];\n\n // An approximation of currently how many seconds are in between blocks.\n uint256 public secondsPerBlock = 15;\n\n /*** STORAGE ***/\n\n /// @dev An array containing the Kitty struct for all Kitties in existence. The ID\n /// of each cat is actually an index into this array. Note that ID 0 is a negacat,\n /// the unKitty, the mythical beast that is the parent of all gen0 cats. A bizarre\n /// creature that is both matron and sire... to itself! Has an invalid genetic code.\n /// In other words, cat ID 0 is invalid... ;-)\n Kitty[] kitties;\n\n /// @dev A mapping from cat IDs to the address that owns them. All cats have\n /// some valid owner address, even gen0 cats are created with a non-zero owner.\n mapping (uint256 => address) public kittyIndexToOwner;\n\n // @dev A mapping from owner address to count of tokens that address owns.\n // Used internally inside balanceOf() to resolve ownership count.\n mapping (address => uint256) ownershipTokenCount;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to call\n /// transferFrom(). Each Kitty can only have one approved address for transfer\n /// at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public kittyIndexToApproved;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to use\n /// this Kitty for siring via breedWith(). Each Kitty can only have one approved\n /// address for siring at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public sireAllowedToAddress;\n\n /// @dev The address of the ClockAuction contract that handles sales of Kitties. This\n /// same contract handles both peer-to-peer sales as well as the gen0 sales which are\n /// initiated every 15 minutes.\n SaleClockAuction public saleAuction;\n\n /// @dev The address of a custom ClockAuction subclassed contract that handles siring\n /// auctions. Needs to be separate from saleAuction because the actions taken on success\n /// after a sales and siring auction are quite different.\n SiringClockAuction public siringAuction;\n\n /// @dev Assigns ownership of a specific Kitty to an address.\n function _transfer(address _from, address _to, uint256 _tokenId) internal {\n // Since the number of kittens is capped to 2^32 we can't overflow this\n ownershipTokenCount[_to]++;\n // transfer ownership\n kittyIndexToOwner[_tokenId] = _to;\n // When creating new kittens _from is 0x0, but we can't account that address.\n if (_from != address(0)) {\n ownershipTokenCount[_from]--;\n // once the kitten is transferred also clear sire allowances\n delete sireAllowedToAddress[_tokenId];\n // clear any previously approved ownership exchange\n delete kittyIndexToApproved[_tokenId];\n }\n // Emit the transfer event.\n Transfer(_from, _to, _tokenId);\n }\n\n /// @dev An internal method that creates a new kitty and stores it. This\n /// method doesn't do any checking and should only be called when the\n /// input data is known to be valid. Will generate both a Birth event\n /// and a Transfer event.\n /// @param _matronId The kitty ID of the matron of this cat (zero for gen0)\n /// @param _sireId The kitty ID of the sire of this cat (zero for gen0)\n /// @param _generation The generation number of this cat, must be computed by caller.\n /// @param _genes The kitty's genetic code.\n /// @param _owner The inital owner of this cat, must be non-zero (except for the unKitty, ID 0)\n function _createKitty(\n uint256 _matronId,\n uint256 _sireId,\n uint256 _generation,\n uint256 _genes,\n address _owner\n )\n internal\n returns (uint)\n {\n // These requires are not strictly necessary, our calling code should make\n // sure that these conditions are never broken. However! _createKitty() is already\n // an expensive call (for storage), and it doesn't hurt to be especially careful\n // to ensure our data structures are always valid.\n require(_matronId == uint256(uint32(_matronId)));\n require(_sireId == uint256(uint32(_sireId)));\n require(_generation == uint256(uint16(_generation)));\n\n // New kitty starts with the same cooldown as parent gen/2\n uint16 cooldownIndex = uint16(_generation / 2);\n if (cooldownIndex > 13) {\n cooldownIndex = 13;\n }\n\n Kitty memory _kitty = Kitty({\n genes: _genes,\n birthTime: uint64(now),\n cooldownEndBlock: 0,\n matronId: uint32(_matronId),\n sireId: uint32(_sireId),\n siringWithId: 0,\n cooldownIndex: cooldownIndex,\n generation: uint16(_generation)\n });\n uint256 newKittenId = kitties.push(_kitty) - 1;\n\n // It's probably never going to happen, 4 billion cats is A LOT, but\n // let's just be 100% sure we never let this happen.\n require(newKittenId == uint256(uint32(newKittenId)));\n\n // emit the birth event\n Birth(\n _owner,\n newKittenId,\n uint256(_kitty.matronId),\n uint256(_kitty.sireId),\n _kitty.genes\n );\n\n // This will assign ownership, and also emit the Transfer event as\n // per ERC721 draft\n _transfer(0, _owner, newKittenId);\n\n return newKittenId;\n }\n\n // Any C-level can fix how many seconds per blocks are currently observed.\n function setSecondsPerBlock(uint256 secs) external onlyCLevel {\n require(secs < cooldowns[0]);\n secondsPerBlock = secs;\n }\n}\n\n\n\n\n\n/// @title The external contract that is responsible for generating metadata for the kitties,\n/// it has one function that will return the data as bytes.\ncontract KittiesERC721Metadata {\n /// @dev Given a token Id, returns a byte array that is supposed to be converted into string.\n function getMetadata(uint256 _tokenId, string) public view returns (bytes32[4] buffer, uint256 count) {\n if (_tokenId == 1) {\n buffer[0] = \"Hello World! :D\";\n count = 15;\n } else if (_tokenId == 2) {\n buffer[0] = \"I would definitely choose a medi\";\n buffer[1] = \"um length string.\";\n count = 49;\n } else if (_tokenId == 3) {\n buffer[0] = \"Lorem ipsum dolor sit amet, mi e\";\n buffer[1] = \"st accumsan dapibus augue lorem,\";\n buffer[2] = \" tristique vestibulum id, libero\";\n buffer[3] = \" suscipit varius sapien aliquam.\";\n count = 128;\n }\n }\n}\n\n\n/// @title The facet of the CryptoKitties core contract that manages ownership, ERC-721 (draft) compliant.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev Ref: https://github.com/ethereum/EIPs/issues/721\n/// See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyOwnership is KittyBase, KittiesERC721 {\n\n /// @notice Name and symbol of the non fungible token, as defined in ERC721.\n string public constant name = \"CryptoKitties\";\n string public constant symbol = \"CK\";\n\n // The contract that will return kitty metadata\n KittiesERC721Metadata public erc721Metadata;\n\n bytes4 constant InterfaceSignature_ERC165 =\n bytes4(keccak256('supportsInterface(bytes4)'));\n\n bytes4 constant InterfaceSignature_ERC721 =\n bytes4(keccak256('name()')) ^\n bytes4(keccak256('symbol()')) ^\n bytes4(keccak256('totalSupply()')) ^\n bytes4(keccak256('balanceOf(address)')) ^\n bytes4(keccak256('ownerOf(uint256)')) ^\n bytes4(keccak256('approve(address,uint256)')) ^\n bytes4(keccak256('transfer(address,uint256)')) ^\n bytes4(keccak256('transferFrom(address,address,uint256)')) ^\n bytes4(keccak256('tokensOfOwner(address)')) ^\n bytes4(keccak256('tokenMetadata(uint256,string)'));\n\n /// @notice Introspection interface as per ERC-165 (https://github.com/ethereum/EIPs/issues/165).\n /// Returns true for any standardized interfaces implemented by this contract. We implement\n /// ERC-165 (obviously!) and ERC-721.\n function supportsInterface(bytes4 _interfaceID) external view returns (bool)\n {\n // DEBUG ONLY\n //require((InterfaceSignature_ERC165 == 0x01ffc9a7) && (InterfaceSignature_ERC721 == 0x9a20483d));\n\n return ((_interfaceID == InterfaceSignature_ERC165) || (_interfaceID == InterfaceSignature_ERC721));\n }\n\n /// @dev Set the address of the sibling contract that tracks metadata.\n /// CEO only.\n function setMetadataAddress(address _contractAddress) public onlyCEO {\n erc721Metadata = KittiesERC721Metadata(_contractAddress);\n }\n\n // Internal utility functions: These functions all assume that their input arguments\n // are valid. We leave it to public methods to sanitize their inputs and follow\n // the required logic.\n\n /// @dev Checks if a given address is the current owner of a particular Kitty.\n /// @param _claimant the address we are validating against.\n /// @param _tokenId kitten id, only valid when > 0\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToOwner[_tokenId] == _claimant;\n }\n\n /// @dev Checks if a given address currently has transferApproval for a particular Kitty.\n /// @param _claimant the address we are confirming kitten is approved for.\n /// @param _tokenId kitten id, only valid when > 0\n function _approvedFor(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToApproved[_tokenId] == _claimant;\n }\n\n /// @dev Marks an address as being approved for transferFrom(), overwriting any previous\n /// approval. Setting _approved to address(0) clears all transfer approval.\n /// NOTE: _approve() does NOT send the Approval event. This is intentional because\n /// _approve() and transferFrom() are used together for putting Kitties on auction, and\n /// there is no value in spamming the log with Approval events in that case.\n function _approve(uint256 _tokenId, address _approved) internal {\n kittyIndexToApproved[_tokenId] = _approved;\n }\n\n /// @notice Returns the number of Kitties owned by a specific address.\n /// @param _owner The owner address to check.\n /// @dev Required for ERC-721 compliance\n function balanceOf(address _owner) public view returns (uint256 count) {\n return ownershipTokenCount[_owner];\n }\n\n /// @notice Transfers a Kitty to another address. If transferring to a smart\n /// contract be VERY CAREFUL to ensure that it is aware of ERC-721 (or\n /// CryptoKitties specifically) or your Kitty may be lost forever. Seriously.\n /// @param _to The address of the recipient, can be a user or contract.\n /// @param _tokenId The ID of the Kitty to transfer.\n /// @dev Required for ERC-721 compliance.\n function transfer(\n address _to,\n uint256 _tokenId\n )\n external\n whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Disallow transfers to the auction contracts to prevent accidental\n // misuse. Auction contracts should only take ownership of kitties\n // through the allow + transferFrom flow.\n require(_to != address(saleAuction));\n require(_to != address(siringAuction));\n\n // You can only send your own cat.\n require(_owns(msg.sender, _tokenId));\n\n // Reassign ownership, clear pending approvals, emit Transfer event.\n _transfer(msg.sender, _to, _tokenId);\n }\n\n /// @notice Grant another address the right to transfer a specific Kitty via\n /// transferFrom(). This is the preferred flow for transfering NFTs to contracts.\n /// @param _to The address to be granted transfer approval. Pass address(0) to\n /// clear all approvals.\n /// @param _tokenId The ID of the Kitty that can be transferred if this call succeeds.\n /// @dev Required for ERC-721 compliance.\n function approve(\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Only an owner can grant transfer approval.\n require(_owns(msg.sender, _tokenId));\n\n // Register the approval (replacing any previous approval).\n _approve(_tokenId, _to);\n\n // Emit approval event.\n Approval(msg.sender, _to, _tokenId);\n }\n\n /// @notice Transfer a Kitty owned by another address, for which the calling address\n /// has previously been granted transfer approval by the owner.\n /// @param _from The address that owns the Kitty to be transfered.\n /// @param _to The address that should take ownership of the Kitty. Can be any address,\n /// including the caller.\n /// @param _tokenId The ID of the Kitty to be transferred.\n /// @dev Required for ERC-721 compliance.\n function transferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Check for approval and valid ownership\n require(_approvedFor(msg.sender, _tokenId));\n require(_owns(_from, _tokenId));\n\n // Reassign ownership (also clears pending approvals and emits Transfer event).\n _transfer(_from, _to, _tokenId);\n }\n\n /// @notice Returns the total number of Kitties currently in existence.\n /// @dev Required for ERC-721 compliance.\n function totalSupply() public view returns (uint) {\n return kitties.length - 1;\n }\n\n /// @notice Returns the address currently assigned ownership of a given Kitty.\n /// @dev Required for ERC-721 compliance.\n function ownerOf(uint256 _tokenId)\n external\n view\n returns (address owner)\n {\n owner = kittyIndexToOwner[_tokenId];\n\n require(owner != address(0));\n }\n\n /// @notice Returns a list of all Kitty IDs assigned to an address.\n /// @param _owner The owner whose Kitties we are interested in.\n /// @dev This method MUST NEVER be called by smart contract code. First, it's fairly\n /// expensive (it walks the entire Kitty array looking for cats belonging to owner),\n /// but it also returns a dynamic array, which is only supported for web3 calls, and\n /// not contract-to-contract calls.\n function tokensOfOwner(address _owner) external view returns(uint256[] ownerTokens) {\n uint256 tokenCount = balanceOf(_owner);\n\n if (tokenCount == 0) {\n // Return an empty array\n return new uint256[](0);\n } else {\n uint256[] memory result = new uint256[](tokenCount);\n uint256 totalCats = totalSupply();\n uint256 resultIndex = 0;\n\n // We count on the fact that all cats have IDs starting at 1 and increasing\n // sequentially up to the totalCat count.\n uint256 catId;\n\n for (catId = 1; catId <= totalCats; catId++) {\n if (kittyIndexToOwner[catId] == _owner) {\n result[resultIndex] = catId;\n resultIndex++;\n }\n }\n\n return result;\n }\n }\n\n /// @dev Adapted from memcpy() by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _memcpy(uint _dest, uint _src, uint _len) private view {\n // Copy word-length chunks while possible\n for(; _len >= 32; _len -= 32) {\n assembly {\n mstore(_dest, mload(_src))\n }\n _dest += 32;\n _src += 32;\n }\n\n // Copy remaining bytes\n uint256 mask = 256 ** (32 - _len) - 1;\n assembly {\n let srcpart := and(mload(_src), not(mask))\n let destpart := and(mload(_dest), mask)\n mstore(_dest, or(destpart, srcpart))\n }\n }\n\n /// @dev Adapted from toString(slice) by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _toString(bytes32[4] _rawBytes, uint256 _stringLength) private view returns (string) {\n var outputString = new string(_stringLength);\n uint256 outputPtr;\n uint256 bytesPtr;\n\n assembly {\n outputPtr := add(outputString, 32)\n bytesPtr := _rawBytes\n }\n\n _memcpy(outputPtr, bytesPtr, _stringLength);\n\n return outputString;\n }\n\n /// @notice Returns a URI pointing to a metadata package for this token conforming to\n /// ERC-721 (https://github.com/ethereum/EIPs/issues/721)\n /// @param _tokenId The ID number of the Kitty whose metadata should be returned.\n function tokenMetadata(uint256 _tokenId, string _preferredTransport) external view returns (string infoUrl) {\n require(erc721Metadata != address(0));\n bytes32[4] memory buffer;\n uint256 count;\n (buffer, count) = erc721Metadata.getMetadata(_tokenId, _preferredTransport);\n\n return _toString(buffer, count);\n }\n}\n\n\n\n/// @title A facet of KittyCore that manages Kitty siring, gestation, and birth.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBreeding is KittyOwnership {\n\n /// @dev The Pregnant event is fired when two cats successfully breed and the pregnancy\n /// timer begins for the matron.\n event Pregnant(address owner, uint256 matronId, uint256 sireId, uint256 cooldownEndBlock);\n\n /// @notice The minimum payment required to use breedWithAuto(). This fee goes towards\n /// the gas cost paid by whatever calls giveBirth(), and can be dynamically updated by\n /// the COO role as the gas price changes.\n uint256 public autoBirthFee = 2 finney;\n\n // Keeps track of number of pregnant kitties.\n uint256 public pregnantKitties;\n\n /// @dev The address of the sibling contract that is used to implement the sooper-sekret\n /// genetic combination algorithm.\n GeneScienceInterface public geneScience;\n\n /// @dev Update the address of the genetic contract, can only be called by the CEO.\n /// @param _address An address of a GeneScience contract instance to be used from this point forward.\n function setGeneScienceAddress(address _address) external onlyCEO {\n GeneScienceInterface candidateContract = GeneScienceInterface(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isGeneScience());\n\n // Set the new contract address\n geneScience = candidateContract;\n }\n\n /// @dev Checks that a given kitten is able to breed. Requires that the\n /// current cooldown is finished (for sires) and also checks that there is\n /// no pending pregnancy.\n function _isReadyToBreed(Kitty _kit) internal view returns (bool) {\n // In addition to checking the cooldownEndBlock, we also need to check to see if\n // the cat has a pending birth; there can be some period of time between the end\n // of the pregnacy timer and the birth event.\n return (_kit.siringWithId == 0) && (_kit.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @dev Check if a sire has authorized breeding with this matron. True if both sire\n /// and matron have the same owner, or if the sire has given siring permission to\n /// the matron's owner (via approveSiring()).\n function _isSiringPermitted(uint256 _sireId, uint256 _matronId) internal view returns (bool) {\n address matronOwner = kittyIndexToOwner[_matronId];\n address sireOwner = kittyIndexToOwner[_sireId];\n\n // Siring is okay if they have same owner, or if the matron's owner was given\n // permission to breed with this sire.\n return (matronOwner == sireOwner || sireAllowedToAddress[_sireId] == matronOwner);\n }\n\n /// @dev Set the cooldownEndTime for the given Kitty, based on its current cooldownIndex.\n /// Also increments the cooldownIndex (unless it has hit the cap).\n /// @param _kitten A reference to the Kitty in storage which needs its timer started.\n function _triggerCooldown(Kitty storage _kitten) internal {\n // Compute an estimation of the cooldown time in blocks (based on current cooldownIndex).\n _kitten.cooldownEndBlock = uint64((cooldowns[_kitten.cooldownIndex]/secondsPerBlock) + block.number);\n\n // Increment the breeding count, clamping it at 13, which is the length of the\n // cooldowns array. We could check the array size dynamically, but hard-coding\n // this as a constant saves gas. Yay, Solidity!\n if (_kitten.cooldownIndex < 13) {\n _kitten.cooldownIndex += 1;\n }\n }\n\n /// @notice Grants approval to another user to sire with one of your Kitties.\n /// @param _addr The address that will be able to sire with your Kitty. Set to\n /// address(0) to clear all siring approvals for this Kitty.\n /// @param _sireId A Kitty that you own that _addr will now be able to sire with.\n function approveSiring(address _addr, uint256 _sireId)\n external\n whenNotPaused\n {\n require(_owns(msg.sender, _sireId));\n sireAllowedToAddress[_sireId] = _addr;\n }\n\n /// @dev Updates the minimum payment required for calling giveBirthAuto(). Can only\n /// be called by the COO address. (This fee is used to offset the gas cost incurred\n /// by the autobirth daemon).\n function setAutoBirthFee(uint256 val) external onlyCOO {\n autoBirthFee = val;\n }\n\n /// @dev Checks to see if a given Kitty is pregnant and (if so) if the gestation\n /// period has passed.\n function _isReadyToGiveBirth(Kitty _matron) private view returns (bool) {\n return (_matron.siringWithId != 0) && (_matron.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @notice Checks that a given kitten is able to breed (i.e. it is not pregnant or\n /// in the middle of a siring cooldown).\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isReadyToBreed(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n Kitty storage kit = kitties[_kittyId];\n return _isReadyToBreed(kit);\n }\n\n /// @dev Checks whether a kitty is currently pregnant.\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isPregnant(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n // A kitty is pregnant if and only if this field is set\n return kitties[_kittyId].siringWithId != 0;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair. DOES NOT\n /// check ownership permissions (that is up to the caller).\n /// @param _matron A reference to the Kitty struct of the potential matron.\n /// @param _matronId The matron's ID.\n /// @param _sire A reference to the Kitty struct of the potential sire.\n /// @param _sireId The sire's ID\n function _isValidMatingPair(\n Kitty storage _matron,\n uint256 _matronId,\n Kitty storage _sire,\n uint256 _sireId\n )\n private\n view\n returns(bool)\n {\n // A Kitty can't breed with itself!\n if (_matronId == _sireId) {\n return false;\n }\n\n // Kitties can't breed with their parents.\n if (_matron.matronId == _sireId || _matron.sireId == _sireId) {\n return false;\n }\n if (_sire.matronId == _matronId || _sire.sireId == _matronId) {\n return false;\n }\n\n // We can short circuit the sibling check (below) if either cat is\n // gen zero (has a matron ID of zero).\n if (_sire.matronId == 0 || _matron.matronId == 0) {\n return true;\n }\n\n // Kitties can't breed with full or half siblings.\n if (_sire.matronId == _matron.matronId || _sire.matronId == _matron.sireId) {\n return false;\n }\n if (_sire.sireId == _matron.matronId || _sire.sireId == _matron.sireId) {\n return false;\n }\n\n // Everything seems cool! Let's get DTF.\n return true;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair for\n /// breeding via auction (i.e. skips ownership and siring approval checks).\n function _canBreedWithViaAuction(uint256 _matronId, uint256 _sireId)\n internal\n view\n returns (bool)\n {\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId);\n }\n\n /// @notice Checks to see if two cats can breed together, including checks for\n /// ownership and siring approvals. Does NOT check that both cats are ready for\n /// breeding (i.e. breedWith could still fail until the cooldowns are finished).\n /// TODO: Shouldn't this check pregnancy and cooldowns?!?\n /// @param _matronId The ID of the proposed matron.\n /// @param _sireId The ID of the proposed sire.\n function canBreedWith(uint256 _matronId, uint256 _sireId)\n external\n view\n returns(bool)\n {\n require(_matronId > 0);\n require(_sireId > 0);\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId) &&\n _isSiringPermitted(_sireId, _matronId);\n }\n\n /// @dev Internal utility function to initiate breeding, assumes that all breeding\n /// requirements have been checked.\n function _breedWith(uint256 _matronId, uint256 _sireId) internal {\n // Grab a reference to the Kitties from storage.\n Kitty storage sire = kitties[_sireId];\n Kitty storage matron = kitties[_matronId];\n\n // Mark the matron as pregnant, keeping track of who the sire is.\n matron.siringWithId = uint32(_sireId);\n\n // Trigger the cooldown for both parents.\n _triggerCooldown(sire);\n _triggerCooldown(matron);\n\n // Clear siring permission for both parents. This may not be strictly necessary\n // but it's likely to avoid confusion!\n delete sireAllowedToAddress[_matronId];\n delete sireAllowedToAddress[_sireId];\n\n // Every time a kitty gets pregnant, counter is incremented.\n pregnantKitties++;\n\n // Emit the pregnancy event.\n Pregnant(kittyIndexToOwner[_matronId], _matronId, _sireId, matron.cooldownEndBlock);\n }\n\n /// @notice Breed a Kitty you own (as matron) with a sire that you own, or for which you\n /// have previously been given Siring approval. Will either make your cat pregnant, or will\n /// fail entirely. Requires a pre-payment of the fee given out to the first caller of giveBirth()\n /// @param _matronId The ID of the Kitty acting as matron (will end up pregnant if successful)\n /// @param _sireId The ID of the Kitty acting as sire (will begin its siring cooldown if successful)\n function breedWithAuto(uint256 _matronId, uint256 _sireId)\n external\n payable\n whenNotPaused\n {\n // Checks for payment.\n require(msg.value >= autoBirthFee);\n\n // Caller must own the matron.\n require(_owns(msg.sender, _matronId));\n\n // Neither sire nor matron are allowed to be on auction during a normal\n // breeding operation, but we don't need to check that explicitly.\n // For matron: The caller of this function can't be the owner of the matron\n // because the owner of a Kitty on auction is the auction house, and the\n // auction house will never call breedWith().\n // For sire: Similarly, a sire on auction will be owned by the auction house\n // and the act of transferring ownership will have cleared any oustanding\n // siring approval.\n // Thus we don't need to spend gas explicitly checking to see if either cat\n // is on auction.\n\n // Check that matron and sire are both owned by caller, or that the sire\n // has given siring permission to caller (i.e. matron's owner).\n // Will fail for _sireId = 0\n require(_isSiringPermitted(_sireId, _matronId));\n\n // Grab a reference to the potential matron\n Kitty storage matron = kitties[_matronId];\n\n // Make sure matron isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(matron));\n\n // Grab a reference to the potential sire\n Kitty storage sire = kitties[_sireId];\n\n // Make sure sire isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(sire));\n\n // Test that these cats are a valid mating pair.\n require(_isValidMatingPair(\n matron,\n _matronId,\n sire,\n _sireId\n ));\n\n // All checks passed, kitty gets pregnant!\n _breedWith(_matronId, _sireId);\n }\n\n /// @notice Have a pregnant Kitty give birth!\n /// @param _matronId A Kitty ready to give birth.\n /// @return The Kitty ID of the new kitten.\n /// @dev Looks at a given Kitty and, if pregnant and if the gestation period has passed,\n /// combines the genes of the two parents to create a new kitten. The new Kitty is assigned\n /// to the current owner of the matron. Upon successful completion, both the matron and the\n /// new kitten will be ready to breed again. Note that anyone can call this function (if they\n /// are willing to pay the gas!), but the new kitten always goes to the mother's owner.\n function giveBirth(uint256 _matronId)\n external\n whenNotPaused\n returns(uint256)\n {\n // Grab a reference to the matron in storage.\n Kitty storage matron = kitties[_matronId];\n\n // Check that the matron is a valid cat.\n require(matron.birthTime != 0);\n\n // Check that the matron is pregnant, and that its time has come!\n require(_isReadyToGiveBirth(matron));\n\n // Grab a reference to the sire in storage.\n uint256 sireId = matron.siringWithId;\n Kitty storage sire = kitties[sireId];\n\n // Determine the higher generation number of the two parents\n uint16 parentGen = matron.generation;\n if (sire.generation > matron.generation) {\n parentGen = sire.generation;\n }\n\n // Call the sooper-sekret gene mixing operation.\n uint256 childGenes = geneScience.mixGenes(matron.genes, sire.genes, matron.cooldownEndBlock - 1);\n\n // Make the new kitten!\n address owner = kittyIndexToOwner[_matronId];\n uint256 kittenId = _createKitty(_matronId, matron.siringWithId, parentGen + 1, childGenes, owner);\n\n // Clear the reference to sire from the matron (REQUIRED! Having siringWithId\n // set is what marks a matron as being pregnant.)\n delete matron.siringWithId;\n\n // Every time a kitty gives birth counter is decremented.\n pregnantKitties--;\n\n // Send the balance fee to the person who made birth happen.\n msg.sender.send(autoBirthFee);\n\n // return the new kitten's ID\n return kittenId;\n }\n}\n\n\n\n\n\n\n\n\n\n\n/// @title Auction Core\n/// @dev Contains models, variables, and internal methods for the auction.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuctionBase {\n\n // Represents an auction on an NFT\n struct Auction {\n // Current owner of NFT\n address seller;\n // Price (in wei) at beginning of auction\n uint128 startingPrice;\n // Price (in wei) at end of auction\n uint128 endingPrice;\n // Duration (in seconds) of auction\n uint64 duration;\n // Time when auction started\n // NOTE: 0 if this auction has been concluded\n uint64 startedAt;\n }\n\n // Reference to contract tracking NFT ownership\n KittiesERC721 public nonFungibleContract;\n\n // Cut owner takes on each auction, measured in basis points (1/100 of a percent).\n // Values 0-10,000 map to 0%-100%\n uint256 public ownerCut;\n\n // Map from token ID to their corresponding auction.\n mapping (uint256 => Auction) tokenIdToAuction;\n\n event AuctionCreated(uint256 tokenId, uint256 startingPrice, uint256 endingPrice, uint256 duration);\n event AuctionSuccessful(uint256 tokenId, uint256 totalPrice, address winner);\n event AuctionCancelled(uint256 tokenId);\n\n /// @dev Returns true if the claimant owns the token.\n /// @param _claimant - Address claiming to own the token.\n /// @param _tokenId - ID of token whose ownership to verify.\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return (nonFungibleContract.ownerOf(_tokenId) == _claimant);\n }\n\n /// @dev Escrows the NFT, assigning ownership to this contract.\n /// Throws if the escrow fails.\n /// @param _owner - Current owner address of token to escrow.\n /// @param _tokenId - ID of token whose approval to verify.\n function _escrow(address _owner, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transferFrom(_owner, this, _tokenId);\n }\n\n /// @dev Transfers an NFT owned by this contract to another address.\n /// Returns true if the transfer succeeds.\n /// @param _receiver - Address to transfer NFT to.\n /// @param _tokenId - ID of token to transfer.\n function _transfer(address _receiver, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transfer(_receiver, _tokenId);\n }\n\n /// @dev Adds an auction to the list of open auctions. Also fires the\n /// AuctionCreated event.\n /// @param _tokenId The ID of the token to be put on auction.\n /// @param _auction Auction to add.\n function _addAuction(uint256 _tokenId, Auction _auction) internal {\n // Require that all auctions have a duration of\n // at least one minute. (Keeps our math from getting hairy!)\n require(_auction.duration >= 1 minutes);\n\n tokenIdToAuction[_tokenId] = _auction;\n\n AuctionCreated(\n uint256(_tokenId),\n uint256(_auction.startingPrice),\n uint256(_auction.endingPrice),\n uint256(_auction.duration)\n );\n }\n\n /// @dev Cancels an auction unconditionally.\n function _cancelAuction(uint256 _tokenId, address _seller) internal {\n _removeAuction(_tokenId);\n _transfer(_seller, _tokenId);\n AuctionCancelled(_tokenId);\n }\n\n /// @dev Computes the price and transfers winnings.\n /// Does NOT transfer ownership of token.\n function _bid(uint256 _tokenId, uint256 _bidAmount)\n internal\n returns (uint256)\n {\n // Get a reference to the auction struct\n Auction storage auction = tokenIdToAuction[_tokenId];\n\n // Explicitly check that this auction is currently live.\n // (Because of how Ethereum mappings work, we can't just count\n // on the lookup above failing. An invalid _tokenId will just\n // return an auction object that is all zeros.)\n require(_isOnAuction(auction));\n\n // Check that the bid is greater than or equal to the current price\n uint256 price = _currentPrice(auction);\n require(_bidAmount >= price);\n\n // Grab a reference to the seller before the auction struct\n // gets deleted.\n address seller = auction.seller;\n\n // The bid is good! Remove the auction before sending the fees\n // to the sender so we can't have a reentrancy attack.\n _removeAuction(_tokenId);\n\n // Transfer proceeds to seller (if there are any!)\n if (price > 0) {\n // Calculate the auctioneer's cut.\n // (NOTE: _computeCut() is guaranteed to return a\n // value <= price, so this subtraction can't go negative.)\n uint256 auctioneerCut = _computeCut(price);\n uint256 sellerProceeds = price - auctioneerCut;\n\n // NOTE: Doing a transfer() in the middle of a complex\n // method like this is generally discouraged because of\n // reentrancy attacks and DoS attacks if the seller is\n // a contract with an invalid fallback function. We explicitly\n // guard against reentrancy attacks by removing the auction\n // before calling transfer(), and the only thing the seller\n // can DoS is the sale of their own asset! (And if it's an\n // accident, they can call cancelAuction(). )\n seller.transfer(sellerProceeds);\n }\n\n // Calculate any excess funds included with the bid. If the excess\n // is anything worth worrying about, transfer it back to bidder.\n // NOTE: We checked above that the bid amount is greater than or\n // equal to the price so this cannot underflow.\n uint256 bidExcess = _bidAmount - price;\n\n // Return the funds. Similar to the previous transfer, this is\n // not susceptible to a re-entry attack because the auction is\n // removed before any transfers occur.\n msg.sender.transfer(bidExcess);\n\n // Tell the world!\n AuctionSuccessful(_tokenId, price, msg.sender);\n\n return price;\n }\n\n /// @dev Removes an auction from the list of open auctions.\n /// @param _tokenId - ID of NFT on auction.\n function _removeAuction(uint256 _tokenId) internal {\n delete tokenIdToAuction[_tokenId];\n }\n\n /// @dev Returns true if the NFT is on auction.\n /// @param _auction - Auction to check.\n function _isOnAuction(Auction storage _auction) internal view returns (bool) {\n return (_auction.startedAt > 0);\n }\n\n /// @dev Returns current price of an NFT on auction. Broken into two\n /// functions (this one, that computes the duration from the auction\n /// structure, and the other that does the price computation) so we\n /// can easily test that the price computation works correctly.\n function _currentPrice(Auction storage _auction)\n internal\n view\n returns (uint256)\n {\n uint256 secondsPassed = 0;\n\n // A bit of insurance against negative values (or wraparound).\n // Probably not necessary (since Ethereum guarnatees that the\n // now variable doesn't ever go backwards).\n if (now > _auction.startedAt) {\n secondsPassed = now - _auction.startedAt;\n }\n\n return _computeCurrentPrice(\n _auction.startingPrice,\n _auction.endingPrice,\n _auction.duration,\n secondsPassed\n );\n }\n\n /// @dev Computes the current price of an auction. Factored out\n /// from _currentPrice so we can run extensive unit tests.\n /// When testing, make this function public and turn on\n /// `Current price computation` test suite.\n function _computeCurrentPrice(\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n uint256 _secondsPassed\n )\n internal\n pure\n returns (uint256)\n {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our public functions carefully cap the maximum values for\n // time (at 64-bits) and currency (at 128-bits). _duration is\n // also known to be non-zero (see the require() statement in\n // _addAuction())\n if (_secondsPassed >= _duration) {\n // We've reached the end of the dynamic pricing portion\n // of the auction, just return the end price.\n return _endingPrice;\n } else {\n // Starting price can be higher than ending price (and often is!), so\n // this delta can be negative.\n int256 totalPriceChange = int256(_endingPrice) - int256(_startingPrice);\n\n // This multiplication can't overflow, _secondsPassed will easily fit within\n // 64-bits, and totalPriceChange will easily fit within 128-bits, their product\n // will always fit within 256-bits.\n int256 currentPriceChange = totalPriceChange * int256(_secondsPassed) / int256(_duration);\n\n // currentPriceChange can be negative, but if so, will have a magnitude\n // less that _startingPrice. Thus, this result will always end up positive.\n int256 currentPrice = int256(_startingPrice) + currentPriceChange;\n\n return uint256(currentPrice);\n }\n }\n\n /// @dev Computes owner's cut of a sale.\n /// @param _price - Sale price of NFT.\n function _computeCut(uint256 _price) internal view returns (uint256) {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our entry functions carefully cap the maximum values for\n // currency (at 128-bits), and ownerCut <= 10000 (see the require()\n // statement in the ClockAuction constructor). The result of this\n // function is always guaranteed to be <= _price.\n return _price * ownerCut / 10000;\n }\n\n}\n\n\n\n\n\n\n\n/**\n * @title KittiesPausable\n * @dev Base contract which allows children to implement an emergency stop mechanism.\n */\ncontract KittiesPausable is KittiesOwnable {\n event Pause();\n event Unpause();\n\n bool public paused = false;\n\n\n /**\n\t * @dev modifier to allow actions only when the contract IS paused\n\t */\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /**\n\t * @dev modifier to allow actions only when the contract IS NOT paused\n\t */\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /**\n\t * @dev called by the owner to pause, triggers stopped state\n\t */\n function pause() onlyOwner whenNotPaused returns (bool) {\n paused = true;\n Pause();\n return true;\n }\n\n /**\n\t * @dev called by the owner to unpause, returns to normal state\n\t */\n function unpause() onlyOwner whenPaused returns (bool) {\n paused = false;\n Unpause();\n return true;\n }\n}\n\n\n/// @title Clock auction for non-fungible tokens.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuction is KittiesPausable, ClockAuctionBase {\n\n /// @dev The ERC-165 interface signature for ERC-721.\n /// Ref: https://github.com/ethereum/EIPs/issues/165\n /// Ref: https://github.com/ethereum/EIPs/issues/721\n bytes4 constant InterfaceSignature_ERC721 = bytes4(0x9a20483d);\n\n /// @dev Constructor creates a reference to the NFT ownership contract\n /// and verifies the owner cut is in the valid range.\n /// @param _nftAddress - address of a deployed contract implementing\n /// the Nonfungible Interface.\n /// @param _cut - percent cut the owner takes on each auction, must be\n /// between 0-10,000.\n function ClockAuction(address _nftAddress, uint256 _cut) public {\n require(_cut <= 10000);\n ownerCut = _cut;\n\n KittiesERC721 candidateContract = KittiesERC721(_nftAddress);\n require(candidateContract.supportsInterface(InterfaceSignature_ERC721));\n nonFungibleContract = candidateContract;\n }\n\n /// @dev Remove all Ether from the contract, which is the owner's cuts\n /// as well as any Ether sent directly to the contract address.\n /// Always transfers to the NFT contract, but can be called either by\n /// the owner or the NFT contract.\n function withdrawBalance() external {\n address nftAddress = address(nonFungibleContract);\n\n require(\n msg.sender == owner ||\n msg.sender == nftAddress\n );\n // We are using this boolean method to make sure that even if one fails it will still work\n bool res = nftAddress.send(this.balance);\n }\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of time to move between starting\n /// price and ending price (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n whenNotPaused\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(_owns(msg.sender, _tokenId));\n _escrow(msg.sender, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Bids on an open auction, completing the auction and transferring\n /// ownership of the NFT if enough Ether is supplied.\n /// @param _tokenId - ID of token to bid on.\n function bid(uint256 _tokenId)\n external\n payable\n whenNotPaused\n {\n // _bid will throw if the bid or funds transfer fails\n _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n }\n\n /// @dev Cancels an auction that hasn't been won yet.\n /// Returns the NFT to original owner.\n /// @notice This is a state-modifying function that can\n /// be called while the contract is paused.\n /// @param _tokenId - ID of token on auction\n function cancelAuction(uint256 _tokenId)\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n address seller = auction.seller;\n require(msg.sender == seller);\n _cancelAuction(_tokenId, seller);\n }\n\n /// @dev Cancels an auction when the contract is paused.\n /// Only the owner may do this, and NFTs are returned to\n /// the seller. This should only be used in emergencies.\n /// @param _tokenId - ID of the NFT on auction to cancel.\n function cancelAuctionWhenPaused(uint256 _tokenId)\n whenPaused\n onlyOwner\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n _cancelAuction(_tokenId, auction.seller);\n }\n\n /// @dev Returns auction info for an NFT on auction.\n /// @param _tokenId - ID of NFT on auction.\n function getAuction(uint256 _tokenId)\n external\n view\n returns\n (\n address seller,\n uint256 startingPrice,\n uint256 endingPrice,\n uint256 duration,\n uint256 startedAt\n ) {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return (\n auction.seller,\n auction.startingPrice,\n auction.endingPrice,\n auction.duration,\n auction.startedAt\n );\n }\n\n /// @dev Returns the current price of an auction.\n /// @param _tokenId - ID of the token price we are checking.\n function getCurrentPrice(uint256 _tokenId)\n external\n view\n returns (uint256)\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return _currentPrice(auction);\n }\n\n}\n\n\n/// @title Reverse auction modified for siring\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SiringClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSiringAuctionAddress() call.\n bool public isSiringClockAuction = true;\n\n // Delegate constructor\n function SiringClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction. Since this function is wrapped,\n /// require sender to be KittyCore contract.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Places a bid for siring. Requires the sender\n /// is the KittyCore contract because all bid methods\n /// should be wrapped. Also returns the kitty to the\n /// seller rather than the winner.\n function bid(uint256 _tokenId)\n external\n payable\n {\n require(msg.sender == address(nonFungibleContract));\n address seller = tokenIdToAuction[_tokenId].seller;\n // _bid checks that token ID is valid and will throw if bid fails\n _bid(_tokenId, msg.value);\n // We transfer the kitty back to the seller, the winner will get\n // the offspring\n _transfer(seller, _tokenId);\n }\n\n}\n\n\n\n\n\n/// @title Clock auction modified for sale of kitties\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SaleClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSaleAuctionAddress() call.\n bool public isSaleClockAuction = true;\n\n // Tracks last 5 sale price of gen0 kitty sales\n uint256 public gen0SaleCount;\n uint256[5] public lastGen0SalePrices;\n\n // Delegate constructor\n function SaleClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Updates lastSalePrice if seller is the nft contract\n /// Otherwise, works the same as default bid method.\n function bid(uint256 _tokenId)\n external\n payable\n {\n // _bid verifies token ID size\n address seller = tokenIdToAuction[_tokenId].seller;\n uint256 price = _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n\n // If not a gen0 auction, exit\n if (seller == address(nonFungibleContract)) {\n // Track gen0 sale prices\n lastGen0SalePrices[gen0SaleCount % 5] = price;\n gen0SaleCount++;\n }\n }\n\n function averageGen0SalePrice() external view returns (uint256) {\n uint256 sum = 0;\n for (uint256 i = 0; i < 5; i++) {\n sum += lastGen0SalePrices[i];\n }\n return sum / 5;\n }\n\n}\n\n\n/// @title Handles creating auctions for sale and siring of kitties.\n/// This wrapper of ReverseAuction exists only so that users can create\n/// auctions with only one transaction.\ncontract KittyAuction is KittyBreeding {\n\n // @notice The auction contract variables are defined in KittyBase to allow\n // us to refer to them in KittyOwnership to prevent accidental transfers.\n // `saleAuction` refers to the auction for gen0 and p2p sale of kitties.\n // `siringAuction` refers to the auction for siring rights of kitties.\n\n /// @dev Sets the reference to the sale auction.\n /// @param _address - Address of sale contract.\n function setSaleAuctionAddress(address _address) external onlyCEO {\n SaleClockAuction candidateContract = SaleClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSaleClockAuction());\n\n // Set the new contract address\n saleAuction = candidateContract;\n }\n\n /// @dev Sets the reference to the siring auction.\n /// @param _address - Address of siring contract.\n function setSiringAuctionAddress(address _address) external onlyCEO {\n SiringClockAuction candidateContract = SiringClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSiringClockAuction());\n\n // Set the new contract address\n siringAuction = candidateContract;\n }\n\n /// @dev Put a kitty up for auction.\n /// Does some ownership trickery to create auctions in one tx.\n function createSaleAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n // Ensure the kitty is not pregnant to prevent the auction\n // contract accidentally receiving ownership of the child.\n // NOTE: the kitty IS allowed to be in a cooldown.\n require(!isPregnant(_kittyId));\n _approve(_kittyId, saleAuction);\n // Sale auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n saleAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Put a kitty up for auction to be sire.\n /// Performs checks to ensure the kitty can be sired, then\n /// delegates to reverse auction.\n function createSiringAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n require(isReadyToBreed(_kittyId));\n _approve(_kittyId, siringAuction);\n // Siring auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n siringAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Completes a siring auction by bidding.\n /// Immediately breeds the winning matron with the sire on auction.\n /// @param _sireId - ID of the sire on auction.\n /// @param _matronId - ID of the matron owned by the bidder.\n function bidOnSiringAuction(\n uint256 _sireId,\n uint256 _matronId\n )\n external\n payable\n whenNotPaused\n {\n // Auction contract checks input sizes\n require(_owns(msg.sender, _matronId));\n require(isReadyToBreed(_matronId));\n require(_canBreedWithViaAuction(_matronId, _sireId));\n\n // Define the current price of the auction.\n uint256 currentPrice = siringAuction.getCurrentPrice(_sireId);\n require(msg.value >= currentPrice + autoBirthFee);\n\n // Siring auction will throw if the bid fails.\n siringAuction.bid.value(msg.value - autoBirthFee)(_sireId);\n _breedWith(uint32(_matronId), uint32(_sireId));\n }\n\n /// @dev Transfers the balance of the sale auction contract\n /// to the KittyCore contract. We use two-step withdrawal to\n /// prevent two transfer calls in the auction bid function.\n function withdrawAuctionBalances() external onlyCLevel {\n saleAuction.withdrawBalance();\n siringAuction.withdrawBalance();\n }\n}\n\n\n/// @title all functions related to creating kittens\ncontract KittyMinting is KittyAuction {\n\n // Limits the number of cats the contract owner can ever create.\n uint256 public constant PROMO_CREATION_LIMIT = 5000;\n uint256 public constant GEN0_CREATION_LIMIT = 45000;\n\n // Constants for gen0 auctions.\n uint256 public constant GEN0_STARTING_PRICE = 10 finney;\n uint256 public constant GEN0_AUCTION_DURATION = 1 days;\n\n // Counts the number of cats the contract owner has created.\n uint256 public promoCreatedCount;\n uint256 public gen0CreatedCount;\n\n /// @dev we can create promo kittens, up to a limit. Only callable by COO\n /// @param _genes the encoded genes of the kitten to be created, any value is accepted\n /// @param _owner the future owner of the created kittens. Default to contract COO\n function createPromoKitty(uint256 _genes, address _owner) external onlyCOO {\n address kittyOwner = _owner;\n if (kittyOwner == address(0)) {\n kittyOwner = cooAddress;\n }\n require(promoCreatedCount < PROMO_CREATION_LIMIT);\n\n promoCreatedCount++;\n _createKitty(0, 0, 0, _genes, kittyOwner);\n }\n\n /// @dev Creates a new gen0 kitty with the given genes and\n /// creates an auction for it.\n function createGen0Auction(uint256 _genes) external onlyCOO {\n require(gen0CreatedCount < GEN0_CREATION_LIMIT);\n\n uint256 kittyId = _createKitty(0, 0, 0, _genes, address(this));\n _approve(kittyId, saleAuction);\n\n saleAuction.createAuction(\n kittyId,\n _computeNextGen0Price(),\n 0,\n GEN0_AUCTION_DURATION,\n address(this)\n );\n\n gen0CreatedCount++;\n }\n\n /// @dev Computes the next gen0 auction starting price, given\n /// the average of the past 5 prices + 50%.\n function _computeNextGen0Price() internal view returns (uint256) {\n uint256 avePrice = saleAuction.averageGen0SalePrice();\n\n // Sanity check to ensure we don't overflow arithmetic\n require(avePrice == uint256(uint128(avePrice)));\n\n uint256 nextPrice = avePrice + (avePrice / 2);\n\n // We never auction for less than starting price\n if (nextPrice < GEN0_STARTING_PRICE) {\n nextPrice = GEN0_STARTING_PRICE;\n }\n\n return nextPrice;\n }\n}\n\n\n/// @title CryptoKitties: Collectible, breedable, and oh-so-adorable cats on the Ethereum blockchain.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev The main CryptoKitties contract, keeps track of kittens so they don't wander around and get lost.\ncontract KittyCore is KittyMinting {\n\n // This is the main CryptoKitties contract. In order to keep our code seperated into logical sections,\n // we've broken it up in two ways. First, we have several seperately-instantiated sibling contracts\n // that handle auctions and our super-top-secret genetic combination algorithm. The auctions are\n // seperate since their logic is somewhat complex and there's always a risk of subtle bugs. By keeping\n // them in their own contracts, we can upgrade them without disrupting the main contract that tracks\n // kitty ownership. The genetic combination algorithm is kept seperate so we can open-source all of\n // the rest of our code without making it _too_ easy for folks to figure out how the genetics work.\n // Don't worry, I'm sure someone will reverse engineer it soon enough!\n //\n // Secondly, we break the core contract into multiple files using inheritence, one for each major\n // facet of functionality of CK. This allows us to keep related code bundled together while still\n // avoiding a single giant file with everything in it. The breakdown is as follows:\n //\n // - KittyBase: This is where we define the most fundamental code shared throughout the core\n // functionality. This includes our main data storage, constants and data types, plus\n // internal functions for managing these items.\n //\n // - KittyAccessControl: This contract manages the various addresses and constraints for operations\n // that can be executed only by specific roles. Namely CEO, CFO and COO.\n //\n // - KittyOwnership: This provides the methods required for basic non-fungible token\n // transactions, following the draft ERC-721 spec (https://github.com/ethereum/EIPs/issues/721).\n //\n // - KittyBreeding: This file contains the methods necessary to breed cats together, including\n // keeping track of siring offers, and relies on an external genetic combination contract.\n //\n // - KittyAuctions: Here we have the public methods for auctioning or bidding on cats or siring\n // services. The actual auction functionality is handled in two sibling contracts (one\n // for sales and one for siring), while auction creation and bidding is mostly mediated\n // through this facet of the core contract.\n //\n // - KittyMinting: This final facet contains the functionality we use for creating new gen0 cats.\n // We can make up to 5000 \"promo\" cats that can be given away (especially important when\n // the community is new), and all others can only be created and then immediately put up\n // for auction via an algorithmically determined starting price. Regardless of how they\n // are created, there is a hard limit of 50k gen0 cats. After that, it's all up to the\n // community to breed, breed, breed!\n\n // Set in case the core contract is broken and an upgrade is required\n address public newContractAddress;\n\n /// @notice Creates the main CryptoKitties smart contract instance.\n function KittyCore() public {\n // Starts paused.\n paused = true;\n\n // the creator of the contract is the initial CEO\n ceoAddress = msg.sender;\n\n // the creator of the contract is also the initial COO\n cooAddress = msg.sender;\n\n // start with the mythical kitten 0 - so we don't have generation-0 parent issues\n _createKitty(0, 0, 0, uint256(-1), address(0));\n }\n\n /// @dev Used to mark the smart contract as upgraded, in case there is a serious\n /// breaking bug. This method does nothing but keep track of the new contract and\n /// emit a message indicating that the new address is set. It's up to clients of this\n /// contract to update to the new contract address in that case. (This contract will\n /// be paused indefinitely if such an upgrade takes place.)\n /// @param _v2Address new address\n function setNewAddress(address _v2Address) external onlyCEO whenPaused {\n // See README.md for updgrade plan\n newContractAddress = _v2Address;\n ContractUpgrade(_v2Address);\n }\n\n /// @notice No tipping!\n /// @dev Reject all Ether from being sent here, unless it's from one of the\n /// two auction contracts. (Hopefully, we can prevent user accidents.)\n function() external payable {\n require(\n msg.sender == address(saleAuction) ||\n msg.sender == address(siringAuction)\n );\n }\n\n /// @notice Returns all the relevant information about a specific kitty.\n /// @param _id The ID of the kitty of interest.\n function getKitty(uint256 _id)\n external\n view\n returns (\n bool isGestating,\n bool isReady,\n uint256 cooldownIndex,\n uint256 nextActionAt,\n uint256 siringWithId,\n uint256 birthTime,\n uint256 matronId,\n uint256 sireId,\n uint256 generation,\n uint256 genes\n ) {\n Kitty storage kit = kitties[_id];\n\n // if this variable is 0 then it's not gestating\n isGestating = (kit.siringWithId != 0);\n isReady = (kit.cooldownEndBlock <= block.number);\n cooldownIndex = uint256(kit.cooldownIndex);\n nextActionAt = uint256(kit.cooldownEndBlock);\n siringWithId = uint256(kit.siringWithId);\n birthTime = uint256(kit.birthTime);\n matronId = uint256(kit.matronId);\n sireId = uint256(kit.sireId);\n generation = uint256(kit.generation);\n genes = kit.genes;\n }\n\n /// @dev Override unpause so it requires all external contract addresses\n /// to be set before contract can be unpaused. Also, we can't have\n /// newContractAddress set either, because then the contract was upgraded.\n /// @notice This is public rather than external so we can call super.unpause\n /// without using an expensive CALL.\n function unpause() public onlyCEO whenPaused {\n require(saleAuction != address(0));\n require(siringAuction != address(0));\n require(geneScience != address(0));\n require(newContractAddress == address(0));\n\n // Actually unpause the contract.\n super.unpause();\n }\n\n // @dev Allows the CFO to capture the balance available to the contract.\n function withdrawBalance() external onlyCFO {\n uint256 balance = this.balance;\n // Subtract all the currently pregnant kittens we have, plus 1 of margin.\n uint256 subtractFees = (pregnantKitties + 1) * autoBirthFee;\n\n if (balance > subtractFees) {\n cfoAddress.send(balance - subtractFees);\n }\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "exportedSymbols": { "ClockAuction": [ 8872 @@ -51963,5 +51963,5 @@ }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:47.614Z" + "updatedAt": "2018-10-09T17:45:36.032Z" } \ No newline at end of file diff --git a/artifacts/json/ClockAuctionBase.json b/artifacts/json/ClockAuctionBase.json index 52b643f1..af505b11 100644 --- a/artifacts/json/ClockAuctionBase.json +++ b/artifacts/json/ClockAuctionBase.json @@ -91,15 +91,15 @@ "type": "event" } ], - "bytecode": "0x6060604052341561000f57600080fd5b61011d8061001e6000396000f3006060604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806383b5ff8b14604e578063dd1b7a0f146074575b600080fd5b3415605857600080fd5b605e60c6565b6040518082815260200191505060405180910390f35b3415607e57600080fd5b608460cc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60015481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16815600a165627a7a723058206b944cbdf572d07dea6a872a3e2839b98365d3f4bcbdbcffbf18fab77a6481900029", - "deployedBytecode": "0x6060604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806383b5ff8b14604e578063dd1b7a0f146074575b600080fd5b3415605857600080fd5b605e60c6565b6040518082815260200191505060405180910390f35b3415607e57600080fd5b608460cc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60015481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16815600a165627a7a723058206b944cbdf572d07dea6a872a3e2839b98365d3f4bcbdbcffbf18fab77a6481900029", + "bytecode": "0x6060604052341561000f57600080fd5b61011d8061001e6000396000f3006060604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806383b5ff8b14604e578063dd1b7a0f146074575b600080fd5b3415605857600080fd5b605e60c6565b6040518082815260200191505060405180910390f35b3415607e57600080fd5b608460cc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60015481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16815600a165627a7a723058209a72cd1348e94b6f694fe512101797123261f2d93c61a1e62520701ce6cbae3d0029", + "deployedBytecode": "0x6060604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806383b5ff8b14604e578063dd1b7a0f146074575b600080fd5b3415605857600080fd5b605e60c6565b6040518082815260200191505060405180910390f35b3415607e57600080fd5b608460cc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60015481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16815600a165627a7a723058209a72cd1348e94b6f694fe512101797123261f2d93c61a1e62520701ce6cbae3d0029", "sourceMap": "44379:9719:18:-;;;;;;;;;;;;;;;;;", "deployedSourceMap": "44379:9719:18:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45099:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44927:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45099:23;;;;:::o;44927:40::-;;;;;;;;;;;;;:::o", "source": "pragma solidity 0.4.18;\n\n/**\n The following contract code, titled KittyCore, was written by Cryptokitties and published\n and retrieved from https://etherscan.io/address/0x06012c8cf97bead5deae237070f9587f8e7a266d#code.\n\n It is included in the current project for test purposes, to ensure that our collateralizer can\n handle ERC721 tokens created by the KittyCore contract.\n*/\n\n/**\n * @title KittiesOwnable\n * @dev The KittiesOwnable contract has an owner address, and provides basic authorization control\n * functions, this simplifies the implementation of \"user permissions\".\n */\ncontract KittiesOwnable {\n address public owner;\n\n\n /**\n\t * @dev The KittiesOwnable constructor sets the original `owner` of the contract to the sender\n\t * account.\n\t */\n function KittiesOwnable() {\n owner = msg.sender;\n }\n\n\n /**\n\t * @dev Throws if called by any account other than the owner.\n\t */\n modifier onlyOwner() {\n require(msg.sender == owner);\n _;\n }\n\n\n /**\n\t * @dev Allows the current owner to transfer control of the contract to a newOwner.\n\t * @param newOwner The address to transfer ownership to.\n\t */\n function transferOwnership(address newOwner) onlyOwner {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n\n}\n\n\n\n/// @title Interface for contracts conforming to ERC-721: Non-Fungible Tokens\n/// @author Dieter Shirley (https://github.com/dete)\ncontract KittiesERC721 {\n // Required methods\n function totalSupply() public view returns (uint256 total);\n function balanceOf(address _owner) public view returns (uint256 balance);\n function ownerOf(uint256 _tokenId) external view returns (address owner);\n function approve(address _to, uint256 _tokenId) external;\n function transfer(address _to, uint256 _tokenId) external;\n function transferFrom(address _from, address _to, uint256 _tokenId) external;\n\n // Events\n event Transfer(address from, address to, uint256 tokenId);\n event Approval(address owner, address approved, uint256 tokenId);\n\n // Optional\n // function name() public view returns (string name);\n // function symbol() public view returns (string symbol);\n // function tokensOfOwner(address _owner) external view returns (uint256[] tokenIds);\n // function tokenMetadata(uint256 _tokenId, string _preferredTransport) public view returns (string infoUrl);\n\n // ERC-165 Compatibility (https://github.com/ethereum/EIPs/issues/165)\n function supportsInterface(bytes4 _interfaceID) external view returns (bool);\n}\n\n\n// // Auction wrapper functions\n\n\n// Auction wrapper functions\n\n\n\n\n\n\n\n/// @title SEKRETOOOO\ncontract GeneScienceInterface {\n /// @dev simply a boolean to indicate this is the contract we expect to be\n function isGeneScience() public pure returns (bool);\n\n /// @dev given genes of kitten 1 & 2, return a genetic combination - may have a random factor\n /// @param genes1 genes of mom\n /// @param genes2 genes of sire\n /// @return the genes that are supposed to be passed down the child\n function mixGenes(uint256 genes1, uint256 genes2, uint256 targetBlock) public returns (uint256);\n}\n\n\n\n\n\n\n\n/// @title A facet of KittyCore that manages special access privileges.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyAccessControl {\n // This facet controls access control for CryptoKitties. There are four roles managed here:\n //\n // - The CEO: The CEO can reassign other roles and change the addresses of our dependent smart\n // contracts. It is also the only role that can unpause the smart contract. It is initially\n // set to the address that created the smart contract in the KittyCore constructor.\n //\n // - The CFO: The CFO can withdraw funds from KittyCore and its auction contracts.\n //\n // - The COO: The COO can release gen0 kitties to auction, and mint promo cats.\n //\n // It should be noted that these roles are distinct without overlap in their access abilities, the\n // abilities listed for each role above are exhaustive. In particular, while the CEO can assign any\n // address to any role, the CEO address itself doesn't have the ability to act in those roles. This\n // restriction is intentional so that we aren't tempted to use the CEO address frequently out of\n // convenience. The less we use an address, the less likely it is that we somehow compromise the\n // account.\n\n /// @dev Emited when contract is upgraded - See README.md for updgrade plan\n event ContractUpgrade(address newContract);\n\n // The addresses of the accounts (or contracts) that can execute actions within each roles.\n address public ceoAddress;\n address public cfoAddress;\n address public cooAddress;\n\n // @dev Keeps track whether the contract is paused. When that is true, most actions are blocked\n bool public paused = false;\n\n /// @dev Access modifier for CEO-only functionality\n modifier onlyCEO() {\n require(msg.sender == ceoAddress);\n _;\n }\n\n /// @dev Access modifier for CFO-only functionality\n modifier onlyCFO() {\n require(msg.sender == cfoAddress);\n _;\n }\n\n /// @dev Access modifier for COO-only functionality\n modifier onlyCOO() {\n require(msg.sender == cooAddress);\n _;\n }\n\n modifier onlyCLevel() {\n require(\n msg.sender == cooAddress ||\n msg.sender == ceoAddress ||\n msg.sender == cfoAddress\n );\n _;\n }\n\n /// @dev Assigns a new address to act as the CEO. Only available to the current CEO.\n /// @param _newCEO The address of the new CEO\n function setCEO(address _newCEO) external onlyCEO {\n require(_newCEO != address(0));\n\n ceoAddress = _newCEO;\n }\n\n /// @dev Assigns a new address to act as the CFO. Only available to the current CEO.\n /// @param _newCFO The address of the new CFO\n function setCFO(address _newCFO) external onlyCEO {\n require(_newCFO != address(0));\n\n cfoAddress = _newCFO;\n }\n\n /// @dev Assigns a new address to act as the COO. Only available to the current CEO.\n /// @param _newCOO The address of the new COO\n function setCOO(address _newCOO) external onlyCEO {\n require(_newCOO != address(0));\n\n cooAddress = _newCOO;\n }\n\n /*** KittiesPausable functionality adapted from OpenZeppelin ***/\n\n /// @dev Modifier to allow actions only when the contract IS NOT paused\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /// @dev Modifier to allow actions only when the contract IS paused\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /// @dev Called by any \"C-level\" role to pause the contract. Used only when\n /// a bug or exploit is detected and we need to limit damage.\n function pause() external onlyCLevel whenNotPaused {\n paused = true;\n }\n\n /// @dev Unpauses the smart contract. Can only be called by the CEO, since\n /// one reason we may pause the contract is when CFO or COO accounts are\n /// compromised.\n /// @notice This is public rather than external so it can be called by\n /// derived contracts.\n function unpause() public onlyCEO whenPaused {\n // can't unpause if contract was upgraded\n paused = false;\n }\n}\n\n\n\n\n/// @title Base contract for CryptoKitties. Holds all common structs, events and base variables.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBase is KittyAccessControl {\n /*** EVENTS ***/\n\n /// @dev The Birth event is fired whenever a new kitten comes into existence. This obviously\n /// includes any time a cat is created through the giveBirth method, but it is also called\n /// when a new gen0 cat is created.\n event Birth(address owner, uint256 kittyId, uint256 matronId, uint256 sireId, uint256 genes);\n\n /// @dev Transfer event as defined in current draft of ERC721. Emitted every time a kitten\n /// ownership is assigned, including births.\n event Transfer(address from, address to, uint256 tokenId);\n\n /*** DATA TYPES ***/\n\n /// @dev The main Kitty struct. Every cat in CryptoKitties is represented by a copy\n /// of this structure, so great care was taken to ensure that it fits neatly into\n /// exactly two 256-bit words. Note that the order of the members in this structure\n /// is important because of the byte-packing rules used by Ethereum.\n /// Ref: http://solidity.readthedocs.io/en/develop/miscellaneous.html\n struct Kitty {\n // The Kitty's genetic code is packed into these 256-bits, the format is\n // sooper-sekret! A cat's genes never change.\n uint256 genes;\n\n // The timestamp from the block when this cat came into existence.\n uint64 birthTime;\n\n // The minimum timestamp after which this cat can engage in breeding\n // activities again. This same timestamp is used for the pregnancy\n // timer (for matrons) as well as the siring cooldown.\n uint64 cooldownEndBlock;\n\n // The ID of the parents of this kitty, set to 0 for gen0 cats.\n // Note that using 32-bit unsigned integers limits us to a \"mere\"\n // 4 billion cats. This number might seem small until you realize\n // that Ethereum currently has a limit of about 500 million\n // transactions per year! So, this definitely won't be a problem\n // for several years (even as Ethereum learns to scale).\n uint32 matronId;\n uint32 sireId;\n\n // Set to the ID of the sire cat for matrons that are pregnant,\n // zero otherwise. A non-zero value here is how we know a cat\n // is pregnant. Used to retrieve the genetic material for the new\n // kitten when the birth transpires.\n uint32 siringWithId;\n\n // Set to the index in the cooldown array (see below) that represents\n // the current cooldown duration for this Kitty. This starts at zero\n // for gen0 cats, and is initialized to floor(generation/2) for others.\n // Incremented by one for each successful breeding action, regardless\n // of whether this cat is acting as matron or sire.\n uint16 cooldownIndex;\n\n // The \"generation number\" of this cat. Cats minted by the CK contract\n // for sale are called \"gen0\" and have a generation number of 0. The\n // generation number of all other cats is the larger of the two generation\n // numbers of their parents, plus one.\n // (i.e. max(matron.generation, sire.generation) + 1)\n uint16 generation;\n }\n\n /*** CONSTANTS ***/\n\n /// @dev A lookup table indicating the cooldown duration after any successful\n /// breeding action, called \"pregnancy time\" for matrons and \"siring cooldown\"\n /// for sires. Designed such that the cooldown roughly doubles each time a cat\n /// is bred, encouraging owners not to just keep breeding the same cat over\n /// and over again. Caps out at one week (a cat can breed an unbounded number\n /// of times, and the maximum cooldown is always seven days).\n uint32[14] public cooldowns = [\n uint32(1 minutes),\n uint32(2 minutes),\n uint32(5 minutes),\n uint32(10 minutes),\n uint32(30 minutes),\n uint32(1 hours),\n uint32(2 hours),\n uint32(4 hours),\n uint32(8 hours),\n uint32(16 hours),\n uint32(1 days),\n uint32(2 days),\n uint32(4 days),\n uint32(7 days)\n ];\n\n // An approximation of currently how many seconds are in between blocks.\n uint256 public secondsPerBlock = 15;\n\n /*** STORAGE ***/\n\n /// @dev An array containing the Kitty struct for all Kitties in existence. The ID\n /// of each cat is actually an index into this array. Note that ID 0 is a negacat,\n /// the unKitty, the mythical beast that is the parent of all gen0 cats. A bizarre\n /// creature that is both matron and sire... to itself! Has an invalid genetic code.\n /// In other words, cat ID 0 is invalid... ;-)\n Kitty[] kitties;\n\n /// @dev A mapping from cat IDs to the address that owns them. All cats have\n /// some valid owner address, even gen0 cats are created with a non-zero owner.\n mapping (uint256 => address) public kittyIndexToOwner;\n\n // @dev A mapping from owner address to count of tokens that address owns.\n // Used internally inside balanceOf() to resolve ownership count.\n mapping (address => uint256) ownershipTokenCount;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to call\n /// transferFrom(). Each Kitty can only have one approved address for transfer\n /// at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public kittyIndexToApproved;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to use\n /// this Kitty for siring via breedWith(). Each Kitty can only have one approved\n /// address for siring at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public sireAllowedToAddress;\n\n /// @dev The address of the ClockAuction contract that handles sales of Kitties. This\n /// same contract handles both peer-to-peer sales as well as the gen0 sales which are\n /// initiated every 15 minutes.\n SaleClockAuction public saleAuction;\n\n /// @dev The address of a custom ClockAuction subclassed contract that handles siring\n /// auctions. Needs to be separate from saleAuction because the actions taken on success\n /// after a sales and siring auction are quite different.\n SiringClockAuction public siringAuction;\n\n /// @dev Assigns ownership of a specific Kitty to an address.\n function _transfer(address _from, address _to, uint256 _tokenId) internal {\n // Since the number of kittens is capped to 2^32 we can't overflow this\n ownershipTokenCount[_to]++;\n // transfer ownership\n kittyIndexToOwner[_tokenId] = _to;\n // When creating new kittens _from is 0x0, but we can't account that address.\n if (_from != address(0)) {\n ownershipTokenCount[_from]--;\n // once the kitten is transferred also clear sire allowances\n delete sireAllowedToAddress[_tokenId];\n // clear any previously approved ownership exchange\n delete kittyIndexToApproved[_tokenId];\n }\n // Emit the transfer event.\n Transfer(_from, _to, _tokenId);\n }\n\n /// @dev An internal method that creates a new kitty and stores it. This\n /// method doesn't do any checking and should only be called when the\n /// input data is known to be valid. Will generate both a Birth event\n /// and a Transfer event.\n /// @param _matronId The kitty ID of the matron of this cat (zero for gen0)\n /// @param _sireId The kitty ID of the sire of this cat (zero for gen0)\n /// @param _generation The generation number of this cat, must be computed by caller.\n /// @param _genes The kitty's genetic code.\n /// @param _owner The inital owner of this cat, must be non-zero (except for the unKitty, ID 0)\n function _createKitty(\n uint256 _matronId,\n uint256 _sireId,\n uint256 _generation,\n uint256 _genes,\n address _owner\n )\n internal\n returns (uint)\n {\n // These requires are not strictly necessary, our calling code should make\n // sure that these conditions are never broken. However! _createKitty() is already\n // an expensive call (for storage), and it doesn't hurt to be especially careful\n // to ensure our data structures are always valid.\n require(_matronId == uint256(uint32(_matronId)));\n require(_sireId == uint256(uint32(_sireId)));\n require(_generation == uint256(uint16(_generation)));\n\n // New kitty starts with the same cooldown as parent gen/2\n uint16 cooldownIndex = uint16(_generation / 2);\n if (cooldownIndex > 13) {\n cooldownIndex = 13;\n }\n\n Kitty memory _kitty = Kitty({\n genes: _genes,\n birthTime: uint64(now),\n cooldownEndBlock: 0,\n matronId: uint32(_matronId),\n sireId: uint32(_sireId),\n siringWithId: 0,\n cooldownIndex: cooldownIndex,\n generation: uint16(_generation)\n });\n uint256 newKittenId = kitties.push(_kitty) - 1;\n\n // It's probably never going to happen, 4 billion cats is A LOT, but\n // let's just be 100% sure we never let this happen.\n require(newKittenId == uint256(uint32(newKittenId)));\n\n // emit the birth event\n Birth(\n _owner,\n newKittenId,\n uint256(_kitty.matronId),\n uint256(_kitty.sireId),\n _kitty.genes\n );\n\n // This will assign ownership, and also emit the Transfer event as\n // per ERC721 draft\n _transfer(0, _owner, newKittenId);\n\n return newKittenId;\n }\n\n // Any C-level can fix how many seconds per blocks are currently observed.\n function setSecondsPerBlock(uint256 secs) external onlyCLevel {\n require(secs < cooldowns[0]);\n secondsPerBlock = secs;\n }\n}\n\n\n\n\n\n/// @title The external contract that is responsible for generating metadata for the kitties,\n/// it has one function that will return the data as bytes.\ncontract KittiesERC721Metadata {\n /// @dev Given a token Id, returns a byte array that is supposed to be converted into string.\n function getMetadata(uint256 _tokenId, string) public view returns (bytes32[4] buffer, uint256 count) {\n if (_tokenId == 1) {\n buffer[0] = \"Hello World! :D\";\n count = 15;\n } else if (_tokenId == 2) {\n buffer[0] = \"I would definitely choose a medi\";\n buffer[1] = \"um length string.\";\n count = 49;\n } else if (_tokenId == 3) {\n buffer[0] = \"Lorem ipsum dolor sit amet, mi e\";\n buffer[1] = \"st accumsan dapibus augue lorem,\";\n buffer[2] = \" tristique vestibulum id, libero\";\n buffer[3] = \" suscipit varius sapien aliquam.\";\n count = 128;\n }\n }\n}\n\n\n/// @title The facet of the CryptoKitties core contract that manages ownership, ERC-721 (draft) compliant.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev Ref: https://github.com/ethereum/EIPs/issues/721\n/// See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyOwnership is KittyBase, KittiesERC721 {\n\n /// @notice Name and symbol of the non fungible token, as defined in ERC721.\n string public constant name = \"CryptoKitties\";\n string public constant symbol = \"CK\";\n\n // The contract that will return kitty metadata\n KittiesERC721Metadata public erc721Metadata;\n\n bytes4 constant InterfaceSignature_ERC165 =\n bytes4(keccak256('supportsInterface(bytes4)'));\n\n bytes4 constant InterfaceSignature_ERC721 =\n bytes4(keccak256('name()')) ^\n bytes4(keccak256('symbol()')) ^\n bytes4(keccak256('totalSupply()')) ^\n bytes4(keccak256('balanceOf(address)')) ^\n bytes4(keccak256('ownerOf(uint256)')) ^\n bytes4(keccak256('approve(address,uint256)')) ^\n bytes4(keccak256('transfer(address,uint256)')) ^\n bytes4(keccak256('transferFrom(address,address,uint256)')) ^\n bytes4(keccak256('tokensOfOwner(address)')) ^\n bytes4(keccak256('tokenMetadata(uint256,string)'));\n\n /// @notice Introspection interface as per ERC-165 (https://github.com/ethereum/EIPs/issues/165).\n /// Returns true for any standardized interfaces implemented by this contract. We implement\n /// ERC-165 (obviously!) and ERC-721.\n function supportsInterface(bytes4 _interfaceID) external view returns (bool)\n {\n // DEBUG ONLY\n //require((InterfaceSignature_ERC165 == 0x01ffc9a7) && (InterfaceSignature_ERC721 == 0x9a20483d));\n\n return ((_interfaceID == InterfaceSignature_ERC165) || (_interfaceID == InterfaceSignature_ERC721));\n }\n\n /// @dev Set the address of the sibling contract that tracks metadata.\n /// CEO only.\n function setMetadataAddress(address _contractAddress) public onlyCEO {\n erc721Metadata = KittiesERC721Metadata(_contractAddress);\n }\n\n // Internal utility functions: These functions all assume that their input arguments\n // are valid. We leave it to public methods to sanitize their inputs and follow\n // the required logic.\n\n /// @dev Checks if a given address is the current owner of a particular Kitty.\n /// @param _claimant the address we are validating against.\n /// @param _tokenId kitten id, only valid when > 0\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToOwner[_tokenId] == _claimant;\n }\n\n /// @dev Checks if a given address currently has transferApproval for a particular Kitty.\n /// @param _claimant the address we are confirming kitten is approved for.\n /// @param _tokenId kitten id, only valid when > 0\n function _approvedFor(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToApproved[_tokenId] == _claimant;\n }\n\n /// @dev Marks an address as being approved for transferFrom(), overwriting any previous\n /// approval. Setting _approved to address(0) clears all transfer approval.\n /// NOTE: _approve() does NOT send the Approval event. This is intentional because\n /// _approve() and transferFrom() are used together for putting Kitties on auction, and\n /// there is no value in spamming the log with Approval events in that case.\n function _approve(uint256 _tokenId, address _approved) internal {\n kittyIndexToApproved[_tokenId] = _approved;\n }\n\n /// @notice Returns the number of Kitties owned by a specific address.\n /// @param _owner The owner address to check.\n /// @dev Required for ERC-721 compliance\n function balanceOf(address _owner) public view returns (uint256 count) {\n return ownershipTokenCount[_owner];\n }\n\n /// @notice Transfers a Kitty to another address. If transferring to a smart\n /// contract be VERY CAREFUL to ensure that it is aware of ERC-721 (or\n /// CryptoKitties specifically) or your Kitty may be lost forever. Seriously.\n /// @param _to The address of the recipient, can be a user or contract.\n /// @param _tokenId The ID of the Kitty to transfer.\n /// @dev Required for ERC-721 compliance.\n function transfer(\n address _to,\n uint256 _tokenId\n )\n external\n whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Disallow transfers to the auction contracts to prevent accidental\n // misuse. Auction contracts should only take ownership of kitties\n // through the allow + transferFrom flow.\n require(_to != address(saleAuction));\n require(_to != address(siringAuction));\n\n // You can only send your own cat.\n require(_owns(msg.sender, _tokenId));\n\n // Reassign ownership, clear pending approvals, emit Transfer event.\n _transfer(msg.sender, _to, _tokenId);\n }\n\n /// @notice Grant another address the right to transfer a specific Kitty via\n /// transferFrom(). This is the preferred flow for transfering NFTs to contracts.\n /// @param _to The address to be granted transfer approval. Pass address(0) to\n /// clear all approvals.\n /// @param _tokenId The ID of the Kitty that can be transferred if this call succeeds.\n /// @dev Required for ERC-721 compliance.\n function approve(\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Only an owner can grant transfer approval.\n require(_owns(msg.sender, _tokenId));\n\n // Register the approval (replacing any previous approval).\n _approve(_tokenId, _to);\n\n // Emit approval event.\n Approval(msg.sender, _to, _tokenId);\n }\n\n /// @notice Transfer a Kitty owned by another address, for which the calling address\n /// has previously been granted transfer approval by the owner.\n /// @param _from The address that owns the Kitty to be transfered.\n /// @param _to The address that should take ownership of the Kitty. Can be any address,\n /// including the caller.\n /// @param _tokenId The ID of the Kitty to be transferred.\n /// @dev Required for ERC-721 compliance.\n function transferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Check for approval and valid ownership\n require(_approvedFor(msg.sender, _tokenId));\n require(_owns(_from, _tokenId));\n\n // Reassign ownership (also clears pending approvals and emits Transfer event).\n _transfer(_from, _to, _tokenId);\n }\n\n /// @notice Returns the total number of Kitties currently in existence.\n /// @dev Required for ERC-721 compliance.\n function totalSupply() public view returns (uint) {\n return kitties.length - 1;\n }\n\n /// @notice Returns the address currently assigned ownership of a given Kitty.\n /// @dev Required for ERC-721 compliance.\n function ownerOf(uint256 _tokenId)\n external\n view\n returns (address owner)\n {\n owner = kittyIndexToOwner[_tokenId];\n\n require(owner != address(0));\n }\n\n /// @notice Returns a list of all Kitty IDs assigned to an address.\n /// @param _owner The owner whose Kitties we are interested in.\n /// @dev This method MUST NEVER be called by smart contract code. First, it's fairly\n /// expensive (it walks the entire Kitty array looking for cats belonging to owner),\n /// but it also returns a dynamic array, which is only supported for web3 calls, and\n /// not contract-to-contract calls.\n function tokensOfOwner(address _owner) external view returns(uint256[] ownerTokens) {\n uint256 tokenCount = balanceOf(_owner);\n\n if (tokenCount == 0) {\n // Return an empty array\n return new uint256[](0);\n } else {\n uint256[] memory result = new uint256[](tokenCount);\n uint256 totalCats = totalSupply();\n uint256 resultIndex = 0;\n\n // We count on the fact that all cats have IDs starting at 1 and increasing\n // sequentially up to the totalCat count.\n uint256 catId;\n\n for (catId = 1; catId <= totalCats; catId++) {\n if (kittyIndexToOwner[catId] == _owner) {\n result[resultIndex] = catId;\n resultIndex++;\n }\n }\n\n return result;\n }\n }\n\n /// @dev Adapted from memcpy() by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _memcpy(uint _dest, uint _src, uint _len) private view {\n // Copy word-length chunks while possible\n for(; _len >= 32; _len -= 32) {\n assembly {\n mstore(_dest, mload(_src))\n }\n _dest += 32;\n _src += 32;\n }\n\n // Copy remaining bytes\n uint256 mask = 256 ** (32 - _len) - 1;\n assembly {\n let srcpart := and(mload(_src), not(mask))\n let destpart := and(mload(_dest), mask)\n mstore(_dest, or(destpart, srcpart))\n }\n }\n\n /// @dev Adapted from toString(slice) by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _toString(bytes32[4] _rawBytes, uint256 _stringLength) private view returns (string) {\n var outputString = new string(_stringLength);\n uint256 outputPtr;\n uint256 bytesPtr;\n\n assembly {\n outputPtr := add(outputString, 32)\n bytesPtr := _rawBytes\n }\n\n _memcpy(outputPtr, bytesPtr, _stringLength);\n\n return outputString;\n }\n\n /// @notice Returns a URI pointing to a metadata package for this token conforming to\n /// ERC-721 (https://github.com/ethereum/EIPs/issues/721)\n /// @param _tokenId The ID number of the Kitty whose metadata should be returned.\n function tokenMetadata(uint256 _tokenId, string _preferredTransport) external view returns (string infoUrl) {\n require(erc721Metadata != address(0));\n bytes32[4] memory buffer;\n uint256 count;\n (buffer, count) = erc721Metadata.getMetadata(_tokenId, _preferredTransport);\n\n return _toString(buffer, count);\n }\n}\n\n\n\n/// @title A facet of KittyCore that manages Kitty siring, gestation, and birth.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBreeding is KittyOwnership {\n\n /// @dev The Pregnant event is fired when two cats successfully breed and the pregnancy\n /// timer begins for the matron.\n event Pregnant(address owner, uint256 matronId, uint256 sireId, uint256 cooldownEndBlock);\n\n /// @notice The minimum payment required to use breedWithAuto(). This fee goes towards\n /// the gas cost paid by whatever calls giveBirth(), and can be dynamically updated by\n /// the COO role as the gas price changes.\n uint256 public autoBirthFee = 2 finney;\n\n // Keeps track of number of pregnant kitties.\n uint256 public pregnantKitties;\n\n /// @dev The address of the sibling contract that is used to implement the sooper-sekret\n /// genetic combination algorithm.\n GeneScienceInterface public geneScience;\n\n /// @dev Update the address of the genetic contract, can only be called by the CEO.\n /// @param _address An address of a GeneScience contract instance to be used from this point forward.\n function setGeneScienceAddress(address _address) external onlyCEO {\n GeneScienceInterface candidateContract = GeneScienceInterface(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isGeneScience());\n\n // Set the new contract address\n geneScience = candidateContract;\n }\n\n /// @dev Checks that a given kitten is able to breed. Requires that the\n /// current cooldown is finished (for sires) and also checks that there is\n /// no pending pregnancy.\n function _isReadyToBreed(Kitty _kit) internal view returns (bool) {\n // In addition to checking the cooldownEndBlock, we also need to check to see if\n // the cat has a pending birth; there can be some period of time between the end\n // of the pregnacy timer and the birth event.\n return (_kit.siringWithId == 0) && (_kit.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @dev Check if a sire has authorized breeding with this matron. True if both sire\n /// and matron have the same owner, or if the sire has given siring permission to\n /// the matron's owner (via approveSiring()).\n function _isSiringPermitted(uint256 _sireId, uint256 _matronId) internal view returns (bool) {\n address matronOwner = kittyIndexToOwner[_matronId];\n address sireOwner = kittyIndexToOwner[_sireId];\n\n // Siring is okay if they have same owner, or if the matron's owner was given\n // permission to breed with this sire.\n return (matronOwner == sireOwner || sireAllowedToAddress[_sireId] == matronOwner);\n }\n\n /// @dev Set the cooldownEndTime for the given Kitty, based on its current cooldownIndex.\n /// Also increments the cooldownIndex (unless it has hit the cap).\n /// @param _kitten A reference to the Kitty in storage which needs its timer started.\n function _triggerCooldown(Kitty storage _kitten) internal {\n // Compute an estimation of the cooldown time in blocks (based on current cooldownIndex).\n _kitten.cooldownEndBlock = uint64((cooldowns[_kitten.cooldownIndex]/secondsPerBlock) + block.number);\n\n // Increment the breeding count, clamping it at 13, which is the length of the\n // cooldowns array. We could check the array size dynamically, but hard-coding\n // this as a constant saves gas. Yay, Solidity!\n if (_kitten.cooldownIndex < 13) {\n _kitten.cooldownIndex += 1;\n }\n }\n\n /// @notice Grants approval to another user to sire with one of your Kitties.\n /// @param _addr The address that will be able to sire with your Kitty. Set to\n /// address(0) to clear all siring approvals for this Kitty.\n /// @param _sireId A Kitty that you own that _addr will now be able to sire with.\n function approveSiring(address _addr, uint256 _sireId)\n external\n whenNotPaused\n {\n require(_owns(msg.sender, _sireId));\n sireAllowedToAddress[_sireId] = _addr;\n }\n\n /// @dev Updates the minimum payment required for calling giveBirthAuto(). Can only\n /// be called by the COO address. (This fee is used to offset the gas cost incurred\n /// by the autobirth daemon).\n function setAutoBirthFee(uint256 val) external onlyCOO {\n autoBirthFee = val;\n }\n\n /// @dev Checks to see if a given Kitty is pregnant and (if so) if the gestation\n /// period has passed.\n function _isReadyToGiveBirth(Kitty _matron) private view returns (bool) {\n return (_matron.siringWithId != 0) && (_matron.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @notice Checks that a given kitten is able to breed (i.e. it is not pregnant or\n /// in the middle of a siring cooldown).\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isReadyToBreed(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n Kitty storage kit = kitties[_kittyId];\n return _isReadyToBreed(kit);\n }\n\n /// @dev Checks whether a kitty is currently pregnant.\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isPregnant(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n // A kitty is pregnant if and only if this field is set\n return kitties[_kittyId].siringWithId != 0;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair. DOES NOT\n /// check ownership permissions (that is up to the caller).\n /// @param _matron A reference to the Kitty struct of the potential matron.\n /// @param _matronId The matron's ID.\n /// @param _sire A reference to the Kitty struct of the potential sire.\n /// @param _sireId The sire's ID\n function _isValidMatingPair(\n Kitty storage _matron,\n uint256 _matronId,\n Kitty storage _sire,\n uint256 _sireId\n )\n private\n view\n returns(bool)\n {\n // A Kitty can't breed with itself!\n if (_matronId == _sireId) {\n return false;\n }\n\n // Kitties can't breed with their parents.\n if (_matron.matronId == _sireId || _matron.sireId == _sireId) {\n return false;\n }\n if (_sire.matronId == _matronId || _sire.sireId == _matronId) {\n return false;\n }\n\n // We can short circuit the sibling check (below) if either cat is\n // gen zero (has a matron ID of zero).\n if (_sire.matronId == 0 || _matron.matronId == 0) {\n return true;\n }\n\n // Kitties can't breed with full or half siblings.\n if (_sire.matronId == _matron.matronId || _sire.matronId == _matron.sireId) {\n return false;\n }\n if (_sire.sireId == _matron.matronId || _sire.sireId == _matron.sireId) {\n return false;\n }\n\n // Everything seems cool! Let's get DTF.\n return true;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair for\n /// breeding via auction (i.e. skips ownership and siring approval checks).\n function _canBreedWithViaAuction(uint256 _matronId, uint256 _sireId)\n internal\n view\n returns (bool)\n {\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId);\n }\n\n /// @notice Checks to see if two cats can breed together, including checks for\n /// ownership and siring approvals. Does NOT check that both cats are ready for\n /// breeding (i.e. breedWith could still fail until the cooldowns are finished).\n /// TODO: Shouldn't this check pregnancy and cooldowns?!?\n /// @param _matronId The ID of the proposed matron.\n /// @param _sireId The ID of the proposed sire.\n function canBreedWith(uint256 _matronId, uint256 _sireId)\n external\n view\n returns(bool)\n {\n require(_matronId > 0);\n require(_sireId > 0);\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId) &&\n _isSiringPermitted(_sireId, _matronId);\n }\n\n /// @dev Internal utility function to initiate breeding, assumes that all breeding\n /// requirements have been checked.\n function _breedWith(uint256 _matronId, uint256 _sireId) internal {\n // Grab a reference to the Kitties from storage.\n Kitty storage sire = kitties[_sireId];\n Kitty storage matron = kitties[_matronId];\n\n // Mark the matron as pregnant, keeping track of who the sire is.\n matron.siringWithId = uint32(_sireId);\n\n // Trigger the cooldown for both parents.\n _triggerCooldown(sire);\n _triggerCooldown(matron);\n\n // Clear siring permission for both parents. This may not be strictly necessary\n // but it's likely to avoid confusion!\n delete sireAllowedToAddress[_matronId];\n delete sireAllowedToAddress[_sireId];\n\n // Every time a kitty gets pregnant, counter is incremented.\n pregnantKitties++;\n\n // Emit the pregnancy event.\n Pregnant(kittyIndexToOwner[_matronId], _matronId, _sireId, matron.cooldownEndBlock);\n }\n\n /// @notice Breed a Kitty you own (as matron) with a sire that you own, or for which you\n /// have previously been given Siring approval. Will either make your cat pregnant, or will\n /// fail entirely. Requires a pre-payment of the fee given out to the first caller of giveBirth()\n /// @param _matronId The ID of the Kitty acting as matron (will end up pregnant if successful)\n /// @param _sireId The ID of the Kitty acting as sire (will begin its siring cooldown if successful)\n function breedWithAuto(uint256 _matronId, uint256 _sireId)\n external\n payable\n whenNotPaused\n {\n // Checks for payment.\n require(msg.value >= autoBirthFee);\n\n // Caller must own the matron.\n require(_owns(msg.sender, _matronId));\n\n // Neither sire nor matron are allowed to be on auction during a normal\n // breeding operation, but we don't need to check that explicitly.\n // For matron: The caller of this function can't be the owner of the matron\n // because the owner of a Kitty on auction is the auction house, and the\n // auction house will never call breedWith().\n // For sire: Similarly, a sire on auction will be owned by the auction house\n // and the act of transferring ownership will have cleared any oustanding\n // siring approval.\n // Thus we don't need to spend gas explicitly checking to see if either cat\n // is on auction.\n\n // Check that matron and sire are both owned by caller, or that the sire\n // has given siring permission to caller (i.e. matron's owner).\n // Will fail for _sireId = 0\n require(_isSiringPermitted(_sireId, _matronId));\n\n // Grab a reference to the potential matron\n Kitty storage matron = kitties[_matronId];\n\n // Make sure matron isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(matron));\n\n // Grab a reference to the potential sire\n Kitty storage sire = kitties[_sireId];\n\n // Make sure sire isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(sire));\n\n // Test that these cats are a valid mating pair.\n require(_isValidMatingPair(\n matron,\n _matronId,\n sire,\n _sireId\n ));\n\n // All checks passed, kitty gets pregnant!\n _breedWith(_matronId, _sireId);\n }\n\n /// @notice Have a pregnant Kitty give birth!\n /// @param _matronId A Kitty ready to give birth.\n /// @return The Kitty ID of the new kitten.\n /// @dev Looks at a given Kitty and, if pregnant and if the gestation period has passed,\n /// combines the genes of the two parents to create a new kitten. The new Kitty is assigned\n /// to the current owner of the matron. Upon successful completion, both the matron and the\n /// new kitten will be ready to breed again. Note that anyone can call this function (if they\n /// are willing to pay the gas!), but the new kitten always goes to the mother's owner.\n function giveBirth(uint256 _matronId)\n external\n whenNotPaused\n returns(uint256)\n {\n // Grab a reference to the matron in storage.\n Kitty storage matron = kitties[_matronId];\n\n // Check that the matron is a valid cat.\n require(matron.birthTime != 0);\n\n // Check that the matron is pregnant, and that its time has come!\n require(_isReadyToGiveBirth(matron));\n\n // Grab a reference to the sire in storage.\n uint256 sireId = matron.siringWithId;\n Kitty storage sire = kitties[sireId];\n\n // Determine the higher generation number of the two parents\n uint16 parentGen = matron.generation;\n if (sire.generation > matron.generation) {\n parentGen = sire.generation;\n }\n\n // Call the sooper-sekret gene mixing operation.\n uint256 childGenes = geneScience.mixGenes(matron.genes, sire.genes, matron.cooldownEndBlock - 1);\n\n // Make the new kitten!\n address owner = kittyIndexToOwner[_matronId];\n uint256 kittenId = _createKitty(_matronId, matron.siringWithId, parentGen + 1, childGenes, owner);\n\n // Clear the reference to sire from the matron (REQUIRED! Having siringWithId\n // set is what marks a matron as being pregnant.)\n delete matron.siringWithId;\n\n // Every time a kitty gives birth counter is decremented.\n pregnantKitties--;\n\n // Send the balance fee to the person who made birth happen.\n msg.sender.send(autoBirthFee);\n\n // return the new kitten's ID\n return kittenId;\n }\n}\n\n\n\n\n\n\n\n\n\n\n/// @title Auction Core\n/// @dev Contains models, variables, and internal methods for the auction.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuctionBase {\n\n // Represents an auction on an NFT\n struct Auction {\n // Current owner of NFT\n address seller;\n // Price (in wei) at beginning of auction\n uint128 startingPrice;\n // Price (in wei) at end of auction\n uint128 endingPrice;\n // Duration (in seconds) of auction\n uint64 duration;\n // Time when auction started\n // NOTE: 0 if this auction has been concluded\n uint64 startedAt;\n }\n\n // Reference to contract tracking NFT ownership\n KittiesERC721 public nonFungibleContract;\n\n // Cut owner takes on each auction, measured in basis points (1/100 of a percent).\n // Values 0-10,000 map to 0%-100%\n uint256 public ownerCut;\n\n // Map from token ID to their corresponding auction.\n mapping (uint256 => Auction) tokenIdToAuction;\n\n event AuctionCreated(uint256 tokenId, uint256 startingPrice, uint256 endingPrice, uint256 duration);\n event AuctionSuccessful(uint256 tokenId, uint256 totalPrice, address winner);\n event AuctionCancelled(uint256 tokenId);\n\n /// @dev Returns true if the claimant owns the token.\n /// @param _claimant - Address claiming to own the token.\n /// @param _tokenId - ID of token whose ownership to verify.\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return (nonFungibleContract.ownerOf(_tokenId) == _claimant);\n }\n\n /// @dev Escrows the NFT, assigning ownership to this contract.\n /// Throws if the escrow fails.\n /// @param _owner - Current owner address of token to escrow.\n /// @param _tokenId - ID of token whose approval to verify.\n function _escrow(address _owner, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transferFrom(_owner, this, _tokenId);\n }\n\n /// @dev Transfers an NFT owned by this contract to another address.\n /// Returns true if the transfer succeeds.\n /// @param _receiver - Address to transfer NFT to.\n /// @param _tokenId - ID of token to transfer.\n function _transfer(address _receiver, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transfer(_receiver, _tokenId);\n }\n\n /// @dev Adds an auction to the list of open auctions. Also fires the\n /// AuctionCreated event.\n /// @param _tokenId The ID of the token to be put on auction.\n /// @param _auction Auction to add.\n function _addAuction(uint256 _tokenId, Auction _auction) internal {\n // Require that all auctions have a duration of\n // at least one minute. (Keeps our math from getting hairy!)\n require(_auction.duration >= 1 minutes);\n\n tokenIdToAuction[_tokenId] = _auction;\n\n AuctionCreated(\n uint256(_tokenId),\n uint256(_auction.startingPrice),\n uint256(_auction.endingPrice),\n uint256(_auction.duration)\n );\n }\n\n /// @dev Cancels an auction unconditionally.\n function _cancelAuction(uint256 _tokenId, address _seller) internal {\n _removeAuction(_tokenId);\n _transfer(_seller, _tokenId);\n AuctionCancelled(_tokenId);\n }\n\n /// @dev Computes the price and transfers winnings.\n /// Does NOT transfer ownership of token.\n function _bid(uint256 _tokenId, uint256 _bidAmount)\n internal\n returns (uint256)\n {\n // Get a reference to the auction struct\n Auction storage auction = tokenIdToAuction[_tokenId];\n\n // Explicitly check that this auction is currently live.\n // (Because of how Ethereum mappings work, we can't just count\n // on the lookup above failing. An invalid _tokenId will just\n // return an auction object that is all zeros.)\n require(_isOnAuction(auction));\n\n // Check that the bid is greater than or equal to the current price\n uint256 price = _currentPrice(auction);\n require(_bidAmount >= price);\n\n // Grab a reference to the seller before the auction struct\n // gets deleted.\n address seller = auction.seller;\n\n // The bid is good! Remove the auction before sending the fees\n // to the sender so we can't have a reentrancy attack.\n _removeAuction(_tokenId);\n\n // Transfer proceeds to seller (if there are any!)\n if (price > 0) {\n // Calculate the auctioneer's cut.\n // (NOTE: _computeCut() is guaranteed to return a\n // value <= price, so this subtraction can't go negative.)\n uint256 auctioneerCut = _computeCut(price);\n uint256 sellerProceeds = price - auctioneerCut;\n\n // NOTE: Doing a transfer() in the middle of a complex\n // method like this is generally discouraged because of\n // reentrancy attacks and DoS attacks if the seller is\n // a contract with an invalid fallback function. We explicitly\n // guard against reentrancy attacks by removing the auction\n // before calling transfer(), and the only thing the seller\n // can DoS is the sale of their own asset! (And if it's an\n // accident, they can call cancelAuction(). )\n seller.transfer(sellerProceeds);\n }\n\n // Calculate any excess funds included with the bid. If the excess\n // is anything worth worrying about, transfer it back to bidder.\n // NOTE: We checked above that the bid amount is greater than or\n // equal to the price so this cannot underflow.\n uint256 bidExcess = _bidAmount - price;\n\n // Return the funds. Similar to the previous transfer, this is\n // not susceptible to a re-entry attack because the auction is\n // removed before any transfers occur.\n msg.sender.transfer(bidExcess);\n\n // Tell the world!\n AuctionSuccessful(_tokenId, price, msg.sender);\n\n return price;\n }\n\n /// @dev Removes an auction from the list of open auctions.\n /// @param _tokenId - ID of NFT on auction.\n function _removeAuction(uint256 _tokenId) internal {\n delete tokenIdToAuction[_tokenId];\n }\n\n /// @dev Returns true if the NFT is on auction.\n /// @param _auction - Auction to check.\n function _isOnAuction(Auction storage _auction) internal view returns (bool) {\n return (_auction.startedAt > 0);\n }\n\n /// @dev Returns current price of an NFT on auction. Broken into two\n /// functions (this one, that computes the duration from the auction\n /// structure, and the other that does the price computation) so we\n /// can easily test that the price computation works correctly.\n function _currentPrice(Auction storage _auction)\n internal\n view\n returns (uint256)\n {\n uint256 secondsPassed = 0;\n\n // A bit of insurance against negative values (or wraparound).\n // Probably not necessary (since Ethereum guarnatees that the\n // now variable doesn't ever go backwards).\n if (now > _auction.startedAt) {\n secondsPassed = now - _auction.startedAt;\n }\n\n return _computeCurrentPrice(\n _auction.startingPrice,\n _auction.endingPrice,\n _auction.duration,\n secondsPassed\n );\n }\n\n /// @dev Computes the current price of an auction. Factored out\n /// from _currentPrice so we can run extensive unit tests.\n /// When testing, make this function public and turn on\n /// `Current price computation` test suite.\n function _computeCurrentPrice(\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n uint256 _secondsPassed\n )\n internal\n pure\n returns (uint256)\n {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our public functions carefully cap the maximum values for\n // time (at 64-bits) and currency (at 128-bits). _duration is\n // also known to be non-zero (see the require() statement in\n // _addAuction())\n if (_secondsPassed >= _duration) {\n // We've reached the end of the dynamic pricing portion\n // of the auction, just return the end price.\n return _endingPrice;\n } else {\n // Starting price can be higher than ending price (and often is!), so\n // this delta can be negative.\n int256 totalPriceChange = int256(_endingPrice) - int256(_startingPrice);\n\n // This multiplication can't overflow, _secondsPassed will easily fit within\n // 64-bits, and totalPriceChange will easily fit within 128-bits, their product\n // will always fit within 256-bits.\n int256 currentPriceChange = totalPriceChange * int256(_secondsPassed) / int256(_duration);\n\n // currentPriceChange can be negative, but if so, will have a magnitude\n // less that _startingPrice. Thus, this result will always end up positive.\n int256 currentPrice = int256(_startingPrice) + currentPriceChange;\n\n return uint256(currentPrice);\n }\n }\n\n /// @dev Computes owner's cut of a sale.\n /// @param _price - Sale price of NFT.\n function _computeCut(uint256 _price) internal view returns (uint256) {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our entry functions carefully cap the maximum values for\n // currency (at 128-bits), and ownerCut <= 10000 (see the require()\n // statement in the ClockAuction constructor). The result of this\n // function is always guaranteed to be <= _price.\n return _price * ownerCut / 10000;\n }\n\n}\n\n\n\n\n\n\n\n/**\n * @title KittiesPausable\n * @dev Base contract which allows children to implement an emergency stop mechanism.\n */\ncontract KittiesPausable is KittiesOwnable {\n event Pause();\n event Unpause();\n\n bool public paused = false;\n\n\n /**\n\t * @dev modifier to allow actions only when the contract IS paused\n\t */\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /**\n\t * @dev modifier to allow actions only when the contract IS NOT paused\n\t */\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /**\n\t * @dev called by the owner to pause, triggers stopped state\n\t */\n function pause() onlyOwner whenNotPaused returns (bool) {\n paused = true;\n Pause();\n return true;\n }\n\n /**\n\t * @dev called by the owner to unpause, returns to normal state\n\t */\n function unpause() onlyOwner whenPaused returns (bool) {\n paused = false;\n Unpause();\n return true;\n }\n}\n\n\n/// @title Clock auction for non-fungible tokens.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuction is KittiesPausable, ClockAuctionBase {\n\n /// @dev The ERC-165 interface signature for ERC-721.\n /// Ref: https://github.com/ethereum/EIPs/issues/165\n /// Ref: https://github.com/ethereum/EIPs/issues/721\n bytes4 constant InterfaceSignature_ERC721 = bytes4(0x9a20483d);\n\n /// @dev Constructor creates a reference to the NFT ownership contract\n /// and verifies the owner cut is in the valid range.\n /// @param _nftAddress - address of a deployed contract implementing\n /// the Nonfungible Interface.\n /// @param _cut - percent cut the owner takes on each auction, must be\n /// between 0-10,000.\n function ClockAuction(address _nftAddress, uint256 _cut) public {\n require(_cut <= 10000);\n ownerCut = _cut;\n\n KittiesERC721 candidateContract = KittiesERC721(_nftAddress);\n require(candidateContract.supportsInterface(InterfaceSignature_ERC721));\n nonFungibleContract = candidateContract;\n }\n\n /// @dev Remove all Ether from the contract, which is the owner's cuts\n /// as well as any Ether sent directly to the contract address.\n /// Always transfers to the NFT contract, but can be called either by\n /// the owner or the NFT contract.\n function withdrawBalance() external {\n address nftAddress = address(nonFungibleContract);\n\n require(\n msg.sender == owner ||\n msg.sender == nftAddress\n );\n // We are using this boolean method to make sure that even if one fails it will still work\n bool res = nftAddress.send(this.balance);\n }\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of time to move between starting\n /// price and ending price (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n whenNotPaused\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(_owns(msg.sender, _tokenId));\n _escrow(msg.sender, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Bids on an open auction, completing the auction and transferring\n /// ownership of the NFT if enough Ether is supplied.\n /// @param _tokenId - ID of token to bid on.\n function bid(uint256 _tokenId)\n external\n payable\n whenNotPaused\n {\n // _bid will throw if the bid or funds transfer fails\n _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n }\n\n /// @dev Cancels an auction that hasn't been won yet.\n /// Returns the NFT to original owner.\n /// @notice This is a state-modifying function that can\n /// be called while the contract is paused.\n /// @param _tokenId - ID of token on auction\n function cancelAuction(uint256 _tokenId)\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n address seller = auction.seller;\n require(msg.sender == seller);\n _cancelAuction(_tokenId, seller);\n }\n\n /// @dev Cancels an auction when the contract is paused.\n /// Only the owner may do this, and NFTs are returned to\n /// the seller. This should only be used in emergencies.\n /// @param _tokenId - ID of the NFT on auction to cancel.\n function cancelAuctionWhenPaused(uint256 _tokenId)\n whenPaused\n onlyOwner\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n _cancelAuction(_tokenId, auction.seller);\n }\n\n /// @dev Returns auction info for an NFT on auction.\n /// @param _tokenId - ID of NFT on auction.\n function getAuction(uint256 _tokenId)\n external\n view\n returns\n (\n address seller,\n uint256 startingPrice,\n uint256 endingPrice,\n uint256 duration,\n uint256 startedAt\n ) {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return (\n auction.seller,\n auction.startingPrice,\n auction.endingPrice,\n auction.duration,\n auction.startedAt\n );\n }\n\n /// @dev Returns the current price of an auction.\n /// @param _tokenId - ID of the token price we are checking.\n function getCurrentPrice(uint256 _tokenId)\n external\n view\n returns (uint256)\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return _currentPrice(auction);\n }\n\n}\n\n\n/// @title Reverse auction modified for siring\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SiringClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSiringAuctionAddress() call.\n bool public isSiringClockAuction = true;\n\n // Delegate constructor\n function SiringClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction. Since this function is wrapped,\n /// require sender to be KittyCore contract.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Places a bid for siring. Requires the sender\n /// is the KittyCore contract because all bid methods\n /// should be wrapped. Also returns the kitty to the\n /// seller rather than the winner.\n function bid(uint256 _tokenId)\n external\n payable\n {\n require(msg.sender == address(nonFungibleContract));\n address seller = tokenIdToAuction[_tokenId].seller;\n // _bid checks that token ID is valid and will throw if bid fails\n _bid(_tokenId, msg.value);\n // We transfer the kitty back to the seller, the winner will get\n // the offspring\n _transfer(seller, _tokenId);\n }\n\n}\n\n\n\n\n\n/// @title Clock auction modified for sale of kitties\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SaleClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSaleAuctionAddress() call.\n bool public isSaleClockAuction = true;\n\n // Tracks last 5 sale price of gen0 kitty sales\n uint256 public gen0SaleCount;\n uint256[5] public lastGen0SalePrices;\n\n // Delegate constructor\n function SaleClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Updates lastSalePrice if seller is the nft contract\n /// Otherwise, works the same as default bid method.\n function bid(uint256 _tokenId)\n external\n payable\n {\n // _bid verifies token ID size\n address seller = tokenIdToAuction[_tokenId].seller;\n uint256 price = _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n\n // If not a gen0 auction, exit\n if (seller == address(nonFungibleContract)) {\n // Track gen0 sale prices\n lastGen0SalePrices[gen0SaleCount % 5] = price;\n gen0SaleCount++;\n }\n }\n\n function averageGen0SalePrice() external view returns (uint256) {\n uint256 sum = 0;\n for (uint256 i = 0; i < 5; i++) {\n sum += lastGen0SalePrices[i];\n }\n return sum / 5;\n }\n\n}\n\n\n/// @title Handles creating auctions for sale and siring of kitties.\n/// This wrapper of ReverseAuction exists only so that users can create\n/// auctions with only one transaction.\ncontract KittyAuction is KittyBreeding {\n\n // @notice The auction contract variables are defined in KittyBase to allow\n // us to refer to them in KittyOwnership to prevent accidental transfers.\n // `saleAuction` refers to the auction for gen0 and p2p sale of kitties.\n // `siringAuction` refers to the auction for siring rights of kitties.\n\n /// @dev Sets the reference to the sale auction.\n /// @param _address - Address of sale contract.\n function setSaleAuctionAddress(address _address) external onlyCEO {\n SaleClockAuction candidateContract = SaleClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSaleClockAuction());\n\n // Set the new contract address\n saleAuction = candidateContract;\n }\n\n /// @dev Sets the reference to the siring auction.\n /// @param _address - Address of siring contract.\n function setSiringAuctionAddress(address _address) external onlyCEO {\n SiringClockAuction candidateContract = SiringClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSiringClockAuction());\n\n // Set the new contract address\n siringAuction = candidateContract;\n }\n\n /// @dev Put a kitty up for auction.\n /// Does some ownership trickery to create auctions in one tx.\n function createSaleAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n // Ensure the kitty is not pregnant to prevent the auction\n // contract accidentally receiving ownership of the child.\n // NOTE: the kitty IS allowed to be in a cooldown.\n require(!isPregnant(_kittyId));\n _approve(_kittyId, saleAuction);\n // Sale auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n saleAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Put a kitty up for auction to be sire.\n /// Performs checks to ensure the kitty can be sired, then\n /// delegates to reverse auction.\n function createSiringAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n require(isReadyToBreed(_kittyId));\n _approve(_kittyId, siringAuction);\n // Siring auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n siringAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Completes a siring auction by bidding.\n /// Immediately breeds the winning matron with the sire on auction.\n /// @param _sireId - ID of the sire on auction.\n /// @param _matronId - ID of the matron owned by the bidder.\n function bidOnSiringAuction(\n uint256 _sireId,\n uint256 _matronId\n )\n external\n payable\n whenNotPaused\n {\n // Auction contract checks input sizes\n require(_owns(msg.sender, _matronId));\n require(isReadyToBreed(_matronId));\n require(_canBreedWithViaAuction(_matronId, _sireId));\n\n // Define the current price of the auction.\n uint256 currentPrice = siringAuction.getCurrentPrice(_sireId);\n require(msg.value >= currentPrice + autoBirthFee);\n\n // Siring auction will throw if the bid fails.\n siringAuction.bid.value(msg.value - autoBirthFee)(_sireId);\n _breedWith(uint32(_matronId), uint32(_sireId));\n }\n\n /// @dev Transfers the balance of the sale auction contract\n /// to the KittyCore contract. We use two-step withdrawal to\n /// prevent two transfer calls in the auction bid function.\n function withdrawAuctionBalances() external onlyCLevel {\n saleAuction.withdrawBalance();\n siringAuction.withdrawBalance();\n }\n}\n\n\n/// @title all functions related to creating kittens\ncontract KittyMinting is KittyAuction {\n\n // Limits the number of cats the contract owner can ever create.\n uint256 public constant PROMO_CREATION_LIMIT = 5000;\n uint256 public constant GEN0_CREATION_LIMIT = 45000;\n\n // Constants for gen0 auctions.\n uint256 public constant GEN0_STARTING_PRICE = 10 finney;\n uint256 public constant GEN0_AUCTION_DURATION = 1 days;\n\n // Counts the number of cats the contract owner has created.\n uint256 public promoCreatedCount;\n uint256 public gen0CreatedCount;\n\n /// @dev we can create promo kittens, up to a limit. Only callable by COO\n /// @param _genes the encoded genes of the kitten to be created, any value is accepted\n /// @param _owner the future owner of the created kittens. Default to contract COO\n function createPromoKitty(uint256 _genes, address _owner) external onlyCOO {\n address kittyOwner = _owner;\n if (kittyOwner == address(0)) {\n kittyOwner = cooAddress;\n }\n require(promoCreatedCount < PROMO_CREATION_LIMIT);\n\n promoCreatedCount++;\n _createKitty(0, 0, 0, _genes, kittyOwner);\n }\n\n /// @dev Creates a new gen0 kitty with the given genes and\n /// creates an auction for it.\n function createGen0Auction(uint256 _genes) external onlyCOO {\n require(gen0CreatedCount < GEN0_CREATION_LIMIT);\n\n uint256 kittyId = _createKitty(0, 0, 0, _genes, address(this));\n _approve(kittyId, saleAuction);\n\n saleAuction.createAuction(\n kittyId,\n _computeNextGen0Price(),\n 0,\n GEN0_AUCTION_DURATION,\n address(this)\n );\n\n gen0CreatedCount++;\n }\n\n /// @dev Computes the next gen0 auction starting price, given\n /// the average of the past 5 prices + 50%.\n function _computeNextGen0Price() internal view returns (uint256) {\n uint256 avePrice = saleAuction.averageGen0SalePrice();\n\n // Sanity check to ensure we don't overflow arithmetic\n require(avePrice == uint256(uint128(avePrice)));\n\n uint256 nextPrice = avePrice + (avePrice / 2);\n\n // We never auction for less than starting price\n if (nextPrice < GEN0_STARTING_PRICE) {\n nextPrice = GEN0_STARTING_PRICE;\n }\n\n return nextPrice;\n }\n}\n\n\n/// @title CryptoKitties: Collectible, breedable, and oh-so-adorable cats on the Ethereum blockchain.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev The main CryptoKitties contract, keeps track of kittens so they don't wander around and get lost.\ncontract KittyCore is KittyMinting {\n\n // This is the main CryptoKitties contract. In order to keep our code seperated into logical sections,\n // we've broken it up in two ways. First, we have several seperately-instantiated sibling contracts\n // that handle auctions and our super-top-secret genetic combination algorithm. The auctions are\n // seperate since their logic is somewhat complex and there's always a risk of subtle bugs. By keeping\n // them in their own contracts, we can upgrade them without disrupting the main contract that tracks\n // kitty ownership. The genetic combination algorithm is kept seperate so we can open-source all of\n // the rest of our code without making it _too_ easy for folks to figure out how the genetics work.\n // Don't worry, I'm sure someone will reverse engineer it soon enough!\n //\n // Secondly, we break the core contract into multiple files using inheritence, one for each major\n // facet of functionality of CK. This allows us to keep related code bundled together while still\n // avoiding a single giant file with everything in it. The breakdown is as follows:\n //\n // - KittyBase: This is where we define the most fundamental code shared throughout the core\n // functionality. This includes our main data storage, constants and data types, plus\n // internal functions for managing these items.\n //\n // - KittyAccessControl: This contract manages the various addresses and constraints for operations\n // that can be executed only by specific roles. Namely CEO, CFO and COO.\n //\n // - KittyOwnership: This provides the methods required for basic non-fungible token\n // transactions, following the draft ERC-721 spec (https://github.com/ethereum/EIPs/issues/721).\n //\n // - KittyBreeding: This file contains the methods necessary to breed cats together, including\n // keeping track of siring offers, and relies on an external genetic combination contract.\n //\n // - KittyAuctions: Here we have the public methods for auctioning or bidding on cats or siring\n // services. The actual auction functionality is handled in two sibling contracts (one\n // for sales and one for siring), while auction creation and bidding is mostly mediated\n // through this facet of the core contract.\n //\n // - KittyMinting: This final facet contains the functionality we use for creating new gen0 cats.\n // We can make up to 5000 \"promo\" cats that can be given away (especially important when\n // the community is new), and all others can only be created and then immediately put up\n // for auction via an algorithmically determined starting price. Regardless of how they\n // are created, there is a hard limit of 50k gen0 cats. After that, it's all up to the\n // community to breed, breed, breed!\n\n // Set in case the core contract is broken and an upgrade is required\n address public newContractAddress;\n\n /// @notice Creates the main CryptoKitties smart contract instance.\n function KittyCore() public {\n // Starts paused.\n paused = true;\n\n // the creator of the contract is the initial CEO\n ceoAddress = msg.sender;\n\n // the creator of the contract is also the initial COO\n cooAddress = msg.sender;\n\n // start with the mythical kitten 0 - so we don't have generation-0 parent issues\n _createKitty(0, 0, 0, uint256(-1), address(0));\n }\n\n /// @dev Used to mark the smart contract as upgraded, in case there is a serious\n /// breaking bug. This method does nothing but keep track of the new contract and\n /// emit a message indicating that the new address is set. It's up to clients of this\n /// contract to update to the new contract address in that case. (This contract will\n /// be paused indefinitely if such an upgrade takes place.)\n /// @param _v2Address new address\n function setNewAddress(address _v2Address) external onlyCEO whenPaused {\n // See README.md for updgrade plan\n newContractAddress = _v2Address;\n ContractUpgrade(_v2Address);\n }\n\n /// @notice No tipping!\n /// @dev Reject all Ether from being sent here, unless it's from one of the\n /// two auction contracts. (Hopefully, we can prevent user accidents.)\n function() external payable {\n require(\n msg.sender == address(saleAuction) ||\n msg.sender == address(siringAuction)\n );\n }\n\n /// @notice Returns all the relevant information about a specific kitty.\n /// @param _id The ID of the kitty of interest.\n function getKitty(uint256 _id)\n external\n view\n returns (\n bool isGestating,\n bool isReady,\n uint256 cooldownIndex,\n uint256 nextActionAt,\n uint256 siringWithId,\n uint256 birthTime,\n uint256 matronId,\n uint256 sireId,\n uint256 generation,\n uint256 genes\n ) {\n Kitty storage kit = kitties[_id];\n\n // if this variable is 0 then it's not gestating\n isGestating = (kit.siringWithId != 0);\n isReady = (kit.cooldownEndBlock <= block.number);\n cooldownIndex = uint256(kit.cooldownIndex);\n nextActionAt = uint256(kit.cooldownEndBlock);\n siringWithId = uint256(kit.siringWithId);\n birthTime = uint256(kit.birthTime);\n matronId = uint256(kit.matronId);\n sireId = uint256(kit.sireId);\n generation = uint256(kit.generation);\n genes = kit.genes;\n }\n\n /// @dev Override unpause so it requires all external contract addresses\n /// to be set before contract can be unpaused. Also, we can't have\n /// newContractAddress set either, because then the contract was upgraded.\n /// @notice This is public rather than external so we can call super.unpause\n /// without using an expensive CALL.\n function unpause() public onlyCEO whenPaused {\n require(saleAuction != address(0));\n require(siringAuction != address(0));\n require(geneScience != address(0));\n require(newContractAddress == address(0));\n\n // Actually unpause the contract.\n super.unpause();\n }\n\n // @dev Allows the CFO to capture the balance available to the contract.\n function withdrawBalance() external onlyCFO {\n uint256 balance = this.balance;\n // Subtract all the currently pregnant kittens we have, plus 1 of margin.\n uint256 subtractFees = (pregnantKitties + 1) * autoBirthFee;\n\n if (balance > subtractFees) {\n cfoAddress.send(balance - subtractFees);\n }\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "exportedSymbols": { "ClockAuction": [ 8872 @@ -51731,5 +51731,5 @@ }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:47.636Z" + "updatedAt": "2018-10-09T17:45:35.834Z" } \ No newline at end of file diff --git a/artifacts/json/CollateralizedSimpleInterestTermsContract.json b/artifacts/json/CollateralizedSimpleInterestTermsContract.json index f77e8276..46561696 100644 --- a/artifacts/json/CollateralizedSimpleInterestTermsContract.json +++ b/artifacts/json/CollateralizedSimpleInterestTermsContract.json @@ -381,15 +381,15 @@ "type": "event" } ], - "bytecode": "0x6060604052341561000f57600080fd5b604051602080611a68833981016040528080519060200190919050508080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050506119ea8061007e6000396000f3006060604052600436106100e6576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a896a1146100eb5780630776298214610126578063208638941461014f5780632762dd8c1461017857806340018a0d146101b35780635f0280ba146101dc5780636f69c96f146102815780638b47e58a146102aa57806393529cdf146102d3578063977a5e64146102fc57806399114d841461035a578063abf410e51461039e578063de53a13c146103f3578063ed8907d71461041c578063fd127a4114610473578063fd40d52e1461049c575b600080fd5b34156100f657600080fd5b6101106004808035600019169060200190919050506104d7565b6040518082815260200191505060405180910390f35b341561013157600080fd5b6101396104fb565b6040518082815260200191505060405180910390f35b341561015a57600080fd5b610162610504565b6040518082815260200191505060405180910390f35b341561018357600080fd5b61019d600480803560001916906020019091905050610510565b6040518082815260200191505060405180910390f35b34156101be57600080fd5b6101c6610532565b6040518082815260200191505060405180910390f35b34156101e757600080fd5b61026760048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061053e565b604051808215151515815260200191505060405180910390f35b341561028c57600080fd5b6102946107b3565b6040518082815260200191505060405180910390f35b34156102b557600080fd5b6102bd6107b9565b6040518082815260200191505060405180910390f35b34156102de57600080fd5b6102e66107be565b6040518082815260200191505060405180910390f35b341561030757600080fd5b61034060048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506107c4565b604051808215151515815260200191505060405180910390f35b341561036557600080fd5b610388600480803560001916906020019091908035906020019091905050610a43565b6040518082815260200191505060405180910390f35b34156103a957600080fd5b6103b1610c4f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103fe57600080fd5b610406610c75565b6040518082815260200191505060405180910390f35b341561042757600080fd5b610441600480803560001916906020019091905050610c7e565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b341561047e57600080fd5b610486610d76565b6040518082815260200191505060405180910390f35b34156104a757600080fd5b6104c1600480803560001916906020019091905050610d83565b6040518082815260200191505060405180910390f35b60008060008360001916600019168152602001908152602001600020549050919050565b6018610e100281565b601e6018610e10020281565b600061051a61195f565b61052383610d9b565b90508060600151915050919050565b60076018610e10020281565b600061054861195f565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636fa9d0566000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156105d657600080fd5b6102c65a03f115156105e757600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561062a57600080fd5b61063387610d9b565b9050806000015173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107a45761069a846000808a600019166000191681526020019081526020016000205461129790919063ffffffff16565b6000808960001916600019168152602001908152602001600020819055507ff1a888d220228f843ac3044ef257c80642e6434d1ddc7ebee0a2813cced3406c87878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405180910390a1600191506107a9565b600091505b5095945050505050565b610e1081565b600581565b61271081565b6000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663079dd4b76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561085757600080fd5b6102c65a03f1151561086857600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108ab57600080fd5b6108b585856112b5565b9150600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663869f05116000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561094557600080fd5b6102c65a03f1151561095657600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663649404bd86866000604051602001526040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1515610a1257600080fd5b6102c65a03f11515610a2357600080fd5b505050604051805190509050818015610a395750805b9250505092915050565b6000610a4d61195f565b60008085600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610adf57600080fd5b6102c65a03f11515610af057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663f6f494c9826000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610b7857600080fd5b6102c65a03f11515610b8957600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16141515610bcc57600080fd5b610bd587610d9b565b9350610be084611746565b9250836040015186111515610bf85760009450610c45565b836060015186101515610c0d57829450610c45565b610c17868561179c565b9150610c428460a00151610c3484866117e690919063ffffffff16565b61182190919063ffffffff16565b94505b5050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60646127100281565b6000806000806000806000806000807fff000000000000000000000000000000000000000000000000000000000000006001028b1694507effffffffffffffffffffffff000000000000000000000000000000000000006001028b16935072ffffff000000000000000000000000000000006001028b1692506ff00000000000000000000000000000006001028b1691506f0ffff0000000000000000000000000006001028b169050610d328560f861183c565b610d3d85609861183c565b610d4885608061183c565b610d5385607c61183c565b610d5e85606c61183c565b99509950995099509950505050505091939590929450565b61016d6018610e10020281565b60006020528060005260406000206000915090505481565b610da361195f565b600080600080600080600080600080600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610e4357600080fd5b6102c65a03f11515610e5457600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663314a522e8f6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610edc57600080fd5b6102c65a03f11515610eed57600080fd5b505050604051805190509b50610f028c610c7e565b809b50819c50829d50839e50849f505050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d23c4c76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610fa457600080fd5b6102c65a03f11515610fb557600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16635715c5b78c6000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561103557600080fd5b6102c65a03f1151561104657600080fd5b505050604051805190509550600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415151561108e57600080fd5b60048081111561109a57fe5b88111515156110a857600080fd5b8760048111156110b457fe5b94506110bf85611859565b9350600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561114f57600080fd5b6102c65a03f1151561116057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663d69dbf638f6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156111e857600080fd5b6102c65a03f115156111f957600080fd5b50505060405180519050925061121884886117e690919063ffffffff16565b915061122d838361129790919063ffffffff16565b905060e0604051908101604052808773ffffffffffffffffffffffffffffffffffffffff1681526020018b815260200184815260200182815260200186600481111561127557fe5b81526020018881526020018a8152509c50505050505050505050505050919050565b60008082840190508381101515156112ab57fe5b8091505092915050565b6000806000806000806000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663079dd4b76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561135157600080fd5b6102c65a03f1151561136257600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156113a557600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561143357600080fd5b6102c65a03f1151561144457600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16636be39bda8c6000604051604001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082600019166000191681526020019150506040805180830381600087803b15156114cb57600080fd5b6102c65a03f115156114dc57600080fd5b5050506040518051906020018051905080985081995050506114fd87610c7e565b809650819750829850839950849a505050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d23c4c76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561159f57600080fd5b6102c65a03f115156115b057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16635715c5b7876000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561163057600080fd5b6102c65a03f1151561164157600080fd5b505050604051805190509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561168a5750600583105b80156116c157503073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b1561173357828173ffffffffffffffffffffffffffffffffffffffff168c600019167f2c500aaec6833a053693d8c2a18a3ed5649a4609699abaf7778c3d389cc40c0588888760405180848152602001838152602001828152602001935050505060405180910390a460019850611738565b600098505b505050505050505092915050565b60008061177b60646127100261176d8560c0015186602001516117e690919063ffffffff16565b61182190919063ffffffff16565b905061179481846020015161129790919063ffffffff16565b915050919050565b60008060006117b884604001518661194690919063ffffffff16565b91506117c78460800151611859565b90506117dc818361182190919063ffffffff16565b9250505092915050565b60008060008414156117fb576000915061181a565b828402905082848281151561180c57fe5b0414151561181657fe5b8091505b5092915050565b600080828481151561182f57fe5b0490508091505092915050565b60008160020a836001900481151561185057fe5b04905092915050565b600080600481111561186757fe5b82600481111561187357fe5b141561188357610e109050611941565b6001600481111561189057fe5b82600481111561189c57fe5b14156118af576018610e10029050611941565b600260048111156118bc57fe5b8260048111156118c857fe5b14156118de5760076018610e1002029050611941565b600360048111156118eb57fe5b8260048111156118f757fe5b141561190d57601e6018610e1002029050611941565b60048081111561191957fe5b82600481111561192557fe5b141561193c5761016d6018610e1002029050611941565b600080fd5b919050565b600082821115151561195457fe5b818303905092915050565b60e060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600060048111156119aa57fe5b8152602001600081526020016000815250905600a165627a7a72305820bed8b1c3c2e17661646af383d581d516d78a5b93d68ceec1eb9f33d1149890500029", - "deployedBytecode": "0x6060604052600436106100e6576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a896a1146100eb5780630776298214610126578063208638941461014f5780632762dd8c1461017857806340018a0d146101b35780635f0280ba146101dc5780636f69c96f146102815780638b47e58a146102aa57806393529cdf146102d3578063977a5e64146102fc57806399114d841461035a578063abf410e51461039e578063de53a13c146103f3578063ed8907d71461041c578063fd127a4114610473578063fd40d52e1461049c575b600080fd5b34156100f657600080fd5b6101106004808035600019169060200190919050506104d7565b6040518082815260200191505060405180910390f35b341561013157600080fd5b6101396104fb565b6040518082815260200191505060405180910390f35b341561015a57600080fd5b610162610504565b6040518082815260200191505060405180910390f35b341561018357600080fd5b61019d600480803560001916906020019091905050610510565b6040518082815260200191505060405180910390f35b34156101be57600080fd5b6101c6610532565b6040518082815260200191505060405180910390f35b34156101e757600080fd5b61026760048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061053e565b604051808215151515815260200191505060405180910390f35b341561028c57600080fd5b6102946107b3565b6040518082815260200191505060405180910390f35b34156102b557600080fd5b6102bd6107b9565b6040518082815260200191505060405180910390f35b34156102de57600080fd5b6102e66107be565b6040518082815260200191505060405180910390f35b341561030757600080fd5b61034060048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506107c4565b604051808215151515815260200191505060405180910390f35b341561036557600080fd5b610388600480803560001916906020019091908035906020019091905050610a43565b6040518082815260200191505060405180910390f35b34156103a957600080fd5b6103b1610c4f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103fe57600080fd5b610406610c75565b6040518082815260200191505060405180910390f35b341561042757600080fd5b610441600480803560001916906020019091905050610c7e565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b341561047e57600080fd5b610486610d76565b6040518082815260200191505060405180910390f35b34156104a757600080fd5b6104c1600480803560001916906020019091905050610d83565b6040518082815260200191505060405180910390f35b60008060008360001916600019168152602001908152602001600020549050919050565b6018610e100281565b601e6018610e10020281565b600061051a61195f565b61052383610d9b565b90508060600151915050919050565b60076018610e10020281565b600061054861195f565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636fa9d0566000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156105d657600080fd5b6102c65a03f115156105e757600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561062a57600080fd5b61063387610d9b565b9050806000015173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107a45761069a846000808a600019166000191681526020019081526020016000205461129790919063ffffffff16565b6000808960001916600019168152602001908152602001600020819055507ff1a888d220228f843ac3044ef257c80642e6434d1ddc7ebee0a2813cced3406c87878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405180910390a1600191506107a9565b600091505b5095945050505050565b610e1081565b600581565b61271081565b6000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663079dd4b76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561085757600080fd5b6102c65a03f1151561086857600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108ab57600080fd5b6108b585856112b5565b9150600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663869f05116000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561094557600080fd5b6102c65a03f1151561095657600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663649404bd86866000604051602001526040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1515610a1257600080fd5b6102c65a03f11515610a2357600080fd5b505050604051805190509050818015610a395750805b9250505092915050565b6000610a4d61195f565b60008085600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610adf57600080fd5b6102c65a03f11515610af057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663f6f494c9826000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610b7857600080fd5b6102c65a03f11515610b8957600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16141515610bcc57600080fd5b610bd587610d9b565b9350610be084611746565b9250836040015186111515610bf85760009450610c45565b836060015186101515610c0d57829450610c45565b610c17868561179c565b9150610c428460a00151610c3484866117e690919063ffffffff16565b61182190919063ffffffff16565b94505b5050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60646127100281565b6000806000806000806000806000807fff000000000000000000000000000000000000000000000000000000000000006001028b1694507effffffffffffffffffffffff000000000000000000000000000000000000006001028b16935072ffffff000000000000000000000000000000006001028b1692506ff00000000000000000000000000000006001028b1691506f0ffff0000000000000000000000000006001028b169050610d328560f861183c565b610d3d85609861183c565b610d4885608061183c565b610d5385607c61183c565b610d5e85606c61183c565b99509950995099509950505050505091939590929450565b61016d6018610e10020281565b60006020528060005260406000206000915090505481565b610da361195f565b600080600080600080600080600080600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610e4357600080fd5b6102c65a03f11515610e5457600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663314a522e8f6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610edc57600080fd5b6102c65a03f11515610eed57600080fd5b505050604051805190509b50610f028c610c7e565b809b50819c50829d50839e50849f505050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d23c4c76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610fa457600080fd5b6102c65a03f11515610fb557600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16635715c5b78c6000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561103557600080fd5b6102c65a03f1151561104657600080fd5b505050604051805190509550600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415151561108e57600080fd5b60048081111561109a57fe5b88111515156110a857600080fd5b8760048111156110b457fe5b94506110bf85611859565b9350600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561114f57600080fd5b6102c65a03f1151561116057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663d69dbf638f6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156111e857600080fd5b6102c65a03f115156111f957600080fd5b50505060405180519050925061121884886117e690919063ffffffff16565b915061122d838361129790919063ffffffff16565b905060e0604051908101604052808773ffffffffffffffffffffffffffffffffffffffff1681526020018b815260200184815260200182815260200186600481111561127557fe5b81526020018881526020018a8152509c50505050505050505050505050919050565b60008082840190508381101515156112ab57fe5b8091505092915050565b6000806000806000806000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663079dd4b76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561135157600080fd5b6102c65a03f1151561136257600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156113a557600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561143357600080fd5b6102c65a03f1151561144457600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16636be39bda8c6000604051604001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082600019166000191681526020019150506040805180830381600087803b15156114cb57600080fd5b6102c65a03f115156114dc57600080fd5b5050506040518051906020018051905080985081995050506114fd87610c7e565b809650819750829850839950849a505050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d23c4c76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561159f57600080fd5b6102c65a03f115156115b057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16635715c5b7876000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561163057600080fd5b6102c65a03f1151561164157600080fd5b505050604051805190509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561168a5750600583105b80156116c157503073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b1561173357828173ffffffffffffffffffffffffffffffffffffffff168c600019167f2c500aaec6833a053693d8c2a18a3ed5649a4609699abaf7778c3d389cc40c0588888760405180848152602001838152602001828152602001935050505060405180910390a460019850611738565b600098505b505050505050505092915050565b60008061177b60646127100261176d8560c0015186602001516117e690919063ffffffff16565b61182190919063ffffffff16565b905061179481846020015161129790919063ffffffff16565b915050919050565b60008060006117b884604001518661194690919063ffffffff16565b91506117c78460800151611859565b90506117dc818361182190919063ffffffff16565b9250505092915050565b60008060008414156117fb576000915061181a565b828402905082848281151561180c57fe5b0414151561181657fe5b8091505b5092915050565b600080828481151561182f57fe5b0490508091505092915050565b60008160020a836001900481151561185057fe5b04905092915050565b600080600481111561186757fe5b82600481111561187357fe5b141561188357610e109050611941565b6001600481111561189057fe5b82600481111561189c57fe5b14156118af576018610e10029050611941565b600260048111156118bc57fe5b8260048111156118c857fe5b14156118de5760076018610e1002029050611941565b600360048111156118eb57fe5b8260048111156118f757fe5b141561190d57601e6018610e1002029050611941565b60048081111561191957fe5b82600481111561192557fe5b141561193c5761016d6018610e1002029050611941565b600080fd5b919050565b600082821115151561195457fe5b818303905092915050565b60e060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600060048111156119aa57fe5b8152602001600081526020016000815250905600a165627a7a72305820bed8b1c3c2e17661646af383d581d516d78a5b93d68ceec1eb9f33d1149890500029", + "bytecode": "0x6060604052341561000f57600080fd5b604051602080611a68833981016040528080519060200190919050508080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050506119ea8061007e6000396000f3006060604052600436106100e6576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a896a1146100eb5780630776298214610126578063208638941461014f5780632762dd8c1461017857806340018a0d146101b35780635f0280ba146101dc5780636f69c96f146102815780638b47e58a146102aa57806393529cdf146102d3578063977a5e64146102fc57806399114d841461035a578063abf410e51461039e578063de53a13c146103f3578063ed8907d71461041c578063fd127a4114610473578063fd40d52e1461049c575b600080fd5b34156100f657600080fd5b6101106004808035600019169060200190919050506104d7565b6040518082815260200191505060405180910390f35b341561013157600080fd5b6101396104fb565b6040518082815260200191505060405180910390f35b341561015a57600080fd5b610162610504565b6040518082815260200191505060405180910390f35b341561018357600080fd5b61019d600480803560001916906020019091905050610510565b6040518082815260200191505060405180910390f35b34156101be57600080fd5b6101c6610532565b6040518082815260200191505060405180910390f35b34156101e757600080fd5b61026760048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061053e565b604051808215151515815260200191505060405180910390f35b341561028c57600080fd5b6102946107b3565b6040518082815260200191505060405180910390f35b34156102b557600080fd5b6102bd6107b9565b6040518082815260200191505060405180910390f35b34156102de57600080fd5b6102e66107be565b6040518082815260200191505060405180910390f35b341561030757600080fd5b61034060048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506107c4565b604051808215151515815260200191505060405180910390f35b341561036557600080fd5b610388600480803560001916906020019091908035906020019091905050610a43565b6040518082815260200191505060405180910390f35b34156103a957600080fd5b6103b1610c4f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103fe57600080fd5b610406610c75565b6040518082815260200191505060405180910390f35b341561042757600080fd5b610441600480803560001916906020019091905050610c7e565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b341561047e57600080fd5b610486610d76565b6040518082815260200191505060405180910390f35b34156104a757600080fd5b6104c1600480803560001916906020019091905050610d83565b6040518082815260200191505060405180910390f35b60008060008360001916600019168152602001908152602001600020549050919050565b6018610e100281565b601e6018610e10020281565b600061051a61195f565b61052383610d9b565b90508060600151915050919050565b60076018610e10020281565b600061054861195f565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636fa9d0566000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156105d657600080fd5b6102c65a03f115156105e757600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561062a57600080fd5b61063387610d9b565b9050806000015173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107a45761069a846000808a600019166000191681526020019081526020016000205461129790919063ffffffff16565b6000808960001916600019168152602001908152602001600020819055507ff1a888d220228f843ac3044ef257c80642e6434d1ddc7ebee0a2813cced3406c87878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405180910390a1600191506107a9565b600091505b5095945050505050565b610e1081565b600581565b61271081565b6000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663079dd4b76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561085757600080fd5b6102c65a03f1151561086857600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108ab57600080fd5b6108b585856112b5565b9150600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663869f05116000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561094557600080fd5b6102c65a03f1151561095657600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663649404bd86866000604051602001526040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1515610a1257600080fd5b6102c65a03f11515610a2357600080fd5b505050604051805190509050818015610a395750805b9250505092915050565b6000610a4d61195f565b60008085600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610adf57600080fd5b6102c65a03f11515610af057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663f6f494c9826000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610b7857600080fd5b6102c65a03f11515610b8957600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16141515610bcc57600080fd5b610bd587610d9b565b9350610be084611746565b9250836040015186111515610bf85760009450610c45565b836060015186101515610c0d57829450610c45565b610c17868561179c565b9150610c428460a00151610c3484866117e690919063ffffffff16565b61182190919063ffffffff16565b94505b5050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60646127100281565b6000806000806000806000806000807fff000000000000000000000000000000000000000000000000000000000000006001028b1694507effffffffffffffffffffffff000000000000000000000000000000000000006001028b16935072ffffff000000000000000000000000000000006001028b1692506ff00000000000000000000000000000006001028b1691506f0ffff0000000000000000000000000006001028b169050610d328560f861183c565b610d3d85609861183c565b610d4885608061183c565b610d5385607c61183c565b610d5e85606c61183c565b99509950995099509950505050505091939590929450565b61016d6018610e10020281565b60006020528060005260406000206000915090505481565b610da361195f565b600080600080600080600080600080600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610e4357600080fd5b6102c65a03f11515610e5457600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663314a522e8f6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610edc57600080fd5b6102c65a03f11515610eed57600080fd5b505050604051805190509b50610f028c610c7e565b809b50819c50829d50839e50849f505050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d23c4c76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610fa457600080fd5b6102c65a03f11515610fb557600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16635715c5b78c6000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561103557600080fd5b6102c65a03f1151561104657600080fd5b505050604051805190509550600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415151561108e57600080fd5b60048081111561109a57fe5b88111515156110a857600080fd5b8760048111156110b457fe5b94506110bf85611859565b9350600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561114f57600080fd5b6102c65a03f1151561116057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663d69dbf638f6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156111e857600080fd5b6102c65a03f115156111f957600080fd5b50505060405180519050925061121884886117e690919063ffffffff16565b915061122d838361129790919063ffffffff16565b905060e0604051908101604052808773ffffffffffffffffffffffffffffffffffffffff1681526020018b815260200184815260200182815260200186600481111561127557fe5b81526020018881526020018a8152509c50505050505050505050505050919050565b60008082840190508381101515156112ab57fe5b8091505092915050565b6000806000806000806000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663079dd4b76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561135157600080fd5b6102c65a03f1151561136257600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156113a557600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561143357600080fd5b6102c65a03f1151561144457600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16636be39bda8c6000604051604001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082600019166000191681526020019150506040805180830381600087803b15156114cb57600080fd5b6102c65a03f115156114dc57600080fd5b5050506040518051906020018051905080985081995050506114fd87610c7e565b809650819750829850839950849a505050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d23c4c76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561159f57600080fd5b6102c65a03f115156115b057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16635715c5b7876000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561163057600080fd5b6102c65a03f1151561164157600080fd5b505050604051805190509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561168a5750600583105b80156116c157503073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b1561173357828173ffffffffffffffffffffffffffffffffffffffff168c600019167f2c500aaec6833a053693d8c2a18a3ed5649a4609699abaf7778c3d389cc40c0588888760405180848152602001838152602001828152602001935050505060405180910390a460019850611738565b600098505b505050505050505092915050565b60008061177b60646127100261176d8560c0015186602001516117e690919063ffffffff16565b61182190919063ffffffff16565b905061179481846020015161129790919063ffffffff16565b915050919050565b60008060006117b884604001518661194690919063ffffffff16565b91506117c78460800151611859565b90506117dc818361182190919063ffffffff16565b9250505092915050565b60008060008414156117fb576000915061181a565b828402905082848281151561180c57fe5b0414151561181657fe5b8091505b5092915050565b600080828481151561182f57fe5b0490508091505092915050565b60008160020a836001900481151561185057fe5b04905092915050565b600080600481111561186757fe5b82600481111561187357fe5b141561188357610e109050611941565b6001600481111561189057fe5b82600481111561189c57fe5b14156118af576018610e10029050611941565b600260048111156118bc57fe5b8260048111156118c857fe5b14156118de5760076018610e1002029050611941565b600360048111156118eb57fe5b8260048111156118f757fe5b141561190d57601e6018610e1002029050611941565b60048081111561191957fe5b82600481111561192557fe5b141561193c5761016d6018610e1002029050611941565b600080fd5b919050565b600082821115151561195457fe5b818303905092915050565b60e060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600060048111156119aa57fe5b8152602001600081526020016000815250905600a165627a7a723058206c75d10e14abe61180859cb3114cf640fbc391119d893d2135d90b3779e7b4170029", + "deployedBytecode": "0x6060604052600436106100e6576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a896a1146100eb5780630776298214610126578063208638941461014f5780632762dd8c1461017857806340018a0d146101b35780635f0280ba146101dc5780636f69c96f146102815780638b47e58a146102aa57806393529cdf146102d3578063977a5e64146102fc57806399114d841461035a578063abf410e51461039e578063de53a13c146103f3578063ed8907d71461041c578063fd127a4114610473578063fd40d52e1461049c575b600080fd5b34156100f657600080fd5b6101106004808035600019169060200190919050506104d7565b6040518082815260200191505060405180910390f35b341561013157600080fd5b6101396104fb565b6040518082815260200191505060405180910390f35b341561015a57600080fd5b610162610504565b6040518082815260200191505060405180910390f35b341561018357600080fd5b61019d600480803560001916906020019091905050610510565b6040518082815260200191505060405180910390f35b34156101be57600080fd5b6101c6610532565b6040518082815260200191505060405180910390f35b34156101e757600080fd5b61026760048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061053e565b604051808215151515815260200191505060405180910390f35b341561028c57600080fd5b6102946107b3565b6040518082815260200191505060405180910390f35b34156102b557600080fd5b6102bd6107b9565b6040518082815260200191505060405180910390f35b34156102de57600080fd5b6102e66107be565b6040518082815260200191505060405180910390f35b341561030757600080fd5b61034060048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506107c4565b604051808215151515815260200191505060405180910390f35b341561036557600080fd5b610388600480803560001916906020019091908035906020019091905050610a43565b6040518082815260200191505060405180910390f35b34156103a957600080fd5b6103b1610c4f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103fe57600080fd5b610406610c75565b6040518082815260200191505060405180910390f35b341561042757600080fd5b610441600480803560001916906020019091905050610c7e565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b341561047e57600080fd5b610486610d76565b6040518082815260200191505060405180910390f35b34156104a757600080fd5b6104c1600480803560001916906020019091905050610d83565b6040518082815260200191505060405180910390f35b60008060008360001916600019168152602001908152602001600020549050919050565b6018610e100281565b601e6018610e10020281565b600061051a61195f565b61052383610d9b565b90508060600151915050919050565b60076018610e10020281565b600061054861195f565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636fa9d0566000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156105d657600080fd5b6102c65a03f115156105e757600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561062a57600080fd5b61063387610d9b565b9050806000015173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107a45761069a846000808a600019166000191681526020019081526020016000205461129790919063ffffffff16565b6000808960001916600019168152602001908152602001600020819055507ff1a888d220228f843ac3044ef257c80642e6434d1ddc7ebee0a2813cced3406c87878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405180910390a1600191506107a9565b600091505b5095945050505050565b610e1081565b600581565b61271081565b6000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663079dd4b76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561085757600080fd5b6102c65a03f1151561086857600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108ab57600080fd5b6108b585856112b5565b9150600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663869f05116000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561094557600080fd5b6102c65a03f1151561095657600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663649404bd86866000604051602001526040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1515610a1257600080fd5b6102c65a03f11515610a2357600080fd5b505050604051805190509050818015610a395750805b9250505092915050565b6000610a4d61195f565b60008085600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610adf57600080fd5b6102c65a03f11515610af057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663f6f494c9826000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610b7857600080fd5b6102c65a03f11515610b8957600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16141515610bcc57600080fd5b610bd587610d9b565b9350610be084611746565b9250836040015186111515610bf85760009450610c45565b836060015186101515610c0d57829450610c45565b610c17868561179c565b9150610c428460a00151610c3484866117e690919063ffffffff16565b61182190919063ffffffff16565b94505b5050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60646127100281565b6000806000806000806000806000807fff000000000000000000000000000000000000000000000000000000000000006001028b1694507effffffffffffffffffffffff000000000000000000000000000000000000006001028b16935072ffffff000000000000000000000000000000006001028b1692506ff00000000000000000000000000000006001028b1691506f0ffff0000000000000000000000000006001028b169050610d328560f861183c565b610d3d85609861183c565b610d4885608061183c565b610d5385607c61183c565b610d5e85606c61183c565b99509950995099509950505050505091939590929450565b61016d6018610e10020281565b60006020528060005260406000206000915090505481565b610da361195f565b600080600080600080600080600080600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610e4357600080fd5b6102c65a03f11515610e5457600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663314a522e8f6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610edc57600080fd5b6102c65a03f11515610eed57600080fd5b505050604051805190509b50610f028c610c7e565b809b50819c50829d50839e50849f505050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d23c4c76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610fa457600080fd5b6102c65a03f11515610fb557600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16635715c5b78c6000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561103557600080fd5b6102c65a03f1151561104657600080fd5b505050604051805190509550600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415151561108e57600080fd5b60048081111561109a57fe5b88111515156110a857600080fd5b8760048111156110b457fe5b94506110bf85611859565b9350600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561114f57600080fd5b6102c65a03f1151561116057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663d69dbf638f6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156111e857600080fd5b6102c65a03f115156111f957600080fd5b50505060405180519050925061121884886117e690919063ffffffff16565b915061122d838361129790919063ffffffff16565b905060e0604051908101604052808773ffffffffffffffffffffffffffffffffffffffff1681526020018b815260200184815260200182815260200186600481111561127557fe5b81526020018881526020018a8152509c50505050505050505050505050919050565b60008082840190508381101515156112ab57fe5b8091505092915050565b6000806000806000806000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663079dd4b76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561135157600080fd5b6102c65a03f1151561136257600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156113a557600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561143357600080fd5b6102c65a03f1151561144457600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16636be39bda8c6000604051604001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082600019166000191681526020019150506040805180830381600087803b15156114cb57600080fd5b6102c65a03f115156114dc57600080fd5b5050506040518051906020018051905080985081995050506114fd87610c7e565b809650819750829850839950849a505050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d23c4c76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561159f57600080fd5b6102c65a03f115156115b057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16635715c5b7876000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561163057600080fd5b6102c65a03f1151561164157600080fd5b505050604051805190509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561168a5750600583105b80156116c157503073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b1561173357828173ffffffffffffffffffffffffffffffffffffffff168c600019167f2c500aaec6833a053693d8c2a18a3ed5649a4609699abaf7778c3d389cc40c0588888760405180848152602001838152602001828152602001935050505060405180910390a460019850611738565b600098505b505050505050505092915050565b60008061177b60646127100261176d8560c0015186602001516117e690919063ffffffff16565b61182190919063ffffffff16565b905061179481846020015161129790919063ffffffff16565b915050919050565b60008060006117b884604001518661194690919063ffffffff16565b91506117c78460800151611859565b90506117dc818361182190919063ffffffff16565b9250505092915050565b60008060008414156117fb576000915061181a565b828402905082848281151561180c57fe5b0414151561181657fe5b8091505b5092915050565b600080828481151561182f57fe5b0490508091505092915050565b60008160020a836001900481151561185057fe5b04905092915050565b600080600481111561186757fe5b82600481111561187357fe5b141561188357610e109050611941565b6001600481111561189057fe5b82600481111561189c57fe5b14156118af576018610e10029050611941565b600260048111156118bc57fe5b8260048111156118c857fe5b14156118de5760076018610e1002029050611941565b600360048111156118eb57fe5b8260048111156118f757fe5b141561190d57601e6018610e1002029050611941565b60048081111561191957fe5b82600481111561192557fe5b141561193c5761016d6018610e1002029050611941565b600080fd5b919050565b600082821115151561195457fe5b818303905092915050565b60e060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600060048111156119aa57fe5b8152602001600081526020016000815250905600a165627a7a723058206c75d10e14abe61180859cb3114cf640fbc391119d893d2135d90b3779e7b4170029", "sourceMap": "844:893:14:-;;;933:146;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1059:16;3551:17:16;3515:16;;:54;;;;;;;;;;;;;;;;;;3408:168;933:146:14;844:893;;;;;;", "deployedSourceMap": "844:893:14:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9334:167:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1532:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1687:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1476:259:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1610:71:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6636:742;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1473:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;860:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2025:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1085:385:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7987:1066:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2492:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2329:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9507:2790;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1766:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2441:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9334:167;9430:17;9470:11;:24;9482:11;9470:24;;;;;;;;;;;;;;;;;;9463:31;;9334:167;;;:::o;1532:72::-;1602:2;1519:7;1577:27;1532:72;:::o;1687:73::-;1758:2;1602;1519:7;1577:27;1734:26;1687:73;:::o;1476:259:14:-;1586:4;1606:34;;:::i;:::-;1643:40;1670:12;1643:26;:40::i;:::-;1606:77;;1701:6;:27;;;1694:34;;1476:259;;;;:::o;1610:71:16:-;1680:1;1602:2;1519:7;1577:27;1656:25;1610:71;:::o;6636:742::-;6865:13;6894:34;;:::i;:::-;3051:16;;;;;;;;;;;:32;;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3029:57;;:10;:57;;;3021:66;;;;;;;;6931:39;6958:11;6931:26;:39::i;:::-;6894:76;;7001:6;:28;;;6985:44;;:12;:44;;;6981:368;;;7072:46;7101:16;7072:11;:24;7084:11;7072:24;;;;;;;;;;;;;;;;;;:28;;:46;;;;:::i;:::-;7045:11;:24;7057:11;7045:24;;;;;;;;;;;;;;;;;:73;;;;7133:179;7171:11;7200:5;7223:11;7252:16;7286:12;7133:179;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7334:4;7327:11;;;;6981:368;7366:5;7359:12;;3097:1;6636:742;;;;;;;;:::o;1473:53::-;1519:7;1473:53;:::o;860:52::-;911:1;860:52;:::o;2025:67::-;2085:7;2025:67;:::o;1085:385:14:-;1226:13;1255:15;1327:19;3353:16:16;;;;;;;;;;;:27;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3331:52;;:10;:52;;;3323:61;;;;;;;;1273:44:14;1297:11;1310:6;1273:23;:44::i;:::-;1255:62;;1349:16;;;;;;;;;;;:31;;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:47;;;1397:11;1410:6;1349:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1327:90;;1435:10;:28;;;;;1449:14;1435:28;1428:35;;1085:385;;;;;;:::o;7987:1066:16:-;8175:28;8219:34;;:::i;:::-;8305:26;8871:13;8145:11;3201:16;;;;;;;;;;;:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:48;;;3250:11;3201:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3184:78;;3192:4;3184:78;;;3176:87;;;;;;;;8256:39;8283:11;8256:26;:39::i;:::-;8219:76;;8334:43;8370:6;8334:35;:43::i;:::-;8305:72;;8405:6;:29;;;8392:9;:42;;8388:659;;;8587:1;8580:8;;;;8388:659;8622:6;:27;;;8609:9;:40;;8605:442;;;8819:21;8812:28;;;;8605:442;8887:51;8920:9;8931:6;8887:32;:51::i;:::-;8871:67;;8959:77;8999:6;:36;;;8959:35;8985:8;8959:21;:25;;:35;;;;:::i;:::-;:39;;:77;;;;:::i;:::-;8952:84;;3273:1;7987:1066;;;;;;;;:::o;2492:40::-;;;;;;;;;;;;;:::o;2329:105::-;2431:3;2085:7;2392:42;2329:105;:::o;9507:2790::-;9620:25;9659:21;9694:18;9726:26;9766:35;9940:34;10160:30;10372:27;10588:35;10845:44;10002:66;9989:79;;:10;:79;9940:128;;10218:66;10205:79;;:10;:79;10160:124;;10427:66;10414:79;;:10;:79;10372:121;;10651:66;10638:79;;:10;:79;10588:129;;10917:66;10904:79;;:10;:79;10845:138;;11994:46;12008:26;12036:3;11994:13;:46::i;:::-;12054:42;12068:22;12092:3;12054:13;:42::i;:::-;12110:39;12124:19;12145:3;12110:13;:39::i;:::-;12163:47;12177:27;12206:3;12163:13;:47::i;:::-;12224:56;12238:36;12276:3;12224:13;:56::i;:::-;11973:317;;;;;;;;;;9507:2790;;;;;;;;;;;;:::o;1766:73::-;1836:3;1602:2;1519:7;1577:27;1812;1766:73;:::o;2441:44::-;;;;;;;;;;;;;;;;;:::o;14136:2420::-;14241:27;;:::i;:::-;14284:18;14467:24;14574:20;14664:17;14782:28;14917:34;15133:29;15568:41;15668:36;15785:27;15907:24;16022:25;14305:16;;;;;;;;;;;:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:58;;;14364:11;14305:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14284:92;;15085:37;15111:10;15085:25;:37::i;:::-;14962:160;;;;;;;;;;;;;;;;;;;;15177:16;;;;;;;;;;;:30;;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:55;;;15233:19;15177:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15133:120;;15373:1;15340:35;;:21;:35;;;;15332:44;;;;;;;;15529:26;15524:32;;;;;;;;15497:23;:59;;15489:68;;;;;;;;15633:23;15612:45;;;;;;;;15568:89;;15719:56;15754:20;15719:34;:56::i;:::-;15668:107;;15827:16;;;;;;;;;;;:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:57;;;15885:11;15827:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15785:112;;15946:66;15980:31;15946:29;:33;;:66;;;;:::i;:::-;15907:105;;16062:47;16086:22;16062:19;:23;;:47;;;;:::i;:::-;16022:87;;16127:422;;;;;;;;;16185:21;16127:422;;;;;;16237:15;16127:422;;;;16330:22;16127:422;;;;16388:20;16127:422;;;;16444:20;16127:422;;;;;;;;;;;;16509:29;16127:422;;;;16280:12;16127:422;;;16120:429;;14136:2420;;;;;;;;;;;;;;;:::o;1007:129:38:-;1065:7;1080:9;1096:1;1092;:5;1080:17;;1115:1;1110;:6;;1103:14;;;;;;1130:1;1123:8;;1007:129;;;;;:::o;4229:1696:16:-;4370:13;4399:21;4430:31;4579:24;4613:20;4643:17;4670:25;4705:34;4931:29;3353:16;;;;;;;;;;;:27;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3331:52;;:10;:52;;;3323:61;;;;;;;;4515:16;;;;;;;;;;;:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:40;;;4556:11;4515:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4472:96;;;;;;;;4870:50;4896:23;4870:25;:50::i;:::-;4750:170;;;;;;;;;;;;;;;;;;;;4975:16;;;;;;;;;;;:30;;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:55;;;5031:19;4975:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4931:120;;5473:1;5440:35;;:21;:35;;;;:101;;;;;911:1;5491:20;:50;5440:101;:147;;;;;5582:4;5557:30;;:13;:30;;;5440:147;5436:460;;;5778:20;5676:21;5603:256;;5647:11;5603:256;;;;5715:15;5748:12;5816:29;5603:256;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5881:4;5874:11;;;;5436:460;5913:5;5906:12;;3394:1;4229:1696;;;;;;;;;;;;:::o;13492:638::-;13614:27;13925:18;13946:118;2431:3;2085:7;2392:42;13946:60;13986:6;:19;;;13946:6;:22;;;:39;;:60;;;;:::i;:::-;:77;;:118;;;;:::i;:::-;13925:139;;14082:41;14109:13;14082:6;:22;;;:26;;:41;;;;:::i;:::-;14075:48;;13492:638;;;;:::o;12707:404::-;12850:10;12876;12943:36;12889:44;12903:6;:29;;;12889:9;:13;;:44;;;;:::i;:::-;12876:57;;12982:63;13017:6;:27;;;12982:34;:63::i;:::-;12943:102;;13062:42;13072:31;13062:5;:9;;:42;;;;:::i;:::-;13055:49;;12707:404;;;;;;:::o;203:173:38:-;261:7;316:9;285:1;280;:6;276:35;;;303:1;296:8;;;;276:35;332:1;328;:5;316:17;;355:1;350;346;:5;;;;;;;;:10;339:18;;;;;;370:1;363:8;;203:173;;;;;;:::o;458:265::-;516:7;605:9;621:1;617;:5;;;;;;;;605:17;;717:1;710:8;;458:265;;;;;:::o;12544:157:16:-;12642:4;12688:6;12683:1;:11;12674:5;12669:11;;;:25;;;;;;;;12662:32;;12544:157;;;;:::o;16562:806::-;16696:37;16777:26;16753:50;;;;;;;;:20;:50;;;;;;;;;16749:613;;;1519:7;16819:29;;;;16749:613;16893:25;16869:49;;;;;;;;:20;:49;;;;;;;;;16865:497;;;1602:2;1519:7;1577:27;16934:28;;;;16865:497;17007:26;16983:50;;;;;;;;:20;:50;;;;;;;;;16979:383;;;1680:1;1602:2;1519:7;1577:27;1656:25;17049:29;;;;16979:383;17123:27;17099:51;;;;;;;;:20;:51;;;;;;;;;17095:267;;;1758:2;1602;1519:7;1577:27;1734:26;17166:30;;;;17095:267;17241:26;17217:50;;;;;;;;:20;:50;;;;;;;;;17213:149;;;1836:3;1602:2;1519:7;1577:27;1812;17283:29;;;;17213:149;17343:8;;;16562:806;;;;:::o;835:110:38:-;893:7;920:1;915;:6;;908:14;;;;;;939:1;935;:5;928:12;;835:110;;;;:::o;844:893:14:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\nimport \"./SimpleInterestTermsContract.sol\";\nimport \"../Collateralizer.sol\";\n\n\n/**\n * Example collateralized terms contract for usage in simple interest debt agreements\n *\n * Authors: nadavhollander, saturnial, jdkanani, graemecode\n */\ncontract CollateralizedSimpleInterestTermsContract is SimpleInterestTermsContract {\n\n function CollateralizedSimpleInterestTermsContract(\n address contractRegistry\n ) public SimpleInterestTermsContract(contractRegistry) {}\n\n function registerTermStart(\n bytes32 agreementId,\n address debtor\n )\n public\n onlyDebtKernel\n returns (bool _success)\n {\n bool registered = super.registerTermStart(agreementId, debtor);\n bool collateralized = contractRegistry.collateralizer().collateralize(agreementId, debtor);\n\n return registered && collateralized;\n }\n\n function getTermEndTimestamp(\n bytes32 _agreementId\n )\n public\n view\n returns (uint)\n {\n SimpleInterestParams memory params = unpackParamsForAgreementID(_agreementId);\n\n return params.termEndUnixTimestamp;\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/examples/CollateralizedSimpleInterestTermsContract.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/examples/CollateralizedSimpleInterestTermsContract.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/examples/CollateralizedSimpleInterestTermsContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/examples/CollateralizedSimpleInterestTermsContract.sol", "exportedSymbols": { "CollateralizedSimpleInterestTermsContract": [ 5273 @@ -412,7 +412,7 @@ { "attributes": { "SourceUnit": 6053, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/examples/SimpleInterestTermsContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/examples/SimpleInterestTermsContract.sol", "file": "./SimpleInterestTermsContract.sol", "scope": 5274, "symbolAliases": [ @@ -427,7 +427,7 @@ { "attributes": { "SourceUnit": 615, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/Collateralizer.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/Collateralizer.sol", "file": "../Collateralizer.sol", "scope": 5274, "symbolAliases": [ @@ -1334,7 +1334,7 @@ "42": { "events": {}, "links": {}, - "address": "0x670315b61825f2691084fb9387996675cf2c0225" + "address": "0x7b7be94999219352b02c70b62b7cc09f7179b3b0" }, "70": { "events": {}, @@ -1343,5 +1343,5 @@ } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:14:48.932Z" + "updatedAt": "2018-10-09T17:51:37.279Z" } \ No newline at end of file diff --git a/artifacts/json/Collateralizer.json b/artifacts/json/Collateralizer.json index 46a17abe..95adba79 100644 --- a/artifacts/json/Collateralizer.json +++ b/artifacts/json/Collateralizer.json @@ -466,15 +466,15 @@ "type": "event" } ], - "bytecode": "0x606060405260008060146101000a81548160ff021916908315150217905550341561002957600080fd5b6040516080806125d983398101604052808051906020019091908051906020019091908051906020019091908051906020019091905050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050612422806101b76000396000f300606060405260043610610111576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680627eb667146101165780630eefdbad1461016b5780632e667c4e146101c05780632f866f731461024e5780633f4ba83a146102a357806344c4ea95146102b85780634bbf7a67146102df5780635c975abb1461031657806361a52a3614610343578063649404bd1461036c5780638456cb59146103ca5780638da5cb5b146103df5780639ae1c1f3146104345780639d23c4c71461046d578063ae72c6ef146104c2578063ca062647146104fb578063e4b67a4c14610544578063ed8e52bd146105ab578063f2fde38b146105d2578063f466f42e1461060b575b600080fd5b341561012157600080fd5b610129610675565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561017657600080fd5b61017e61069b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101cb57600080fd5b6101d36106c1565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102135780820151818401526020810190506101f8565b50505050905090810190601f1680156102405780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561025957600080fd5b6102616106fa565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102ae57600080fd5b6102b6610720565b005b34156102c357600080fd5b6102dd6004808035600019169060200190919050506107de565b005b34156102ea57600080fd5b6103006004808035906020019091905050610c9a565b6040518082815260200191505060405180910390f35b341561032157600080fd5b610329610ccb565b604051808215151515815260200191505060405180910390f35b341561034e57600080fd5b610356610cde565b6040518082815260200191505060405180910390f35b341561037757600080fd5b6103b060048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610ce5565b604051808215151515815260200191505060405180910390f35b34156103d557600080fd5b6103dd61124b565b005b34156103ea57600080fd5b6103f261130b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561043f57600080fd5b61046b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611330565b005b341561047857600080fd5b6104806113d9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104cd57600080fd5b6104f9600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506113ff565b005b341561050657600080fd5b6105206004808035600019169060200190919050506114a8565b60405180848152602001838152602001828152602001935050505060405180910390f35b341561054f57600080fd5b610569600480803560001916906020019091905050611534565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156105b657600080fd5b6105d0600480803560001916906020019091905050611567565b005b34156105dd57600080fd5b610609600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611a11565b005b341561061657600080fd5b61061e611b66565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610661578082015181840152602081019050610646565b505050509050019250505060405180910390f35b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6040805190810160405280600e81526020017f636f6c6c61746572616c697a657200000000000000000000000000000000000081525081565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561077b57600080fd5b600060149054906101000a900460ff16151561079657600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b60008060008060008060149054906101000a900460ff1615151561080157600080fd5b61080a86611b7d565b8095508196508297508398505050505060008411151561082957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415151561086557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff1660056000886000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156108dc57600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166303a896a1876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b151561095b57600080fd5b6102c65a03f1151561096c57600080fd5b505050604051805190508273ffffffffffffffffffffffffffffffffffffffff166399114d84888573ffffffffffffffffffffffffffffffffffffffff16632762dd8c8b6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610a1257600080fd5b6102c65a03f11515610a2357600080fd5b505050604051805190506000604051602001526040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050602060405180830381600087803b1515610a9657600080fd5b6102c65a03f11515610aa757600080fd5b5050506040518051905011151515610abe57600080fd5b60056000876000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060056000876000191660001916815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690558473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82866000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1515610be557600080fd5b6102c65a03f11515610bf657600080fd5b505050604051805190501515610c0b57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff1686600019167f2621540e2b91ca10330d6a7cbd6fb8cab2396f91c4935ad76b1183770819fa1f8787604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a3505050505050565b6000610cc4610cb58362015180611d3990919063ffffffff16565b42611d7490919063ffffffff16565b9050919050565b600060149054906101000a900460ff1681565b6201518081565b6000806000806000806000610d04336006611d8d90919063ffffffff16565b1515610d0f57600080fd5b600060149054906101000a900460ff16151515610d2b57600080fd5b610d3489611b7d565b809650819750829850839950505050503373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515610d7e57600080fd5b600085111515610d8d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614151515610dc957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560008b6000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515610e3f57600080fd5b859150309050848273ffffffffffffffffffffffffffffffffffffffff166370a082318a6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1515610ee957600080fd5b6102c65a03f11515610efa57600080fd5b5050506040518051905010151515610f1157600080fd5b848273ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e8a600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b151561100b57600080fd5b6102c65a03f1151561101c57600080fd5b505050604051805190501015151561103357600080fd5b87600560008b6000191660001916815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166315dacbea838a84896000604051602001526040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050602060405180830381600087803b15156111c257600080fd5b6102c65a03f115156111d357600080fd5b5050506040518051905015156111e857600080fd5b8573ffffffffffffffffffffffffffffffffffffffff1689600019167f38f12634ebefbe7f6767652aae05e220f95e0ca8ef8353c9c9c5ae439a592aec876040518082815260200191505060405180910390a36001965050505050505092915050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156112a657600080fd5b600060149054906101000a900460ff161515156112c257600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561138b57600080fd5b6113d6816040805190810160405280600e81526020017f636f6c6c61746572616c697a65720000000000000000000000000000000000008152506006611de69092919063ffffffff16565b50565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561145a57600080fd5b6114a5816040805190810160405280600e81526020017f636f6c6c61746572616c697a657200000000000000000000000000000000000081525060066120dc9092919063ffffffff16565b50565b6000806000806000806000806d0ff0000000000000000000000000600102891694506c0fffffffffffffffffffffff00600102891693506c1000000000000000000000000085600190048115156114fb57fe5b049250610100846001900481151561150f57fe5b04915060ff600102891690508282826001900497509750975050505050509193909250565b60056020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008060008060149054906101000a900460ff1615151561158a57600080fd5b61159386611b7d565b809550819650829750839850505050506000841115156115b257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141515156115ee57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff1660056000886000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561166557600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166303a896a1876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156116e457600080fd5b6102c65a03f115156116f557600080fd5b505050604051805190508273ffffffffffffffffffffffffffffffffffffffff166399114d848861172587610c9a565b6000604051602001526040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050602060405180830381600087803b151561178e57600080fd5b6102c65a03f1151561179f57600080fd5b505050604051805190501115156117b557600080fd5b60056000876000191660001916815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ba20dda4876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b151561189457600080fd5b6102c65a03f115156118a557600080fd5b5050506040518051905090508473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82866000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b151561195c57600080fd5b6102c65a03f1151561196d57600080fd5b50505060405180519050151561198257600080fd5b8073ffffffffffffffffffffffffffffffffffffffff1686600019167f50d195a4b80a950617a8e0e18ac9dd4c0236ac72d5e12355d881443823870d398787604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a3505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a6c57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611aa857600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611b6e612365565b611b7860066122b8565b905090565b600080600080600080600080600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636be39bda8c6000604051604001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082600019166000191681526020019150506040805180830381600087803b1515611c2c57600080fd5b6102c65a03f11515611c3d57600080fd5b505050604051805190602001805190508096508197505050611c5e856114a8565b809450819550829650505050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635715c5b7856000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515611d0357600080fd5b6102c65a03f11515611d1457600080fd5b5050506040518051905090508083838899509950995099505050505050509193509193565b6000806000841415611d4e5760009150611d6d565b8284029050828482811515611d5f57fe5b04141515611d6957fe5b8091505b5092915050565b6000828211151515611d8257fe5b818303905092915050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000806000611df58686611d8d565b1515611e0057600080fd5b8560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600186600201805490500391508560020182815481101515611e6257fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055808660020184815481101515611ef357fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090558560020182815481101515611fd857fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600186600201818180549050039150816120209190612379565b508473ffffffffffffffffffffffffffffffffffffffff167f0814e4ee85854cea446b4a27a460e5ffb41516230dbc02f226c07907e432241c856040518080602001828103825283818151815260200191508051906020019080838360005b8381101561209a57808201518184015260208101905061207f565b50505050905090810190601f1680156120c75780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050505050565b6120e68383612350565b15156120f157600080fd5b60018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555082600201805480600101828161216191906123a5565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060018360020180549050038360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f571925c699f9072cec76b6c6c000571cc8d0bb5c47e5819202e2e9496c6508b5826040518080602001828103825283818151815260200191508051906020019080838360005b8381101561227957808201518184015260208101905061225e565b50505050905090810190601f1680156122a65780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b6122c0612365565b8160020180548060200260200160405190810160405280929190818152602001828054801561234457602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116122fa575b50505050509050919050565b600061235c8383611d8d565b15905092915050565b602060405190810160405280600081525090565b8154818355818115116123a05781836000526020600020918201910161239f91906123d1565b5b505050565b8154818355818115116123cc578183600052602060002091820191016123cb91906123d1565b5b505050565b6123f391905b808211156123ef5760008160009055506001016123d7565b5090565b905600a165627a7a723058203b584ec992a2b71a9f97e43f2ea339359f8fd35253cf72bd14ae3b2d2a47a1d40029", - "deployedBytecode": "0x606060405260043610610111576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680627eb667146101165780630eefdbad1461016b5780632e667c4e146101c05780632f866f731461024e5780633f4ba83a146102a357806344c4ea95146102b85780634bbf7a67146102df5780635c975abb1461031657806361a52a3614610343578063649404bd1461036c5780638456cb59146103ca5780638da5cb5b146103df5780639ae1c1f3146104345780639d23c4c71461046d578063ae72c6ef146104c2578063ca062647146104fb578063e4b67a4c14610544578063ed8e52bd146105ab578063f2fde38b146105d2578063f466f42e1461060b575b600080fd5b341561012157600080fd5b610129610675565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561017657600080fd5b61017e61069b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101cb57600080fd5b6101d36106c1565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102135780820151818401526020810190506101f8565b50505050905090810190601f1680156102405780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561025957600080fd5b6102616106fa565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102ae57600080fd5b6102b6610720565b005b34156102c357600080fd5b6102dd6004808035600019169060200190919050506107de565b005b34156102ea57600080fd5b6103006004808035906020019091905050610c9a565b6040518082815260200191505060405180910390f35b341561032157600080fd5b610329610ccb565b604051808215151515815260200191505060405180910390f35b341561034e57600080fd5b610356610cde565b6040518082815260200191505060405180910390f35b341561037757600080fd5b6103b060048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610ce5565b604051808215151515815260200191505060405180910390f35b34156103d557600080fd5b6103dd61124b565b005b34156103ea57600080fd5b6103f261130b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561043f57600080fd5b61046b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611330565b005b341561047857600080fd5b6104806113d9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104cd57600080fd5b6104f9600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506113ff565b005b341561050657600080fd5b6105206004808035600019169060200190919050506114a8565b60405180848152602001838152602001828152602001935050505060405180910390f35b341561054f57600080fd5b610569600480803560001916906020019091905050611534565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156105b657600080fd5b6105d0600480803560001916906020019091905050611567565b005b34156105dd57600080fd5b610609600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611a11565b005b341561061657600080fd5b61061e611b66565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610661578082015181840152602081019050610646565b505050509050019250505060405180910390f35b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6040805190810160405280600e81526020017f636f6c6c61746572616c697a657200000000000000000000000000000000000081525081565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561077b57600080fd5b600060149054906101000a900460ff16151561079657600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b60008060008060008060149054906101000a900460ff1615151561080157600080fd5b61080a86611b7d565b8095508196508297508398505050505060008411151561082957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415151561086557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff1660056000886000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156108dc57600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166303a896a1876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b151561095b57600080fd5b6102c65a03f1151561096c57600080fd5b505050604051805190508273ffffffffffffffffffffffffffffffffffffffff166399114d84888573ffffffffffffffffffffffffffffffffffffffff16632762dd8c8b6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610a1257600080fd5b6102c65a03f11515610a2357600080fd5b505050604051805190506000604051602001526040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050602060405180830381600087803b1515610a9657600080fd5b6102c65a03f11515610aa757600080fd5b5050506040518051905011151515610abe57600080fd5b60056000876000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060056000876000191660001916815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690558473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82866000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1515610be557600080fd5b6102c65a03f11515610bf657600080fd5b505050604051805190501515610c0b57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff1686600019167f2621540e2b91ca10330d6a7cbd6fb8cab2396f91c4935ad76b1183770819fa1f8787604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a3505050505050565b6000610cc4610cb58362015180611d3990919063ffffffff16565b42611d7490919063ffffffff16565b9050919050565b600060149054906101000a900460ff1681565b6201518081565b6000806000806000806000610d04336006611d8d90919063ffffffff16565b1515610d0f57600080fd5b600060149054906101000a900460ff16151515610d2b57600080fd5b610d3489611b7d565b809650819750829850839950505050503373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515610d7e57600080fd5b600085111515610d8d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614151515610dc957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560008b6000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515610e3f57600080fd5b859150309050848273ffffffffffffffffffffffffffffffffffffffff166370a082318a6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1515610ee957600080fd5b6102c65a03f11515610efa57600080fd5b5050506040518051905010151515610f1157600080fd5b848273ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e8a600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b151561100b57600080fd5b6102c65a03f1151561101c57600080fd5b505050604051805190501015151561103357600080fd5b87600560008b6000191660001916815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166315dacbea838a84896000604051602001526040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050602060405180830381600087803b15156111c257600080fd5b6102c65a03f115156111d357600080fd5b5050506040518051905015156111e857600080fd5b8573ffffffffffffffffffffffffffffffffffffffff1689600019167f38f12634ebefbe7f6767652aae05e220f95e0ca8ef8353c9c9c5ae439a592aec876040518082815260200191505060405180910390a36001965050505050505092915050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156112a657600080fd5b600060149054906101000a900460ff161515156112c257600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561138b57600080fd5b6113d6816040805190810160405280600e81526020017f636f6c6c61746572616c697a65720000000000000000000000000000000000008152506006611de69092919063ffffffff16565b50565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561145a57600080fd5b6114a5816040805190810160405280600e81526020017f636f6c6c61746572616c697a657200000000000000000000000000000000000081525060066120dc9092919063ffffffff16565b50565b6000806000806000806000806d0ff0000000000000000000000000600102891694506c0fffffffffffffffffffffff00600102891693506c1000000000000000000000000085600190048115156114fb57fe5b049250610100846001900481151561150f57fe5b04915060ff600102891690508282826001900497509750975050505050509193909250565b60056020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008060008060149054906101000a900460ff1615151561158a57600080fd5b61159386611b7d565b809550819650829750839850505050506000841115156115b257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141515156115ee57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff1660056000886000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561166557600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166303a896a1876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156116e457600080fd5b6102c65a03f115156116f557600080fd5b505050604051805190508273ffffffffffffffffffffffffffffffffffffffff166399114d848861172587610c9a565b6000604051602001526040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050602060405180830381600087803b151561178e57600080fd5b6102c65a03f1151561179f57600080fd5b505050604051805190501115156117b557600080fd5b60056000876000191660001916815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ba20dda4876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b151561189457600080fd5b6102c65a03f115156118a557600080fd5b5050506040518051905090508473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82866000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b151561195c57600080fd5b6102c65a03f1151561196d57600080fd5b50505060405180519050151561198257600080fd5b8073ffffffffffffffffffffffffffffffffffffffff1686600019167f50d195a4b80a950617a8e0e18ac9dd4c0236ac72d5e12355d881443823870d398787604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a3505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a6c57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611aa857600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611b6e612365565b611b7860066122b8565b905090565b600080600080600080600080600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636be39bda8c6000604051604001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082600019166000191681526020019150506040805180830381600087803b1515611c2c57600080fd5b6102c65a03f11515611c3d57600080fd5b505050604051805190602001805190508096508197505050611c5e856114a8565b809450819550829650505050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635715c5b7856000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515611d0357600080fd5b6102c65a03f11515611d1457600080fd5b5050506040518051905090508083838899509950995099505050505050509193509193565b6000806000841415611d4e5760009150611d6d565b8284029050828482811515611d5f57fe5b04141515611d6957fe5b8091505b5092915050565b6000828211151515611d8257fe5b818303905092915050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000806000611df58686611d8d565b1515611e0057600080fd5b8560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600186600201805490500391508560020182815481101515611e6257fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055808660020184815481101515611ef357fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090558560020182815481101515611fd857fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600186600201818180549050039150816120209190612379565b508473ffffffffffffffffffffffffffffffffffffffff167f0814e4ee85854cea446b4a27a460e5ffb41516230dbc02f226c07907e432241c856040518080602001828103825283818151815260200191508051906020019080838360005b8381101561209a57808201518184015260208101905061207f565b50505050905090810190601f1680156120c75780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050505050565b6120e68383612350565b15156120f157600080fd5b60018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555082600201805480600101828161216191906123a5565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060018360020180549050038360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f571925c699f9072cec76b6c6c000571cc8d0bb5c47e5819202e2e9496c6508b5826040518080602001828103825283818151815260200191508051906020019080838360005b8381101561227957808201518184015260208101905061225e565b50505050905090810190601f1680156122a65780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b6122c0612365565b8160020180548060200260200160405190810160405280929190818152602001828054801561234457602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116122fa575b50505050509050919050565b600061235c8383611d8d565b15905092915050565b602060405190810160405280600081525090565b8154818355818115116123a05781836000526020600020918201910161239f91906123d1565b5b505050565b8154818355818115116123cc578183600052602060002091820191016123cb91906123d1565b5b505050565b6123f391905b808211156123ef5760008160009055506001016123d7565b5090565b905600a165627a7a723058203b584ec992a2b71a9f97e43f2ea339359f8fd35253cf72bd14ae3b2d2a47a1d40029", + "bytecode": "0x606060405260008060146101000a81548160ff021916908315150217905550341561002957600080fd5b6040516080806125d983398101604052808051906020019091908051906020019091908051906020019091908051906020019091905050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050612422806101b76000396000f300606060405260043610610111576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680627eb667146101165780630eefdbad1461016b5780632e667c4e146101c05780632f866f731461024e5780633f4ba83a146102a357806344c4ea95146102b85780634bbf7a67146102df5780635c975abb1461031657806361a52a3614610343578063649404bd1461036c5780638456cb59146103ca5780638da5cb5b146103df5780639ae1c1f3146104345780639d23c4c71461046d578063ae72c6ef146104c2578063ca062647146104fb578063e4b67a4c14610544578063ed8e52bd146105ab578063f2fde38b146105d2578063f466f42e1461060b575b600080fd5b341561012157600080fd5b610129610675565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561017657600080fd5b61017e61069b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101cb57600080fd5b6101d36106c1565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102135780820151818401526020810190506101f8565b50505050905090810190601f1680156102405780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561025957600080fd5b6102616106fa565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102ae57600080fd5b6102b6610720565b005b34156102c357600080fd5b6102dd6004808035600019169060200190919050506107de565b005b34156102ea57600080fd5b6103006004808035906020019091905050610c9a565b6040518082815260200191505060405180910390f35b341561032157600080fd5b610329610ccb565b604051808215151515815260200191505060405180910390f35b341561034e57600080fd5b610356610cde565b6040518082815260200191505060405180910390f35b341561037757600080fd5b6103b060048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610ce5565b604051808215151515815260200191505060405180910390f35b34156103d557600080fd5b6103dd61124b565b005b34156103ea57600080fd5b6103f261130b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561043f57600080fd5b61046b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611330565b005b341561047857600080fd5b6104806113d9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104cd57600080fd5b6104f9600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506113ff565b005b341561050657600080fd5b6105206004808035600019169060200190919050506114a8565b60405180848152602001838152602001828152602001935050505060405180910390f35b341561054f57600080fd5b610569600480803560001916906020019091905050611534565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156105b657600080fd5b6105d0600480803560001916906020019091905050611567565b005b34156105dd57600080fd5b610609600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611a11565b005b341561061657600080fd5b61061e611b66565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610661578082015181840152602081019050610646565b505050509050019250505060405180910390f35b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6040805190810160405280600e81526020017f636f6c6c61746572616c697a657200000000000000000000000000000000000081525081565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561077b57600080fd5b600060149054906101000a900460ff16151561079657600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b60008060008060008060149054906101000a900460ff1615151561080157600080fd5b61080a86611b7d565b8095508196508297508398505050505060008411151561082957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415151561086557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff1660056000886000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156108dc57600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166303a896a1876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b151561095b57600080fd5b6102c65a03f1151561096c57600080fd5b505050604051805190508273ffffffffffffffffffffffffffffffffffffffff166399114d84888573ffffffffffffffffffffffffffffffffffffffff16632762dd8c8b6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610a1257600080fd5b6102c65a03f11515610a2357600080fd5b505050604051805190506000604051602001526040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050602060405180830381600087803b1515610a9657600080fd5b6102c65a03f11515610aa757600080fd5b5050506040518051905011151515610abe57600080fd5b60056000876000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060056000876000191660001916815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690558473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82866000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1515610be557600080fd5b6102c65a03f11515610bf657600080fd5b505050604051805190501515610c0b57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff1686600019167f2621540e2b91ca10330d6a7cbd6fb8cab2396f91c4935ad76b1183770819fa1f8787604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a3505050505050565b6000610cc4610cb58362015180611d3990919063ffffffff16565b42611d7490919063ffffffff16565b9050919050565b600060149054906101000a900460ff1681565b6201518081565b6000806000806000806000610d04336006611d8d90919063ffffffff16565b1515610d0f57600080fd5b600060149054906101000a900460ff16151515610d2b57600080fd5b610d3489611b7d565b809650819750829850839950505050503373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515610d7e57600080fd5b600085111515610d8d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614151515610dc957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560008b6000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515610e3f57600080fd5b859150309050848273ffffffffffffffffffffffffffffffffffffffff166370a082318a6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1515610ee957600080fd5b6102c65a03f11515610efa57600080fd5b5050506040518051905010151515610f1157600080fd5b848273ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e8a600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b151561100b57600080fd5b6102c65a03f1151561101c57600080fd5b505050604051805190501015151561103357600080fd5b87600560008b6000191660001916815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166315dacbea838a84896000604051602001526040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050602060405180830381600087803b15156111c257600080fd5b6102c65a03f115156111d357600080fd5b5050506040518051905015156111e857600080fd5b8573ffffffffffffffffffffffffffffffffffffffff1689600019167f38f12634ebefbe7f6767652aae05e220f95e0ca8ef8353c9c9c5ae439a592aec876040518082815260200191505060405180910390a36001965050505050505092915050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156112a657600080fd5b600060149054906101000a900460ff161515156112c257600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561138b57600080fd5b6113d6816040805190810160405280600e81526020017f636f6c6c61746572616c697a65720000000000000000000000000000000000008152506006611de69092919063ffffffff16565b50565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561145a57600080fd5b6114a5816040805190810160405280600e81526020017f636f6c6c61746572616c697a657200000000000000000000000000000000000081525060066120dc9092919063ffffffff16565b50565b6000806000806000806000806d0ff0000000000000000000000000600102891694506c0fffffffffffffffffffffff00600102891693506c1000000000000000000000000085600190048115156114fb57fe5b049250610100846001900481151561150f57fe5b04915060ff600102891690508282826001900497509750975050505050509193909250565b60056020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008060008060149054906101000a900460ff1615151561158a57600080fd5b61159386611b7d565b809550819650829750839850505050506000841115156115b257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141515156115ee57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff1660056000886000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561166557600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166303a896a1876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156116e457600080fd5b6102c65a03f115156116f557600080fd5b505050604051805190508273ffffffffffffffffffffffffffffffffffffffff166399114d848861172587610c9a565b6000604051602001526040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050602060405180830381600087803b151561178e57600080fd5b6102c65a03f1151561179f57600080fd5b505050604051805190501115156117b557600080fd5b60056000876000191660001916815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ba20dda4876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b151561189457600080fd5b6102c65a03f115156118a557600080fd5b5050506040518051905090508473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82866000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b151561195c57600080fd5b6102c65a03f1151561196d57600080fd5b50505060405180519050151561198257600080fd5b8073ffffffffffffffffffffffffffffffffffffffff1686600019167f50d195a4b80a950617a8e0e18ac9dd4c0236ac72d5e12355d881443823870d398787604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a3505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a6c57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611aa857600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611b6e612365565b611b7860066122b8565b905090565b600080600080600080600080600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636be39bda8c6000604051604001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082600019166000191681526020019150506040805180830381600087803b1515611c2c57600080fd5b6102c65a03f11515611c3d57600080fd5b505050604051805190602001805190508096508197505050611c5e856114a8565b809450819550829650505050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635715c5b7856000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515611d0357600080fd5b6102c65a03f11515611d1457600080fd5b5050506040518051905090508083838899509950995099505050505050509193509193565b6000806000841415611d4e5760009150611d6d565b8284029050828482811515611d5f57fe5b04141515611d6957fe5b8091505b5092915050565b6000828211151515611d8257fe5b818303905092915050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000806000611df58686611d8d565b1515611e0057600080fd5b8560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600186600201805490500391508560020182815481101515611e6257fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055808660020184815481101515611ef357fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090558560020182815481101515611fd857fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600186600201818180549050039150816120209190612379565b508473ffffffffffffffffffffffffffffffffffffffff167f0814e4ee85854cea446b4a27a460e5ffb41516230dbc02f226c07907e432241c856040518080602001828103825283818151815260200191508051906020019080838360005b8381101561209a57808201518184015260208101905061207f565b50505050905090810190601f1680156120c75780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050505050565b6120e68383612350565b15156120f157600080fd5b60018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555082600201805480600101828161216191906123a5565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060018360020180549050038360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f571925c699f9072cec76b6c6c000571cc8d0bb5c47e5819202e2e9496c6508b5826040518080602001828103825283818151815260200191508051906020019080838360005b8381101561227957808201518184015260208101905061225e565b50505050905090810190601f1680156122a65780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b6122c0612365565b8160020180548060200260200160405190810160405280929190818152602001828054801561234457602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116122fa575b50505050509050919050565b600061235c8383611d8d565b15905092915050565b602060405190810160405280600081525090565b8154818355818115116123a05781836000526020600020918201910161239f91906123d1565b5b505050565b8154818355818115116123cc578183600052602060002091820191016123cb91906123d1565b5b505050565b6123f391905b808211156123ef5760008160009055506001016123d7565b5090565b905600a165627a7a72305820f08f44266b9c50a091dac8a1b531ea3e794d76850524bba8c8e6b748e5160fa60029", + "deployedBytecode": "0x606060405260043610610111576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680627eb667146101165780630eefdbad1461016b5780632e667c4e146101c05780632f866f731461024e5780633f4ba83a146102a357806344c4ea95146102b85780634bbf7a67146102df5780635c975abb1461031657806361a52a3614610343578063649404bd1461036c5780638456cb59146103ca5780638da5cb5b146103df5780639ae1c1f3146104345780639d23c4c71461046d578063ae72c6ef146104c2578063ca062647146104fb578063e4b67a4c14610544578063ed8e52bd146105ab578063f2fde38b146105d2578063f466f42e1461060b575b600080fd5b341561012157600080fd5b610129610675565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561017657600080fd5b61017e61069b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101cb57600080fd5b6101d36106c1565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102135780820151818401526020810190506101f8565b50505050905090810190601f1680156102405780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561025957600080fd5b6102616106fa565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102ae57600080fd5b6102b6610720565b005b34156102c357600080fd5b6102dd6004808035600019169060200190919050506107de565b005b34156102ea57600080fd5b6103006004808035906020019091905050610c9a565b6040518082815260200191505060405180910390f35b341561032157600080fd5b610329610ccb565b604051808215151515815260200191505060405180910390f35b341561034e57600080fd5b610356610cde565b6040518082815260200191505060405180910390f35b341561037757600080fd5b6103b060048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610ce5565b604051808215151515815260200191505060405180910390f35b34156103d557600080fd5b6103dd61124b565b005b34156103ea57600080fd5b6103f261130b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561043f57600080fd5b61046b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611330565b005b341561047857600080fd5b6104806113d9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104cd57600080fd5b6104f9600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506113ff565b005b341561050657600080fd5b6105206004808035600019169060200190919050506114a8565b60405180848152602001838152602001828152602001935050505060405180910390f35b341561054f57600080fd5b610569600480803560001916906020019091905050611534565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156105b657600080fd5b6105d0600480803560001916906020019091905050611567565b005b34156105dd57600080fd5b610609600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611a11565b005b341561061657600080fd5b61061e611b66565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610661578082015181840152602081019050610646565b505050509050019250505060405180910390f35b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6040805190810160405280600e81526020017f636f6c6c61746572616c697a657200000000000000000000000000000000000081525081565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561077b57600080fd5b600060149054906101000a900460ff16151561079657600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b60008060008060008060149054906101000a900460ff1615151561080157600080fd5b61080a86611b7d565b8095508196508297508398505050505060008411151561082957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415151561086557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff1660056000886000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156108dc57600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166303a896a1876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b151561095b57600080fd5b6102c65a03f1151561096c57600080fd5b505050604051805190508273ffffffffffffffffffffffffffffffffffffffff166399114d84888573ffffffffffffffffffffffffffffffffffffffff16632762dd8c8b6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610a1257600080fd5b6102c65a03f11515610a2357600080fd5b505050604051805190506000604051602001526040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050602060405180830381600087803b1515610a9657600080fd5b6102c65a03f11515610aa757600080fd5b5050506040518051905011151515610abe57600080fd5b60056000876000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060056000876000191660001916815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690558473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82866000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1515610be557600080fd5b6102c65a03f11515610bf657600080fd5b505050604051805190501515610c0b57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff1686600019167f2621540e2b91ca10330d6a7cbd6fb8cab2396f91c4935ad76b1183770819fa1f8787604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a3505050505050565b6000610cc4610cb58362015180611d3990919063ffffffff16565b42611d7490919063ffffffff16565b9050919050565b600060149054906101000a900460ff1681565b6201518081565b6000806000806000806000610d04336006611d8d90919063ffffffff16565b1515610d0f57600080fd5b600060149054906101000a900460ff16151515610d2b57600080fd5b610d3489611b7d565b809650819750829850839950505050503373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515610d7e57600080fd5b600085111515610d8d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614151515610dc957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560008b6000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515610e3f57600080fd5b859150309050848273ffffffffffffffffffffffffffffffffffffffff166370a082318a6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1515610ee957600080fd5b6102c65a03f11515610efa57600080fd5b5050506040518051905010151515610f1157600080fd5b848273ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e8a600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b151561100b57600080fd5b6102c65a03f1151561101c57600080fd5b505050604051805190501015151561103357600080fd5b87600560008b6000191660001916815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166315dacbea838a84896000604051602001526040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050602060405180830381600087803b15156111c257600080fd5b6102c65a03f115156111d357600080fd5b5050506040518051905015156111e857600080fd5b8573ffffffffffffffffffffffffffffffffffffffff1689600019167f38f12634ebefbe7f6767652aae05e220f95e0ca8ef8353c9c9c5ae439a592aec876040518082815260200191505060405180910390a36001965050505050505092915050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156112a657600080fd5b600060149054906101000a900460ff161515156112c257600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561138b57600080fd5b6113d6816040805190810160405280600e81526020017f636f6c6c61746572616c697a65720000000000000000000000000000000000008152506006611de69092919063ffffffff16565b50565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561145a57600080fd5b6114a5816040805190810160405280600e81526020017f636f6c6c61746572616c697a657200000000000000000000000000000000000081525060066120dc9092919063ffffffff16565b50565b6000806000806000806000806d0ff0000000000000000000000000600102891694506c0fffffffffffffffffffffff00600102891693506c1000000000000000000000000085600190048115156114fb57fe5b049250610100846001900481151561150f57fe5b04915060ff600102891690508282826001900497509750975050505050509193909250565b60056020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008060008060149054906101000a900460ff1615151561158a57600080fd5b61159386611b7d565b809550819650829750839850505050506000841115156115b257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141515156115ee57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff1660056000886000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561166557600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166303a896a1876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156116e457600080fd5b6102c65a03f115156116f557600080fd5b505050604051805190508273ffffffffffffffffffffffffffffffffffffffff166399114d848861172587610c9a565b6000604051602001526040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050602060405180830381600087803b151561178e57600080fd5b6102c65a03f1151561179f57600080fd5b505050604051805190501115156117b557600080fd5b60056000876000191660001916815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ba20dda4876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b151561189457600080fd5b6102c65a03f115156118a557600080fd5b5050506040518051905090508473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82866000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b151561195c57600080fd5b6102c65a03f1151561196d57600080fd5b50505060405180519050151561198257600080fd5b8073ffffffffffffffffffffffffffffffffffffffff1686600019167f50d195a4b80a950617a8e0e18ac9dd4c0236ac72d5e12355d881443823870d398787604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a3505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a6c57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611aa857600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611b6e612365565b611b7860066122b8565b905090565b600080600080600080600080600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636be39bda8c6000604051604001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082600019166000191681526020019150506040805180830381600087803b1515611c2c57600080fd5b6102c65a03f11515611c3d57600080fd5b505050604051805190602001805190508096508197505050611c5e856114a8565b809450819550829650505050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635715c5b7856000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515611d0357600080fd5b6102c65a03f11515611d1457600080fd5b5050506040518051905090508083838899509950995099505050505050509193509193565b6000806000841415611d4e5760009150611d6d565b8284029050828482811515611d5f57fe5b04141515611d6957fe5b8091505b5092915050565b6000828211151515611d8257fe5b818303905092915050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000806000611df58686611d8d565b1515611e0057600080fd5b8560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600186600201805490500391508560020182815481101515611e6257fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055808660020184815481101515611ef357fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090558560020182815481101515611fd857fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600186600201818180549050039150816120209190612379565b508473ffffffffffffffffffffffffffffffffffffffff167f0814e4ee85854cea446b4a27a460e5ffb41516230dbc02f226c07907e432241c856040518080602001828103825283818151815260200191508051906020019080838360005b8381101561209a57808201518184015260208101905061207f565b50505050905090810190601f1680156120c75780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050505050565b6120e68383612350565b15156120f157600080fd5b60018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555082600201805480600101828161216191906123a5565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060018360020180549050038360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f571925c699f9072cec76b6c6c000571cc8d0bb5c47e5819202e2e9496c6508b5826040518080602001828103825283818151815260200191508051906020019080838360005b8381101561227957808201518184015260208101905061225e565b50505050905090810190601f1680156122a65780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b6122c0612365565b8160020180548060200260200160405190810160405280929190818152602001828054801561234457602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116122fa575b50505050509050919050565b600061235c8383611d8d565b15905092915050565b602060405190810160405280600081525090565b8154818355818115116123a05781836000526020600020918201910161239f91906123d1565b5b505050565b8154818355818115116123cc578183600052602060002091820191016123cb91906123d1565b5b505050565b6123f391905b808211156123ef5760008160009055506001016123d7565b5090565b905600a165627a7a72305820f08f44266b9c50a091dac8a1b531ea3e794d76850524bba8c8e6b748e5160fa60029", "sourceMap": "1169:15132:0:-;;;268:5:37;247:26;;;;;;;;;;;;;;;;;;;;2393:391:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;509:10:39;501:5;;:18;;;;;;;;;;;;;;;;;;2589:11:0;2569:17;;:31;;;;;;;;;;;;;;;;;;2638:13;2610:12;;:42;;;;;;;;;;;;;;;;;;2692:14;2662:13;;:45;;;;;;;;;;;;;;;;;;2757:19;2717:18;;:60;;;;;;;;;;;;;;;;;;2393:391;;;;1169:15132;;;;;;", "deployedSourceMap": "1169:15132:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1316:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1433:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1765:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1355:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;833:87:37;;;;;;;;;;;;;;6067:2313:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14803:224;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;247:26:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1712:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3035:2749;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;666:85:37;;;;;;;;;;;;;;238:20:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11766:175:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;1393:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11472:164;;;;;;;;;;;;;;;;;;;;;;;;;;;;13297:1500;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1574:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8640:2707;;;;;;;;;;;;;;;;;;;;;;;;;;;;;832:169:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;12046:177:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;1316:32:0;;;;;;;;;;;;;:::o;1433:44::-;;;;;;;;;;;;;:::o;1765:49::-;;;;;;;;;;;;;;;;;;;;:::o;1355:32::-;;;;;;;;;;;;;:::o;833:87:37:-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;568:6:37;;;;;;;;;;;560:15;;;;;;;;895:5;886:6;;:14;;;;;;;;;;;;;;;;;;906:9;;;;;;;;;;833:87::o;6067:2313:0:-;6235:23;6318:21;6480:22;6597:27;7709:22;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;6825:41:0;6854:11;6825:28;:41::i;:::-;6695:171;;;;;;;;;;;;;;;;6978:1;6959:16;:20;6951:29;;;;;;;;7025:1;6998:29;;:15;:29;;;;6990:38;;;;;;;;7340:1;7290:52;;:25;:38;7316:11;7290:38;;;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;;7282:61;;;;;;;;7586:13;:34;;;7621:11;7586:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7436:13;:39;;;7493:11;7522:13;:33;;;7556:11;7522:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7436:146;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:197;;7415:228;;;;;;;;7734:25;:38;7760:11;7734:38;;;;;;;;;;;;;;;;;;;;;;;;;;;7709:63;;7903:25;:38;7929:11;7903:38;;;;;;;;;;;;;;;;;;7896:45;;;;;;;;;;;8074:15;8068:31;;;8117:14;8149:16;8068:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8047:142;;;;;;;;8290:14;8233:140;;8265:11;8233:140;;;;8318:15;8347:16;8233:140;;;;;;;;;;;;;;;;;;;;;;;;;;;;6067:2313;;;;;;:::o;14803:224::-;14913:4;14940:80;14973:37;14992:17;1750:8;14973:18;;:37;;;;:::i;:::-;14940:15;:19;;:80;;;;:::i;:::-;14933:87;;14803:224;;;:::o;247:26:37:-;;;;;;;;;;;;;:::o;1712:46:0:-;1750:8;1712:46;:::o;3035:2749::-;3217:13;3302:23;3385:21;3547:22;3664:27;4607:16;4658:17;2315:53;2357:10;2315:28;:41;;:53;;;;:::i;:::-;2307:62;;;;;;;;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;3891:41:0;3920:11;3891:28;:41::i;:::-;3761:171;;;;;;;;;;;;;;;;3968:10;3951:27;;:13;:27;;;3943:36;;;;;;;;4016:1;3997:16;:20;3989:29;;;;;;;;4063:1;4036:29;;:15;:29;;;;4028:38;;;;;;;;4593:1;4543:52;;:25;:38;4569:11;4543:38;;;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;4535:61;;;;;;;;4632:15;4607:41;;4686:4;4658:33;;4901:16;4861:10;:20;;;4882:14;4861:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:56;;4853:65;;;;;;;;5163:16;5103:10;:20;;;5124:14;5140:18;;;;;;;;;;;5103:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:76;;5095:85;;;;;;;;5354:14;5313:25;:38;5339:11;5313:38;;;;;;;;;;;;;;;;;;:55;;;;;;;;;;;;;;;;;;5477:18;;;;;;;;;;;:31;;;5522:10;5546:14;5574:9;5597:16;5477:146;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5469:155;;;;;;;;5721:15;5691:64;;5708:11;5691:64;;;;5738:16;5691:64;;;;;;;;;;;;;;;;;;5773:4;5766:11;;3035:2749;;;;;;;;;;:::o;666:85:37:-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;729:4;720:6;;:13;;;;;;;;;;;;;;;;;;739:7;;;;;;;;;;666:85::o;238:20:39:-;;;;;;;;;;;;;:::o;11766:175:0:-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;11870:64:0;11919:5;11926:7;;;;;;;;;;;;;;;;;;11870:28;:48;;:64;;;;;:::i;:::-;11766:175;:::o;1393:34::-;;;;;;;;;;;;;:::o;11472:164::-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;11575:54:0;11614:5;11621:7;;;;;;;;;;;;;;;;;;11575:28;:38;;:54;;;;;:::i;:::-;11472:164;:::o;13297:1500::-;13407:4;13413;13419;13523:35;13765:31;14138:25;14220:21;14542:25;13586:66;13573:79;;:10;:79;13523:129;;13824:66;13811:79;;:10;:79;13765:125;;14202:8;14171:27;14166:33;;;:44;;;;;;;;14138:72;;14276:6;14249:23;14244:29;;;:38;;;;;;;;14220:62;;14595:66;14582:79;;:10;:79;14542:119;;14693:20;14727:16;14762:17;14757:23;;;14672:118;;;;;;13297:1500;;;;;;;;;;:::o;1574:60::-;;;;;;;;;;;;;;;;;;;;;;:::o;8640:2707::-;8808:23;8891:21;9053:22;9170:27;10861:19;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;9397:41:0;9426:11;9397:28;:41::i;:::-;9267:171;;;;;;;;;;;;;;;;9550:1;9531:16;:20;9523:29;;;;;;;;9597:1;9570:29;;:15;:29;;;;9562:38;;;;;;;;9909:1;9859:52;;:25;:38;9885:11;9859:38;;;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;;9851:61;;;;;;;;10565:13;:34;;;10600:11;10565:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10412:13;:39;;;10469:11;10498:50;10530:17;10498:31;:50::i;:::-;10412:150;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:200;10391:231;;;;;;;;10753:25;:38;10779:11;10753:38;;;;;;;;;;;;;;;;;;10746:45;;;;;;;;;;;10883:12;;;;;;;;;;;:27;;;10911:11;10883:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10861:62;;11048:15;11042:31;;;11091:11;11120:16;11042:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11021:139;;;;;;;;11260:11;11205:135;;11235:11;11205:135;;;;11285:15;11314:16;11205:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;8640:2707;;;;;;:::o;832:169:39:-;653:5;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;928:1;908:22;;:8;:22;;;;900:31;;;;;;;;965:8;937:37;;958:5;;;;;;;;;;;937:37;;;;;;;;;;;;988:8;980:5;;:16;;;;;;;;;;;;;;;;;;832:169;:::o;12046:177:0:-;12134:9;;:::i;:::-;12166:50;:28;:48;:50::i;:::-;12159:57;;12046:177;:::o;15033:1266::-;15152:24;15190:22;15226:23;15263:28;15316;15354:31;15570:25;15605:21;15636:22;16027:30;15525:12;;;;;;;;;;;:21;;;15547:11;15525:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15475:84;;;;;;;;15871:60;15907:23;15871:35;:60::i;:::-;15763:168;;;;;;;;;;;;16060:13;;;;;;;;;;;:36;;;16097:20;16060:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16027:91;;16150:22;16186:16;16216:17;16261:20;16129:163;;;;;;;;15033:1266;;;;;;;;;;;:::o;203:173:38:-;261:7;316:9;285:1;280;:6;276:35;;;303:1;296:8;;;;276:35;332:1;328;:5;316:17;;355:1;350;346;:5;;;;;;;;:10;339:18;;;;;;370:1;363:8;;203:173;;;;;;:::o;835:110::-;893:7;920:1;915;:6;;908:14;;;;;;939:1;935;:5;928:12;;835:110;;;;:::o;3295:166:17:-;3405:4;3432;:15;;:22;3448:5;3432:22;;;;;;;;;;;;;;;;;;;;;;;;;3425:29;;3295:166;;;;:::o;2121:1168::-;2489:25;2551:23;2619:19;2452:25;2465:4;2471:5;2452:12;:25::i;:::-;2444:34;;;;;;;;2517:4;:17;;:24;2535:5;2517:24;;;;;;;;;;;;;;;;2489:52;;2608:1;2577:4;:21;;:28;;;;:32;2551:58;;2641:4;:21;;2663:18;2641:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;2619:63;;2745:4;:15;;:22;2761:5;2745:22;;;;;;;;;;;;;;;;2738:29;;;;;;;;;;;2894:11;2848:4;:21;;2870:20;2848:43;;;;;;;;;;;;;;;;;;;:57;;;;;;;;;;;;;;;;;;3009:20;2976:4;:17;;:30;2994:11;2976:30;;;;;;;;;;;;;;;:53;;;;3046:4;:17;;:24;3064:5;3046:24;;;;;;;;;;;;;;;3039:31;;;3144:4;:21;;3166:18;3144:41;;;;;;;;;;;;;;;;;;;3137:48;;;;;;;;;;;3227:1;3195:4;:21;;:33;;;;;;;;;;;;;;:::i;:::-;;3260:5;3239:43;;;3267:14;3239:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2121:1168:17;;;;;;:::o;1732:383::-;1884:28;1900:4;1906:5;1884:15;:28::i;:::-;1876:37;;;;;;;;1949:4;1924;:15;;:22;1940:5;1924:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;1963:4;:21;;:33;;;;;;;;;;;:::i;:::-;;;;;;;;;;1990:5;1963:33;;;;;;;;;;;;;;;;;;;;;;;2064:1;2033:4;:21;;:28;;;;:32;2006:4;:17;;:24;2024:5;2006:24;;;;;;;;;;;;;;;:59;;;;2086:5;2075:33;;;2093:14;2075:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1732:383:17;;;:::o;3646:162::-;3748:9;;:::i;:::-;3780:4;:21;;3773:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3646:162;;;:::o;3467:173::-;3580:4;3608:25;3621:4;3627:5;3608:12;:25::i;:::-;3607:26;3600:33;;3467:173;;;;:::o;1169:15132:0:-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\nimport \"zeppelin-solidity/contracts/math/SafeMath.sol\";\nimport \"zeppelin-solidity/contracts/token/ERC20/ERC20.sol\";\n\nimport \"./TermsContract.sol\";\nimport \"./DebtRegistry.sol\";\nimport \"./TokenRegistry.sol\";\nimport \"./TokenTransferProxy.sol\";\nimport { PermissionsLib, PermissionEvents } from \"./libraries/PermissionsLib.sol\";\n\n\n/**\n * Contains functionality for collateralizing assets, by transferring them from\n * a debtor address to this contract as a custodian.\n *\n * Authors (in no particular order): nadavhollander, saturnial, jdkanani, graemecode\n */\ncontract Collateralizer is Pausable, PermissionEvents {\n using PermissionsLib for PermissionsLib.Permissions;\n using SafeMath for uint;\n\n address public debtKernelAddress;\n\n DebtRegistry public debtRegistry;\n TokenRegistry public tokenRegistry;\n TokenTransferProxy public tokenTransferProxy;\n\n // Collateralizer here refers to the owner of the asset that is being collateralized.\n mapping(bytes32 => address) public agreementToCollateralizer;\n\n PermissionsLib.Permissions internal collateralizationPermissions;\n\n uint public constant SECONDS_IN_DAY = 24*60*60;\n\n string public constant CONTEXT = \"collateralizer\";\n\n event CollateralLocked(\n bytes32 indexed agreementID,\n address indexed token,\n uint amount\n );\n\n event CollateralReturned(\n bytes32 indexed agreementID,\n address indexed collateralizer,\n address token,\n uint amount\n );\n\n event CollateralSeized(\n bytes32 indexed agreementID,\n address indexed beneficiary,\n address token,\n uint amount\n );\n\n modifier onlyAuthorizedToCollateralize() {\n require(collateralizationPermissions.isAuthorized(msg.sender));\n _;\n }\n\n function Collateralizer(\n address _debtKernel,\n address _debtRegistry,\n address _tokenRegistry,\n address _tokenTransferProxy\n ) public {\n debtKernelAddress = _debtKernel;\n debtRegistry = DebtRegistry(_debtRegistry);\n tokenRegistry = TokenRegistry(_tokenRegistry);\n tokenTransferProxy = TokenTransferProxy(_tokenTransferProxy);\n }\n\n /**\n * Transfers collateral from the debtor to the current contract, as custodian.\n *\n * @param agreementId bytes32 The debt agreement's ID\n * @param collateralizer address The owner of the asset being collateralized\n */\n function collateralize(\n bytes32 agreementId,\n address collateralizer\n )\n public\n onlyAuthorizedToCollateralize\n whenNotPaused\n returns (bool _success)\n {\n // The token in which collateral is denominated\n address collateralToken;\n // The amount being put up for collateral\n uint collateralAmount;\n // The number of days a debtor has after a debt enters default\n // before their collateral is eligible for seizure.\n uint gracePeriodInDays;\n // The terms contract according to which this asset is being collateralized.\n TermsContract termsContract;\n\n // Fetch all relevant collateralization parameters\n (\n collateralToken,\n collateralAmount,\n gracePeriodInDays,\n termsContract\n ) = retrieveCollateralParameters(agreementId);\n\n require(termsContract == msg.sender);\n require(collateralAmount > 0);\n require(collateralToken != address(0));\n\n /*\n Ensure that the agreement has not already been collateralized.\n\n If the agreement has already been collateralized, this check will fail\n because any valid collateralization must have some sort of valid\n address associated with it as a collateralizer. Given that it is impossible\n to send transactions from address 0x0, this check will only fail\n when the agreement is already collateralized.\n */\n require(agreementToCollateralizer[agreementId] == address(0));\n\n ERC20 erc20token = ERC20(collateralToken);\n address custodian = address(this);\n\n /*\n The collateralizer must have sufficient balance equal to or greater\n than the amount being put up for collateral.\n */\n require(erc20token.balanceOf(collateralizer) >= collateralAmount);\n\n /*\n The proxy must have an allowance granted by the collateralizer equal\n to or greater than the amount being put up for collateral.\n */\n require(erc20token.allowance(collateralizer, tokenTransferProxy) >= collateralAmount);\n\n // store collaterallizer in mapping, effectively demarcating that the\n // agreement is now collateralized.\n agreementToCollateralizer[agreementId] = collateralizer;\n\n // the collateral must be successfully transferred to this contract, via a proxy.\n require(tokenTransferProxy.transferFrom(\n erc20token,\n collateralizer,\n custodian,\n collateralAmount\n ));\n\n // emit event that collateral has been secured.\n CollateralLocked(agreementId, collateralToken, collateralAmount);\n\n return true;\n }\n\n /**\n * Returns collateral to the debt agreement's original collateralizer\n * if and only if the debt agreement's term has lapsed and\n * the total expected repayment value has been repaid.\n *\n * @param agreementId bytes32 The debt agreement's ID\n */\n function returnCollateral(\n bytes32 agreementId\n )\n public\n whenNotPaused\n {\n // The token in which collateral is denominated\n address collateralToken;\n // The amount being put up for collateral\n uint collateralAmount;\n // The number of days a debtor has after a debt enters default\n // before their collateral is eligible for seizure.\n uint gracePeriodInDays;\n // The terms contract according to which this asset is being collateralized.\n TermsContract termsContract;\n\n // Fetch all relevant collateralization parameters.\n (\n collateralToken,\n collateralAmount,\n gracePeriodInDays,\n termsContract\n ) = retrieveCollateralParameters(agreementId);\n\n // Ensure a valid form of collateral is tied to this agreement id\n require(collateralAmount > 0);\n require(collateralToken != address(0));\n\n // Withdrawal can only occur if the collateral has yet to be withdrawn.\n // When we withdraw collateral, we reset the collateral agreement\n // in a gas-efficient manner by resetting the address of the collateralizer to 0\n require(agreementToCollateralizer[agreementId] != address(0));\n\n // Ensure that the debt is not in a state of default\n require(\n termsContract.getExpectedRepaymentValue(\n agreementId,\n termsContract.getTermEndTimestamp(agreementId)\n ) <= termsContract.getValueRepaidToDate(agreementId)\n );\n\n // determine collateralizer of the collateral.\n address collateralizer = agreementToCollateralizer[agreementId];\n\n // Mark agreement's collateral as withdrawn by setting the agreement's\n // collateralizer to 0x0.\n delete agreementToCollateralizer[agreementId];\n\n // transfer the collateral this contract was holding in escrow back to collateralizer.\n require(\n ERC20(collateralToken).transfer(\n collateralizer,\n collateralAmount\n )\n );\n\n // log the return event.\n CollateralReturned(\n agreementId,\n collateralizer,\n collateralToken,\n collateralAmount\n );\n }\n\n /**\n * Seizes the collateral from the given debt agreement and\n * transfers it to the debt agreement's current beneficiary\n * (i.e. the person who \"owns\" the debt).\n *\n * @param agreementId bytes32 The debt agreement's ID\n */\n function seizeCollateral(\n bytes32 agreementId\n )\n public\n whenNotPaused\n {\n\n // The token in which collateral is denominated\n address collateralToken;\n // The amount being put up for collateral\n uint collateralAmount;\n // The number of days a debtor has after a debt enters default\n // before their collateral is eligible for seizure.\n uint gracePeriodInDays;\n // The terms contract according to which this asset is being collateralized.\n TermsContract termsContract;\n\n // Fetch all relevant collateralization parameters\n (\n collateralToken,\n collateralAmount,\n gracePeriodInDays,\n termsContract\n ) = retrieveCollateralParameters(agreementId);\n\n // Ensure a valid form of collateral is tied to this agreement id\n require(collateralAmount > 0);\n require(collateralToken != address(0));\n\n // Seizure can only occur if the collateral has yet to be withdrawn.\n // When we withdraw collateral, we reset the collateral agreement\n // in a gas-efficient manner by resetting the address of the collateralizer to 0\n require(agreementToCollateralizer[agreementId] != address(0));\n\n // Ensure debt is in a state of default when we account for the\n // specified \"grace period\". We do this by checking whether the\n // *current* value repaid to-date exceeds the expected repayment value\n // at the point of time at which the grace period would begin if it ended\n // now. This crucially relies on the assumption that both expected repayment value\n /// and value repaid to date monotonically increase over time\n require(\n termsContract.getExpectedRepaymentValue(\n agreementId,\n timestampAdjustedForGracePeriod(gracePeriodInDays)\n ) > termsContract.getValueRepaidToDate(agreementId)\n );\n\n // Mark agreement's collateral as withdrawn by setting the agreement's\n // collateralizer to 0x0.\n delete agreementToCollateralizer[agreementId];\n\n // determine beneficiary of the seized collateral.\n address beneficiary = debtRegistry.getBeneficiary(agreementId);\n\n // transfer the collateral this contract was holding in escrow to beneficiary.\n require(\n ERC20(collateralToken).transfer(\n beneficiary,\n collateralAmount\n )\n );\n\n // log the seizure event.\n CollateralSeized(\n agreementId,\n beneficiary,\n collateralToken,\n collateralAmount\n );\n }\n\n /**\n * Adds an address to the list of agents authorized\n * to invoke the `collateralize` function.\n */\n function addAuthorizedCollateralizeAgent(address agent)\n public\n onlyOwner\n {\n collateralizationPermissions.authorize(agent, CONTEXT);\n }\n\n /**\n * Removes an address from the list of agents authorized\n * to invoke the `collateralize` function.\n */\n function revokeCollateralizeAuthorization(address agent)\n public\n onlyOwner\n {\n collateralizationPermissions.revokeAuthorization(agent, CONTEXT);\n }\n\n /**\n * Returns the list of agents authorized to invoke the 'collateralize' function.\n */\n function getAuthorizedCollateralizeAgents()\n public\n view\n returns(address[])\n {\n return collateralizationPermissions.getAuthorizedAgents();\n }\n\n /**\n * Unpacks collateralization-specific parameters from their tightly-packed\n * representation in a terms contract parameter string.\n *\n * For collateralized terms contracts, we reserve the lowest order 108 bits\n * of the terms contract parameters for parameters relevant to collateralization.\n *\n * Contracts that inherit from the Collateralized terms contract\n * can encode whichever parameter schema they please in the remaining\n * space of the terms contract parameters.\n * The 108 bits are encoded as follows (from higher order bits to lower order bits):\n *\n * 8 bits - Collateral Token (encoded by its unsigned integer index in the TokenRegistry contract)\n * 92 bits - Collateral Amount (encoded as an unsigned integer)\n * 8 bits - Grace Period* Length (encoded as an unsigned integer)\n *\n * * = The \"Grace\" Period is the number of days a debtor has between\n * when they fall behind on an expected payment and when their collateral\n * can be seized by the creditor.\n */\n function unpackCollateralParametersFromBytes(bytes32 parameters)\n public\n pure\n returns (uint, uint, uint)\n {\n // The first byte of the 108 reserved bits represents the collateral token.\n bytes32 collateralTokenIndexShifted =\n parameters & 0x0000000000000000000000000000000000000ff0000000000000000000000000;\n // The subsequent 92 bits represents the collateral amount, as denominated in the above token.\n bytes32 collateralAmountShifted =\n parameters & 0x000000000000000000000000000000000000000fffffffffffffffffffffff00;\n\n // We bit-shift these values, respectively, 100 bits and 8 bits right using\n // mathematical operations, so that their 32 byte integer counterparts\n // correspond to the intended values packed in the 32 byte string\n uint collateralTokenIndex = uint(collateralTokenIndexShifted) / 2 ** 100;\n uint collateralAmount = uint(collateralAmountShifted) / 2 ** 8;\n\n // The last byte of the parameters represents the \"grace period\" of the loan,\n // as defined in terms of days.\n // Since this value takes the rightmost place in the parameters string,\n // we do not need to bit-shift it.\n bytes32 gracePeriodInDays =\n parameters & 0x00000000000000000000000000000000000000000000000000000000000000ff;\n\n return (\n collateralTokenIndex,\n collateralAmount,\n uint(gracePeriodInDays)\n );\n }\n\n function timestampAdjustedForGracePeriod(uint gracePeriodInDays)\n public\n view\n returns (uint)\n {\n return block.timestamp.sub(\n SECONDS_IN_DAY.mul(gracePeriodInDays)\n );\n }\n\n function retrieveCollateralParameters(bytes32 agreementId)\n internal\n view\n returns (\n address _collateralToken,\n uint _collateralAmount,\n uint _gracePeriodInDays,\n TermsContract _termsContract\n )\n {\n address termsContractAddress;\n bytes32 termsContractParameters;\n\n // Pull the terms contract and associated parameters for the agreement\n (termsContractAddress, termsContractParameters) = debtRegistry.getTerms(agreementId);\n\n uint collateralTokenIndex;\n uint collateralAmount;\n uint gracePeriodInDays;\n\n // Unpack terms contract parameters in order to get collateralization-specific params\n (\n collateralTokenIndex,\n collateralAmount,\n gracePeriodInDays\n ) = unpackCollateralParametersFromBytes(termsContractParameters);\n\n // Resolve address of token associated with this agreement in token registry\n address collateralTokenAddress = tokenRegistry.getTokenAddressByIndex(collateralTokenIndex);\n\n return (\n collateralTokenAddress,\n collateralAmount,\n gracePeriodInDays,\n TermsContract(termsContractAddress)\n );\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/Collateralizer.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/Collateralizer.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/Collateralizer.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/Collateralizer.sol", "exportedSymbols": { "Collateralizer": [ 614 @@ -527,7 +527,7 @@ { "attributes": { "SourceUnit": 4758, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/TermsContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/TermsContract.sol", "file": "./TermsContract.sol", "scope": 615, "symbolAliases": [ @@ -542,7 +542,7 @@ { "attributes": { "SourceUnit": 3159, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/DebtRegistry.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/DebtRegistry.sol", "file": "./DebtRegistry.sol", "scope": 615, "symbolAliases": [ @@ -557,7 +557,7 @@ { "attributes": { "SourceUnit": 5114, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/TokenRegistry.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/TokenRegistry.sol", "file": "./TokenRegistry.sol", "scope": 615, "symbolAliases": [ @@ -572,7 +572,7 @@ { "attributes": { "SourceUnit": 5207, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/TokenTransferProxy.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/TokenTransferProxy.sol", "file": "./TokenTransferProxy.sol", "scope": 615, "symbolAliases": [ @@ -587,7 +587,7 @@ { "attributes": { "SourceUnit": 6272, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/libraries/PermissionsLib.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/libraries/PermissionsLib.sol", "file": "./libraries/PermissionsLib.sol", "scope": 615, "symbolAliases": [ @@ -9801,7 +9801,7 @@ } }, "links": {}, - "address": "0xf5ff656bfeada48090daf7341a2d4e160d699d27" + "address": "0x39ab84786d3696677cb62181f56286c9496b490b" }, "70": { "events": { @@ -9950,5 +9950,5 @@ } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:15:01.357Z" + "updatedAt": "2018-10-09T17:51:53.173Z" } \ No newline at end of file diff --git a/artifacts/json/ContractRegistry.json b/artifacts/json/ContractRegistry.json index a7160219..645085c3 100644 --- a/artifacts/json/ContractRegistry.json +++ b/artifacts/json/ContractRegistry.json @@ -220,15 +220,15 @@ "type": "event" } ], - "bytecode": "0x6060604052341561000f57600080fd5b60405160e080610e5683398101604052808051906020019091908051906020019091908051906020019091908051906020019091908051906020019091908051906020019091908051906020019091905050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555086600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050505050610bd88061027e6000396000f3006060604052600436106100a4576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063079dd4b7146100a95780630eefdbad146100fe5780632f866f73146101535780636fa9d056146101a8578063869f0511146101fd5780638da5cb5b146102525780639d23c4c7146102a7578063e2aa46bb146102fc578063f2fde38b14610341578063f8d898981461037a575b600080fd5b34156100b457600080fd5b6100bc6103cf565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561010957600080fd5b6101116103f5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015e57600080fd5b61016661041b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101b357600080fd5b6101bb610441565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561020857600080fd5b610210610467565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561025d57600080fd5b61026561048d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102b257600080fd5b6102ba6104b2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561030757600080fd5b61033f600480803560ff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506104d8565b005b341561034c57600080fd5b610378600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506109b6565b005b341561038557600080fd5b61038d610b0b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561053557600080fd5b6000600681111561054257fe5b83600681111561054e57fe5b14156105c957600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506105838282610b31565b81600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061094b565b600160068111156105d657fe5b8360068111156105e257fe5b141561065d57600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506106178282610b31565b81600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061094a565b6002600681111561066a57fe5b83600681111561067657fe5b14156106f157600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506106ab8282610b31565b81600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610949565b600360068111156106fe57fe5b83600681111561070a57fe5b141561078557600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061073f8282610b31565b81600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610948565b6004600681111561079257fe5b83600681111561079e57fe5b141561081957600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506107d38282610b31565b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610947565b6005600681111561082657fe5b83600681111561083257fe5b14156108ad57600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506108678282610b31565b81600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610946565b6006808111156108b957fe5b8360068111156108c557fe5b141561094057600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506108fa8282610b31565b81600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610945565b600080fd5b5b5b5b5b5b5b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1684600681111561098557fe5b7fea5852cbfaa20064a0ffec7659e5b7178c40ecc51d8788b6981bfa062bc6e78860405160405180910390a4505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a1157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610a4d57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515610b6d57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515610ba857600080fd5b50505600a165627a7a72305820863aed3d99d08dd18c74da28de24f902c7888dba43fa57be5382cd9453da81520029", - "deployedBytecode": "0x6060604052600436106100a4576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063079dd4b7146100a95780630eefdbad146100fe5780632f866f73146101535780636fa9d056146101a8578063869f0511146101fd5780638da5cb5b146102525780639d23c4c7146102a7578063e2aa46bb146102fc578063f2fde38b14610341578063f8d898981461037a575b600080fd5b34156100b457600080fd5b6100bc6103cf565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561010957600080fd5b6101116103f5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015e57600080fd5b61016661041b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101b357600080fd5b6101bb610441565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561020857600080fd5b610210610467565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561025d57600080fd5b61026561048d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102b257600080fd5b6102ba6104b2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561030757600080fd5b61033f600480803560ff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506104d8565b005b341561034c57600080fd5b610378600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506109b6565b005b341561038557600080fd5b61038d610b0b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561053557600080fd5b6000600681111561054257fe5b83600681111561054e57fe5b14156105c957600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506105838282610b31565b81600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061094b565b600160068111156105d657fe5b8360068111156105e257fe5b141561065d57600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506106178282610b31565b81600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061094a565b6002600681111561066a57fe5b83600681111561067657fe5b14156106f157600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506106ab8282610b31565b81600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610949565b600360068111156106fe57fe5b83600681111561070a57fe5b141561078557600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061073f8282610b31565b81600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610948565b6004600681111561079257fe5b83600681111561079e57fe5b141561081957600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506107d38282610b31565b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610947565b6005600681111561082657fe5b83600681111561083257fe5b14156108ad57600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506108678282610b31565b81600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610946565b6006808111156108b957fe5b8360068111156108c557fe5b141561094057600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506108fa8282610b31565b81600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610945565b600080fd5b5b5b5b5b5b5b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1684600681111561098557fe5b7fea5852cbfaa20064a0ffec7659e5b7178c40ecc51d8788b6981bfa062bc6e78860405160405180910390a4505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a1157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610a4d57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515610b6d57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515610ba857600080fd5b50505600a165627a7a72305820863aed3d99d08dd18c74da28de24f902c7888dba43fa57be5382cd9453da81520029", + "bytecode": "0x6060604052341561000f57600080fd5b60405160e080610e5683398101604052808051906020019091908051906020019091908051906020019091908051906020019091908051906020019091908051906020019091908051906020019091905050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555086600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050505050610bd88061027e6000396000f3006060604052600436106100a4576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063079dd4b7146100a95780630eefdbad146100fe5780632f866f73146101535780636fa9d056146101a8578063869f0511146101fd5780638da5cb5b146102525780639d23c4c7146102a7578063e2aa46bb146102fc578063f2fde38b14610341578063f8d898981461037a575b600080fd5b34156100b457600080fd5b6100bc6103cf565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561010957600080fd5b6101116103f5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015e57600080fd5b61016661041b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101b357600080fd5b6101bb610441565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561020857600080fd5b610210610467565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561025d57600080fd5b61026561048d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102b257600080fd5b6102ba6104b2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561030757600080fd5b61033f600480803560ff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506104d8565b005b341561034c57600080fd5b610378600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506109b6565b005b341561038557600080fd5b61038d610b0b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561053557600080fd5b6000600681111561054257fe5b83600681111561054e57fe5b14156105c957600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506105838282610b31565b81600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061094b565b600160068111156105d657fe5b8360068111156105e257fe5b141561065d57600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506106178282610b31565b81600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061094a565b6002600681111561066a57fe5b83600681111561067657fe5b14156106f157600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506106ab8282610b31565b81600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610949565b600360068111156106fe57fe5b83600681111561070a57fe5b141561078557600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061073f8282610b31565b81600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610948565b6004600681111561079257fe5b83600681111561079e57fe5b141561081957600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506107d38282610b31565b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610947565b6005600681111561082657fe5b83600681111561083257fe5b14156108ad57600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506108678282610b31565b81600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610946565b6006808111156108b957fe5b8360068111156108c557fe5b141561094057600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506108fa8282610b31565b81600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610945565b600080fd5b5b5b5b5b5b5b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1684600681111561098557fe5b7fea5852cbfaa20064a0ffec7659e5b7178c40ecc51d8788b6981bfa062bc6e78860405160405180910390a4505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a1157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610a4d57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515610b6d57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515610ba857600080fd5b50505600a165627a7a72305820d2c3695b4e3dc0d3df9860fc48c7997a17a9cac2d105fc35b68b7c1d4971de900029", + "deployedBytecode": "0x6060604052600436106100a4576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063079dd4b7146100a95780630eefdbad146100fe5780632f866f73146101535780636fa9d056146101a8578063869f0511146101fd5780638da5cb5b146102525780639d23c4c7146102a7578063e2aa46bb146102fc578063f2fde38b14610341578063f8d898981461037a575b600080fd5b34156100b457600080fd5b6100bc6103cf565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561010957600080fd5b6101116103f5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015e57600080fd5b61016661041b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101b357600080fd5b6101bb610441565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561020857600080fd5b610210610467565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561025d57600080fd5b61026561048d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102b257600080fd5b6102ba6104b2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561030757600080fd5b61033f600480803560ff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506104d8565b005b341561034c57600080fd5b610378600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506109b6565b005b341561038557600080fd5b61038d610b0b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561053557600080fd5b6000600681111561054257fe5b83600681111561054e57fe5b14156105c957600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506105838282610b31565b81600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061094b565b600160068111156105d657fe5b8360068111156105e257fe5b141561065d57600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506106178282610b31565b81600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061094a565b6002600681111561066a57fe5b83600681111561067657fe5b14156106f157600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506106ab8282610b31565b81600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610949565b600360068111156106fe57fe5b83600681111561070a57fe5b141561078557600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061073f8282610b31565b81600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610948565b6004600681111561079257fe5b83600681111561079e57fe5b141561081957600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506107d38282610b31565b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610947565b6005600681111561082657fe5b83600681111561083257fe5b14156108ad57600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506108678282610b31565b81600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610946565b6006808111156108b957fe5b8360068111156108c557fe5b141561094057600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506108fa8282610b31565b81600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610945565b600080fd5b5b5b5b5b5b5b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1684600681111561098557fe5b7fea5852cbfaa20064a0ffec7659e5b7178c40ecc51d8788b6981bfa062bc6e78860405160405180910390a4505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a1157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610a4d57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515610b6d57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515610ba857600080fd5b50505600a165627a7a72305820d2c3695b4e3dc0d3df9860fc48c7997a17a9cac2d105fc35b68b7c1d4971de900029", "sourceMap": "298:3506:1:-;;;971:667;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;509:10:39;501:5;;:18;;;;;;;;;;;;;;;;;;1288:15:1;1256:14;;:48;;;;;;;;;;;;;;;;;;1338:11;1314:10;;:36;;;;;;;;;;;;;;;;;;1388:13;1360:12;;:42;;;;;;;;;;;;;;;;;;1434:10;1412:9;;:33;;;;;;;;;;;;;;;;;;1489:16;1455:15;;:51;;;;;;;;;;;;;;;;;;1546:14;1516:13;;:45;;;;;;;;;;;;;;;;;;1611:19;1571:18;;:60;;;;;;;;;;;;;;;;;;971:667;;;;;;;298:3506;;;;;;", "deployedSourceMap": "298:3506:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;731:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;920:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;765:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;836:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;689:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;238:20:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;880:34:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1644:1853;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;832:169:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;804:26:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;731:28;;;;;;;;;;;;;:::o;920:44::-;;;;;;;;;;;;;:::o;765:33::-;;;;;;;;;;;;;:::o;836:38::-;;;;;;;;;;;;;:::o;689:36::-;;;;;;;;;;;;;:::o;238:20:39:-;;;;;;;;;;;;;:::o;880:34:1:-;;;;;;;;;;;;;:::o;1644:1853::-;1783:18;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;1832:27:1;1816:43;;;;;;;;:12;:43;;;;;;;;;1812:1608;;;1896:14;;;;;;;;;;;1875:36;;1925:42;1944:10;1956;1925:18;:42::i;:::-;2013:10;1981:14;;:43;;;;;;;;;;;;;;;;;;1812:1608;;;2061:23;2045:39;;;;;;;;:12;:39;;;;;;;;;2041:1379;;;2121:10;;;;;;;;;;;2100:32;;2146:42;2165:10;2177;2146:18;:42::i;:::-;2226:10;2202;;:35;;;;;;;;;;;;;;;;;;2041:1379;;;2274:25;2258:41;;;;;;;;:12;:41;;;;;;;;;2254:1166;;;2336:12;;;;;;;;;;;2315:34;;2363:42;2382:10;2394;2363:18;:42::i;:::-;2447:10;2419:12;;:39;;;;;;;;;;;;;;;;;;2254:1166;;;2495:22;2479:38;;;;;;;;:12;:38;;;;;;;;;2475:945;;;2554:9;;;;;;;;;;;2533:31;;2578:42;2597:10;2609;2578:18;:42::i;:::-;2656:10;2634:9;;:33;;;;;;;;;;;;;;;;;;2475:945;;;2704:28;2688:44;;;;;;;;:12;:44;;;;;;;;;2684:736;;;2769:15;;;;;;;;;;;2748:37;;2799:42;2818:10;2830;2799:18;:42::i;:::-;2889:10;2855:15;;:45;;;;;;;;;;;;;;;;;;2684:736;;;2937:26;2921:42;;;;;;;;:12;:42;;;;;;;;;2917:503;;;3000:13;;;;;;;;;;;2979:35;;3028:42;3047:10;3059;3028:18;:42::i;:::-;3114:10;3084:13;;:41;;;;;;;;;;;;;;;;;;2917:503;;;3162:31;3146:47;;;;;;;;:12;:47;;;;;;;;;3142:278;;;3230:18;;;;;;;;;;;3209:40;;3263:42;3282:10;3294;3263:18;:42::i;:::-;3359:10;3319:18;;:51;;;;;;;;;;;;;;;;;;3142:278;;;3401:8;;;3142:278;2917:503;2684:736;2475:945;2254:1166;2041:1379;1812:1608;3479:10;3430:60;;3467:10;3430:60;;3453:12;3430:60;;;;;;;;;;;;;;;;;;1644:1853;;;:::o;832:169:39:-;653:5;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;928:1;908:22;;:8;:22;;;;900:31;;;;;;;;965:8;937:37;;958:5;;;;;;;;;;;937:37;;;;;;;;;;;;988:8;980:5;;:16;;;;;;;;;;;;;;;;;;832:169;:::o;804:26:1:-;;;;;;;;;;;;;:::o;3503:299::-;3667:1;3645:24;;:10;:24;;;;3637:33;;;;;;;;3741:10;3727:24;;:10;:24;;;;3719:33;;;;;;;;3503:299;;:::o", "source": "pragma solidity 0.4.18;\n\nimport \"zeppelin-solidity/contracts/ownership/Ownable.sol\";\n\nimport \"./Collateralizer.sol\";\nimport \"./DebtKernel.sol\";\nimport \"./DebtRegistry.sol\";\nimport \"./DebtToken.sol\";\nimport \"./RepaymentRouter.sol\";\nimport \"./TokenRegistry.sol\";\nimport \"./TokenTransferProxy.sol\";\n\n\ncontract ContractRegistry is Ownable {\n\n event ContractAddressUpdated(\n ContractType indexed contractType,\n address indexed oldAddress,\n address indexed newAddress\n );\n\n enum ContractType {\n Collateralizer,\n DebtKernel,\n DebtRegistry,\n DebtToken,\n RepaymentRouter,\n TokenRegistry,\n TokenTransferProxy\n }\n\n Collateralizer public collateralizer;\n DebtKernel public debtKernel;\n DebtRegistry public debtRegistry;\n DebtToken public debtToken;\n RepaymentRouter public repaymentRouter;\n TokenRegistry public tokenRegistry;\n TokenTransferProxy public tokenTransferProxy;\n\n function ContractRegistry(\n address _collateralizer,\n address _debtKernel,\n address _debtRegistry,\n address _debtToken,\n address _repaymentRouter,\n address _tokenRegistry,\n address _tokenTransferProxy\n )\n public\n {\n collateralizer = Collateralizer(_collateralizer);\n debtKernel = DebtKernel(_debtKernel);\n debtRegistry = DebtRegistry(_debtRegistry);\n debtToken = DebtToken(_debtToken);\n repaymentRouter = RepaymentRouter(_repaymentRouter);\n tokenRegistry = TokenRegistry(_tokenRegistry);\n tokenTransferProxy = TokenTransferProxy(_tokenTransferProxy);\n }\n\n function updateAddress(\n ContractType contractType,\n address newAddress\n )\n public\n onlyOwner\n {\n address oldAddress;\n\n if (contractType == ContractType.Collateralizer) {\n oldAddress = address(collateralizer);\n validateNewAddress(newAddress, oldAddress);\n collateralizer = Collateralizer(newAddress);\n } else if (contractType == ContractType.DebtKernel) {\n oldAddress = address(debtKernel);\n validateNewAddress(newAddress, oldAddress);\n debtKernel = DebtKernel(newAddress);\n } else if (contractType == ContractType.DebtRegistry) {\n oldAddress = address(debtRegistry);\n validateNewAddress(newAddress, oldAddress);\n debtRegistry = DebtRegistry(newAddress);\n } else if (contractType == ContractType.DebtToken) {\n oldAddress = address(debtToken);\n validateNewAddress(newAddress, oldAddress);\n debtToken = DebtToken(newAddress);\n } else if (contractType == ContractType.RepaymentRouter) {\n oldAddress = address(repaymentRouter);\n validateNewAddress(newAddress, oldAddress);\n repaymentRouter = RepaymentRouter(newAddress);\n } else if (contractType == ContractType.TokenRegistry) {\n oldAddress = address(tokenRegistry);\n validateNewAddress(newAddress, oldAddress);\n tokenRegistry = TokenRegistry(newAddress);\n } else if (contractType == ContractType.TokenTransferProxy) {\n oldAddress = address(tokenTransferProxy);\n validateNewAddress(newAddress, oldAddress);\n tokenTransferProxy = TokenTransferProxy(newAddress);\n } else {\n revert();\n }\n\n ContractAddressUpdated(contractType, oldAddress, newAddress);\n }\n\n function validateNewAddress(\n address newAddress,\n address oldAddress\n )\n internal\n pure\n {\n require(newAddress != address(0)); // new address cannot be null address.\n require(newAddress != oldAddress); // new address cannot be existing address.\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/ContractRegistry.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/ContractRegistry.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/ContractRegistry.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/ContractRegistry.sol", "exportedSymbols": { "ContractRegistry": [ 923 @@ -266,7 +266,7 @@ { "attributes": { "SourceUnit": 615, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/Collateralizer.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/Collateralizer.sol", "file": "./Collateralizer.sol", "scope": 924, "symbolAliases": [ @@ -281,7 +281,7 @@ { "attributes": { "SourceUnit": 2631, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/DebtKernel.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/DebtKernel.sol", "file": "./DebtKernel.sol", "scope": 924, "symbolAliases": [ @@ -296,7 +296,7 @@ { "attributes": { "SourceUnit": 3159, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/DebtRegistry.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/DebtRegistry.sol", "file": "./DebtRegistry.sol", "scope": 924, "symbolAliases": [ @@ -311,7 +311,7 @@ { "attributes": { "SourceUnit": 3541, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/DebtToken.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/DebtToken.sol", "file": "./DebtToken.sol", "scope": 924, "symbolAliases": [ @@ -326,7 +326,7 @@ { "attributes": { "SourceUnit": 4708, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/RepaymentRouter.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/RepaymentRouter.sol", "file": "./RepaymentRouter.sol", "scope": 924, "symbolAliases": [ @@ -341,7 +341,7 @@ { "attributes": { "SourceUnit": 5114, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/TokenRegistry.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/TokenRegistry.sol", "file": "./TokenRegistry.sol", "scope": 924, "symbolAliases": [ @@ -356,7 +356,7 @@ { "attributes": { "SourceUnit": 5207, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/TokenTransferProxy.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/TokenTransferProxy.sol", "file": "./TokenTransferProxy.sol", "scope": 924, "symbolAliases": [ @@ -4730,7 +4730,7 @@ } }, "links": {}, - "address": "0x98090fb23948d09772840b7440e7cdd4c28c2c8d" + "address": "0x342e4778937a0fa5879aa594d0f57370f1a0e5d9" }, "70": { "events": { @@ -4779,5 +4779,5 @@ } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:16:36.727Z" + "updatedAt": "2018-10-09T17:53:24.840Z" } \ No newline at end of file diff --git a/artifacts/json/CreditorProxy.json b/artifacts/json/CreditorProxy.json index 38840f83..da6ba8d7 100644 --- a/artifacts/json/CreditorProxy.json +++ b/artifacts/json/CreditorProxy.json @@ -308,15 +308,15 @@ "type": "event" } ], - "bytecode": "0x606060405260008060146101000a81548160ff021916908315150217905550341561002957600080fd5b604051602080611be483398101604052808051906020019091905050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050611b0e806100d66000396000f3006060604052600436106100ba576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633c1c90a7146100bf5780633f4ba83a1461015d57806347f7835d146101725780635c975abb146102d05780638456cb59146102fd5780638da5cb5b14610312578063a318b5f714610367578063abf410e5146103a6578063c1614d00146103fb578063e283040d1461043a578063f06bbf751461046b578063f2fde38b1461049c575b600080fd5b34156100ca57600080fd5b61015b60048080608001906004806020026040519081016040528092919082600460200280828437820191505050505091908060800190600480602002604051908101604052809291908260046020028082843782019150505050509190806020019060018060200260405190810160405280929190826001602002808284378201915050505050919050506104d5565b005b341561016857600080fd5b6101706105e1565b005b341561017d57600080fd5b6102b2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908060c001906006806020026040519081016040528092919082600660200280828437820191505050505091908061010001906008806020026040519081016040528092919082600860200280828437820191505050505091908060200190600180602002604051908101604052809291908260016020028082843782019150505050509190806060019060038060200260405190810160405280929190826003602002808284378201915050505050919080606001906003806020026040519081016040528092919082600360200280828437820191505050505091908060600190600380602002604051908101604052809291908260036020028082843782019150505050509190505061069f565b60405180826000191660001916815260200191505060405180910390f35b34156102db57600080fd5b6102e3610fa7565b604051808215151515815260200191505060405180910390f35b341561030857600080fd5b610310610fba565b005b341561031d57600080fd5b61032561107a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561037257600080fd5b61038c60048080356000191690602001909190505061109f565b604051808215151515815260200191505060405180910390f35b34156103b157600080fd5b6103b96110bf565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561040657600080fd5b6104206004808035600019169060200190919050506110e5565b604051808215151515815260200191505060405180910390f35b341561044557600080fd5b61044d611105565b60405180826000191660001916815260200191505060405180910390f35b341561047657600080fd5b61047e61110d565b604051808261ffff1661ffff16815260200191505060405180910390f35b34156104a757600080fd5b6104d3600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611113565b005b60008060149054906101000a900460ff161515156104f257600080fd5b83600060048110151561050157fe5b602002015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561053f57600080fd5b61054a848484611268565b9050600160026000836000191660001916815260200190815260200160002060006101000a81548160ff021916908315150217905550806000191684600060048110151561059457fe5b602002015173ffffffffffffffffffffffffffffffffffffffff167f07d3242876ac355520b94ab74873262d83b5b81dbd5da781118f78cee0bbe74760405160405180910390a350505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561063c57600080fd5b600060149054906101000a900460ff16151561065757600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b600080600080600060149054906101000a900460ff161515156106c157600080fd5b6108436080604051908101604052808d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018c600060068110151561071157fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018c600260068110151561075657fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018c600360068110151561079b57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152506080604051908101604052808c60056008811015156107ea57fe5b602002015181526020018c600060088110151561080357fe5b602002015181526020018c600760088110151561081c57fe5b602002015181526020018c600160088110151561083557fe5b60200201518152508a611268565b925060036000846000191660001916815260200190815260200160002060009054906101000a900460ff16156108d75782600019168b73ffffffffffffffffffffffffffffffffffffffff166001600381111561089c57fe5b60ff167f2ced8b4371717a8c6ce644dc517a7eaf4c7c0b52e5ab304c4c7472b15588b10260405160405180910390a460006001029350610f99565b60026000846000191660001916815260200190815260200160002060009054906101000a900460ff16156109695782600019168b73ffffffffffffffffffffffffffffffffffffffff166000600381111561092e57fe5b60ff167f2ced8b4371717a8c6ce644dc517a7eaf4c7c0b52e5ab304c4c7472b15588b10260405160405180910390a460006001029350610f99565b6109af8b8489600160038110151561097d57fe5b602002015189600160038110151561099157fe5b60200201518960016003811015156109a557fe5b6020020151611468565b1515610a195782600019168b73ffffffffffffffffffffffffffffffffffffffff16600260038111156109de57fe5b60ff167f2ced8b4371717a8c6ce644dc517a7eaf4c7c0b52e5ab304c4c7472b15588b10260405160405180910390a460006001029350610f99565b610a52896005600881101515610a2b57fe5b60200201518a6002600881101515610a3f57fe5b602002015161156f90919063ffffffff16565b9150610a728b8b6004600681101515610a6757fe5b60200201518461158d565b1515610adb5782600019168b73ffffffffffffffffffffffffffffffffffffffff16600380811115610aa057fe5b60ff167f2ced8b4371717a8c6ce644dc517a7eaf4c7c0b52e5ab304c4c7472b15588b10260405160405180910390a460006001029350610f99565b6000821115610b0f57610b038a6004600681101515610af657fe5b60200201518c30856116a9565b1515610b0e57600080fd5b5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663079dd4b76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610b9d57600080fd5b6102c65a03f11515610bae57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663e6488fc9308c8c8c8c8c8c6000604051602001526040518863ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200187600660200280838360005b83811015610c6b578082015181840152602081019050610c50565b5050505090500186600860200280838360005b83811015610c99578082015181840152602081019050610c7e565b5050505090500185600160200280838360005b83811015610cc7578082015181840152602081019050610cac565b5050505090500184600360200280838360005b83811015610cf5578082015181840152602081019050610cda565b5050505090500183600360200280838360005b83811015610d23578082015181840152602081019050610d08565b5050505090500182600360200280838360005b83811015610d51578082015181840152602081019050610d36565b50505050905001975050505050505050602060405180830381600087803b1515610d7a57600080fd5b6102c65a03f11515610d8b57600080fd5b505050604051805190509050600060010260001916816000191614151515610db257600080fd5b600160036000856000191660001916815260200190815260200160002060006101000a81548160ff021916908315150217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f8d898986000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610e7457600080fd5b6102c65a03f11515610e8557600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8c83600190046040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1515610f3457600080fd5b6102c65a03f11515610f4557600080fd5b505050806000191683600019168c73ffffffffffffffffffffffffffffffffffffffff167f44bca8cc6f9375e3d800b6361e71fdde37e4fc86bdc3a72c4f8f69bbd19a01f360405160405180910390a48093505b505050979650505050505050565b600060149054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561101557600080fd5b600060149054906101000a900460ff1615151561103157600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60026020528060005260406000206000915054906101000a900460ff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60036020528060005260406000206000915054906101000a900460ff1681565b600060010281565b611f4081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561116e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156111aa57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600083600060048110151561127957fe5b602002015184600160048110151561128d57fe5b60200201518460006004811015156112a157fe5b60200201518660026004811015156112b557fe5b60200201518660016004811015156112c957fe5b60200201518860036004811015156112dd57fe5b60200201518760006001811015156112f157fe5b602002015189600260048110151561130557fe5b60200201518a600360048110151561131957fe5b6020020151604051808a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018881526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140184600019166000191681526020018381526020018281526020019950505050505050505050604051809103902090509392505050565b600060018560405180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c0182600019166000191681526020019150506040518091039020858585604051600081526020016040526000604051602001526040518085600019166000191681526020018460ff1660ff16815260200183600019166000191681526020018260001916600019168152602001945050505050602060405160208103908084039060008661646e5a03f1151561152d57600080fd5b50506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b600080828401905083811015151561158357fe5b8091505092915050565b60008060008061159e8688306117af565b92506115aa86886118a7565b9150848210806115b957508483105b156115c7576000935061169f565b61167a8630600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630eefdbad6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561165a57600080fd5b6102c65a03f1151561166b57600080fd5b505050604051805190506117af565b90508481101561169a5761168e868661196a565b151561169957600080fd5b5b600193505b5050509392505050565b60008473ffffffffffffffffffffffffffffffffffffffff166323b872dd8585856000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b151561178a57600080fd5b6102c65a03f1151561179b57600080fd5b505050604051805190509050949350505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e611f4061ffff1685856040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600088803b151561188657600080fd5b87f1151561189357600080fd5b505050506040518051905090509392505050565b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231611f4061ffff16846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600088803b151561194a57600080fd5b87f1151561195757600080fd5b5050505060405180519050905092915050565b60008273ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630eefdbad6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515611a1657600080fd5b6102c65a03f11515611a2757600080fd5b50505060405180519050846000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1515611abf57600080fd5b6102c65a03f11515611ad057600080fd5b505050604051805190509050929150505600a165627a7a7230582077351096e22ed68088d0c4d2d4e0c3c66fd364f8bacf64149f14f1cdb40aa1850029", - "deployedBytecode": "0x6060604052600436106100ba576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633c1c90a7146100bf5780633f4ba83a1461015d57806347f7835d146101725780635c975abb146102d05780638456cb59146102fd5780638da5cb5b14610312578063a318b5f714610367578063abf410e5146103a6578063c1614d00146103fb578063e283040d1461043a578063f06bbf751461046b578063f2fde38b1461049c575b600080fd5b34156100ca57600080fd5b61015b60048080608001906004806020026040519081016040528092919082600460200280828437820191505050505091908060800190600480602002604051908101604052809291908260046020028082843782019150505050509190806020019060018060200260405190810160405280929190826001602002808284378201915050505050919050506104d5565b005b341561016857600080fd5b6101706105e1565b005b341561017d57600080fd5b6102b2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908060c001906006806020026040519081016040528092919082600660200280828437820191505050505091908061010001906008806020026040519081016040528092919082600860200280828437820191505050505091908060200190600180602002604051908101604052809291908260016020028082843782019150505050509190806060019060038060200260405190810160405280929190826003602002808284378201915050505050919080606001906003806020026040519081016040528092919082600360200280828437820191505050505091908060600190600380602002604051908101604052809291908260036020028082843782019150505050509190505061069f565b60405180826000191660001916815260200191505060405180910390f35b34156102db57600080fd5b6102e3610fa7565b604051808215151515815260200191505060405180910390f35b341561030857600080fd5b610310610fba565b005b341561031d57600080fd5b61032561107a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561037257600080fd5b61038c60048080356000191690602001909190505061109f565b604051808215151515815260200191505060405180910390f35b34156103b157600080fd5b6103b96110bf565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561040657600080fd5b6104206004808035600019169060200190919050506110e5565b604051808215151515815260200191505060405180910390f35b341561044557600080fd5b61044d611105565b60405180826000191660001916815260200191505060405180910390f35b341561047657600080fd5b61047e61110d565b604051808261ffff1661ffff16815260200191505060405180910390f35b34156104a757600080fd5b6104d3600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611113565b005b60008060149054906101000a900460ff161515156104f257600080fd5b83600060048110151561050157fe5b602002015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561053f57600080fd5b61054a848484611268565b9050600160026000836000191660001916815260200190815260200160002060006101000a81548160ff021916908315150217905550806000191684600060048110151561059457fe5b602002015173ffffffffffffffffffffffffffffffffffffffff167f07d3242876ac355520b94ab74873262d83b5b81dbd5da781118f78cee0bbe74760405160405180910390a350505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561063c57600080fd5b600060149054906101000a900460ff16151561065757600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b600080600080600060149054906101000a900460ff161515156106c157600080fd5b6108436080604051908101604052808d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018c600060068110151561071157fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018c600260068110151561075657fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018c600360068110151561079b57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152506080604051908101604052808c60056008811015156107ea57fe5b602002015181526020018c600060088110151561080357fe5b602002015181526020018c600760088110151561081c57fe5b602002015181526020018c600160088110151561083557fe5b60200201518152508a611268565b925060036000846000191660001916815260200190815260200160002060009054906101000a900460ff16156108d75782600019168b73ffffffffffffffffffffffffffffffffffffffff166001600381111561089c57fe5b60ff167f2ced8b4371717a8c6ce644dc517a7eaf4c7c0b52e5ab304c4c7472b15588b10260405160405180910390a460006001029350610f99565b60026000846000191660001916815260200190815260200160002060009054906101000a900460ff16156109695782600019168b73ffffffffffffffffffffffffffffffffffffffff166000600381111561092e57fe5b60ff167f2ced8b4371717a8c6ce644dc517a7eaf4c7c0b52e5ab304c4c7472b15588b10260405160405180910390a460006001029350610f99565b6109af8b8489600160038110151561097d57fe5b602002015189600160038110151561099157fe5b60200201518960016003811015156109a557fe5b6020020151611468565b1515610a195782600019168b73ffffffffffffffffffffffffffffffffffffffff16600260038111156109de57fe5b60ff167f2ced8b4371717a8c6ce644dc517a7eaf4c7c0b52e5ab304c4c7472b15588b10260405160405180910390a460006001029350610f99565b610a52896005600881101515610a2b57fe5b60200201518a6002600881101515610a3f57fe5b602002015161156f90919063ffffffff16565b9150610a728b8b6004600681101515610a6757fe5b60200201518461158d565b1515610adb5782600019168b73ffffffffffffffffffffffffffffffffffffffff16600380811115610aa057fe5b60ff167f2ced8b4371717a8c6ce644dc517a7eaf4c7c0b52e5ab304c4c7472b15588b10260405160405180910390a460006001029350610f99565b6000821115610b0f57610b038a6004600681101515610af657fe5b60200201518c30856116a9565b1515610b0e57600080fd5b5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663079dd4b76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610b9d57600080fd5b6102c65a03f11515610bae57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663e6488fc9308c8c8c8c8c8c6000604051602001526040518863ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200187600660200280838360005b83811015610c6b578082015181840152602081019050610c50565b5050505090500186600860200280838360005b83811015610c99578082015181840152602081019050610c7e565b5050505090500185600160200280838360005b83811015610cc7578082015181840152602081019050610cac565b5050505090500184600360200280838360005b83811015610cf5578082015181840152602081019050610cda565b5050505090500183600360200280838360005b83811015610d23578082015181840152602081019050610d08565b5050505090500182600360200280838360005b83811015610d51578082015181840152602081019050610d36565b50505050905001975050505050505050602060405180830381600087803b1515610d7a57600080fd5b6102c65a03f11515610d8b57600080fd5b505050604051805190509050600060010260001916816000191614151515610db257600080fd5b600160036000856000191660001916815260200190815260200160002060006101000a81548160ff021916908315150217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f8d898986000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610e7457600080fd5b6102c65a03f11515610e8557600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8c83600190046040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1515610f3457600080fd5b6102c65a03f11515610f4557600080fd5b505050806000191683600019168c73ffffffffffffffffffffffffffffffffffffffff167f44bca8cc6f9375e3d800b6361e71fdde37e4fc86bdc3a72c4f8f69bbd19a01f360405160405180910390a48093505b505050979650505050505050565b600060149054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561101557600080fd5b600060149054906101000a900460ff1615151561103157600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60026020528060005260406000206000915054906101000a900460ff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60036020528060005260406000206000915054906101000a900460ff1681565b600060010281565b611f4081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561116e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156111aa57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600083600060048110151561127957fe5b602002015184600160048110151561128d57fe5b60200201518460006004811015156112a157fe5b60200201518660026004811015156112b557fe5b60200201518660016004811015156112c957fe5b60200201518860036004811015156112dd57fe5b60200201518760006001811015156112f157fe5b602002015189600260048110151561130557fe5b60200201518a600360048110151561131957fe5b6020020151604051808a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018881526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140184600019166000191681526020018381526020018281526020019950505050505050505050604051809103902090509392505050565b600060018560405180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c0182600019166000191681526020019150506040518091039020858585604051600081526020016040526000604051602001526040518085600019166000191681526020018460ff1660ff16815260200183600019166000191681526020018260001916600019168152602001945050505050602060405160208103908084039060008661646e5a03f1151561152d57600080fd5b50506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b600080828401905083811015151561158357fe5b8091505092915050565b60008060008061159e8688306117af565b92506115aa86886118a7565b9150848210806115b957508483105b156115c7576000935061169f565b61167a8630600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630eefdbad6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561165a57600080fd5b6102c65a03f1151561166b57600080fd5b505050604051805190506117af565b90508481101561169a5761168e868661196a565b151561169957600080fd5b5b600193505b5050509392505050565b60008473ffffffffffffffffffffffffffffffffffffffff166323b872dd8585856000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b151561178a57600080fd5b6102c65a03f1151561179b57600080fd5b505050604051805190509050949350505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e611f4061ffff1685856040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600088803b151561188657600080fd5b87f1151561189357600080fd5b505050506040518051905090509392505050565b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231611f4061ffff16846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600088803b151561194a57600080fd5b87f1151561195757600080fd5b5050505060405180519050905092915050565b60008273ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630eefdbad6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515611a1657600080fd5b6102c65a03f11515611a2757600080fd5b50505060405180519050846000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1515611abf57600080fd5b6102c65a03f11515611ad057600080fd5b505050604051805190509050929150505600a165627a7a7230582077351096e22ed68088d0c4d2d4e0c3c66fd364f8bacf64149f14f1cdb40aa1850029", + "bytecode": "0x606060405260008060146101000a81548160ff021916908315150217905550341561002957600080fd5b604051602080611be483398101604052808051906020019091905050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050611b0e806100d66000396000f3006060604052600436106100ba576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633c1c90a7146100bf5780633f4ba83a1461015d57806347f7835d146101725780635c975abb146102d05780638456cb59146102fd5780638da5cb5b14610312578063a318b5f714610367578063abf410e5146103a6578063c1614d00146103fb578063e283040d1461043a578063f06bbf751461046b578063f2fde38b1461049c575b600080fd5b34156100ca57600080fd5b61015b60048080608001906004806020026040519081016040528092919082600460200280828437820191505050505091908060800190600480602002604051908101604052809291908260046020028082843782019150505050509190806020019060018060200260405190810160405280929190826001602002808284378201915050505050919050506104d5565b005b341561016857600080fd5b6101706105e1565b005b341561017d57600080fd5b6102b2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908060c001906006806020026040519081016040528092919082600660200280828437820191505050505091908061010001906008806020026040519081016040528092919082600860200280828437820191505050505091908060200190600180602002604051908101604052809291908260016020028082843782019150505050509190806060019060038060200260405190810160405280929190826003602002808284378201915050505050919080606001906003806020026040519081016040528092919082600360200280828437820191505050505091908060600190600380602002604051908101604052809291908260036020028082843782019150505050509190505061069f565b60405180826000191660001916815260200191505060405180910390f35b34156102db57600080fd5b6102e3610fa7565b604051808215151515815260200191505060405180910390f35b341561030857600080fd5b610310610fba565b005b341561031d57600080fd5b61032561107a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561037257600080fd5b61038c60048080356000191690602001909190505061109f565b604051808215151515815260200191505060405180910390f35b34156103b157600080fd5b6103b96110bf565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561040657600080fd5b6104206004808035600019169060200190919050506110e5565b604051808215151515815260200191505060405180910390f35b341561044557600080fd5b61044d611105565b60405180826000191660001916815260200191505060405180910390f35b341561047657600080fd5b61047e61110d565b604051808261ffff1661ffff16815260200191505060405180910390f35b34156104a757600080fd5b6104d3600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611113565b005b60008060149054906101000a900460ff161515156104f257600080fd5b83600060048110151561050157fe5b602002015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561053f57600080fd5b61054a848484611268565b9050600160026000836000191660001916815260200190815260200160002060006101000a81548160ff021916908315150217905550806000191684600060048110151561059457fe5b602002015173ffffffffffffffffffffffffffffffffffffffff167f07d3242876ac355520b94ab74873262d83b5b81dbd5da781118f78cee0bbe74760405160405180910390a350505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561063c57600080fd5b600060149054906101000a900460ff16151561065757600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b600080600080600060149054906101000a900460ff161515156106c157600080fd5b6108436080604051908101604052808d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018c600060068110151561071157fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018c600260068110151561075657fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018c600360068110151561079b57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152506080604051908101604052808c60056008811015156107ea57fe5b602002015181526020018c600060088110151561080357fe5b602002015181526020018c600760088110151561081c57fe5b602002015181526020018c600160088110151561083557fe5b60200201518152508a611268565b925060036000846000191660001916815260200190815260200160002060009054906101000a900460ff16156108d75782600019168b73ffffffffffffffffffffffffffffffffffffffff166001600381111561089c57fe5b60ff167f2ced8b4371717a8c6ce644dc517a7eaf4c7c0b52e5ab304c4c7472b15588b10260405160405180910390a460006001029350610f99565b60026000846000191660001916815260200190815260200160002060009054906101000a900460ff16156109695782600019168b73ffffffffffffffffffffffffffffffffffffffff166000600381111561092e57fe5b60ff167f2ced8b4371717a8c6ce644dc517a7eaf4c7c0b52e5ab304c4c7472b15588b10260405160405180910390a460006001029350610f99565b6109af8b8489600160038110151561097d57fe5b602002015189600160038110151561099157fe5b60200201518960016003811015156109a557fe5b6020020151611468565b1515610a195782600019168b73ffffffffffffffffffffffffffffffffffffffff16600260038111156109de57fe5b60ff167f2ced8b4371717a8c6ce644dc517a7eaf4c7c0b52e5ab304c4c7472b15588b10260405160405180910390a460006001029350610f99565b610a52896005600881101515610a2b57fe5b60200201518a6002600881101515610a3f57fe5b602002015161156f90919063ffffffff16565b9150610a728b8b6004600681101515610a6757fe5b60200201518461158d565b1515610adb5782600019168b73ffffffffffffffffffffffffffffffffffffffff16600380811115610aa057fe5b60ff167f2ced8b4371717a8c6ce644dc517a7eaf4c7c0b52e5ab304c4c7472b15588b10260405160405180910390a460006001029350610f99565b6000821115610b0f57610b038a6004600681101515610af657fe5b60200201518c30856116a9565b1515610b0e57600080fd5b5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663079dd4b76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610b9d57600080fd5b6102c65a03f11515610bae57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663e6488fc9308c8c8c8c8c8c6000604051602001526040518863ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200187600660200280838360005b83811015610c6b578082015181840152602081019050610c50565b5050505090500186600860200280838360005b83811015610c99578082015181840152602081019050610c7e565b5050505090500185600160200280838360005b83811015610cc7578082015181840152602081019050610cac565b5050505090500184600360200280838360005b83811015610cf5578082015181840152602081019050610cda565b5050505090500183600360200280838360005b83811015610d23578082015181840152602081019050610d08565b5050505090500182600360200280838360005b83811015610d51578082015181840152602081019050610d36565b50505050905001975050505050505050602060405180830381600087803b1515610d7a57600080fd5b6102c65a03f11515610d8b57600080fd5b505050604051805190509050600060010260001916816000191614151515610db257600080fd5b600160036000856000191660001916815260200190815260200160002060006101000a81548160ff021916908315150217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f8d898986000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610e7457600080fd5b6102c65a03f11515610e8557600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8c83600190046040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1515610f3457600080fd5b6102c65a03f11515610f4557600080fd5b505050806000191683600019168c73ffffffffffffffffffffffffffffffffffffffff167f44bca8cc6f9375e3d800b6361e71fdde37e4fc86bdc3a72c4f8f69bbd19a01f360405160405180910390a48093505b505050979650505050505050565b600060149054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561101557600080fd5b600060149054906101000a900460ff1615151561103157600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60026020528060005260406000206000915054906101000a900460ff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60036020528060005260406000206000915054906101000a900460ff1681565b600060010281565b611f4081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561116e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156111aa57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600083600060048110151561127957fe5b602002015184600160048110151561128d57fe5b60200201518460006004811015156112a157fe5b60200201518660026004811015156112b557fe5b60200201518660016004811015156112c957fe5b60200201518860036004811015156112dd57fe5b60200201518760006001811015156112f157fe5b602002015189600260048110151561130557fe5b60200201518a600360048110151561131957fe5b6020020151604051808a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018881526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140184600019166000191681526020018381526020018281526020019950505050505050505050604051809103902090509392505050565b600060018560405180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c0182600019166000191681526020019150506040518091039020858585604051600081526020016040526000604051602001526040518085600019166000191681526020018460ff1660ff16815260200183600019166000191681526020018260001916600019168152602001945050505050602060405160208103908084039060008661646e5a03f1151561152d57600080fd5b50506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b600080828401905083811015151561158357fe5b8091505092915050565b60008060008061159e8688306117af565b92506115aa86886118a7565b9150848210806115b957508483105b156115c7576000935061169f565b61167a8630600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630eefdbad6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561165a57600080fd5b6102c65a03f1151561166b57600080fd5b505050604051805190506117af565b90508481101561169a5761168e868661196a565b151561169957600080fd5b5b600193505b5050509392505050565b60008473ffffffffffffffffffffffffffffffffffffffff166323b872dd8585856000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b151561178a57600080fd5b6102c65a03f1151561179b57600080fd5b505050604051805190509050949350505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e611f4061ffff1685856040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600088803b151561188657600080fd5b87f1151561189357600080fd5b505050506040518051905090509392505050565b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231611f4061ffff16846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600088803b151561194a57600080fd5b87f1151561195757600080fd5b5050505060405180519050905092915050565b60008273ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630eefdbad6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515611a1657600080fd5b6102c65a03f11515611a2757600080fd5b50505060405180519050846000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1515611abf57600080fd5b6102c65a03f11515611ad057600080fd5b505050604051805190509050929150505600a165627a7a72305820627f64d2f5e59580e881310ad781c1c18c95e290f478ac08b283c8661b5071d90029", + "deployedBytecode": "0x6060604052600436106100ba576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633c1c90a7146100bf5780633f4ba83a1461015d57806347f7835d146101725780635c975abb146102d05780638456cb59146102fd5780638da5cb5b14610312578063a318b5f714610367578063abf410e5146103a6578063c1614d00146103fb578063e283040d1461043a578063f06bbf751461046b578063f2fde38b1461049c575b600080fd5b34156100ca57600080fd5b61015b60048080608001906004806020026040519081016040528092919082600460200280828437820191505050505091908060800190600480602002604051908101604052809291908260046020028082843782019150505050509190806020019060018060200260405190810160405280929190826001602002808284378201915050505050919050506104d5565b005b341561016857600080fd5b6101706105e1565b005b341561017d57600080fd5b6102b2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908060c001906006806020026040519081016040528092919082600660200280828437820191505050505091908061010001906008806020026040519081016040528092919082600860200280828437820191505050505091908060200190600180602002604051908101604052809291908260016020028082843782019150505050509190806060019060038060200260405190810160405280929190826003602002808284378201915050505050919080606001906003806020026040519081016040528092919082600360200280828437820191505050505091908060600190600380602002604051908101604052809291908260036020028082843782019150505050509190505061069f565b60405180826000191660001916815260200191505060405180910390f35b34156102db57600080fd5b6102e3610fa7565b604051808215151515815260200191505060405180910390f35b341561030857600080fd5b610310610fba565b005b341561031d57600080fd5b61032561107a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561037257600080fd5b61038c60048080356000191690602001909190505061109f565b604051808215151515815260200191505060405180910390f35b34156103b157600080fd5b6103b96110bf565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561040657600080fd5b6104206004808035600019169060200190919050506110e5565b604051808215151515815260200191505060405180910390f35b341561044557600080fd5b61044d611105565b60405180826000191660001916815260200191505060405180910390f35b341561047657600080fd5b61047e61110d565b604051808261ffff1661ffff16815260200191505060405180910390f35b34156104a757600080fd5b6104d3600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611113565b005b60008060149054906101000a900460ff161515156104f257600080fd5b83600060048110151561050157fe5b602002015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561053f57600080fd5b61054a848484611268565b9050600160026000836000191660001916815260200190815260200160002060006101000a81548160ff021916908315150217905550806000191684600060048110151561059457fe5b602002015173ffffffffffffffffffffffffffffffffffffffff167f07d3242876ac355520b94ab74873262d83b5b81dbd5da781118f78cee0bbe74760405160405180910390a350505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561063c57600080fd5b600060149054906101000a900460ff16151561065757600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b600080600080600060149054906101000a900460ff161515156106c157600080fd5b6108436080604051908101604052808d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018c600060068110151561071157fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018c600260068110151561075657fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018c600360068110151561079b57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152506080604051908101604052808c60056008811015156107ea57fe5b602002015181526020018c600060088110151561080357fe5b602002015181526020018c600760088110151561081c57fe5b602002015181526020018c600160088110151561083557fe5b60200201518152508a611268565b925060036000846000191660001916815260200190815260200160002060009054906101000a900460ff16156108d75782600019168b73ffffffffffffffffffffffffffffffffffffffff166001600381111561089c57fe5b60ff167f2ced8b4371717a8c6ce644dc517a7eaf4c7c0b52e5ab304c4c7472b15588b10260405160405180910390a460006001029350610f99565b60026000846000191660001916815260200190815260200160002060009054906101000a900460ff16156109695782600019168b73ffffffffffffffffffffffffffffffffffffffff166000600381111561092e57fe5b60ff167f2ced8b4371717a8c6ce644dc517a7eaf4c7c0b52e5ab304c4c7472b15588b10260405160405180910390a460006001029350610f99565b6109af8b8489600160038110151561097d57fe5b602002015189600160038110151561099157fe5b60200201518960016003811015156109a557fe5b6020020151611468565b1515610a195782600019168b73ffffffffffffffffffffffffffffffffffffffff16600260038111156109de57fe5b60ff167f2ced8b4371717a8c6ce644dc517a7eaf4c7c0b52e5ab304c4c7472b15588b10260405160405180910390a460006001029350610f99565b610a52896005600881101515610a2b57fe5b60200201518a6002600881101515610a3f57fe5b602002015161156f90919063ffffffff16565b9150610a728b8b6004600681101515610a6757fe5b60200201518461158d565b1515610adb5782600019168b73ffffffffffffffffffffffffffffffffffffffff16600380811115610aa057fe5b60ff167f2ced8b4371717a8c6ce644dc517a7eaf4c7c0b52e5ab304c4c7472b15588b10260405160405180910390a460006001029350610f99565b6000821115610b0f57610b038a6004600681101515610af657fe5b60200201518c30856116a9565b1515610b0e57600080fd5b5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663079dd4b76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610b9d57600080fd5b6102c65a03f11515610bae57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663e6488fc9308c8c8c8c8c8c6000604051602001526040518863ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200187600660200280838360005b83811015610c6b578082015181840152602081019050610c50565b5050505090500186600860200280838360005b83811015610c99578082015181840152602081019050610c7e565b5050505090500185600160200280838360005b83811015610cc7578082015181840152602081019050610cac565b5050505090500184600360200280838360005b83811015610cf5578082015181840152602081019050610cda565b5050505090500183600360200280838360005b83811015610d23578082015181840152602081019050610d08565b5050505090500182600360200280838360005b83811015610d51578082015181840152602081019050610d36565b50505050905001975050505050505050602060405180830381600087803b1515610d7a57600080fd5b6102c65a03f11515610d8b57600080fd5b505050604051805190509050600060010260001916816000191614151515610db257600080fd5b600160036000856000191660001916815260200190815260200160002060006101000a81548160ff021916908315150217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f8d898986000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610e7457600080fd5b6102c65a03f11515610e8557600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8c83600190046040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1515610f3457600080fd5b6102c65a03f11515610f4557600080fd5b505050806000191683600019168c73ffffffffffffffffffffffffffffffffffffffff167f44bca8cc6f9375e3d800b6361e71fdde37e4fc86bdc3a72c4f8f69bbd19a01f360405160405180910390a48093505b505050979650505050505050565b600060149054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561101557600080fd5b600060149054906101000a900460ff1615151561103157600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60026020528060005260406000206000915054906101000a900460ff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60036020528060005260406000206000915054906101000a900460ff1681565b600060010281565b611f4081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561116e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156111aa57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600083600060048110151561127957fe5b602002015184600160048110151561128d57fe5b60200201518460006004811015156112a157fe5b60200201518660026004811015156112b557fe5b60200201518660016004811015156112c957fe5b60200201518860036004811015156112dd57fe5b60200201518760006001811015156112f157fe5b602002015189600260048110151561130557fe5b60200201518a600360048110151561131957fe5b6020020151604051808a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018881526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140184600019166000191681526020018381526020018281526020019950505050505050505050604051809103902090509392505050565b600060018560405180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c0182600019166000191681526020019150506040518091039020858585604051600081526020016040526000604051602001526040518085600019166000191681526020018460ff1660ff16815260200183600019166000191681526020018260001916600019168152602001945050505050602060405160208103908084039060008661646e5a03f1151561152d57600080fd5b50506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b600080828401905083811015151561158357fe5b8091505092915050565b60008060008061159e8688306117af565b92506115aa86886118a7565b9150848210806115b957508483105b156115c7576000935061169f565b61167a8630600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630eefdbad6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561165a57600080fd5b6102c65a03f1151561166b57600080fd5b505050604051805190506117af565b90508481101561169a5761168e868661196a565b151561169957600080fd5b5b600193505b5050509392505050565b60008473ffffffffffffffffffffffffffffffffffffffff166323b872dd8585856000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b151561178a57600080fd5b6102c65a03f1151561179b57600080fd5b505050604051805190509050949350505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e611f4061ffff1685856040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600088803b151561188657600080fd5b87f1151561189357600080fd5b505050506040518051905090509392505050565b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231611f4061ffff16846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600088803b151561194a57600080fd5b87f1151561195757600080fd5b5050505060405180519050905092915050565b60008273ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630eefdbad6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515611a1657600080fd5b6102c65a03f11515611a2757600080fd5b50505060405180519050846000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1515611abf57600080fd5b6102c65a03f11515611ad057600080fd5b505050604051805190509050929150505600a165627a7a72305820627f64d2f5e59580e881310ad781c1c18c95e290f478ac08b283c8661b5071d90029", "sourceMap": "1086:9807:2:-;;;268:5:37;247:26;;;;;;;;;;;;;;;;;;;;2040:140:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;509:10:39;501:5;;:18;;;;;;;;;;;;;;;;;;2155:17:2;2119:16;;:54;;;;;;;;;;;;;;;;;;2040:140;1086:9807;;;;;;", "deployedSourceMap": "1086:9807:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5952:607;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;833:87:37;;;;;;;;;;;;;;2398:3455:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;247:26:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;666:85;;;;;;;;;;;;;;238:20:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1502:51:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1333:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1559:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1380:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1441:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;832:169:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;5952:607:2;6246:30;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;6213:19:2;6233:1;6213:22;;;;;;;;;;;;;6199:36;;:10;:36;;;6191:45;;;;;;;;6279:135;6318:19;6351:16;6381:23;6279:25;:135::i;:::-;6246:168;;6469:4;6424:18;:42;6443:22;6424:42;;;;;;;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;6529:22;6483:69;;;6505:19;6525:1;6505:22;;;;;;;;;;;;;6483:69;;;;;;;;;;;;5952:607;;;;:::o;833:87:37:-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;568:6:37;;;;;;;;;;;560:15;;;;;;;;895:5;886:6;;:14;;;;;;;;;;;;;;;;;;906:9;;;;;;;;;;833:87::o;2398:3455:2:-;2835:20;2872:30;4306:25;5247:19;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;2905:550:2;;;;;;;;;;2962:8;2905:550;;;;;;;;2988:14;3003:1;2988:17;;;;;;;;;;;;;2905:550;;;;;;;;3051:14;3066:1;3051:17;;;;;;;;;;;;;2905:550;;;;;;;;3101:14;3116:1;3101:17;;;;;;;;;;;;;2905:550;;;;;;;;;;;;;;;;3181:11;3193:1;3181:14;;;;;;;;;;;;;2905:550;;;;3229:11;3241:1;3229:14;;;;;;;;;;;;;2905:550;;;;3286:11;3298:1;3286:14;;;;;;;;;;;;;2905:550;;;;3356:11;3368:1;3356:14;;;;;;;;;;;;;2905:550;;;3406:12;2905:25;:550::i;:::-;2872:583;;3470:15;:39;3486:22;3470:39;;;;;;;;;;;;;;;;;;;;;;;;;;;3466:192;;;3585:22;3525:83;;;3575:8;3525:83;;3540:32;3534:39;;;;;;;;3525:83;;;;;;;;;;;;1433:1;1425:10;;3622:25;;;;3466:192;3672:18;:42;3691:22;3672:42;;;;;;;;;;;;;;;;;;;;;;;;;;;3668:191;;;3785:22;3730:78;;;3775:8;3730:78;;3745:27;3739:34;;;;;;;;3730:78;;;;;;;;;;;;1433:1;1425:10;;3822:25;;;;3668:191;3874:168;3904:8;3926:22;3962:11;3974:1;3962:14;;;;;;;;;;;;;3990:11;4002:1;3990:14;;;;;;;;;;;;;4018:11;4030:1;4018:14;;;;;;;;;;;;;3874:16;:168::i;:::-;3873:169;3869:384;;;4167:22;4058:145;;;4141:8;4058:145;;4090:32;4084:39;;;;;;;;4058:145;;;;;;;;;;;;1433:1;1425:10;;4217:25;;;;3869:384;4334:34;4353:11;4365:1;4353:14;;;;;;;;;;;;;4334:11;4346:1;4334:14;;;;;;;;;;;;;:18;;:34;;;;:::i;:::-;4306:62;;4384:129;4430:8;4452:14;4467:1;4452:17;;;;;;;;;;;;;4483:20;4384:32;:129::i;:::-;4383:130;4379:362;;;4655:22;4529:162;;;4629:8;4529:162;;4561:49;4555:56;;;;;;;;4529:162;;;;;;;;;;;;1433:1;1425:10;;4705:25;;;;4379:362;4839:1;4816:20;:24;4812:276;;;4881:182;4921:14;4936:1;4921:17;;;;;;;;;;;;;4960:8;4998:4;5025:20;4881:18;:182::i;:::-;4856:221;;;;;;;;4812:276;5269:16;;;;;;;;;;;:27;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:43;;;5334:4;5353:14;5381:11;5406:12;5432:11;5457;5482;5269:234;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;23:1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;23:1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;23:1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;23:1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;23:1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5247:256:2;;1433:1;1425:10;;5522:33;;;:11;:33;;;;;5514:42;;;;;;;;5609:4;5567:15;:39;5583:22;5567:39;;;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;5672:16;;;;;;;;;;;:26;;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:37;;;5710:8;5728:11;5720:20;;;5672:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5805:11;5752:65;;;5781:22;5752:65;;;5771:8;5752:65;;;;;;;;;;;;5835:11;5828:18;;429:1:37;2398:3455:2;;;;;;;;;;;;:::o;247:26:37:-;;;;;;;;;;;;;:::o;666:85::-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;729:4;720:6;;:13;;;;;;;;;;;;;;;;;;739:7;;;;;;;;;;666:85::o;238:20:39:-;;;;;;;;;;;;;:::o;1502:51:2:-;;;;;;;;;;;;;;;;;;;;;;:::o;1333:40::-;;;;;;;;;;;;;:::o;1559:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;1380:55::-;1433:1;1425:10;;1380:55;:::o;1441:54::-;1491:4;1441:54;:::o;832:169:39:-;653:5;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;928:1;908:22;;:8;:22;;;;900:31;;;;;;;;965:8;937:37;;958:5;;;;;;;;;;;937:37;;;;;;;;;;;;988:8;980:5;;:16;;;;;;;;;;;;;;;;;;832:169;:::o;6749:761:2:-;6955:31;7032:19;7052:1;7032:22;;;;;;;;;;;;;7080:19;7100:1;7080:22;;;;;;;;;;;;;7144:16;7161:1;7144:19;;;;;;;;;;;;;7193;7213:1;7193:22;;;;;;;;;;;;;7244:16;7261:1;7244:19;;;;;;;;;;;;;7302;7322:1;7302:22;;;;;;;;;;;;;7355:23;7379:1;7355:26;;;;;;;;;;;;;7395:16;7412:1;7395:19;;;;;;;;;;;;;7466:16;7483:1;7466:19;;;;;;;;;;;;;7009:494;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7002:501;;6749:761;;;;;:::o;8965:360::-;9145:11;9189:129;9258:4;9212:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9277:1;9292;9307;9189:129;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9179:139;;:6;:139;;;9172:146;;8965:360;;;;;;;:::o;1007:129:38:-;1065:7;1080:9;1096:1;1092;:5;1080:17;;1115:1;1110;:6;;1103:14;;;;;;1130:1;1123:8;;1007:129;;;;;:::o;7721:1107:2:-;7896:37;8022:19;8107:20;8396:27;8044:53;8057:14;8073:8;8091:4;8044:12;:53::i;:::-;8022:75;;8130:36;8141:14;8157:8;8130:10;:36::i;:::-;8107:59;;8199:20;8181:15;:38;:79;;;;8240:20;8223:14;:37;8181:79;8177:122;;;8283:5;8276:12;;;;8177:122;8426:128;8452:14;8488:4;8507:16;;;;;;;;;;;:35;;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8426:12;:128::i;:::-;8396:158;;8681:20;8656:22;:45;8652:148;;;8725:63;8751:14;8767:20;8725:25;:63::i;:::-;8717:72;;;;;;;;8652:148;8817:4;8810:11;;7721:1107;;;;;;;;;:::o;10643:248::-;10801:13;10843:6;10837:26;;;10864:5;10871:3;10876:7;10837:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10830:54;;10643:248;;;;;;:::o;9804:337::-;9950:15;10038:5;10032:22;;;1491:4;10032:52;;10098:5;10117:7;10032:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10025:109;;9804:337;;;;;:::o;9421:265::-;9540:13;9626:5;9620:22;;;1491:4;9620:52;;9673:5;9620:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9613:66;;9421:265;;;;:::o;10258:272::-;10377:13;10419:5;10413:20;;;10455:16;;;;;;;;;;;:35;;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10507:6;10413:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10406:117;;10258:272;;;;:::o", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\nimport \"./ContractRegistry.sol\";\nimport \"zeppelin-solidity/contracts/lifecycle/Pausable.sol\";\nimport \"zeppelin-solidity/contracts/math/SafeMath.sol\";\nimport \"zeppelin-solidity/contracts/token/ERC20/ERC20.sol\";\n\n\n/**\n * The CreditorProxy is a thin wrapper around the DebtKernel\n * It implements creditor-driven loans as specified by DIP-1\n *\n * Authors: Bo Henderson & Shivani Gupta & Dharma Team\n * DIP: https://github.com/dharmaprotocol/DIPs/issues/1\n */\ncontract CreditorProxy is Pausable {\n using SafeMath for uint;\n\n enum Errors {\n DEBT_OFFER_CANCELLED,\n DEBT_OFFER_ALREADY_FILLED,\n DEBT_OFFER_NON_CONSENSUAL,\n CREDITOR_BALANCE_OR_ALLOWANCE_INSUFFICIENT\n }\n\n ContractRegistry public contractRegistry;\n\n bytes32 constant public NULL_ISSUANCE_HASH = bytes32(0);\n uint16 constant public EXTERNAL_QUERY_GAS_LIMIT = 8000;\n\n mapping (bytes32 => bool) public debtOfferCancelled;\n mapping (bytes32 => bool) public debtOfferFilled;\n\n event LogDebtOfferCancelled(\n address indexed _creditor,\n bytes32 indexed _creditorCommitmentHash\n );\n\n event LogDebtOfferFilled(\n address indexed _creditor,\n bytes32 indexed _creditorCommitmentHash,\n bytes32 indexed _agreementId\n );\n\n event LogError(\n uint8 indexed _errorId,\n address indexed _creditor,\n bytes32 indexed _creditorCommitmentHash\n );\n\n function CreditorProxy(address _contractRegistry)\n public\n {\n contractRegistry = ContractRegistry(_contractRegistry);\n }\n\n /*\n * Submit debt order to DebtKernel if it is consensual with creditor's request\n * Creditor signature in arguments is only used internally,\n * It will not be verified by the Debt Kernel\n */\n function fillDebtOffer(\n address creditor,\n address[6] orderAddresses, // repayment-router, debtor, uw, tc, p-token, relayer\n uint[8] orderValues, // rr, salt, pa, uwFee, rFee, cFee, dFee, expTime\n bytes32[1] orderBytes32, // tcParams\n uint8[3] signaturesV, // debtV, credV, uwV\n bytes32[3] signaturesR,\n bytes32[3] signaturesS\n )\n public\n whenNotPaused\n returns (bytes32 _agreementId)\n {\n\n bytes32 creditorCommitmentHash = getCreditorCommitmentHash(\n [\n creditor,\n orderAddresses[0], // repayment router version\n orderAddresses[2], // underwriter\n orderAddresses[3] // termsContract\n ],\n [\n orderValues[5], // creditor fee\n orderValues[0], // underwriterRiskRating\n orderValues[7], // commitmentExpirationTimestampInSec\n orderValues[1] // salt\n ],\n orderBytes32 // termsContractParameters\n );\n\n if (debtOfferFilled[creditorCommitmentHash]) {\n LogError(uint8(Errors.DEBT_OFFER_ALREADY_FILLED), creditor, creditorCommitmentHash);\n return NULL_ISSUANCE_HASH;\n }\n\n if (debtOfferCancelled[creditorCommitmentHash]) {\n LogError(uint8(Errors.DEBT_OFFER_CANCELLED), creditor, creditorCommitmentHash);\n return NULL_ISSUANCE_HASH; \n }\n\n if (!isValidSignature(\n creditor,\n creditorCommitmentHash,\n signaturesV[1],\n signaturesR[1],\n signaturesS[1]\n )) {\n LogError(\n uint8(Errors.DEBT_OFFER_NON_CONSENSUAL),\n creditor,\n creditorCommitmentHash\n );\n return NULL_ISSUANCE_HASH;\n }\n\n // principal amount + creditor fee\n uint totalCreditorPayment = orderValues[2].add(orderValues[5]);\n\n if (!hasSufficientBalanceAndAllowance(\n creditor,\n orderAddresses[4],\n totalCreditorPayment\n )) {\n LogError(\n uint8(Errors.CREDITOR_BALANCE_OR_ALLOWANCE_INSUFFICIENT),\n creditor,\n creditorCommitmentHash\n );\n return NULL_ISSUANCE_HASH;\n }\n\n // Transfer principal from creditor to CreditorProxy\n if (totalCreditorPayment > 0) {\n require(\n transferTokensFrom(\n orderAddresses[4],\n creditor,\n address(this),\n totalCreditorPayment\n )\n );\n }\n\n // Grant allowance to the TokenTransferProxy for this contract.\n\n\n // Fill debt order with this contract playing the role of creditor\n bytes32 agreementId = contractRegistry.debtKernel().fillDebtOrder(\n address(this),\n orderAddresses,\n orderValues,\n orderBytes32,\n signaturesV,\n signaturesR,\n signaturesS\n );\n\n require(agreementId != NULL_ISSUANCE_HASH);\n\n debtOfferFilled[creditorCommitmentHash] = true;\n\n // transfer debt token to real creditor\n contractRegistry.debtToken().transfer(creditor, uint256(agreementId));\n\n LogDebtOfferFilled(creditor, creditorCommitmentHash, agreementId);\n\n return agreementId;\n }\n\n /**\n * Allows creditor to prevent a debt offer from being used in the future\n */\n function cancelDebtOffer(\n address[4] commitmentAddresses,\n uint[4] commitmentValues,\n bytes32[1] termsContractParameters\n )\n public\n whenNotPaused\n {\n // sender must be the creditor\n require(msg.sender == commitmentAddresses[0]);\n bytes32 creditorCommitmentHash = getCreditorCommitmentHash(\n commitmentAddresses,\n commitmentValues,\n termsContractParameters\n );\n debtOfferCancelled[creditorCommitmentHash] = true;\n LogDebtOfferCancelled(commitmentAddresses[0], creditorCommitmentHash);\n }\n\n ////////////////////////\n // INTERNAL FUNCTIONS //\n ////////////////////////\n\n /**\n * Returns the messaged signed by the creditor to indicate their commitment\n */\n function getCreditorCommitmentHash(\n address[4] commitmentAddresses,\n uint[4] commitmentValues,\n bytes32[1] termsContractParameters\n )\n internal\n pure\n returns (bytes32 _creditorCommitmentHash)\n {\n return keccak256(\n commitmentAddresses[0], // creditor\n commitmentAddresses[1], // repayment router version\n commitmentValues[0], // creditor fee\n commitmentAddresses[2], // underwriter\n commitmentValues[1], // underwriterRiskRating\n commitmentAddresses[3], // termsContract\n termsContractParameters[0],\n commitmentValues[2], // commitmentExpirationTimestampInSec\n commitmentValues[3] // salt\n );\n }\n\n\n /**\n * Assert that the creditor has a sufficient token balance and has granted the token transfer\n * proxy contract sufficient allowance to suffice for the principal and creditor fee.\n */\n function hasSufficientBalanceAndAllowance(\n address creditor,\n address principalToken,\n uint totalCreditorPayment\n )\n internal\n returns (bool _isBalanceAndAllowanceSufficient)\n {\n // The allowance that this contract has for a creditor's tokens.\n uint proxyAllowance = getAllowance(principalToken, creditor, address(this));\n uint creditorBalance = getBalance(principalToken, creditor);\n\n if (creditorBalance < totalCreditorPayment || proxyAllowance < totalCreditorPayment) {\n return false;\n }\n\n // The allowance that the token transfer proxy has for this contract's tokens.\n uint tokenTransferAllowance = getAllowance(\n principalToken,\n address(this),\n contractRegistry.tokenTransferProxy()\n );\n\n // Ensure the token transfer proxy can transfer tokens from the creditor proxy\n if (tokenTransferAllowance < totalCreditorPayment) {\n require(setTokenTransferAllowance(principalToken, totalCreditorPayment));\n }\n\n return true;\n }\n\n /**\n * Given a hashed message, a signer's address, and a signature,\n * returns whether the signature is valid.\n */\n function isValidSignature(\n address signer,\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n )\n internal\n pure\n returns (bool _valid)\n {\n return signer == ecrecover(\n keccak256(\"\\x19Ethereum Signed Message:\\n32\", hash),\n v,\n r,\n s\n );\n }\n\n /**\n * Helper function for querying an address' balance on a given token.\n */\n function getBalance(\n address token,\n address owner\n )\n internal\n view\n returns (uint _balance)\n {\n // Limit gas to prevent reentrancy.\n return ERC20(token).balanceOf.gas(EXTERNAL_QUERY_GAS_LIMIT)(owner);\n }\n\n /**\n * Helper function for querying this contract's allowance for transferring the given token.\n */\n function getAllowance(\n address token,\n address owner,\n address granter\n )\n internal\n view\n returns (uint _allowance)\n {\n // Limit gas to prevent reentrancy.\n return ERC20(token).allowance.gas(EXTERNAL_QUERY_GAS_LIMIT)(\n owner,\n granter\n );\n }\n\n /**\n * Helper function for approving this address' allowance to Dharma's token transfer proxy.\n */\n function setTokenTransferAllowance(\n address token,\n uint amount\n )\n internal\n returns (bool _success)\n {\n return ERC20(token).approve(\n address(contractRegistry.tokenTransferProxy()),\n amount\n );\n }\n\n\n /**\n * Helper function for transferring a specified amount of tokens between two parties.\n */\n function transferTokensFrom(\n address _token,\n address _from,\n address _to,\n uint _amount\n )\n internal\n returns (bool _success)\n {\n return ERC20(_token).transferFrom(_from, _to, _amount);\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/CreditorProxy.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/CreditorProxy.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/CreditorProxy.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/CreditorProxy.sol", "exportedSymbols": { "CreditorProxy": [ 1491 @@ -339,7 +339,7 @@ { "attributes": { "SourceUnit": 924, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/ContractRegistry.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/ContractRegistry.sol", "file": "./ContractRegistry.sol", "scope": 1492, "symbolAliases": [ @@ -8778,7 +8778,7 @@ } }, "links": {}, - "address": "0xd1c0be587dc75cb5d9c9c3856068717351c020d5" + "address": "0xd9b303da12a84a405c482c91592b5bd00a2317e2" }, "70": { "events": { @@ -8878,5 +8878,5 @@ } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:16:36.732Z" + "updatedAt": "2018-10-09T17:53:24.855Z" } \ No newline at end of file diff --git a/artifacts/json/DebtKernel.json b/artifacts/json/DebtKernel.json index 9ef6dbd4..9aa36338 100644 --- a/artifacts/json/DebtKernel.json +++ b/artifacts/json/DebtKernel.json @@ -406,15 +406,15 @@ "type": "event" } ], - "bytecode": "0x606060405260008060146101000a81548160ff021916908315150217905550341561002957600080fd5b60405160208061276a83398101604052808051906020019091905050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050612694806100d66000396000f3006060604052600436106100db576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806320385f2f146100e05780633f4ba83a1461017f5780635428368f146101945780635c975abb146101d35780638456cb59146102005780638591b2ad146102155780638da5cb5b1461025457806390e14899146102a95780639b345d75146102fe578063a8b3bb8714610337578063e283040d146103ec578063e6488fc91461041d578063f06bbf751461057b578063f2fde38b146105ac578063f8d89898146105e5575b600080fd5b34156100eb57600080fd5b61017d6004808060c001906006806020026040519081016040528092919082600660200280828437820191505050505091908061010001906008806020026040519081016040528092919082600860200280828437820191505050505091908060200190600180602002604051908101604052809291908260016020028082843782019150505050509190505061063a565b005b341561018a57600080fd5b610192610739565b005b341561019f57600080fd5b6101b96004808035600019169060200190919050506107f7565b604051808215151515815260200191505060405180910390f35b34156101de57600080fd5b6101e6610817565b604051808215151515815260200191505060405180910390f35b341561020b57600080fd5b61021361082a565b005b341561022057600080fd5b61023a6004808035600019169060200190919050506108ea565b604051808215151515815260200191505060405180910390f35b341561025f57600080fd5b61026761090a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102b457600080fd5b6102bc61092f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561030957600080fd5b610335600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610955565b005b341561034257600080fd5b6103ea600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919080359060200190919050506109f4565b005b34156103f757600080fd5b6103ff610b27565b60405180826000191660001916815260200191505060405180910390f35b341561042857600080fd5b61055d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908060c0019060068060200260405190810160405280929190826006602002808284378201915050505050919080610100019060088060200260405190810160405280929190826008602002808284378201915050505050919080602001906001806020026040519081016040528092919082600160200280828437820191505050505091908060600190600380602002604051908101604052809291908260036020028082843782019150505050509190806060019060038060200260405190810160405280929190826003602002808284378201915050505050919080606001906003806020026040519081016040528092919082600360200280828437820191505050505091905050610b2f565b60405180826000191660001916815260200191505060405180910390f35b341561058657600080fd5b61058e610e7e565b604051808261ffff1661ffff16815260200191505060405180910390f35b34156105b757600080fd5b6105e3600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610e84565b005b34156105f057600080fd5b6105f8610fd9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610642612497565b600060149054906101000a900460ff1615151561065e57600080fd5b610669848484610fff565b905080600001516020015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156106ad57600080fd5b6001600460008361012001516000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff16816101200151600019167f781502ecbc7096cfe7d502e0027f02eedf4ce6d62162cd3bd45d1a3dd98b8c2360405160405180910390a350505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561079457600080fd5b600060149054906101000a900460ff1615156107af57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b60046020528060005260406000206000915054906101000a900460ff1681565b600060149054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561088557600080fd5b600060149054906101000a900460ff161515156108a157600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b60036020528060005260406000206000915054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156109b057600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6109fc612520565b600060149054906101000a900460ff16151515610a1857600080fd5b8673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610a7d57508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515610a8857600080fd5b610a978888868987878b6111df565b90506001600360008360e001516000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff168160e00151600019167f77b488cc12f7f1c1527489c59889ce053dfc7115033f9b5d147fd7a8bdbc3a4760405160405180910390a35050505050505050565b600060010281565b6000610b39612497565b600060149054906101000a900460ff16151515610b5557600080fd5b610b60888888610fff565b9050610b6b816112a9565b1580610b815750610b7f818a878787611703565b155b80610b935750610b9189826119f9565b155b15610ba45760006001029150610e72565b610bb2898260000151611a9f565b50600073ffffffffffffffffffffffffffffffffffffffff1681600001516080015173ffffffffffffffffffffffffffffffffffffffff16141515610ce35780600001516080015173ffffffffffffffffffffffffffffffffffffffff1663977a5e64826000015160e001518360000151602001516000604051602001526040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1515610cbc57600080fd5b6102c65a03f11515610ccd57600080fd5b505050604051805190501515610ce257600080fd5b5b600081606001511115610d2e57610d2281608001518a836000015160200151610d1d8560c001518660600151611cb190919063ffffffff16565b611cca565b1515610d2d57600080fd5b5b600081602001511115610d6357610d5781608001518a8360000151604001518460200151611cca565b1515610d6257600080fd5b5b600081604001511115610d9457610d8881608001518a8360e001518460400151611cca565b1515610d9357600080fd5b5b8060e0015173ffffffffffffffffffffffffffffffffffffffff1681600001516040015173ffffffffffffffffffffffffffffffffffffffff16826000015160e00151600019167f4d61b488582cd44b5157ec41d5a9cfcc0595cc347661eda1d84cc40d7e943fb38460600151856080015186602001518760400151604051808581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182815260200194505050505060405180910390a4806000015160e0015191505b50979650505050505050565b611f4081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610edf57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610f1b57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611007612497565b61100f612497565b610140604051908101604052806110b087600060068110151561102e57fe5b602002015188600160068110151561104257fe5b602002015189600260068110151561105657fe5b60200201518a600360068110151561106a57fe5b60200201518a600060088110151561107e57fe5b60200201518b600160088110151561109257fe5b60200201518b60006001811015156110a657fe5b60200201516111df565b81526020018560036008811015156110c457fe5b602002015181526020018560046008811015156110dd57fe5b602002015181526020018560026008811015156110f657fe5b6020020151815260200186600460068110151561110f57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff16815260200185600560088110151561113e57fe5b6020020151815260200185600660088110151561115757fe5b6020020151815260200186600560068110151561117057fe5b602002015173ffffffffffffffffffffffffffffffffffffffff16815260200185600760088110151561119f57fe5b6020020151815260200160006001026000191681525090506111c081611e26565b8161012001906000191690816000191681525050809150509392505050565b6111e7612520565b6111ef612520565b610100604051908101604052808a73ffffffffffffffffffffffffffffffffffffffff1681526020018973ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018773ffffffffffffffffffffffffffffffffffffffff168152602001846000191681526020018581526020016112918b8b8b8b8b8b8b611f6f565b60001916815250905080915050979650505050505050565b6000806112c78360c001518460a001516120b890919063ffffffff16565b90506112e4836020015184604001516120b890919063ffffffff16565b8114151561133b57826101200151600019166004600881111561130357fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b8260c001518360600151101561139a57826101200151600019166005600881111561136257fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b600073ffffffffffffffffffffffffffffffffffffffff1683600001516040015173ffffffffffffffffffffffffffffffffffffffff161480156113e2575060008360200151115b8061142d5750600073ffffffffffffffffffffffffffffffffffffffff168360e0015173ffffffffffffffffffffffffffffffffffffffff1614801561142c575082602001518114155b5b1561148157826101200151600019166006600881111561144957fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b4283610100015110156114dd5782610120015160001916600160088111156114a557fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634f558e79846000015160e00151600190046000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561158257600080fd5b6102c65a03f1151561159357600080fd5b50505060405180519050156115f15782610120015160001916600060088111156115b957fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b60036000846000015160e001516000191660001916815260200190815260200160002060009054906101000a900460ff161561167657826101200151600019166002600881111561163e57fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b600460008461012001516000191660001916815260200190815260200160002060009054906101000a900460ff16156116f85782610120015160001916600360088111156116c057fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b600191505b50919050565b600085600001516020015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156117eb5761179586600001516020015187610120015186600060038110151561176357fe5b602002015186600060038110151561177757fe5b602002015186600060038110151561178b57fe5b60200201516120d6565b15156117ea5785610120015160001916600760088111156117b257fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600090506119f0565b5b8473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156118c15761186b8587610120015186600160038110151561183957fe5b602002015186600160038110151561184d57fe5b602002015186600160038110151561186157fe5b60200201516120d6565b15156118c057856101200151600019166007600881111561188857fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600090506119f0565b5b600073ffffffffffffffffffffffffffffffffffffffff1686600001516040015173ffffffffffffffffffffffffffffffffffffffff161415801561193a575085600001516040015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b156119eb57611995866000015160400151611954886121dd565b86600260038110151561196357fe5b602002015186600260038110151561197757fe5b602002015186600260038110151561198b57fe5b60200201516120d6565b15156119ea5785610120015160001916600760088111156119b257fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600090506119f0565b5b600190505b95945050505050565b600080611a178360a0015184606001516120b890919063ffffffff16565b905080611a288460800151866122bb565b1080611a40575080611a3e84608001518661237e565b105b15611a935782610120015160001916600880811115611a5b57fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009150611a98565b600191505b5092915050565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166399f1050184600001518686602001518760400151886060015189608001518a60a001518b60c001516000604051602001526040518963ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001836000191660001916815260200182815260200198505050505050505050602060405180830381600087803b1515611c7357600080fd5b6102c65a03f11515611c8457600080fd5b5050506040518051905090508260e001516001900481141515611ca357fe5b8260e0015191505092915050565b6000828211151515611cbf57fe5b818303905092915050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166315dacbea868686866000604051602001526040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050602060405180830381600087803b1515611e0157600080fd5b6102c65a03f11515611e1257600080fd5b505050604051805190509050949350505050565b600030826000015160e001518360200151846060015185608001518660c001518760a001518860e0015189604001518a6101000151604051808b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018a600019166000191681526020018981526020018881526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018381526020018281526020019a505050505050505050505060405180910390209050919050565b600087878786888688604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401836000191660001916815260200182815260200197505050505050505060405180910390209050979650505050505050565b60008082840190508381101515156120cc57fe5b8091505092915050565b600060018560405180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c0182600019166000191681526020019150506040518091039020858585604051600081526020016040526000604051602001526040518085600019166000191681526020018460ff1660ff16815260200183600019166000191681526020018260001916600019168152602001945050505050602060405160208103908084039060008661646e5a03f1151561219b57600080fd5b50506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b600030826000015160e00151836020015184606001518560800151866101000151604051808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140186600019166000191681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001965050505050505060405180910390209050919050565b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231611f4061ffff16846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600088803b151561235e57600080fd5b87f1151561236b57600080fd5b5050505060405180519050905092915050565b60008273ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e611f4061ffff1684600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600088803b151561247757600080fd5b87f1151561248457600080fd5b5050505060405180519050905092915050565b610220604051908101604052806124ac6125c4565b8152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600080191681525090565b61010060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000801916815260200160008152602001600080191681525090565b61010060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008019168152602001600081526020016000801916815250905600a165627a7a7230582019411195caef9256a956aee6f4d54e6877e2c4808c9a00d29b58e4c57701b5120029", - "deployedBytecode": "0x6060604052600436106100db576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806320385f2f146100e05780633f4ba83a1461017f5780635428368f146101945780635c975abb146101d35780638456cb59146102005780638591b2ad146102155780638da5cb5b1461025457806390e14899146102a95780639b345d75146102fe578063a8b3bb8714610337578063e283040d146103ec578063e6488fc91461041d578063f06bbf751461057b578063f2fde38b146105ac578063f8d89898146105e5575b600080fd5b34156100eb57600080fd5b61017d6004808060c001906006806020026040519081016040528092919082600660200280828437820191505050505091908061010001906008806020026040519081016040528092919082600860200280828437820191505050505091908060200190600180602002604051908101604052809291908260016020028082843782019150505050509190505061063a565b005b341561018a57600080fd5b610192610739565b005b341561019f57600080fd5b6101b96004808035600019169060200190919050506107f7565b604051808215151515815260200191505060405180910390f35b34156101de57600080fd5b6101e6610817565b604051808215151515815260200191505060405180910390f35b341561020b57600080fd5b61021361082a565b005b341561022057600080fd5b61023a6004808035600019169060200190919050506108ea565b604051808215151515815260200191505060405180910390f35b341561025f57600080fd5b61026761090a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102b457600080fd5b6102bc61092f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561030957600080fd5b610335600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610955565b005b341561034257600080fd5b6103ea600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919080359060200190919050506109f4565b005b34156103f757600080fd5b6103ff610b27565b60405180826000191660001916815260200191505060405180910390f35b341561042857600080fd5b61055d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908060c0019060068060200260405190810160405280929190826006602002808284378201915050505050919080610100019060088060200260405190810160405280929190826008602002808284378201915050505050919080602001906001806020026040519081016040528092919082600160200280828437820191505050505091908060600190600380602002604051908101604052809291908260036020028082843782019150505050509190806060019060038060200260405190810160405280929190826003602002808284378201915050505050919080606001906003806020026040519081016040528092919082600360200280828437820191505050505091905050610b2f565b60405180826000191660001916815260200191505060405180910390f35b341561058657600080fd5b61058e610e7e565b604051808261ffff1661ffff16815260200191505060405180910390f35b34156105b757600080fd5b6105e3600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610e84565b005b34156105f057600080fd5b6105f8610fd9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610642612497565b600060149054906101000a900460ff1615151561065e57600080fd5b610669848484610fff565b905080600001516020015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156106ad57600080fd5b6001600460008361012001516000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff16816101200151600019167f781502ecbc7096cfe7d502e0027f02eedf4ce6d62162cd3bd45d1a3dd98b8c2360405160405180910390a350505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561079457600080fd5b600060149054906101000a900460ff1615156107af57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b60046020528060005260406000206000915054906101000a900460ff1681565b600060149054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561088557600080fd5b600060149054906101000a900460ff161515156108a157600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b60036020528060005260406000206000915054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156109b057600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6109fc612520565b600060149054906101000a900460ff16151515610a1857600080fd5b8673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610a7d57508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515610a8857600080fd5b610a978888868987878b6111df565b90506001600360008360e001516000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff168160e00151600019167f77b488cc12f7f1c1527489c59889ce053dfc7115033f9b5d147fd7a8bdbc3a4760405160405180910390a35050505050505050565b600060010281565b6000610b39612497565b600060149054906101000a900460ff16151515610b5557600080fd5b610b60888888610fff565b9050610b6b816112a9565b1580610b815750610b7f818a878787611703565b155b80610b935750610b9189826119f9565b155b15610ba45760006001029150610e72565b610bb2898260000151611a9f565b50600073ffffffffffffffffffffffffffffffffffffffff1681600001516080015173ffffffffffffffffffffffffffffffffffffffff16141515610ce35780600001516080015173ffffffffffffffffffffffffffffffffffffffff1663977a5e64826000015160e001518360000151602001516000604051602001526040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1515610cbc57600080fd5b6102c65a03f11515610ccd57600080fd5b505050604051805190501515610ce257600080fd5b5b600081606001511115610d2e57610d2281608001518a836000015160200151610d1d8560c001518660600151611cb190919063ffffffff16565b611cca565b1515610d2d57600080fd5b5b600081602001511115610d6357610d5781608001518a8360000151604001518460200151611cca565b1515610d6257600080fd5b5b600081604001511115610d9457610d8881608001518a8360e001518460400151611cca565b1515610d9357600080fd5b5b8060e0015173ffffffffffffffffffffffffffffffffffffffff1681600001516040015173ffffffffffffffffffffffffffffffffffffffff16826000015160e00151600019167f4d61b488582cd44b5157ec41d5a9cfcc0595cc347661eda1d84cc40d7e943fb38460600151856080015186602001518760400151604051808581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182815260200194505050505060405180910390a4806000015160e0015191505b50979650505050505050565b611f4081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610edf57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610f1b57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611007612497565b61100f612497565b610140604051908101604052806110b087600060068110151561102e57fe5b602002015188600160068110151561104257fe5b602002015189600260068110151561105657fe5b60200201518a600360068110151561106a57fe5b60200201518a600060088110151561107e57fe5b60200201518b600160088110151561109257fe5b60200201518b60006001811015156110a657fe5b60200201516111df565b81526020018560036008811015156110c457fe5b602002015181526020018560046008811015156110dd57fe5b602002015181526020018560026008811015156110f657fe5b6020020151815260200186600460068110151561110f57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff16815260200185600560088110151561113e57fe5b6020020151815260200185600660088110151561115757fe5b6020020151815260200186600560068110151561117057fe5b602002015173ffffffffffffffffffffffffffffffffffffffff16815260200185600760088110151561119f57fe5b6020020151815260200160006001026000191681525090506111c081611e26565b8161012001906000191690816000191681525050809150509392505050565b6111e7612520565b6111ef612520565b610100604051908101604052808a73ffffffffffffffffffffffffffffffffffffffff1681526020018973ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018773ffffffffffffffffffffffffffffffffffffffff168152602001846000191681526020018581526020016112918b8b8b8b8b8b8b611f6f565b60001916815250905080915050979650505050505050565b6000806112c78360c001518460a001516120b890919063ffffffff16565b90506112e4836020015184604001516120b890919063ffffffff16565b8114151561133b57826101200151600019166004600881111561130357fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b8260c001518360600151101561139a57826101200151600019166005600881111561136257fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b600073ffffffffffffffffffffffffffffffffffffffff1683600001516040015173ffffffffffffffffffffffffffffffffffffffff161480156113e2575060008360200151115b8061142d5750600073ffffffffffffffffffffffffffffffffffffffff168360e0015173ffffffffffffffffffffffffffffffffffffffff1614801561142c575082602001518114155b5b1561148157826101200151600019166006600881111561144957fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b4283610100015110156114dd5782610120015160001916600160088111156114a557fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634f558e79846000015160e00151600190046000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561158257600080fd5b6102c65a03f1151561159357600080fd5b50505060405180519050156115f15782610120015160001916600060088111156115b957fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b60036000846000015160e001516000191660001916815260200190815260200160002060009054906101000a900460ff161561167657826101200151600019166002600881111561163e57fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b600460008461012001516000191660001916815260200190815260200160002060009054906101000a900460ff16156116f85782610120015160001916600360088111156116c057fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b600191505b50919050565b600085600001516020015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156117eb5761179586600001516020015187610120015186600060038110151561176357fe5b602002015186600060038110151561177757fe5b602002015186600060038110151561178b57fe5b60200201516120d6565b15156117ea5785610120015160001916600760088111156117b257fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600090506119f0565b5b8473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156118c15761186b8587610120015186600160038110151561183957fe5b602002015186600160038110151561184d57fe5b602002015186600160038110151561186157fe5b60200201516120d6565b15156118c057856101200151600019166007600881111561188857fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600090506119f0565b5b600073ffffffffffffffffffffffffffffffffffffffff1686600001516040015173ffffffffffffffffffffffffffffffffffffffff161415801561193a575085600001516040015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b156119eb57611995866000015160400151611954886121dd565b86600260038110151561196357fe5b602002015186600260038110151561197757fe5b602002015186600260038110151561198b57fe5b60200201516120d6565b15156119ea5785610120015160001916600760088111156119b257fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600090506119f0565b5b600190505b95945050505050565b600080611a178360a0015184606001516120b890919063ffffffff16565b905080611a288460800151866122bb565b1080611a40575080611a3e84608001518661237e565b105b15611a935782610120015160001916600880811115611a5b57fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009150611a98565b600191505b5092915050565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166399f1050184600001518686602001518760400151886060015189608001518a60a001518b60c001516000604051602001526040518963ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001836000191660001916815260200182815260200198505050505050505050602060405180830381600087803b1515611c7357600080fd5b6102c65a03f11515611c8457600080fd5b5050506040518051905090508260e001516001900481141515611ca357fe5b8260e0015191505092915050565b6000828211151515611cbf57fe5b818303905092915050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166315dacbea868686866000604051602001526040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050602060405180830381600087803b1515611e0157600080fd5b6102c65a03f11515611e1257600080fd5b505050604051805190509050949350505050565b600030826000015160e001518360200151846060015185608001518660c001518760a001518860e0015189604001518a6101000151604051808b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018a600019166000191681526020018981526020018881526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018381526020018281526020019a505050505050505050505060405180910390209050919050565b600087878786888688604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401836000191660001916815260200182815260200197505050505050505060405180910390209050979650505050505050565b60008082840190508381101515156120cc57fe5b8091505092915050565b600060018560405180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c0182600019166000191681526020019150506040518091039020858585604051600081526020016040526000604051602001526040518085600019166000191681526020018460ff1660ff16815260200183600019166000191681526020018260001916600019168152602001945050505050602060405160208103908084039060008661646e5a03f1151561219b57600080fd5b50506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b600030826000015160e00151836020015184606001518560800151866101000151604051808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140186600019166000191681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001965050505050505060405180910390209050919050565b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231611f4061ffff16846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600088803b151561235e57600080fd5b87f1151561236b57600080fd5b5050505060405180519050905092915050565b60008273ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e611f4061ffff1684600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600088803b151561247757600080fd5b87f1151561248457600080fd5b5050505060405180519050905092915050565b610220604051908101604052806124ac6125c4565b8152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600080191681525090565b61010060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000801916815260200160008152602001600080191681525090565b61010060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008019168152602001600081526020016000801916815250905600a165627a7a7230582019411195caef9256a956aee6f4d54e6877e2c4808c9a00d29b58e4c57701b5120029", + "bytecode": "0x606060405260008060146101000a81548160ff021916908315150217905550341561002957600080fd5b60405160208061276a83398101604052808051906020019091905050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050612694806100d66000396000f3006060604052600436106100db576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806320385f2f146100e05780633f4ba83a1461017f5780635428368f146101945780635c975abb146101d35780638456cb59146102005780638591b2ad146102155780638da5cb5b1461025457806390e14899146102a95780639b345d75146102fe578063a8b3bb8714610337578063e283040d146103ec578063e6488fc91461041d578063f06bbf751461057b578063f2fde38b146105ac578063f8d89898146105e5575b600080fd5b34156100eb57600080fd5b61017d6004808060c001906006806020026040519081016040528092919082600660200280828437820191505050505091908061010001906008806020026040519081016040528092919082600860200280828437820191505050505091908060200190600180602002604051908101604052809291908260016020028082843782019150505050509190505061063a565b005b341561018a57600080fd5b610192610739565b005b341561019f57600080fd5b6101b96004808035600019169060200190919050506107f7565b604051808215151515815260200191505060405180910390f35b34156101de57600080fd5b6101e6610817565b604051808215151515815260200191505060405180910390f35b341561020b57600080fd5b61021361082a565b005b341561022057600080fd5b61023a6004808035600019169060200190919050506108ea565b604051808215151515815260200191505060405180910390f35b341561025f57600080fd5b61026761090a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102b457600080fd5b6102bc61092f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561030957600080fd5b610335600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610955565b005b341561034257600080fd5b6103ea600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919080359060200190919050506109f4565b005b34156103f757600080fd5b6103ff610b27565b60405180826000191660001916815260200191505060405180910390f35b341561042857600080fd5b61055d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908060c0019060068060200260405190810160405280929190826006602002808284378201915050505050919080610100019060088060200260405190810160405280929190826008602002808284378201915050505050919080602001906001806020026040519081016040528092919082600160200280828437820191505050505091908060600190600380602002604051908101604052809291908260036020028082843782019150505050509190806060019060038060200260405190810160405280929190826003602002808284378201915050505050919080606001906003806020026040519081016040528092919082600360200280828437820191505050505091905050610b2f565b60405180826000191660001916815260200191505060405180910390f35b341561058657600080fd5b61058e610e7e565b604051808261ffff1661ffff16815260200191505060405180910390f35b34156105b757600080fd5b6105e3600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610e84565b005b34156105f057600080fd5b6105f8610fd9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610642612497565b600060149054906101000a900460ff1615151561065e57600080fd5b610669848484610fff565b905080600001516020015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156106ad57600080fd5b6001600460008361012001516000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff16816101200151600019167f781502ecbc7096cfe7d502e0027f02eedf4ce6d62162cd3bd45d1a3dd98b8c2360405160405180910390a350505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561079457600080fd5b600060149054906101000a900460ff1615156107af57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b60046020528060005260406000206000915054906101000a900460ff1681565b600060149054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561088557600080fd5b600060149054906101000a900460ff161515156108a157600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b60036020528060005260406000206000915054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156109b057600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6109fc612520565b600060149054906101000a900460ff16151515610a1857600080fd5b8673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610a7d57508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515610a8857600080fd5b610a978888868987878b6111df565b90506001600360008360e001516000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff168160e00151600019167f77b488cc12f7f1c1527489c59889ce053dfc7115033f9b5d147fd7a8bdbc3a4760405160405180910390a35050505050505050565b600060010281565b6000610b39612497565b600060149054906101000a900460ff16151515610b5557600080fd5b610b60888888610fff565b9050610b6b816112a9565b1580610b815750610b7f818a878787611703565b155b80610b935750610b9189826119f9565b155b15610ba45760006001029150610e72565b610bb2898260000151611a9f565b50600073ffffffffffffffffffffffffffffffffffffffff1681600001516080015173ffffffffffffffffffffffffffffffffffffffff16141515610ce35780600001516080015173ffffffffffffffffffffffffffffffffffffffff1663977a5e64826000015160e001518360000151602001516000604051602001526040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1515610cbc57600080fd5b6102c65a03f11515610ccd57600080fd5b505050604051805190501515610ce257600080fd5b5b600081606001511115610d2e57610d2281608001518a836000015160200151610d1d8560c001518660600151611cb190919063ffffffff16565b611cca565b1515610d2d57600080fd5b5b600081602001511115610d6357610d5781608001518a8360000151604001518460200151611cca565b1515610d6257600080fd5b5b600081604001511115610d9457610d8881608001518a8360e001518460400151611cca565b1515610d9357600080fd5b5b8060e0015173ffffffffffffffffffffffffffffffffffffffff1681600001516040015173ffffffffffffffffffffffffffffffffffffffff16826000015160e00151600019167f4d61b488582cd44b5157ec41d5a9cfcc0595cc347661eda1d84cc40d7e943fb38460600151856080015186602001518760400151604051808581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182815260200194505050505060405180910390a4806000015160e0015191505b50979650505050505050565b611f4081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610edf57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610f1b57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611007612497565b61100f612497565b610140604051908101604052806110b087600060068110151561102e57fe5b602002015188600160068110151561104257fe5b602002015189600260068110151561105657fe5b60200201518a600360068110151561106a57fe5b60200201518a600060088110151561107e57fe5b60200201518b600160088110151561109257fe5b60200201518b60006001811015156110a657fe5b60200201516111df565b81526020018560036008811015156110c457fe5b602002015181526020018560046008811015156110dd57fe5b602002015181526020018560026008811015156110f657fe5b6020020151815260200186600460068110151561110f57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff16815260200185600560088110151561113e57fe5b6020020151815260200185600660088110151561115757fe5b6020020151815260200186600560068110151561117057fe5b602002015173ffffffffffffffffffffffffffffffffffffffff16815260200185600760088110151561119f57fe5b6020020151815260200160006001026000191681525090506111c081611e26565b8161012001906000191690816000191681525050809150509392505050565b6111e7612520565b6111ef612520565b610100604051908101604052808a73ffffffffffffffffffffffffffffffffffffffff1681526020018973ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018773ffffffffffffffffffffffffffffffffffffffff168152602001846000191681526020018581526020016112918b8b8b8b8b8b8b611f6f565b60001916815250905080915050979650505050505050565b6000806112c78360c001518460a001516120b890919063ffffffff16565b90506112e4836020015184604001516120b890919063ffffffff16565b8114151561133b57826101200151600019166004600881111561130357fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b8260c001518360600151101561139a57826101200151600019166005600881111561136257fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b600073ffffffffffffffffffffffffffffffffffffffff1683600001516040015173ffffffffffffffffffffffffffffffffffffffff161480156113e2575060008360200151115b8061142d5750600073ffffffffffffffffffffffffffffffffffffffff168360e0015173ffffffffffffffffffffffffffffffffffffffff1614801561142c575082602001518114155b5b1561148157826101200151600019166006600881111561144957fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b4283610100015110156114dd5782610120015160001916600160088111156114a557fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634f558e79846000015160e00151600190046000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561158257600080fd5b6102c65a03f1151561159357600080fd5b50505060405180519050156115f15782610120015160001916600060088111156115b957fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b60036000846000015160e001516000191660001916815260200190815260200160002060009054906101000a900460ff161561167657826101200151600019166002600881111561163e57fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b600460008461012001516000191660001916815260200190815260200160002060009054906101000a900460ff16156116f85782610120015160001916600360088111156116c057fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b600191505b50919050565b600085600001516020015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156117eb5761179586600001516020015187610120015186600060038110151561176357fe5b602002015186600060038110151561177757fe5b602002015186600060038110151561178b57fe5b60200201516120d6565b15156117ea5785610120015160001916600760088111156117b257fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600090506119f0565b5b8473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156118c15761186b8587610120015186600160038110151561183957fe5b602002015186600160038110151561184d57fe5b602002015186600160038110151561186157fe5b60200201516120d6565b15156118c057856101200151600019166007600881111561188857fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600090506119f0565b5b600073ffffffffffffffffffffffffffffffffffffffff1686600001516040015173ffffffffffffffffffffffffffffffffffffffff161415801561193a575085600001516040015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b156119eb57611995866000015160400151611954886121dd565b86600260038110151561196357fe5b602002015186600260038110151561197757fe5b602002015186600260038110151561198b57fe5b60200201516120d6565b15156119ea5785610120015160001916600760088111156119b257fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600090506119f0565b5b600190505b95945050505050565b600080611a178360a0015184606001516120b890919063ffffffff16565b905080611a288460800151866122bb565b1080611a40575080611a3e84608001518661237e565b105b15611a935782610120015160001916600880811115611a5b57fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009150611a98565b600191505b5092915050565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166399f1050184600001518686602001518760400151886060015189608001518a60a001518b60c001516000604051602001526040518963ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001836000191660001916815260200182815260200198505050505050505050602060405180830381600087803b1515611c7357600080fd5b6102c65a03f11515611c8457600080fd5b5050506040518051905090508260e001516001900481141515611ca357fe5b8260e0015191505092915050565b6000828211151515611cbf57fe5b818303905092915050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166315dacbea868686866000604051602001526040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050602060405180830381600087803b1515611e0157600080fd5b6102c65a03f11515611e1257600080fd5b505050604051805190509050949350505050565b600030826000015160e001518360200151846060015185608001518660c001518760a001518860e0015189604001518a6101000151604051808b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018a600019166000191681526020018981526020018881526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018381526020018281526020019a505050505050505050505060405180910390209050919050565b600087878786888688604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401836000191660001916815260200182815260200197505050505050505060405180910390209050979650505050505050565b60008082840190508381101515156120cc57fe5b8091505092915050565b600060018560405180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c0182600019166000191681526020019150506040518091039020858585604051600081526020016040526000604051602001526040518085600019166000191681526020018460ff1660ff16815260200183600019166000191681526020018260001916600019168152602001945050505050602060405160208103908084039060008661646e5a03f1151561219b57600080fd5b50506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b600030826000015160e00151836020015184606001518560800151866101000151604051808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140186600019166000191681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001965050505050505060405180910390209050919050565b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231611f4061ffff16846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600088803b151561235e57600080fd5b87f1151561236b57600080fd5b5050505060405180519050905092915050565b60008273ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e611f4061ffff1684600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600088803b151561247757600080fd5b87f1151561248457600080fd5b5050505060405180519050905092915050565b610220604051908101604052806124ac6125c4565b8152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600080191681525090565b61010060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000801916815260200160008152602001600080191681525090565b61010060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008019168152602001600081526020016000801916815250905600a165627a7a723058207dc7286e90d9ea455bd504e38e706d1e72bd10278d055e25e2cb023c570eb76d0029", + "deployedBytecode": "0x6060604052600436106100db576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806320385f2f146100e05780633f4ba83a1461017f5780635428368f146101945780635c975abb146101d35780638456cb59146102005780638591b2ad146102155780638da5cb5b1461025457806390e14899146102a95780639b345d75146102fe578063a8b3bb8714610337578063e283040d146103ec578063e6488fc91461041d578063f06bbf751461057b578063f2fde38b146105ac578063f8d89898146105e5575b600080fd5b34156100eb57600080fd5b61017d6004808060c001906006806020026040519081016040528092919082600660200280828437820191505050505091908061010001906008806020026040519081016040528092919082600860200280828437820191505050505091908060200190600180602002604051908101604052809291908260016020028082843782019150505050509190505061063a565b005b341561018a57600080fd5b610192610739565b005b341561019f57600080fd5b6101b96004808035600019169060200190919050506107f7565b604051808215151515815260200191505060405180910390f35b34156101de57600080fd5b6101e6610817565b604051808215151515815260200191505060405180910390f35b341561020b57600080fd5b61021361082a565b005b341561022057600080fd5b61023a6004808035600019169060200190919050506108ea565b604051808215151515815260200191505060405180910390f35b341561025f57600080fd5b61026761090a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102b457600080fd5b6102bc61092f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561030957600080fd5b610335600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610955565b005b341561034257600080fd5b6103ea600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919080359060200190919050506109f4565b005b34156103f757600080fd5b6103ff610b27565b60405180826000191660001916815260200191505060405180910390f35b341561042857600080fd5b61055d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908060c0019060068060200260405190810160405280929190826006602002808284378201915050505050919080610100019060088060200260405190810160405280929190826008602002808284378201915050505050919080602001906001806020026040519081016040528092919082600160200280828437820191505050505091908060600190600380602002604051908101604052809291908260036020028082843782019150505050509190806060019060038060200260405190810160405280929190826003602002808284378201915050505050919080606001906003806020026040519081016040528092919082600360200280828437820191505050505091905050610b2f565b60405180826000191660001916815260200191505060405180910390f35b341561058657600080fd5b61058e610e7e565b604051808261ffff1661ffff16815260200191505060405180910390f35b34156105b757600080fd5b6105e3600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610e84565b005b34156105f057600080fd5b6105f8610fd9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610642612497565b600060149054906101000a900460ff1615151561065e57600080fd5b610669848484610fff565b905080600001516020015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156106ad57600080fd5b6001600460008361012001516000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff16816101200151600019167f781502ecbc7096cfe7d502e0027f02eedf4ce6d62162cd3bd45d1a3dd98b8c2360405160405180910390a350505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561079457600080fd5b600060149054906101000a900460ff1615156107af57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b60046020528060005260406000206000915054906101000a900460ff1681565b600060149054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561088557600080fd5b600060149054906101000a900460ff161515156108a157600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b60036020528060005260406000206000915054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156109b057600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6109fc612520565b600060149054906101000a900460ff16151515610a1857600080fd5b8673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610a7d57508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515610a8857600080fd5b610a978888868987878b6111df565b90506001600360008360e001516000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff168160e00151600019167f77b488cc12f7f1c1527489c59889ce053dfc7115033f9b5d147fd7a8bdbc3a4760405160405180910390a35050505050505050565b600060010281565b6000610b39612497565b600060149054906101000a900460ff16151515610b5557600080fd5b610b60888888610fff565b9050610b6b816112a9565b1580610b815750610b7f818a878787611703565b155b80610b935750610b9189826119f9565b155b15610ba45760006001029150610e72565b610bb2898260000151611a9f565b50600073ffffffffffffffffffffffffffffffffffffffff1681600001516080015173ffffffffffffffffffffffffffffffffffffffff16141515610ce35780600001516080015173ffffffffffffffffffffffffffffffffffffffff1663977a5e64826000015160e001518360000151602001516000604051602001526040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1515610cbc57600080fd5b6102c65a03f11515610ccd57600080fd5b505050604051805190501515610ce257600080fd5b5b600081606001511115610d2e57610d2281608001518a836000015160200151610d1d8560c001518660600151611cb190919063ffffffff16565b611cca565b1515610d2d57600080fd5b5b600081602001511115610d6357610d5781608001518a8360000151604001518460200151611cca565b1515610d6257600080fd5b5b600081604001511115610d9457610d8881608001518a8360e001518460400151611cca565b1515610d9357600080fd5b5b8060e0015173ffffffffffffffffffffffffffffffffffffffff1681600001516040015173ffffffffffffffffffffffffffffffffffffffff16826000015160e00151600019167f4d61b488582cd44b5157ec41d5a9cfcc0595cc347661eda1d84cc40d7e943fb38460600151856080015186602001518760400151604051808581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182815260200194505050505060405180910390a4806000015160e0015191505b50979650505050505050565b611f4081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610edf57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610f1b57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611007612497565b61100f612497565b610140604051908101604052806110b087600060068110151561102e57fe5b602002015188600160068110151561104257fe5b602002015189600260068110151561105657fe5b60200201518a600360068110151561106a57fe5b60200201518a600060088110151561107e57fe5b60200201518b600160088110151561109257fe5b60200201518b60006001811015156110a657fe5b60200201516111df565b81526020018560036008811015156110c457fe5b602002015181526020018560046008811015156110dd57fe5b602002015181526020018560026008811015156110f657fe5b6020020151815260200186600460068110151561110f57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff16815260200185600560088110151561113e57fe5b6020020151815260200185600660088110151561115757fe5b6020020151815260200186600560068110151561117057fe5b602002015173ffffffffffffffffffffffffffffffffffffffff16815260200185600760088110151561119f57fe5b6020020151815260200160006001026000191681525090506111c081611e26565b8161012001906000191690816000191681525050809150509392505050565b6111e7612520565b6111ef612520565b610100604051908101604052808a73ffffffffffffffffffffffffffffffffffffffff1681526020018973ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018773ffffffffffffffffffffffffffffffffffffffff168152602001846000191681526020018581526020016112918b8b8b8b8b8b8b611f6f565b60001916815250905080915050979650505050505050565b6000806112c78360c001518460a001516120b890919063ffffffff16565b90506112e4836020015184604001516120b890919063ffffffff16565b8114151561133b57826101200151600019166004600881111561130357fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b8260c001518360600151101561139a57826101200151600019166005600881111561136257fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b600073ffffffffffffffffffffffffffffffffffffffff1683600001516040015173ffffffffffffffffffffffffffffffffffffffff161480156113e2575060008360200151115b8061142d5750600073ffffffffffffffffffffffffffffffffffffffff168360e0015173ffffffffffffffffffffffffffffffffffffffff1614801561142c575082602001518114155b5b1561148157826101200151600019166006600881111561144957fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b4283610100015110156114dd5782610120015160001916600160088111156114a557fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634f558e79846000015160e00151600190046000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561158257600080fd5b6102c65a03f1151561159357600080fd5b50505060405180519050156115f15782610120015160001916600060088111156115b957fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b60036000846000015160e001516000191660001916815260200190815260200160002060009054906101000a900460ff161561167657826101200151600019166002600881111561163e57fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b600460008461012001516000191660001916815260200190815260200160002060009054906101000a900460ff16156116f85782610120015160001916600360088111156116c057fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b600191505b50919050565b600085600001516020015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156117eb5761179586600001516020015187610120015186600060038110151561176357fe5b602002015186600060038110151561177757fe5b602002015186600060038110151561178b57fe5b60200201516120d6565b15156117ea5785610120015160001916600760088111156117b257fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600090506119f0565b5b8473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156118c15761186b8587610120015186600160038110151561183957fe5b602002015186600160038110151561184d57fe5b602002015186600160038110151561186157fe5b60200201516120d6565b15156118c057856101200151600019166007600881111561188857fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600090506119f0565b5b600073ffffffffffffffffffffffffffffffffffffffff1686600001516040015173ffffffffffffffffffffffffffffffffffffffff161415801561193a575085600001516040015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b156119eb57611995866000015160400151611954886121dd565b86600260038110151561196357fe5b602002015186600260038110151561197757fe5b602002015186600260038110151561198b57fe5b60200201516120d6565b15156119ea5785610120015160001916600760088111156119b257fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600090506119f0565b5b600190505b95945050505050565b600080611a178360a0015184606001516120b890919063ffffffff16565b905080611a288460800151866122bb565b1080611a40575080611a3e84608001518661237e565b105b15611a935782610120015160001916600880811115611a5b57fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009150611a98565b600191505b5092915050565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166399f1050184600001518686602001518760400151886060015189608001518a60a001518b60c001516000604051602001526040518963ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001836000191660001916815260200182815260200198505050505050505050602060405180830381600087803b1515611c7357600080fd5b6102c65a03f11515611c8457600080fd5b5050506040518051905090508260e001516001900481141515611ca357fe5b8260e0015191505092915050565b6000828211151515611cbf57fe5b818303905092915050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166315dacbea868686866000604051602001526040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050602060405180830381600087803b1515611e0157600080fd5b6102c65a03f11515611e1257600080fd5b505050604051805190509050949350505050565b600030826000015160e001518360200151846060015185608001518660c001518760a001518860e0015189604001518a6101000151604051808b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018a600019166000191681526020018981526020018881526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018381526020018281526020019a505050505050505050505060405180910390209050919050565b600087878786888688604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401836000191660001916815260200182815260200197505050505050505060405180910390209050979650505050505050565b60008082840190508381101515156120cc57fe5b8091505092915050565b600060018560405180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c0182600019166000191681526020019150506040518091039020858585604051600081526020016040526000604051602001526040518085600019166000191681526020018460ff1660ff16815260200183600019166000191681526020018260001916600019168152602001945050505050602060405160208103908084039060008661646e5a03f1151561219b57600080fd5b50506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b600030826000015160e00151836020015184606001518560800151866101000151604051808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140186600019166000191681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001965050505050505060405180910390209050919050565b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231611f4061ffff16846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600088803b151561235e57600080fd5b87f1151561236b57600080fd5b5050505060405180519050905092915050565b60008273ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e611f4061ffff1684600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600088803b151561247757600080fd5b87f1151561248457600080fd5b5050505060405180519050905092915050565b610220604051908101604052806124ac6125c4565b8152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600080191681525090565b61010060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000801916815260200160008152602001600080191681525090565b61010060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008019168152602001600081526020016000801916815250905600a165627a7a723058207dc7286e90d9ea455bd504e38e706d1e72bd10278d055e25e2cb023c570eb76d0029", "sourceMap": "1252:20103:3:-;;;268:5:37;247:26;;;;;;;;;;;;;;;;;;;;4174:139:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;509:10:39;501:5;;:18;;;;;;;;;;;;;;;;;;4281:25:3;4258:20;;:48;;;;;;;;;;;;;;;;;;4174:139;1252:20103;;;;;;", "deployedSourceMap": "1252:20103:3:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8782:459;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;833:87:37;;;;;;;;;;;;;;2946:51:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;247:26:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;666:85;;;;;;;;;;;;;;2890:50:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;238:20:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2428:35:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4600:141;;;;;;;;;;;;;;;;;;;;;;;;;;;;7906:715;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2469:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4826:2907;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2829:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;832:169:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;2343:26:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8782:459;8961:26;;:::i;:::-;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;8990:55:3;9003:14;9019:11;9032:12;8990;:55::i;:::-;8961:84;;9078:9;:18;;;:25;;;9064:39;;:10;:39;;;9056:48;;;;;;;;9161:4;9115:18;:43;9134:9;:23;;;9115:43;;;;;;;;;;;;;;;;;;:50;;;;;;;;;;;;;;;;;;9223:10;9176:58;;9198:9;:23;;;9176:58;;;;;;;;;;;;;8782:459;;;;:::o;833:87:37:-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;568:6:37;;;;;;;;;;;560:15;;;;;;;;895:5;886:6;;:14;;;;;;;;;;;;;;;;;;906:9;;;;;;;;;;833:87::o;2946:51:3:-;;;;;;;;;;;;;;;;;;;;;;:::o;247:26:37:-;;;;;;;;;;;;;:::o;666:85::-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;729:4;720:6;;:13;;;;;;;;;;;;;;;;;;739:7;;;;;;;;;;666:85::o;2890:50:3:-;;;;;;;;;;;;;;;;;;;;;;:::o;238:20:39:-;;;;;;;;;;;;;:::o;2428:35:3:-;;;;;;;;;;;;;:::o;4600:141::-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;4717:16:3;4695:9;;:39;;;;;;;;;;;;;;;;;;4600:141;:::o;7906:715::-;8261:24;;:::i;:::-;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;8214:6:3;8200:20;;:10;:20;;;:49;;;;8238:11;8224:25;;:10;:25;;;8200:49;8192:58;;;;;;;;8288:204;8313:7;8334:6;8354:11;8379:13;8406:21;8441:4;8459:23;8288:11;:204::i;:::-;8261:231;;8545:4;8503:17;:39;8521:8;:20;;;8503:39;;;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;8603:10;8560:54;;8581:8;:20;;;8560:54;;;;;;;;;;;;;7906:715;;;;;;;;:::o;2469:55::-;2522:1;2514:10;;2469:55;:::o;4826:2907::-;5126:20;5162:26;;:::i;:::-;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;5191:55:3;5204:14;5220:11;5233:12;5191;:55::i;:::-;5162:84;;5313:44;5347:9;5313:33;:44::i;:::-;5312:45;:241;;;;5374:179;5430:9;5457:8;5483:11;5512;5541;5374:38;:179::i;:::-;5373:180;5312:241;:322;;;;5570:64;5614:8;5624:9;5570:43;:64::i;:::-;5569:65;5312:322;5308:378;;;2522:1;2514:10;;5650:25;;;;5308:378;5751:48;5770:8;5780:9;:18;;;5751;:48::i;:::-;;6150:1;6106:46;;:9;:18;;;:32;;;:46;;;;6102:331;;;6207:9;:18;;;:32;;;6193:86;;;6305:9;:18;;;:30;;;6361:9;:18;;;:25;;;6193:215;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6168:254;;;;;;;;6102:331;6515:1;6487:9;:25;;;:29;6483:280;;;6540:211;6576:9;:24;;;6618:8;6644:9;:18;;;:25;;;6687:50;6717:9;:19;;;6687:9;:25;;;:29;;:50;;;;:::i;:::-;6540:18;:211::i;:::-;6532:220;;;;;;;;6483:280;6855:1;6828:9;:24;;;:28;6824:258;;;6880:190;6916:9;:24;;;6958:8;6984:9;:18;;;:30;;;7032:9;:24;;;6880:18;:190::i;:::-;6872:199;;;;;;;;6824:258;7162:1;7139:9;:20;;;:24;7135:237;;;7187:173;7223:9;:24;;;7265:8;7291:9;:17;;;7326:9;:20;;;7187:18;:173::i;:::-;7179:182;;;;;;;;7135:237;7617:9;:17;;;7382:296;;7535:9;:18;;;:30;;;7382:296;;7414:9;:18;;;:30;;;7382:296;;;;7458:9;:25;;;7497:9;:24;;;7579:9;:24;;;7648:9;:20;;;7382:296;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7696:9;:18;;;:30;;;7689:37;;429:1:37;4826:2907:3;;;;;;;;;;:::o;2829:54::-;2879:4;2829:54;:::o;832:169:39:-;653:5;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;928:1;908:22;;:8;:22;;;;900:31;;;;;;;;965:8;937:37;;958:5;;;;;;;;;;;937:37;;;;;;;;;;;;988:8;980:5;;:16;;;;;;;;;;;;;;;;;;832:169;:::o;2343:26:3:-;;;;;;;;;;;;;:::o;17363:1001::-;17505:20;;:::i;:::-;17541:26;;:::i;:::-;17570:696;;;;;;;;;17604:262;17633:14;17648:1;17633:17;;;;;;;;;;;;;17668:14;17683:1;17668:17;;;;;;;;;;;;;17703:14;17718:1;17703:17;;;;;;;;;;;;;17738:14;17753:1;17738:17;;;;;;;;;;;;;17773:11;17785:1;17773:14;;;;;;;;;;;;;17805:11;17817:1;17805:14;;;;;;;;;;;;;17837:12;17850:1;17837:15;;;;;;;;;;;;;17604:11;:262::i;:::-;17570:696;;;;18028:11;18040:1;18028:14;;;;;;;;;;;;;17570:696;;;;18068:11;18080:1;18068:14;;;;;;;;;;;;;17570:696;;;;17984:11;17996:1;17984:14;;;;;;;;;;;;;17570:696;;;;17896:14;17911:1;17896:17;;;;;;;;;;;;;17570:696;;;;;;18109:11;18121:1;18109:14;;;;;;;;;;;;;17570:696;;;;18148:11;18160:1;18148:14;;;;;;;;;;;;;17570:696;;;;17936:14;17951:1;17936:17;;;;;;;;;;;;;17570:696;;;;;;18202:11;18214:1;18202:14;;;;;;;;;;;;;17570:696;;;;18253:1;18245:10;;17570:696;;;;;;17541:725;;18303:27;18320:9;18303:16;:27::i;:::-;18277:9;:23;;:53;;;;;;;;;;;;;18348:9;18341:16;;17363:1001;;;;;;:::o;16285:941::-;16564:18;;:::i;:::-;16598:24;;:::i;:::-;16625:568;;;;;;;;;16657:7;16625:568;;;;;;16686:6;16625:568;;;;;;16719:11;16625:568;;;;;;16809:21;16625:568;;;;16759:13;16625:568;;;;;;16893:23;16625:568;;;;;;;16850:4;16625:568;;;;16943:239;16975:7;17000:6;17024:11;17053:13;17084:21;17123:4;17145:23;16943:14;:239::i;:::-;16625:568;;;;;;16598:595;;17211:8;17204:15;;16285:941;;;;;;;;;;:::o;12282:2557::-;12380:18;12414:14;12431:46;12457:9;:19;;;12431:9;:21;;;:25;;:46;;;;:::i;:::-;12414:63;;12666:50;12691:9;:24;;;12666:9;:20;;;:24;;:50;;;;:::i;:::-;12653:9;:63;;12649:213;;;12801:9;:23;;;12732:93;;;12747:51;12741:58;;;;;;;;12732:93;;;;;;;;;;;;12846:5;12839:12;;;;12649:213;12988:9;:19;;;12960:9;:25;;;:47;12956:189;;;13084:9;:23;;;13023:85;;;13038:43;13032:50;;;;;;;;13023:85;;;;;;;;;;;;13129:5;13122:12;;;;12956:189;13492:1;13450:44;;:9;:18;;;:30;;;:44;;;:76;;;;;13525:1;13498:9;:24;;;:28;13450:76;13449:168;;;;13573:1;13544:31;;:9;:17;;;:31;;;:72;;;;;13592:9;:24;;;13579:9;:37;;13544:72;13449:168;13445:313;;;13697:9;:23;;;13633:88;;;13648:46;13642:53;;;;;;;;13633:88;;;;;;;;;;;;13742:5;13735:12;;;;13445:313;13916:15;13879:9;:34;;;:52;13875:171;;;13985:9;:23;;;13947:62;;;13962:20;13956:27;;;;;;;;13947:62;;;;;;;;;;;;14030:5;14023:12;;;;13875:171;14145:9;;;;;;;;;;;:16;;;14167:9;:18;;;:30;;;14162:36;;;14145:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14141:171;;;14251:9;:23;;;14215:60;;;14230:18;14224:25;;;;;;;;14215:60;;;;;;;;;;;;14296:5;14289:12;;;;14141:171;14399:17;:49;14417:9;:18;;;:30;;;14399:49;;;;;;;;;;;;;;;;;;;;;;;;;;;14395:173;;;14507:9;:23;;;14464:67;;;14479:25;14473:32;;;;;;;;14464:67;;;;;;;;;;;;14552:5;14545:12;;;;14395:173;14651:18;:43;14670:9;:23;;;14651:43;;;;;;;;;;;;;;;;;;;;;;;;;;;14647:164;;;14750:9;:23;;;14710:64;;;14725:22;14719:29;;;;;;;;14710:64;;;;;;;;;;;;14795:5;14788:12;;;;14647:164;14828:4;14821:11;;12282:2557;;;;;:::o;10229:1909::-;10466:23;10613:9;:18;;;:25;;;10599:39;;:10;:39;;;;10595:426;;;10659:210;10693:9;:18;;;:25;;;10736:9;:23;;;10777:11;10789:1;10777:14;;;;;;;;;;;;;10809:11;10821:1;10809:14;;;;;;;;;;;;;10841:11;10853:1;10841:14;;;;;;;;;;;;;10659:16;:210::i;:::-;10658:211;10654:357;;;10942:9;:23;;;10889:77;;;10904:35;10898:42;;;;;;;;10889:77;;;;;;;;;;;;10991:5;10984:12;;;;10654:357;10595:426;11143:8;11129:22;;:10;:22;;;;11125:392;;;11172:193;11206:8;11232:9;:23;;;11273:11;11285:1;11273:14;;;;;;;;;;;;;11305:11;11317:1;11305:14;;;;;;;;;;;;;11337:11;11349:1;11337:14;;;;;;;;;;;;;11172:16;:193::i;:::-;11171:194;11167:340;;;11438:9;:23;;;11385:77;;;11400:35;11394:42;;;;;;;;11385:77;;;;;;;;;;;;11487:5;11480:12;;;;11167:340;11125:392;11647:1;11605:44;;:9;:18;;;:30;;;:44;;;;:104;;;;;11679:9;:18;;;:30;;;11665:44;;:10;:44;;;;11605:104;11601:509;;;11730:228;11764:9;:18;;;:30;;;11812:36;11838:9;11812:25;:36::i;:::-;11866:11;11878:1;11866:14;;;;;;;;;;;;;11898:11;11910:1;11898:14;;;;;;;;;;;;;11930:11;11942:1;11930:14;;;;;;;;;;;;;11730:16;:228::i;:::-;11729:229;11725:375;;;12031:9;:23;;;11978:77;;;11993:35;11987:42;;;;;;;;11978:77;;;;;;;;;;;;12080:5;12073:12;;;;11725:375;11601:509;12127:4;12120:11;;10229:1909;;;;;;;;:::o;15056:624::-;15204:37;15257:25;15285:52;15315:9;:21;;;15285:9;:25;;;:29;;:52;;;;:::i;:::-;15257:80;;15401:20;15352:46;15363:9;:24;;;15389:8;15352:10;:46::i;:::-;:69;:156;;;;15488:20;15437:48;15450:9;:24;;;15476:8;15437:12;:48::i;:::-;:71;15352:156;15348:304;;;15591:9;:23;;;15524:91;;;15539:49;15533:56;;;;;;;;15524:91;;;;;;;;;;;;15636:5;15629:12;;;;15348:304;15669:4;15662:11;;15056:624;;;;;;:::o;9472:606::-;9574:20;9665:12;9680:9;;;;;;;;;;;:16;;;9710:8;:16;;;9740:11;9765:8;:15;;;9794:8;:20;;;9828:8;:30;;;9872:8;:22;;;9908:8;:32;;;9954:8;:13;;;9680:297;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9665:312;;10011:8;:20;;;10006:26;;;9995:7;:37;9988:45;;;;;;10051:8;:20;;;10044:27;;9472:606;;;;;:::o;835:110:38:-;893:7;920:1;915;:6;;908:14;;;;;;939:1;935;:5;928:12;;835:110;;;;:::o;15832:332:3:-;15986:12;16040:20;;;;;;;;;;;16021:53;;;16088:5;16107:4;16125:2;16141:6;16021:136;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16014:143;;15832:332;;;;;;:::o;19562:536::-;19656:26;19736:4;19755:9;:18;;;:30;;;19799:9;:24;;;19837:9;:25;;;19876:9;:24;;;19914:9;:19;;;19947:9;:21;;;19982:9;:17;;;20013:9;:20;;;20047:9;:34;;;19705:386;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19698:393;;19562:536;;;:::o;18441:534::-;18723:20;18789:7;18810:6;18830:11;18855:21;18890:13;18917:23;18954:4;18766:202;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18759:209;;18441:534;;;;;;;;;:::o;1007:129:38:-;1065:7;1080:9;1096:1;1092;:5;1080:17;;1115:1;1110;:6;;1103:14;;;;;;1130:1;1123:8;;1007:129;;;;;:::o;20235:360:3:-;20415:11;20459:129;20528:4;20482:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20547:1;20562;20577;20459:129;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20449:139;;:6;:139;;;20442:146;;20235:360;;;;;;;:::o;19080:417::-;19183:31;19268:4;19287:9;:18;;;:30;;;19331:9;:24;;;19369:9;:25;;;19408:9;:24;;;19446:9;:34;;;19237:253;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19230:260;;19080:417;;;:::o;20691:265::-;20810:13;20896:5;20890:22;;;2879:4;20890:52;;20943:5;20890:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20883:66;;20691:265;;;;:::o;21062:291::-;21183:15;21271:5;21265:22;;;2879:4;21265:52;;21318:5;21325:20;;;;;;;;;;;21265:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21258:88;;21062:291;;;;:::o;1252:20103::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\nimport \"./DebtToken.sol\";\nimport \"./TermsContract.sol\";\nimport \"./TokenTransferProxy.sol\";\nimport \"zeppelin-solidity/contracts/lifecycle/Pausable.sol\";\nimport \"zeppelin-solidity/contracts/math/SafeMath.sol\";\nimport \"zeppelin-solidity/contracts/token/ERC20/ERC20.sol\";\n\n\n/**\n * The DebtKernel is the hub of all business logic governing how and when\n * debt orders can be filled and cancelled. All logic that determines\n * whether a debt order is valid & consensual is contained herein,\n * as well as the mechanisms that transfer fees to keepers and\n * principal payments to debtors.\n *\n * Author: Nadav Hollander -- Github: nadavhollander\n */\ncontract DebtKernel is Pausable {\n using SafeMath for uint;\n\n enum Errors {\n // Debt has been already been issued\n DEBT_ISSUED,\n // Order has already expired\n ORDER_EXPIRED,\n // Debt issuance associated with order has been cancelled\n ISSUANCE_CANCELLED,\n // Order has been cancelled\n ORDER_CANCELLED,\n // Order parameters specify amount of creditor / debtor fees\n // that is not equivalent to the amount of underwriter / relayer fees\n ORDER_INVALID_INSUFFICIENT_OR_EXCESSIVE_FEES,\n // Order parameters specify insufficient principal amount for\n // debtor to at least be able to meet his fees\n ORDER_INVALID_INSUFFICIENT_PRINCIPAL,\n // Order parameters specify non zero fee for an unspecified recipient\n ORDER_INVALID_UNSPECIFIED_FEE_RECIPIENT,\n // Order signatures are mismatched / malformed\n ORDER_INVALID_NON_CONSENSUAL,\n // Insufficient balance or allowance for principal token transfer\n CREDITOR_BALANCE_OR_ALLOWANCE_INSUFFICIENT\n }\n\n DebtToken public debtToken;\n\n // solhint-disable-next-line var-name-mixedcase\n address public TOKEN_TRANSFER_PROXY;\n bytes32 constant public NULL_ISSUANCE_HASH = bytes32(0);\n\n /* NOTE(kayvon): Currently, the `view` keyword does not actually enforce the\n static nature of the method; this will change in the future, but for now, in\n order to prevent reentrancy we'll need to arbitrarily set an upper bound on\n the gas limit allotted for certain method calls. */\n uint16 constant public EXTERNAL_QUERY_GAS_LIMIT = 8000;\n\n mapping (bytes32 => bool) public issuanceCancelled;\n mapping (bytes32 => bool) public debtOrderCancelled;\n\n event LogDebtOrderFilled(\n bytes32 indexed _agreementId,\n uint _principal,\n address _principalToken,\n address indexed _underwriter,\n uint _underwriterFee,\n address indexed _relayer,\n uint _relayerFee\n );\n\n event LogIssuanceCancelled(\n bytes32 indexed _agreementId,\n address indexed _cancelledBy\n );\n\n event LogDebtOrderCancelled(\n bytes32 indexed _debtOrderHash,\n address indexed _cancelledBy\n );\n\n event LogError(\n uint8 indexed _errorId,\n bytes32 indexed _orderHash\n );\n\n struct Issuance {\n address version;\n address debtor;\n address underwriter;\n uint underwriterRiskRating;\n address termsContract;\n bytes32 termsContractParameters;\n uint salt;\n bytes32 agreementId;\n }\n\n struct DebtOrder {\n Issuance issuance;\n uint underwriterFee;\n uint relayerFee;\n uint principalAmount;\n address principalToken;\n uint creditorFee;\n uint debtorFee;\n address relayer;\n uint expirationTimestampInSec;\n bytes32 debtOrderHash;\n }\n\n function DebtKernel(address tokenTransferProxyAddress)\n public\n {\n TOKEN_TRANSFER_PROXY = tokenTransferProxyAddress;\n }\n\n ////////////////////////\n // EXTERNAL FUNCTIONS //\n ////////////////////////\n\n /**\n * Allows contract owner to set the currently used debt token contract.\n * Function exists to maximize upgradeability of individual modules\n * in the entire system.\n */\n function setDebtToken(address debtTokenAddress)\n public\n onlyOwner\n {\n debtToken = DebtToken(debtTokenAddress);\n }\n\n /**\n * Fills a given debt order if it is valid and consensual.\n */\n function fillDebtOrder(\n address creditor,\n address[6] orderAddresses,\n uint[8] orderValues,\n bytes32[1] orderBytes32,\n uint8[3] signaturesV,\n bytes32[3] signaturesR,\n bytes32[3] signaturesS\n )\n public\n whenNotPaused\n returns (bytes32 _agreementId)\n {\n DebtOrder memory debtOrder = getDebtOrder(orderAddresses, orderValues, orderBytes32);\n\n // Assert order's validity & consensuality\n if (!assertDebtOrderValidityInvariants(debtOrder) ||\n !assertDebtOrderConsensualityInvariants(\n debtOrder,\n creditor,\n signaturesV,\n signaturesR,\n signaturesS) ||\n !assertExternalBalanceAndAllowanceInvariants(creditor, debtOrder)) {\n return NULL_ISSUANCE_HASH;\n }\n\n // Mint debt token and finalize debt agreement\n issueDebtAgreement(creditor, debtOrder.issuance);\n\n // Register debt agreement's start with terms contract\n // We permit terms contracts to be undefined (for debt agreements which\n // may not have terms contracts associated with them), and only\n // register a term's start if the terms contract address is defined.\n if (debtOrder.issuance.termsContract != address(0)) {\n require(\n TermsContract(debtOrder.issuance.termsContract)\n .registerTermStart(\n debtOrder.issuance.agreementId,\n debtOrder.issuance.debtor\n )\n );\n }\n\n // Transfer principal to debtor\n if (debtOrder.principalAmount > 0) {\n require(transferTokensFrom(\n debtOrder.principalToken,\n creditor,\n debtOrder.issuance.debtor,\n debtOrder.principalAmount.sub(debtOrder.debtorFee)\n ));\n }\n\n // Transfer underwriter fee to underwriter\n if (debtOrder.underwriterFee > 0) {\n require(transferTokensFrom(\n debtOrder.principalToken,\n creditor,\n debtOrder.issuance.underwriter,\n debtOrder.underwriterFee\n ));\n }\n\n // Transfer relayer fee to relayer\n if (debtOrder.relayerFee > 0) {\n require(transferTokensFrom(\n debtOrder.principalToken,\n creditor,\n debtOrder.relayer,\n debtOrder.relayerFee\n ));\n }\n\n LogDebtOrderFilled(\n debtOrder.issuance.agreementId,\n debtOrder.principalAmount,\n debtOrder.principalToken,\n debtOrder.issuance.underwriter,\n debtOrder.underwriterFee,\n debtOrder.relayer,\n debtOrder.relayerFee\n );\n\n return debtOrder.issuance.agreementId;\n }\n\n /**\n * Allows both underwriters and debtors to prevent a debt\n * issuance in which they're involved from being used in\n * a future debt order.\n */\n function cancelIssuance(\n address version,\n address debtor,\n address termsContract,\n bytes32 termsContractParameters,\n address underwriter,\n uint underwriterRiskRating,\n uint salt\n )\n public\n whenNotPaused\n {\n require(msg.sender == debtor || msg.sender == underwriter);\n\n Issuance memory issuance = getIssuance(\n version,\n debtor,\n underwriter,\n termsContract,\n underwriterRiskRating,\n salt,\n termsContractParameters\n );\n\n issuanceCancelled[issuance.agreementId] = true;\n\n LogIssuanceCancelled(issuance.agreementId, msg.sender);\n }\n\n /**\n * Allows a debtor to cancel a debt order before it's been filled\n * -- preventing any counterparty from filling it in the future.\n */\n function cancelDebtOrder(\n address[6] orderAddresses,\n uint[8] orderValues,\n bytes32[1] orderBytes32\n )\n public\n whenNotPaused\n {\n DebtOrder memory debtOrder = getDebtOrder(orderAddresses, orderValues, orderBytes32);\n\n require(msg.sender == debtOrder.issuance.debtor);\n\n debtOrderCancelled[debtOrder.debtOrderHash] = true;\n\n LogDebtOrderCancelled(debtOrder.debtOrderHash, msg.sender);\n }\n\n ////////////////////////\n // INTERNAL FUNCTIONS //\n ////////////////////////\n\n /**\n * Helper function that mints debt token associated with the\n * given issuance and grants it to the beneficiary.\n */\n function issueDebtAgreement(address beneficiary, Issuance issuance)\n internal\n returns (bytes32 _agreementId)\n {\n // Mint debt token and finalize debt agreement\n uint tokenId = debtToken.create(\n issuance.version,\n beneficiary,\n issuance.debtor,\n issuance.underwriter,\n issuance.underwriterRiskRating,\n issuance.termsContract,\n issuance.termsContractParameters,\n issuance.salt\n );\n\n assert(tokenId == uint(issuance.agreementId));\n\n return issuance.agreementId;\n }\n\n /**\n * Asserts that a debt order meets all consensuality requirements\n * described in the DebtKernel specification document.\n */\n function assertDebtOrderConsensualityInvariants(\n DebtOrder debtOrder,\n address creditor,\n uint8[3] signaturesV,\n bytes32[3] signaturesR,\n bytes32[3] signaturesS\n )\n internal\n returns (bool _orderIsConsensual)\n {\n // Invariant: debtor's signature must be valid, unless debtor is submitting order\n if (msg.sender != debtOrder.issuance.debtor) {\n if (!isValidSignature(\n debtOrder.issuance.debtor,\n debtOrder.debtOrderHash,\n signaturesV[0],\n signaturesR[0],\n signaturesS[0]\n )) {\n LogError(uint8(Errors.ORDER_INVALID_NON_CONSENSUAL), debtOrder.debtOrderHash);\n return false;\n }\n }\n\n // Invariant: creditor's signature must be valid, unless creditor is submitting order\n if (msg.sender != creditor) {\n if (!isValidSignature(\n creditor,\n debtOrder.debtOrderHash,\n signaturesV[1],\n signaturesR[1],\n signaturesS[1]\n )) {\n LogError(uint8(Errors.ORDER_INVALID_NON_CONSENSUAL), debtOrder.debtOrderHash);\n return false;\n }\n }\n\n\n // Invariant: underwriter's signature must be valid (if present)\n if (debtOrder.issuance.underwriter != address(0) &&\n msg.sender != debtOrder.issuance.underwriter) {\n if (!isValidSignature(\n debtOrder.issuance.underwriter,\n getUnderwriterMessageHash(debtOrder),\n signaturesV[2],\n signaturesR[2],\n signaturesS[2]\n )) {\n LogError(uint8(Errors.ORDER_INVALID_NON_CONSENSUAL), debtOrder.debtOrderHash);\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Asserts that debt order meets all validity requirements described in\n * the DebtKernel specification document.\n */\n function assertDebtOrderValidityInvariants(DebtOrder debtOrder)\n internal\n returns (bool _orderIsValid)\n {\n uint totalFees = debtOrder.creditorFee.add(debtOrder.debtorFee);\n\n // Invariant: the total value of fees contributed by debtors and creditors\n // must be equivalent to that paid out to underwriters and relayers.\n if (totalFees != debtOrder.relayerFee.add(debtOrder.underwriterFee)) {\n LogError(uint8(Errors.ORDER_INVALID_INSUFFICIENT_OR_EXCESSIVE_FEES), debtOrder.debtOrderHash);\n return false;\n }\n\n // Invariant: debtor is given enough principal to cover at least debtorFees\n if (debtOrder.principalAmount < debtOrder.debtorFee) {\n LogError(uint8(Errors.ORDER_INVALID_INSUFFICIENT_PRINCIPAL), debtOrder.debtOrderHash);\n return false;\n }\n\n // Invariant: if no underwriter is specified, underwriter fees must be 0\n // Invariant: if no relayer is specified, relayer fees must be 0.\n // Given that relayer fees = total fees - underwriter fees,\n // we assert that total fees = underwriter fees.\n if ((debtOrder.issuance.underwriter == address(0) && debtOrder.underwriterFee > 0) ||\n (debtOrder.relayer == address(0) && totalFees != debtOrder.underwriterFee)) {\n LogError(uint8(Errors.ORDER_INVALID_UNSPECIFIED_FEE_RECIPIENT), debtOrder.debtOrderHash);\n return false;\n }\n\n // Invariant: debt order must not be expired\n // solhint-disable-next-line not-rely-on-time\n if (debtOrder.expirationTimestampInSec < block.timestamp) {\n LogError(uint8(Errors.ORDER_EXPIRED), debtOrder.debtOrderHash);\n return false;\n }\n\n // Invariant: debt order's issuance must not already be minted as debt token\n if (debtToken.exists(uint(debtOrder.issuance.agreementId))) {\n LogError(uint8(Errors.DEBT_ISSUED), debtOrder.debtOrderHash);\n return false;\n }\n\n // Invariant: debt order's issuance must not have been cancelled\n if (issuanceCancelled[debtOrder.issuance.agreementId]) {\n LogError(uint8(Errors.ISSUANCE_CANCELLED), debtOrder.debtOrderHash);\n return false;\n }\n\n // Invariant: debt order itself must not have been cancelled\n if (debtOrderCancelled[debtOrder.debtOrderHash]) {\n LogError(uint8(Errors.ORDER_CANCELLED), debtOrder.debtOrderHash);\n return false;\n }\n\n return true;\n }\n\n /**\n * Assert that the creditor has a sufficient token balance and has\n * granted the token transfer proxy contract sufficient allowance to suffice for the principal\n * and creditor fee.\n */\n function assertExternalBalanceAndAllowanceInvariants(\n address creditor,\n DebtOrder debtOrder\n )\n internal\n returns (bool _isBalanceAndAllowanceSufficient)\n {\n uint totalCreditorPayment = debtOrder.principalAmount.add(debtOrder.creditorFee);\n\n if (getBalance(debtOrder.principalToken, creditor) < totalCreditorPayment ||\n getAllowance(debtOrder.principalToken, creditor) < totalCreditorPayment) {\n LogError(uint8(Errors.CREDITOR_BALANCE_OR_ALLOWANCE_INSUFFICIENT), debtOrder.debtOrderHash);\n return false;\n }\n\n return true;\n }\n\n /**\n * Helper function transfers a specified amount of tokens between two parties\n * using the token transfer proxy contract.\n */\n function transferTokensFrom(\n address token,\n address from,\n address to,\n uint amount\n )\n internal\n returns (bool success)\n {\n return TokenTransferProxy(TOKEN_TRANSFER_PROXY).transferFrom(\n token,\n from,\n to,\n amount\n );\n }\n\n /**\n * Helper function that constructs a hashed issuance structs from the given\n * parameters.\n */\n function getIssuance(\n address version,\n address debtor,\n address underwriter,\n address termsContract,\n uint underwriterRiskRating,\n uint salt,\n bytes32 termsContractParameters\n )\n internal\n pure\n returns (Issuance _issuance)\n {\n Issuance memory issuance = Issuance({\n version: version,\n debtor: debtor,\n underwriter: underwriter,\n termsContract: termsContract,\n underwriterRiskRating: underwriterRiskRating,\n salt: salt,\n termsContractParameters: termsContractParameters,\n agreementId: getAgreementId(\n version,\n debtor,\n underwriter,\n termsContract,\n underwriterRiskRating,\n salt,\n termsContractParameters\n )\n });\n\n return issuance;\n }\n\n /**\n * Helper function that constructs a hashed debt order struct given the raw parameters\n * of a debt order.\n */\n function getDebtOrder(address[6] orderAddresses, uint[8] orderValues, bytes32[1] orderBytes32)\n internal\n view\n returns (DebtOrder _debtOrder)\n {\n DebtOrder memory debtOrder = DebtOrder({\n issuance: getIssuance(\n orderAddresses[0],\n orderAddresses[1],\n orderAddresses[2],\n orderAddresses[3],\n orderValues[0],\n orderValues[1],\n orderBytes32[0]\n ),\n principalToken: orderAddresses[4],\n relayer: orderAddresses[5],\n principalAmount: orderValues[2],\n underwriterFee: orderValues[3],\n relayerFee: orderValues[4],\n creditorFee: orderValues[5],\n debtorFee: orderValues[6],\n expirationTimestampInSec: orderValues[7],\n debtOrderHash: bytes32(0)\n });\n\n debtOrder.debtOrderHash = getDebtOrderHash(debtOrder);\n\n return debtOrder;\n }\n\n /**\n * Helper function that returns an issuance's hash\n */\n function getAgreementId(\n address version,\n address debtor,\n address underwriter,\n address termsContract,\n uint underwriterRiskRating,\n uint salt,\n bytes32 termsContractParameters\n )\n internal\n pure\n returns (bytes32 _agreementId)\n {\n return keccak256(\n version,\n debtor,\n underwriter,\n underwriterRiskRating,\n termsContract,\n termsContractParameters,\n salt\n );\n }\n\n /**\n * Returns the hash of the parameters which an underwriter is supposed to sign\n */\n function getUnderwriterMessageHash(DebtOrder debtOrder)\n internal\n view\n returns (bytes32 _underwriterMessageHash)\n {\n return keccak256(\n address(this),\n debtOrder.issuance.agreementId,\n debtOrder.underwriterFee,\n debtOrder.principalAmount,\n debtOrder.principalToken,\n debtOrder.expirationTimestampInSec\n );\n }\n\n /**\n * Returns the hash of the debt order.\n */\n function getDebtOrderHash(DebtOrder debtOrder)\n internal\n view\n returns (bytes32 _debtorMessageHash)\n {\n return keccak256(\n address(this),\n debtOrder.issuance.agreementId,\n debtOrder.underwriterFee,\n debtOrder.principalAmount,\n debtOrder.principalToken,\n debtOrder.debtorFee,\n debtOrder.creditorFee,\n debtOrder.relayer,\n debtOrder.relayerFee,\n debtOrder.expirationTimestampInSec\n );\n }\n\n /**\n * Given a hashed message, a signer's address, and a signature, returns\n * whether the signature is valid.\n */\n function isValidSignature(\n address signer,\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n )\n internal\n pure\n returns (bool _valid)\n {\n return signer == ecrecover(\n keccak256(\"\\x19Ethereum Signed Message:\\n32\", hash),\n v,\n r,\n s\n );\n }\n\n /**\n * Helper function for querying an address' balance on a given token.\n */\n function getBalance(\n address token,\n address owner\n )\n internal\n view\n returns (uint _balance)\n {\n // Limit gas to prevent reentrancy.\n return ERC20(token).balanceOf.gas(EXTERNAL_QUERY_GAS_LIMIT)(owner);\n }\n\n /**\n * Helper function for querying an address' allowance to the 0x transfer proxy.\n */\n function getAllowance(\n address token,\n address owner\n )\n internal\n view\n returns (uint _allowance)\n {\n // Limit gas to prevent reentrancy.\n return ERC20(token).allowance.gas(EXTERNAL_QUERY_GAS_LIMIT)(owner, TOKEN_TRANSFER_PROXY);\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/DebtKernel.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/DebtKernel.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/DebtKernel.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/DebtKernel.sol", "exportedSymbols": { "DebtKernel": [ 2630 @@ -437,7 +437,7 @@ { "attributes": { "SourceUnit": 3541, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/DebtToken.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/DebtToken.sol", "file": "./DebtToken.sol", "scope": 2631, "symbolAliases": [ @@ -452,7 +452,7 @@ { "attributes": { "SourceUnit": 4758, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/TermsContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/TermsContract.sol", "file": "./TermsContract.sol", "scope": 2631, "symbolAliases": [ @@ -467,7 +467,7 @@ { "attributes": { "SourceUnit": 5207, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/TokenTransferProxy.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/TokenTransferProxy.sol", "file": "./TokenTransferProxy.sol", "scope": 2631, "symbolAliases": [ @@ -17682,7 +17682,7 @@ } }, "links": {}, - "address": "0xc01c57ffedca4d0644abb966f055f040cd63fd5b" + "address": "0x4a42fbdae13791341361f9d2dd69873d83e4b816" }, "70": { "events": { @@ -17814,5 +17814,5 @@ } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:15:01.344Z" + "updatedAt": "2018-10-09T17:51:53.185Z" } \ No newline at end of file diff --git a/artifacts/json/DebtRegistry.json b/artifacts/json/DebtRegistry.json index 0fdf6729..ac679176 100644 --- a/artifacts/json/DebtRegistry.json +++ b/artifacts/json/DebtRegistry.json @@ -541,15 +541,15 @@ "type": "event" } ], - "bytecode": "0x606060405260008060146101000a81548160ff021916908315150217905550336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506123298061006d6000396000f300606060405260043610610133576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632be84c6614610138578063314a522e146101c65780633f4ba83a1461020957806342cc6b041461021e5780635969549e146102575780635c975abb1461029d57806364a666f2146102ca5780636be39bda146103345780638456cb59146103aa5780638ad1d846146103bf5780638da5cb5b1461044d5780638dadc81d146104a25780638eaa6ac014610530578063932993951461064d5780639758af1e14610686578063ad655998146106c5578063ba20dda4146106fe578063c205e64c14610765578063cf9df5eb1461079e578063d69dbf631461088e578063f2fde38b146108c9578063f6f494c914610902578063f94df67814610969575b600080fd5b341561014357600080fd5b61014b6109d3565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561018b578082015181840152602081019050610170565b50505050905090810190601f1680156101b85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101d157600080fd5b6101eb600480803560001916906020019091905050610a0c565b60405180826000191660001916815260200191505060405180910390f35b341561021457600080fd5b61021c610a4a565b005b341561022957600080fd5b610255600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b08565b005b341561026257600080fd5b61029b60048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610bb1565b005b34156102a857600080fd5b6102b0610d44565b604051808215151515815260200191505060405180910390f35b34156102d557600080fd5b6102dd610d57565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610320578082015181840152602081019050610305565b505050509050019250505060405180910390f35b341561033f57600080fd5b610359600480803560001916906020019091905050610d6e565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182600019166000191681526020019250505060405180910390f35b34156103b557600080fd5b6103bd610dee565b005b34156103ca57600080fd5b6103f6600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610eae565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561043957808201518184015260208101905061041e565b505050509050019250505060405180910390f35b341561045857600080fd5b610460610f4f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104ad57600080fd5b6104b5610f74565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104f55780820151818401526020810190506104da565b50505050905090810190601f1680156105225780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561053b57600080fd5b610555600480803560001916906020019091905050610fad565b604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001836000191660001916815260200182815260200197505050505050505060405180910390f35b341561065857600080fd5b610684600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061112a565b005b341561069157600080fd5b6106ab6004808035600019169060200190919050506111d3565b604051808215151515815260200191505060405180910390f35b34156106d057600080fd5b6106fc600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061124a565b005b341561070957600080fd5b6107236004808035600019169060200190919050506112f3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561077057600080fd5b61079c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611351565b005b34156107a957600080fd5b610870600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035600019169060200190919080359060200190919050506113fa565b60405180826000191660001916815260200191505060405180910390f35b341561089957600080fd5b6108b3600480803560001916906020019091905050611835565b6040518082815260200191505060405180910390f35b34156108d457600080fd5b610900600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611873565b005b341561090d57600080fd5b6109276004808035600019169060200190919050506119c8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561097457600080fd5b61097c611a26565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156109bf5780820151818401526020810190506109a4565b505050509050019250505060405180910390f35b6040805190810160405280601281526020017f646562742d72656769737472792d65646974000000000000000000000000000081525081565b600081610a18816111d3565b1515610a2357600080fd5b60016000846000191660001916815260200190815260200160002060050154915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610aa557600080fd5b600060149054906101000a900460ff161515610ac057600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610b6357600080fd5b610bae816040805190810160405280601281526020017f646562742d72656769737472792d6564697400000000000000000000000000008152506006611a3d9092919063ffffffff16565b50565b6000610bc7336006611c1990919063ffffffff16565b1515610bd257600080fd5b600060149054906101000a900460ff16151515610bee57600080fd5b82610bf8816111d3565b1515610c0357600080fd5b82600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610c4057600080fd5b60016000866000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692508360016000876000191660001916815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1686600019167f7afbd1e661f2fdce6222afdac74cd28b1847177e232db3d0f0dcf3739e8d809460405160405180910390a45050505050565b600060149054906101000a900460ff1681565b610d5f61216e565b610d696003611c72565b905090565b60008082610d7b816111d3565b1515610d8657600080fd5b60016000856000191660001916815260200190815260200160002060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008660001916600019168152602001908152602001600020600501549250925050915091565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610e4957600080fd5b600060149054906101000a900460ff16151515610e6557600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b610eb6612182565b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015610f4357602002820191906000526020600020905b81546000191681526020019060010190808311610f2b575b50505050509050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6040805190810160405280601481526020017f646562742d72656769737472792d696e7365727400000000000000000000000081525081565b600080600080600080600060016000896000191660001916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008a6000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008b6000191660001916815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008c6000191660001916815260200190815260200160002060030154600160008d6000191660001916815260200190815260200160002060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008e6000191660001916815260200190815260200160002060050154600160008f60001916600019168152602001908152602001600020600601549650965096509650965096509650919395979092949650565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561118557600080fd5b6111d0816040805190810160405280601281526020017f646562742d72656769737472792d6564697400000000000000000000000000008152506006611d0a9092919063ffffffff16565b50565b60008073ffffffffffffffffffffffffffffffffffffffff1660016000846000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156112a557600080fd5b6112f0816040805190810160405280601481526020017f646562742d72656769737472792d696e736572740000000000000000000000008152506003611a3d9092919063ffffffff16565b50565b6000816112ff816111d3565b151561130a57600080fd5b60016000846000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156113ac57600080fd5b6113f7816040805190810160405280601481526020017f646562742d72656769737472792d696e736572740000000000000000000000008152506003611d0a9092919063ffffffff16565b50565b6000611404612196565b600061141a336003611c1990919063ffffffff16565b151561142557600080fd5b600060149054906101000a900460ff1615151561144157600080fd5b89600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561147e57600080fd5b60e0604051908101604052808d73ffffffffffffffffffffffffffffffffffffffff1681526020018c73ffffffffffffffffffffffffffffffffffffffff1681526020018a73ffffffffffffffffffffffffffffffffffffffff1681526020018981526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018760001916815260200142815250925061151b838b87612000565b9150600073ffffffffffffffffffffffffffffffffffffffff1660016000846000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561159657600080fd5b8260016000846000191660001916815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506060820151816003015560808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060a0820151816005019060001916905560c08201518160060155905050600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806001018281611746919061222f565b916000526020600020900160008490919091509060001916905550826040015173ffffffffffffffffffffffffffffffffffffffff16836020015173ffffffffffffffffffffffffffffffffffffffff1683600019167f10919d8a6bfbd0c46213ad51d6258e42af00bbf36133aada8a058bbe4f4a9240866060015187608001518860a00151604051808481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018260001916600019168152602001935050505060405180910390a481935050505098975050505050505050565b600081611841816111d3565b151561184c57600080fd5b60016000846000191660001916815260200190815260200160002060060154915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156118ce57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561190a57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000816119d4816111d3565b15156119df57600080fd5b60016000846000191660001916815260200190815260200160002060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b611a2e61216e565b611a386006611c72565b905090565b611a478383612159565b1515611a5257600080fd5b60018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550826002018054806001018281611ac2919061225b565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060018360020180549050038360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f571925c699f9072cec76b6c6c000571cc8d0bb5c47e5819202e2e9496c6508b5826040518080602001828103825283818151815260200191508051906020019080838360005b83811015611bda578082015181840152602081019050611bbf565b50505050905090810190601f168015611c075780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c7a61216e565b81600201805480602002602001604051908101604052809291908181526020018280548015611cfe57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611cb4575b50505050509050919050565b6000806000611d198686611c19565b1515611d2457600080fd5b8560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600186600201805490500391508560020182815481101515611d8657fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055808660020184815481101515611e1757fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090558560020182815481101515611efc57fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018660020181818054905003915081611f449190612287565b508473ffffffffffffffffffffffffffffffffffffffff167f0814e4ee85854cea446b4a27a460e5ffb41516230dbc02f226c07907e432241c856040518080602001828103825283818151815260200191508051906020019080838360005b83811015611fbe578082015181840152602081019050611fa3565b50505050905090810190601f168015611feb5780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050505050565b60008360000151838560400151866060015187608001518860a0015187604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018360001916600019168152602001828152602001975050505050505050604051809103902090509392505050565b60006121658383611c19565b15905092915050565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b60e060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008019168152602001600081525090565b8154818355818115116122565781836000526020600020918201910161225591906122b3565b5b505050565b8154818355818115116122825781836000526020600020918201910161228191906122d8565b5b505050565b8154818355818115116122ae578183600052602060002091820191016122ad91906122d8565b5b505050565b6122d591905b808211156122d15760008160009055506001016122b9565b5090565b90565b6122fa91905b808211156122f65760008160009055506001016122de565b5090565b905600a165627a7a72305820a7dff4e8b78a42a8352e889d366d56ee6d328cf9f4e829420fa1fc37829c4d180029", - "deployedBytecode": "0x606060405260043610610133576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632be84c6614610138578063314a522e146101c65780633f4ba83a1461020957806342cc6b041461021e5780635969549e146102575780635c975abb1461029d57806364a666f2146102ca5780636be39bda146103345780638456cb59146103aa5780638ad1d846146103bf5780638da5cb5b1461044d5780638dadc81d146104a25780638eaa6ac014610530578063932993951461064d5780639758af1e14610686578063ad655998146106c5578063ba20dda4146106fe578063c205e64c14610765578063cf9df5eb1461079e578063d69dbf631461088e578063f2fde38b146108c9578063f6f494c914610902578063f94df67814610969575b600080fd5b341561014357600080fd5b61014b6109d3565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561018b578082015181840152602081019050610170565b50505050905090810190601f1680156101b85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101d157600080fd5b6101eb600480803560001916906020019091905050610a0c565b60405180826000191660001916815260200191505060405180910390f35b341561021457600080fd5b61021c610a4a565b005b341561022957600080fd5b610255600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b08565b005b341561026257600080fd5b61029b60048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610bb1565b005b34156102a857600080fd5b6102b0610d44565b604051808215151515815260200191505060405180910390f35b34156102d557600080fd5b6102dd610d57565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610320578082015181840152602081019050610305565b505050509050019250505060405180910390f35b341561033f57600080fd5b610359600480803560001916906020019091905050610d6e565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182600019166000191681526020019250505060405180910390f35b34156103b557600080fd5b6103bd610dee565b005b34156103ca57600080fd5b6103f6600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610eae565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561043957808201518184015260208101905061041e565b505050509050019250505060405180910390f35b341561045857600080fd5b610460610f4f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104ad57600080fd5b6104b5610f74565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104f55780820151818401526020810190506104da565b50505050905090810190601f1680156105225780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561053b57600080fd5b610555600480803560001916906020019091905050610fad565b604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001836000191660001916815260200182815260200197505050505050505060405180910390f35b341561065857600080fd5b610684600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061112a565b005b341561069157600080fd5b6106ab6004808035600019169060200190919050506111d3565b604051808215151515815260200191505060405180910390f35b34156106d057600080fd5b6106fc600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061124a565b005b341561070957600080fd5b6107236004808035600019169060200190919050506112f3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561077057600080fd5b61079c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611351565b005b34156107a957600080fd5b610870600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035600019169060200190919080359060200190919050506113fa565b60405180826000191660001916815260200191505060405180910390f35b341561089957600080fd5b6108b3600480803560001916906020019091905050611835565b6040518082815260200191505060405180910390f35b34156108d457600080fd5b610900600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611873565b005b341561090d57600080fd5b6109276004808035600019169060200190919050506119c8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561097457600080fd5b61097c611a26565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156109bf5780820151818401526020810190506109a4565b505050509050019250505060405180910390f35b6040805190810160405280601281526020017f646562742d72656769737472792d65646974000000000000000000000000000081525081565b600081610a18816111d3565b1515610a2357600080fd5b60016000846000191660001916815260200190815260200160002060050154915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610aa557600080fd5b600060149054906101000a900460ff161515610ac057600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610b6357600080fd5b610bae816040805190810160405280601281526020017f646562742d72656769737472792d6564697400000000000000000000000000008152506006611a3d9092919063ffffffff16565b50565b6000610bc7336006611c1990919063ffffffff16565b1515610bd257600080fd5b600060149054906101000a900460ff16151515610bee57600080fd5b82610bf8816111d3565b1515610c0357600080fd5b82600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610c4057600080fd5b60016000866000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692508360016000876000191660001916815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1686600019167f7afbd1e661f2fdce6222afdac74cd28b1847177e232db3d0f0dcf3739e8d809460405160405180910390a45050505050565b600060149054906101000a900460ff1681565b610d5f61216e565b610d696003611c72565b905090565b60008082610d7b816111d3565b1515610d8657600080fd5b60016000856000191660001916815260200190815260200160002060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008660001916600019168152602001908152602001600020600501549250925050915091565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610e4957600080fd5b600060149054906101000a900460ff16151515610e6557600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b610eb6612182565b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015610f4357602002820191906000526020600020905b81546000191681526020019060010190808311610f2b575b50505050509050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6040805190810160405280601481526020017f646562742d72656769737472792d696e7365727400000000000000000000000081525081565b600080600080600080600060016000896000191660001916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008a6000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008b6000191660001916815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008c6000191660001916815260200190815260200160002060030154600160008d6000191660001916815260200190815260200160002060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008e6000191660001916815260200190815260200160002060050154600160008f60001916600019168152602001908152602001600020600601549650965096509650965096509650919395979092949650565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561118557600080fd5b6111d0816040805190810160405280601281526020017f646562742d72656769737472792d6564697400000000000000000000000000008152506006611d0a9092919063ffffffff16565b50565b60008073ffffffffffffffffffffffffffffffffffffffff1660016000846000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156112a557600080fd5b6112f0816040805190810160405280601481526020017f646562742d72656769737472792d696e736572740000000000000000000000008152506003611a3d9092919063ffffffff16565b50565b6000816112ff816111d3565b151561130a57600080fd5b60016000846000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156113ac57600080fd5b6113f7816040805190810160405280601481526020017f646562742d72656769737472792d696e736572740000000000000000000000008152506003611d0a9092919063ffffffff16565b50565b6000611404612196565b600061141a336003611c1990919063ffffffff16565b151561142557600080fd5b600060149054906101000a900460ff1615151561144157600080fd5b89600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561147e57600080fd5b60e0604051908101604052808d73ffffffffffffffffffffffffffffffffffffffff1681526020018c73ffffffffffffffffffffffffffffffffffffffff1681526020018a73ffffffffffffffffffffffffffffffffffffffff1681526020018981526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018760001916815260200142815250925061151b838b87612000565b9150600073ffffffffffffffffffffffffffffffffffffffff1660016000846000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561159657600080fd5b8260016000846000191660001916815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506060820151816003015560808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060a0820151816005019060001916905560c08201518160060155905050600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806001018281611746919061222f565b916000526020600020900160008490919091509060001916905550826040015173ffffffffffffffffffffffffffffffffffffffff16836020015173ffffffffffffffffffffffffffffffffffffffff1683600019167f10919d8a6bfbd0c46213ad51d6258e42af00bbf36133aada8a058bbe4f4a9240866060015187608001518860a00151604051808481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018260001916600019168152602001935050505060405180910390a481935050505098975050505050505050565b600081611841816111d3565b151561184c57600080fd5b60016000846000191660001916815260200190815260200160002060060154915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156118ce57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561190a57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000816119d4816111d3565b15156119df57600080fd5b60016000846000191660001916815260200190815260200160002060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b611a2e61216e565b611a386006611c72565b905090565b611a478383612159565b1515611a5257600080fd5b60018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550826002018054806001018281611ac2919061225b565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060018360020180549050038360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f571925c699f9072cec76b6c6c000571cc8d0bb5c47e5819202e2e9496c6508b5826040518080602001828103825283818151815260200191508051906020019080838360005b83811015611bda578082015181840152602081019050611bbf565b50505050905090810190601f168015611c075780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c7a61216e565b81600201805480602002602001604051908101604052809291908181526020018280548015611cfe57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611cb4575b50505050509050919050565b6000806000611d198686611c19565b1515611d2457600080fd5b8560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600186600201805490500391508560020182815481101515611d8657fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055808660020184815481101515611e1757fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090558560020182815481101515611efc57fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018660020181818054905003915081611f449190612287565b508473ffffffffffffffffffffffffffffffffffffffff167f0814e4ee85854cea446b4a27a460e5ffb41516230dbc02f226c07907e432241c856040518080602001828103825283818151815260200191508051906020019080838360005b83811015611fbe578082015181840152602081019050611fa3565b50505050905090810190601f168015611feb5780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050505050565b60008360000151838560400151866060015187608001518860a0015187604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018360001916600019168152602001828152602001975050505050505050604051809103902090509392505050565b60006121658383611c19565b15905092915050565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b60e060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008019168152602001600081525090565b8154818355818115116122565781836000526020600020918201910161225591906122b3565b5b505050565b8154818355818115116122825781836000526020600020918201910161228191906122d8565b5b505050565b8154818355818115116122ae578183600052602060002091820191016122ad91906122d8565b5b505050565b6122d591905b808211156122d15760008160009055506001016122b9565b5090565b90565b6122fa91905b808211156122f65760008160009055506001016122de565b5090565b905600a165627a7a72305820a7dff4e8b78a42a8352e889d366d56ee6d328cf9f4e829420fa1fc37829c4d180029", + "bytecode": "0x606060405260008060146101000a81548160ff021916908315150217905550336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506123298061006d6000396000f300606060405260043610610133576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632be84c6614610138578063314a522e146101c65780633f4ba83a1461020957806342cc6b041461021e5780635969549e146102575780635c975abb1461029d57806364a666f2146102ca5780636be39bda146103345780638456cb59146103aa5780638ad1d846146103bf5780638da5cb5b1461044d5780638dadc81d146104a25780638eaa6ac014610530578063932993951461064d5780639758af1e14610686578063ad655998146106c5578063ba20dda4146106fe578063c205e64c14610765578063cf9df5eb1461079e578063d69dbf631461088e578063f2fde38b146108c9578063f6f494c914610902578063f94df67814610969575b600080fd5b341561014357600080fd5b61014b6109d3565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561018b578082015181840152602081019050610170565b50505050905090810190601f1680156101b85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101d157600080fd5b6101eb600480803560001916906020019091905050610a0c565b60405180826000191660001916815260200191505060405180910390f35b341561021457600080fd5b61021c610a4a565b005b341561022957600080fd5b610255600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b08565b005b341561026257600080fd5b61029b60048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610bb1565b005b34156102a857600080fd5b6102b0610d44565b604051808215151515815260200191505060405180910390f35b34156102d557600080fd5b6102dd610d57565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610320578082015181840152602081019050610305565b505050509050019250505060405180910390f35b341561033f57600080fd5b610359600480803560001916906020019091905050610d6e565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182600019166000191681526020019250505060405180910390f35b34156103b557600080fd5b6103bd610dee565b005b34156103ca57600080fd5b6103f6600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610eae565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561043957808201518184015260208101905061041e565b505050509050019250505060405180910390f35b341561045857600080fd5b610460610f4f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104ad57600080fd5b6104b5610f74565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104f55780820151818401526020810190506104da565b50505050905090810190601f1680156105225780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561053b57600080fd5b610555600480803560001916906020019091905050610fad565b604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001836000191660001916815260200182815260200197505050505050505060405180910390f35b341561065857600080fd5b610684600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061112a565b005b341561069157600080fd5b6106ab6004808035600019169060200190919050506111d3565b604051808215151515815260200191505060405180910390f35b34156106d057600080fd5b6106fc600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061124a565b005b341561070957600080fd5b6107236004808035600019169060200190919050506112f3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561077057600080fd5b61079c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611351565b005b34156107a957600080fd5b610870600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035600019169060200190919080359060200190919050506113fa565b60405180826000191660001916815260200191505060405180910390f35b341561089957600080fd5b6108b3600480803560001916906020019091905050611835565b6040518082815260200191505060405180910390f35b34156108d457600080fd5b610900600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611873565b005b341561090d57600080fd5b6109276004808035600019169060200190919050506119c8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561097457600080fd5b61097c611a26565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156109bf5780820151818401526020810190506109a4565b505050509050019250505060405180910390f35b6040805190810160405280601281526020017f646562742d72656769737472792d65646974000000000000000000000000000081525081565b600081610a18816111d3565b1515610a2357600080fd5b60016000846000191660001916815260200190815260200160002060050154915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610aa557600080fd5b600060149054906101000a900460ff161515610ac057600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610b6357600080fd5b610bae816040805190810160405280601281526020017f646562742d72656769737472792d6564697400000000000000000000000000008152506006611a3d9092919063ffffffff16565b50565b6000610bc7336006611c1990919063ffffffff16565b1515610bd257600080fd5b600060149054906101000a900460ff16151515610bee57600080fd5b82610bf8816111d3565b1515610c0357600080fd5b82600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610c4057600080fd5b60016000866000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692508360016000876000191660001916815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1686600019167f7afbd1e661f2fdce6222afdac74cd28b1847177e232db3d0f0dcf3739e8d809460405160405180910390a45050505050565b600060149054906101000a900460ff1681565b610d5f61216e565b610d696003611c72565b905090565b60008082610d7b816111d3565b1515610d8657600080fd5b60016000856000191660001916815260200190815260200160002060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008660001916600019168152602001908152602001600020600501549250925050915091565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610e4957600080fd5b600060149054906101000a900460ff16151515610e6557600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b610eb6612182565b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015610f4357602002820191906000526020600020905b81546000191681526020019060010190808311610f2b575b50505050509050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6040805190810160405280601481526020017f646562742d72656769737472792d696e7365727400000000000000000000000081525081565b600080600080600080600060016000896000191660001916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008a6000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008b6000191660001916815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008c6000191660001916815260200190815260200160002060030154600160008d6000191660001916815260200190815260200160002060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008e6000191660001916815260200190815260200160002060050154600160008f60001916600019168152602001908152602001600020600601549650965096509650965096509650919395979092949650565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561118557600080fd5b6111d0816040805190810160405280601281526020017f646562742d72656769737472792d6564697400000000000000000000000000008152506006611d0a9092919063ffffffff16565b50565b60008073ffffffffffffffffffffffffffffffffffffffff1660016000846000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156112a557600080fd5b6112f0816040805190810160405280601481526020017f646562742d72656769737472792d696e736572740000000000000000000000008152506003611a3d9092919063ffffffff16565b50565b6000816112ff816111d3565b151561130a57600080fd5b60016000846000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156113ac57600080fd5b6113f7816040805190810160405280601481526020017f646562742d72656769737472792d696e736572740000000000000000000000008152506003611d0a9092919063ffffffff16565b50565b6000611404612196565b600061141a336003611c1990919063ffffffff16565b151561142557600080fd5b600060149054906101000a900460ff1615151561144157600080fd5b89600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561147e57600080fd5b60e0604051908101604052808d73ffffffffffffffffffffffffffffffffffffffff1681526020018c73ffffffffffffffffffffffffffffffffffffffff1681526020018a73ffffffffffffffffffffffffffffffffffffffff1681526020018981526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018760001916815260200142815250925061151b838b87612000565b9150600073ffffffffffffffffffffffffffffffffffffffff1660016000846000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561159657600080fd5b8260016000846000191660001916815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506060820151816003015560808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060a0820151816005019060001916905560c08201518160060155905050600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806001018281611746919061222f565b916000526020600020900160008490919091509060001916905550826040015173ffffffffffffffffffffffffffffffffffffffff16836020015173ffffffffffffffffffffffffffffffffffffffff1683600019167f10919d8a6bfbd0c46213ad51d6258e42af00bbf36133aada8a058bbe4f4a9240866060015187608001518860a00151604051808481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018260001916600019168152602001935050505060405180910390a481935050505098975050505050505050565b600081611841816111d3565b151561184c57600080fd5b60016000846000191660001916815260200190815260200160002060060154915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156118ce57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561190a57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000816119d4816111d3565b15156119df57600080fd5b60016000846000191660001916815260200190815260200160002060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b611a2e61216e565b611a386006611c72565b905090565b611a478383612159565b1515611a5257600080fd5b60018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550826002018054806001018281611ac2919061225b565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060018360020180549050038360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f571925c699f9072cec76b6c6c000571cc8d0bb5c47e5819202e2e9496c6508b5826040518080602001828103825283818151815260200191508051906020019080838360005b83811015611bda578082015181840152602081019050611bbf565b50505050905090810190601f168015611c075780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c7a61216e565b81600201805480602002602001604051908101604052809291908181526020018280548015611cfe57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611cb4575b50505050509050919050565b6000806000611d198686611c19565b1515611d2457600080fd5b8560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600186600201805490500391508560020182815481101515611d8657fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055808660020184815481101515611e1757fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090558560020182815481101515611efc57fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018660020181818054905003915081611f449190612287565b508473ffffffffffffffffffffffffffffffffffffffff167f0814e4ee85854cea446b4a27a460e5ffb41516230dbc02f226c07907e432241c856040518080602001828103825283818151815260200191508051906020019080838360005b83811015611fbe578082015181840152602081019050611fa3565b50505050905090810190601f168015611feb5780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050505050565b60008360000151838560400151866060015187608001518860a0015187604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018360001916600019168152602001828152602001975050505050505050604051809103902090509392505050565b60006121658383611c19565b15905092915050565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b60e060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008019168152602001600081525090565b8154818355818115116122565781836000526020600020918201910161225591906122b3565b5b505050565b8154818355818115116122825781836000526020600020918201910161228191906122d8565b5b505050565b8154818355818115116122ae578183600052602060002091820191016122ad91906122d8565b5b505050565b6122d591905b808211156122d15760008160009055506001016122b9565b5090565b90565b6122fa91905b808211156122f65760008160009055506001016122de565b5090565b905600a165627a7a723058201d2cee182d625af198fe8ab8069834713ceab1956303b72b02b2a75c642ebdf60029", + "deployedBytecode": "0x606060405260043610610133576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632be84c6614610138578063314a522e146101c65780633f4ba83a1461020957806342cc6b041461021e5780635969549e146102575780635c975abb1461029d57806364a666f2146102ca5780636be39bda146103345780638456cb59146103aa5780638ad1d846146103bf5780638da5cb5b1461044d5780638dadc81d146104a25780638eaa6ac014610530578063932993951461064d5780639758af1e14610686578063ad655998146106c5578063ba20dda4146106fe578063c205e64c14610765578063cf9df5eb1461079e578063d69dbf631461088e578063f2fde38b146108c9578063f6f494c914610902578063f94df67814610969575b600080fd5b341561014357600080fd5b61014b6109d3565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561018b578082015181840152602081019050610170565b50505050905090810190601f1680156101b85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101d157600080fd5b6101eb600480803560001916906020019091905050610a0c565b60405180826000191660001916815260200191505060405180910390f35b341561021457600080fd5b61021c610a4a565b005b341561022957600080fd5b610255600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b08565b005b341561026257600080fd5b61029b60048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610bb1565b005b34156102a857600080fd5b6102b0610d44565b604051808215151515815260200191505060405180910390f35b34156102d557600080fd5b6102dd610d57565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610320578082015181840152602081019050610305565b505050509050019250505060405180910390f35b341561033f57600080fd5b610359600480803560001916906020019091905050610d6e565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182600019166000191681526020019250505060405180910390f35b34156103b557600080fd5b6103bd610dee565b005b34156103ca57600080fd5b6103f6600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610eae565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561043957808201518184015260208101905061041e565b505050509050019250505060405180910390f35b341561045857600080fd5b610460610f4f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104ad57600080fd5b6104b5610f74565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104f55780820151818401526020810190506104da565b50505050905090810190601f1680156105225780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561053b57600080fd5b610555600480803560001916906020019091905050610fad565b604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001836000191660001916815260200182815260200197505050505050505060405180910390f35b341561065857600080fd5b610684600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061112a565b005b341561069157600080fd5b6106ab6004808035600019169060200190919050506111d3565b604051808215151515815260200191505060405180910390f35b34156106d057600080fd5b6106fc600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061124a565b005b341561070957600080fd5b6107236004808035600019169060200190919050506112f3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561077057600080fd5b61079c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611351565b005b34156107a957600080fd5b610870600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035600019169060200190919080359060200190919050506113fa565b60405180826000191660001916815260200191505060405180910390f35b341561089957600080fd5b6108b3600480803560001916906020019091905050611835565b6040518082815260200191505060405180910390f35b34156108d457600080fd5b610900600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611873565b005b341561090d57600080fd5b6109276004808035600019169060200190919050506119c8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561097457600080fd5b61097c611a26565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156109bf5780820151818401526020810190506109a4565b505050509050019250505060405180910390f35b6040805190810160405280601281526020017f646562742d72656769737472792d65646974000000000000000000000000000081525081565b600081610a18816111d3565b1515610a2357600080fd5b60016000846000191660001916815260200190815260200160002060050154915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610aa557600080fd5b600060149054906101000a900460ff161515610ac057600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610b6357600080fd5b610bae816040805190810160405280601281526020017f646562742d72656769737472792d6564697400000000000000000000000000008152506006611a3d9092919063ffffffff16565b50565b6000610bc7336006611c1990919063ffffffff16565b1515610bd257600080fd5b600060149054906101000a900460ff16151515610bee57600080fd5b82610bf8816111d3565b1515610c0357600080fd5b82600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610c4057600080fd5b60016000866000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692508360016000876000191660001916815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1686600019167f7afbd1e661f2fdce6222afdac74cd28b1847177e232db3d0f0dcf3739e8d809460405160405180910390a45050505050565b600060149054906101000a900460ff1681565b610d5f61216e565b610d696003611c72565b905090565b60008082610d7b816111d3565b1515610d8657600080fd5b60016000856000191660001916815260200190815260200160002060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008660001916600019168152602001908152602001600020600501549250925050915091565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610e4957600080fd5b600060149054906101000a900460ff16151515610e6557600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b610eb6612182565b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015610f4357602002820191906000526020600020905b81546000191681526020019060010190808311610f2b575b50505050509050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6040805190810160405280601481526020017f646562742d72656769737472792d696e7365727400000000000000000000000081525081565b600080600080600080600060016000896000191660001916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008a6000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008b6000191660001916815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008c6000191660001916815260200190815260200160002060030154600160008d6000191660001916815260200190815260200160002060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008e6000191660001916815260200190815260200160002060050154600160008f60001916600019168152602001908152602001600020600601549650965096509650965096509650919395979092949650565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561118557600080fd5b6111d0816040805190810160405280601281526020017f646562742d72656769737472792d6564697400000000000000000000000000008152506006611d0a9092919063ffffffff16565b50565b60008073ffffffffffffffffffffffffffffffffffffffff1660016000846000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156112a557600080fd5b6112f0816040805190810160405280601481526020017f646562742d72656769737472792d696e736572740000000000000000000000008152506003611a3d9092919063ffffffff16565b50565b6000816112ff816111d3565b151561130a57600080fd5b60016000846000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156113ac57600080fd5b6113f7816040805190810160405280601481526020017f646562742d72656769737472792d696e736572740000000000000000000000008152506003611d0a9092919063ffffffff16565b50565b6000611404612196565b600061141a336003611c1990919063ffffffff16565b151561142557600080fd5b600060149054906101000a900460ff1615151561144157600080fd5b89600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561147e57600080fd5b60e0604051908101604052808d73ffffffffffffffffffffffffffffffffffffffff1681526020018c73ffffffffffffffffffffffffffffffffffffffff1681526020018a73ffffffffffffffffffffffffffffffffffffffff1681526020018981526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018760001916815260200142815250925061151b838b87612000565b9150600073ffffffffffffffffffffffffffffffffffffffff1660016000846000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561159657600080fd5b8260016000846000191660001916815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506060820151816003015560808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060a0820151816005019060001916905560c08201518160060155905050600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806001018281611746919061222f565b916000526020600020900160008490919091509060001916905550826040015173ffffffffffffffffffffffffffffffffffffffff16836020015173ffffffffffffffffffffffffffffffffffffffff1683600019167f10919d8a6bfbd0c46213ad51d6258e42af00bbf36133aada8a058bbe4f4a9240866060015187608001518860a00151604051808481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018260001916600019168152602001935050505060405180910390a481935050505098975050505050505050565b600081611841816111d3565b151561184c57600080fd5b60016000846000191660001916815260200190815260200160002060060154915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156118ce57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561190a57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000816119d4816111d3565b15156119df57600080fd5b60016000846000191660001916815260200190815260200160002060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b611a2e61216e565b611a386006611c72565b905090565b611a478383612159565b1515611a5257600080fd5b60018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550826002018054806001018281611ac2919061225b565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060018360020180549050038360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f571925c699f9072cec76b6c6c000571cc8d0bb5c47e5819202e2e9496c6508b5826040518080602001828103825283818151815260200191508051906020019080838360005b83811015611bda578082015181840152602081019050611bbf565b50505050905090810190601f168015611c075780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c7a61216e565b81600201805480602002602001604051908101604052809291908181526020018280548015611cfe57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611cb4575b50505050509050919050565b6000806000611d198686611c19565b1515611d2457600080fd5b8560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600186600201805490500391508560020182815481101515611d8657fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055808660020184815481101515611e1757fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090558560020182815481101515611efc57fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018660020181818054905003915081611f449190612287565b508473ffffffffffffffffffffffffffffffffffffffff167f0814e4ee85854cea446b4a27a460e5ffb41516230dbc02f226c07907e432241c856040518080602001828103825283818151815260200191508051906020019080838360005b83811015611fbe578082015181840152602081019050611fa3565b50505050905090810190601f168015611feb5780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050505050565b60008360000151838560400151866060015187608001518860a0015187604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018360001916600019168152602001828152602001975050505050505050604051809103902090509392505050565b60006121658383611c19565b15905092915050565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b60e060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008019168152602001600081525090565b8154818355818115116122565781836000526020600020918201910161225591906122b3565b5b505050565b8154818355818115116122825781836000526020600020918201910161228191906122d8565b5b505050565b8154818355818115116122ae578183600052602060002091820191016122ad91906122d8565b5b505050565b6122d591905b808211156122d15760008160009055506001016122b9565b5090565b90565b6122fa91905b808211156122f65760008160009055506001016122de565b5090565b905600a165627a7a723058201d2cee182d625af198fe8ab8069834713ceab1956303b72b02b2a75c642ebdf60029", "sourceMap": "1124:8996:4:-;;;268:5:37;247:26;;;;;;;;;;;;;;;;;;;;509:10:39;501:5;;:18;;;;;;;;;;;;;;;;;;1124:8996:4;;;;;;", "deployedSourceMap": "1124:8996:4:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1975:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7833:221:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;833:87:37;;;;;;;;;;;;;;5634:152:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;4712:495;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;247:26:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8885:164:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;8179:284:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;666:85:37;;;;;;;;;;;;;;9457:145:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;238:20:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1907:62:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6659:533:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6239:168;;;;;;;;;;;;;;;;;;;;;;;;;;;;3027:178;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5336:158;;;;;;;;;;;;;;;;;;;;;;;;;;;;7265:196;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5920:174;;;;;;;;;;;;;;;;;;;;;;;;;;;;3371:1170;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8565:226;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;832:169:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;7545:201:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9154:160;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;1975:58:4;;;;;;;;;;;;;;;;;;;;:::o;7833:221::-;7972:7;7942:11;2766:27;2781:11;2766:14;:27::i;:::-;2758:36;;;;;;;;8002:8;:21;8011:11;8002:21;;;;;;;;;;;;;;;;;:45;;;7995:52;;7833:221;;;;:::o;833:87:37:-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;568:6:37;;;;;;;;;;;560:15;;;;;;;;895:5;886:6;;:14;;;;;;;;;;;;;;;;;;906:9;;;;;;;;;;833:87::o;5634:152:4:-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;5728:51:4;5759:5;5766:12;;;;;;;;;;;;;;;;;;5728:20;:30;;:51;;;;;:::i;:::-;5634:152;:::o;4712:495::-;4944:27;2632:45;2666:10;2632:20;:33;;:45;;;;:::i;:::-;2624:54;;;;;;;;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;4874:11:4;2766:27;2781:11;2766:14;:27::i;:::-;2758:36;;;;;;;;4914:14;2908:1;2885:25;;:11;:25;;;;2877:34;;;;;;;;4974:8;:21;4983:11;4974:21;;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;4944:63;;5054:14;5018:8;:21;5027:11;5018:21;;;;;;;;;;;;;;;;;:33;;;:50;;;;;;;;;;;;;;;;;;5176:14;5079:121;;5143:19;5079:121;;5118:11;5079:121;;;;;;;;;;;;;2804:1;429::37;4712:495:4;;;:::o;247:26:37:-;;;;;;;;;;;;;:::o;8885:164:4:-;8966:9;;:::i;:::-;8998:44;:22;:42;:44::i;:::-;8991:51;;8885:164;:::o;8179:284::-;8299:7;8308;8270:11;2766:27;2781:11;2766:14;:27::i;:::-;2758:36;;;;;;;;8352:8;:21;8361:11;8352:21;;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;8401:8;:21;8410:11;8401:21;;;;;;;;;;;;;;;;;:45;;;8331:125;;;;8179:284;;;;:::o;666:85:37:-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;729:4;720:6;;:13;;;;;;;;;;;;;;;;;;739:7;;;;;;;;;;666:85::o;9457:145:4:-;9542:9;;:::i;:::-;9574:13;:21;9588:6;9574:21;;;;;;;;;;;;;;;9567:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9457:145;;;:::o;238:20:39:-;;;;;;;;;;;;;:::o;1907:62:4:-;;;;;;;;;;;;;;;;;;;;:::o;6659:533::-;6737:7;6746;6755;6764:4;6770:7;6779;6788:4;6829:8;:21;6838:11;6829:21;;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;6872:8;:21;6881:11;6872:21;;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;6919:8;:21;6928:11;6919:21;;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;6966:8;:21;6975:11;6966:21;;;;;;;;;;;;;;;;;:43;;;7023:8;:21;7032:11;7023:21;;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;7072:8;:21;7081:11;7072:21;;;;;;;;;;;;;;;;;:45;;;7131:8;:21;7140:11;7131:21;;;;;;;;;;;;;;;;;:44;;;6808:377;;;;;;;;;;;;;;6659:533;;;;;;;;;:::o;6239:168::-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;6339:61:4;6380:5;6387:12;;;;;;;;;;;;;;;;;;6339:20;:40;;:61;;;;;:::i;:::-;6239:168;:::o;3027:178::-;3117:11;3196:1;3151:47;;:8;:21;3160:11;3151:21;;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;:47;;;;3144:54;;3027:178;;;:::o;5336:158::-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;5432:55:4;5465:5;5472:14;;;;;;;;;;;;;;;;;;5432:22;:32;;:55;;;;;:::i;:::-;5336:158;:::o;7265:196::-;7391:7;7362:11;2766:27;2781:11;2766:14;:27::i;:::-;2758:36;;;;;;;;7421:8;:21;7430:11;7421:21;;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;7414:40;;7265:196;;;;:::o;5920:174::-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;6022:65:4;6065:5;6072:14;;;;;;;;;;;;;;;;;;6022:22;:42;;:65;;;;;:::i;:::-;5920:174;:::o;3371:1170::-;3761:20;3797:18;;:::i;:::-;4049:19;2510:47;2546:10;2510:22;:35;;:47;;;;:::i;:::-;2502:56;;;;;;;;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;3730:12:4;2908:1;2885:25;;:11;:25;;;;2877:34;;;;;;;;3818:220;;;;;;;;;3837:8;3818:220;;;;;;3859:12;3818:220;;;;;;3885:12;3818:220;;;;;;3911:22;3818:220;;;;3947:14;3818:220;;;;;;3975:24;3818:220;;;;;;;4013:15;3818:220;;;3797:241;;4071:38;4087:5;4094:7;4103:5;4071:15;:38::i;:::-;4049:60;;4173:1;4128:47;;:8;:21;4137:11;4128:21;;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;:47;;;4120:56;;;;;;;;4211:5;4187:8;:21;4196:11;4187:21;;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4226:13;:22;4240:7;4226:22;;;;;;;;;;;;;;;:40;;;;;;;;;;;:::i;:::-;;;;;;;;;;4254:11;4226:40;;;;;;;;;;;;4361:5;:17;;;4277:228;;4330:5;:17;;;4277:228;;4305:11;4277:228;;;;4392:5;:27;;;4433:5;:19;;;4466:5;:29;;;4277:228;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4523:11;4516:18;;429:1:37;3371:1170:4;;;;;;;;;;;;:::o;8565:226::-;8703:14;8673:11;2766:27;2781:11;2766:14;:27::i;:::-;2758:36;;;;;;;;8740:8;:21;8749:11;8740:21;;;;;;;;;;;;;;;;;:44;;;8733:51;;8565:226;;;;:::o;832:169:39:-;653:5;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;928:1;908:22;;:8;:22;;;;900:31;;;;;;;;965:8;937:37;;958:5;;;;;;;;;;;937:37;;;;;;;;;;;;988:8;980:5;;:16;;;;;;;;;;;;;;;;;;832:169;:::o;7545:201:4:-;7674:7;7644:11;2766:27;2781:11;2766:14;:27::i;:::-;2758:36;;;;;;;;7704:8;:21;7713:11;7704:21;;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;7697:42;;7545:201;;;;:::o;9154:160::-;9233:9;;:::i;:::-;9265:42;:20;:40;:42::i;:::-;9258:49;;9154:160;:::o;1732:383:17:-;1884:28;1900:4;1906:5;1884:15;:28::i;:::-;1876:37;;;;;;;;1949:4;1924;:15;;:22;1940:5;1924:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;1963:4;:21;;:33;;;;;;;;;;;:::i;:::-;;;;;;;;;;1990:5;1963:33;;;;;;;;;;;;;;;;;;;;;;;2064:1;2033:4;:21;;:28;;;;:32;2006:4;:17;;:24;2024:5;2006:24;;;;;;;;;;;;;;;:59;;;;2086:5;2075:33;;;2093:14;2075:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1732:383:17;;;:::o;3295:166::-;3405:4;3432;:15;;:22;3448:5;3432:22;;;;;;;;;;;;;;;;;;;;;;;;;3425:29;;3295:166;;;;:::o;3646:162::-;3748:9;;:::i;:::-;3780:4;:21;;3773:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3646:162;;;:::o;2121:1168::-;2489:25;2551:23;2619:19;2452:25;2465:4;2471:5;2452:12;:25::i;:::-;2444:34;;;;;;;;2517:4;:17;;:24;2535:5;2517:24;;;;;;;;;;;;;;;;2489:52;;2608:1;2577:4;:21;;:28;;;;:32;2551:58;;2641:4;:21;;2663:18;2641:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;2619:63;;2745:4;:15;;:22;2761:5;2745:22;;;;;;;;;;;;;;;;2738:29;;;;;;;;;;;2894:11;2848:4;:21;;2870:20;2848:43;;;;;;;;;;;;;;;;;;;:57;;;;;;;;;;;;;;;;;;3009:20;2976:4;:17;;:30;2994:11;2976:30;;;;;;;;;;;;;;;:53;;;;3046:4;:17;;:24;3064:5;3046:24;;;;;;;;;;;;;;;3039:31;;;3144:4;:21;;3166:18;3144:41;;;;;;;;;;;;;;;;;;;3137:48;;;;;;;;;;;3227:1;3195:4;:21;;:33;;;;;;;;;;;;;;:::i;:::-;;3260:5;3239:43;;;3267:14;3239:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2121:1168:17;;;;;;:::o;9728:390:4:-;9842:7;9895:6;:14;;;9923:7;9944:6;:18;;;9976:6;:28;;;10018:6;:20;;;10052:6;:30;;;10096:5;9872:239;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9865:246;;9728:390;;;;;:::o;3467:173:17:-;3580:4;3608:25;3621:4;3627:5;3608:12;:25::i;:::-;3607:26;3600:33;;3467:173;;;;:::o;1124:8996:4:-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\nimport { PermissionsLib, PermissionEvents } from \"./libraries/PermissionsLib.sol\";\nimport \"zeppelin-solidity/contracts/math/SafeMath.sol\";\nimport \"zeppelin-solidity/contracts/lifecycle/Pausable.sol\";\n\n\n/**\n * The DebtRegistry stores the parameters and beneficiaries of all debt agreements in\n * Dharma protocol. It authorizes a limited number of agents to\n * perform mutations on it -- those agents can be changed at any\n * time by the contract's owner.\n *\n * Author: Nadav Hollander -- Github: nadavhollander\n */\ncontract DebtRegistry is Pausable, PermissionEvents {\n using SafeMath for uint;\n using PermissionsLib for PermissionsLib.Permissions;\n\n struct Entry {\n address version;\n address beneficiary;\n address underwriter;\n uint underwriterRiskRating;\n address termsContract;\n bytes32 termsContractParameters;\n uint issuanceBlockTimestamp;\n }\n\n // Primary registry mapping agreement IDs to their corresponding entries\n mapping (bytes32 => Entry) internal registry;\n\n // Maps debtor addresses to a list of their debts' agreement IDs\n mapping (address => bytes32[]) internal debtorToDebts;\n\n PermissionsLib.Permissions internal entryInsertPermissions;\n PermissionsLib.Permissions internal entryEditPermissions;\n\n string public constant INSERT_CONTEXT = \"debt-registry-insert\";\n string public constant EDIT_CONTEXT = \"debt-registry-edit\";\n\n event LogInsertEntry(\n bytes32 indexed agreementId,\n address indexed beneficiary,\n address indexed underwriter,\n uint underwriterRiskRating,\n address termsContract,\n bytes32 termsContractParameters\n );\n\n event LogModifyEntryBeneficiary(\n bytes32 indexed agreementId,\n address indexed previousBeneficiary,\n address indexed newBeneficiary\n );\n\n modifier onlyAuthorizedToInsert() {\n require(entryInsertPermissions.isAuthorized(msg.sender));\n _;\n }\n\n modifier onlyAuthorizedToEdit() {\n require(entryEditPermissions.isAuthorized(msg.sender));\n _;\n }\n\n modifier onlyExtantEntry(bytes32 agreementId) {\n require(doesEntryExist(agreementId));\n _;\n }\n\n modifier nonNullBeneficiary(address beneficiary) {\n require(beneficiary != address(0));\n _;\n }\n\n /* Ensures an entry with the specified agreement ID exists within the debt registry. */\n function doesEntryExist(bytes32 agreementId)\n public\n view\n returns (bool exists)\n {\n return registry[agreementId].beneficiary != address(0);\n }\n\n /**\n * Inserts a new entry into the registry, if the entry is valid and sender is\n * authorized to make 'insert' mutations to the registry.\n */\n function insert(\n address _version,\n address _beneficiary,\n address _debtor,\n address _underwriter,\n uint _underwriterRiskRating,\n address _termsContract,\n bytes32 _termsContractParameters,\n uint _salt\n )\n public\n onlyAuthorizedToInsert\n whenNotPaused\n nonNullBeneficiary(_beneficiary)\n returns (bytes32 _agreementId)\n {\n Entry memory entry = Entry(\n _version,\n _beneficiary,\n _underwriter,\n _underwriterRiskRating,\n _termsContract,\n _termsContractParameters,\n block.timestamp\n );\n\n bytes32 agreementId = _getAgreementId(entry, _debtor, _salt);\n\n require(registry[agreementId].beneficiary == address(0));\n\n registry[agreementId] = entry;\n debtorToDebts[_debtor].push(agreementId);\n\n LogInsertEntry(\n agreementId,\n entry.beneficiary,\n entry.underwriter,\n entry.underwriterRiskRating,\n entry.termsContract,\n entry.termsContractParameters\n );\n\n return agreementId;\n }\n\n /**\n * Modifies the beneficiary of a debt issuance, if the sender\n * is authorized to make 'modifyBeneficiary' mutations to\n * the registry.\n */\n function modifyBeneficiary(bytes32 agreementId, address newBeneficiary)\n public\n onlyAuthorizedToEdit\n whenNotPaused\n onlyExtantEntry(agreementId)\n nonNullBeneficiary(newBeneficiary)\n {\n address previousBeneficiary = registry[agreementId].beneficiary;\n\n registry[agreementId].beneficiary = newBeneficiary;\n\n LogModifyEntryBeneficiary(\n agreementId,\n previousBeneficiary,\n newBeneficiary\n );\n }\n\n /**\n * Adds an address to the list of agents authorized\n * to make 'insert' mutations to the registry.\n */\n function addAuthorizedInsertAgent(address agent)\n public\n onlyOwner\n {\n entryInsertPermissions.authorize(agent, INSERT_CONTEXT);\n }\n\n /**\n * Adds an address to the list of agents authorized\n * to make 'modifyBeneficiary' mutations to the registry.\n */\n function addAuthorizedEditAgent(address agent)\n public\n onlyOwner\n {\n entryEditPermissions.authorize(agent, EDIT_CONTEXT);\n }\n\n /**\n * Removes an address from the list of agents authorized\n * to make 'insert' mutations to the registry.\n */\n function revokeInsertAgentAuthorization(address agent)\n public\n onlyOwner\n {\n entryInsertPermissions.revokeAuthorization(agent, INSERT_CONTEXT);\n }\n\n /**\n * Removes an address from the list of agents authorized\n * to make 'modifyBeneficiary' mutations to the registry.\n */\n function revokeEditAgentAuthorization(address agent)\n public\n onlyOwner\n {\n entryEditPermissions.revokeAuthorization(agent, EDIT_CONTEXT);\n }\n\n /**\n * Returns the parameters of a debt issuance in the registry.\n *\n * TODO(kayvon): protect this function with our `onlyExtantEntry` modifier once the restriction\n * on the size of the call stack has been addressed.\n */\n function get(bytes32 agreementId)\n public\n view\n returns(address, address, address, uint, address, bytes32, uint)\n {\n return (\n registry[agreementId].version,\n registry[agreementId].beneficiary,\n registry[agreementId].underwriter,\n registry[agreementId].underwriterRiskRating,\n registry[agreementId].termsContract,\n registry[agreementId].termsContractParameters,\n registry[agreementId].issuanceBlockTimestamp\n );\n }\n\n /**\n * Returns the beneficiary of a given issuance\n */\n function getBeneficiary(bytes32 agreementId)\n public\n view\n onlyExtantEntry(agreementId)\n returns(address)\n {\n return registry[agreementId].beneficiary;\n }\n\n /**\n * Returns the terms contract address of a given issuance\n */\n function getTermsContract(bytes32 agreementId)\n public\n view\n onlyExtantEntry(agreementId)\n returns (address)\n {\n return registry[agreementId].termsContract;\n }\n\n /**\n * Returns the terms contract parameters of a given issuance\n */\n function getTermsContractParameters(bytes32 agreementId)\n public\n view\n onlyExtantEntry(agreementId)\n returns (bytes32)\n {\n return registry[agreementId].termsContractParameters;\n }\n\n /**\n * Returns a tuple of the terms contract and its associated parameters\n * for a given issuance\n */\n function getTerms(bytes32 agreementId)\n public\n view\n onlyExtantEntry(agreementId)\n returns(address, bytes32)\n {\n return (\n registry[agreementId].termsContract,\n registry[agreementId].termsContractParameters\n );\n }\n\n /**\n * Returns the timestamp of the block at which a debt agreement was issued.\n */\n function getIssuanceBlockTimestamp(bytes32 agreementId)\n public\n view\n onlyExtantEntry(agreementId)\n returns (uint timestamp)\n {\n return registry[agreementId].issuanceBlockTimestamp;\n }\n\n /**\n * Returns the list of agents authorized to make 'insert' mutations\n */\n function getAuthorizedInsertAgents()\n public\n view\n returns(address[])\n {\n return entryInsertPermissions.getAuthorizedAgents();\n }\n\n /**\n * Returns the list of agents authorized to make 'modifyBeneficiary' mutations\n */\n function getAuthorizedEditAgents()\n public\n view\n returns(address[])\n {\n return entryEditPermissions.getAuthorizedAgents();\n }\n\n /**\n * Returns the list of debt agreements a debtor is party to,\n * with each debt agreement listed by agreement ID.\n */\n function getDebtorsDebts(address debtor)\n public\n view\n returns(bytes32[])\n {\n return debtorToDebts[debtor];\n }\n\n /**\n * Helper function for computing the hash of a given issuance,\n * and, in turn, its agreementId\n */\n function _getAgreementId(Entry _entry, address _debtor, uint _salt)\n internal\n pure\n returns(bytes32)\n {\n return keccak256(\n _entry.version,\n _debtor,\n _entry.underwriter,\n _entry.underwriterRiskRating,\n _entry.termsContract,\n _entry.termsContractParameters,\n _salt\n );\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/DebtRegistry.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/DebtRegistry.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/DebtRegistry.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/DebtRegistry.sol", "exportedSymbols": { "DebtRegistry": [ 3158 @@ -572,7 +572,7 @@ { "attributes": { "SourceUnit": 6272, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/libraries/PermissionsLib.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/libraries/PermissionsLib.sol", "file": "./libraries/PermissionsLib.sol", "scope": 3159, "symbolAliases": [ @@ -7984,7 +7984,7 @@ } }, "links": {}, - "address": "0x2bfd08581121530eba6b86eda5b2932bea8117d9" + "address": "0x0db51854d2b302e35d8f0f7a4fabb2415f9e42a5" }, "70": { "events": { @@ -8164,5 +8164,5 @@ } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:15:01.319Z" + "updatedAt": "2018-10-09T17:51:53.167Z" } \ No newline at end of file diff --git a/artifacts/json/DebtToken.json b/artifacts/json/DebtToken.json index 931b8738..6ac71369 100644 --- a/artifacts/json/DebtToken.json +++ b/artifacts/json/DebtToken.json @@ -738,15 +738,15 @@ "type": "event" } ], - "bytecode": "0x60606040526000600b60146101000a81548160ff02191690831515021790555034156200002b57600080fd5b60405160208062003823833981016040528080519060200190919050506040805190810160405280600981526020017f44656274546f6b656e00000000000000000000000000000000000000000000008152506040805190810160405280600381526020017f44445400000000000000000000000000000000000000000000000000000000008152508160049080519060200190620000cc92919062000171565b508060059080519060200190620000e592919062000171565b50505033600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505062000220565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620001b457805160ff1916838001178555620001e5565b82800160010185558215620001e5579182015b82811115620001e4578251825591602001919060010190620001c7565b5b509050620001f49190620001f8565b5090565b6200021d91905b8082111562000219576000816000905550600101620001ff565b5090565b90565b6135f380620002306000396000f3006060604052600436106101ab576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168062b0aeae146101b057806301ffc9a7146101e95780630343e1221461024357806306fdde03146102ad578063081812fc1461033b578063095ea7b31461039e578063162094c4146103e057806318160ddd146104465780631fe23d7f1461046f57806321d37127146104fd57806323b872dd146105675780632f745c59146105c857806333d261771461061e5780633f4ba83a1461065757806342842e0e1461066c5780634f558e79146106cd5780634f6ccce7146107085780635c975abb1461073f5780636352211e1461076c57806370a08231146107cf5780637b1039991461081c57806381ac3fbc146108715780638456cb59146108aa5780638da5cb5b146108bf57806395d89b411461091457806399f10501146109a25780639c0d9c4314610a8a578063a22cb46514610ac3578063a9059cbb14610b07578063b5c2f7ea14610b49578063b88d4fde14610bd7578063c87b56dd14610c7b578063e985e9c514610d17578063f2fde38b14610d87575b600080fd5b34156101bb57600080fd5b6101e7600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610dc0565b005b34156101f457600080fd5b61022960048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050610e6a565b604051808215151515815260200191505060405180910390f35b341561024e57600080fd5b610256610eb8565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561029957808201518184015260208101905061027e565b505050509050019250505060405180910390f35b34156102b857600080fd5b6102c0610ecf565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103005780820151818401526020810190506102e5565b50505050905090810190601f16801561032d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561034657600080fd5b61035c6004808035906020019091905050610f77565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103a957600080fd5b6103de600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610fb4565b005b34156103eb57600080fd5b610444600480803590602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610fde565b005b341561045157600080fd5b610459611027565b6040518082815260200191505060405180910390f35b341561047a57600080fd5b610482611034565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104c25780820151818401526020810190506104a7565b50505050905090810190601f1680156104ef5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561050857600080fd5b61051061106d565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610553578082015181840152602081019050610538565b505050509050019250505060405180910390f35b341561057257600080fd5b6105c6600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611084565b005b34156105d357600080fd5b610608600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506110ba565b6040518082815260200191505060405180910390f35b341561062957600080fd5b610655600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611132565b005b341561066257600080fd5b61066a6111dc565b005b341561067757600080fd5b6106cb600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061129c565b005b34156106d857600080fd5b6106ee60048080359060200190919050506112d2565b604051808215151515815260200191505060405180910390f35b341561071357600080fd5b6107296004808035906020019091905050611343565b6040518082815260200191505060405180910390f35b341561074a57600080fd5b61075261137c565b604051808215151515815260200191505060405180910390f35b341561077757600080fd5b61078d600480803590602001909190505061138f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156107da57600080fd5b610806600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061140c565b6040518082815260200191505060405180910390f35b341561082757600080fd5b61082f611490565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561087c57600080fd5b6108a8600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506114b6565b005b34156108b557600080fd5b6108bd611560565b005b34156108ca57600080fd5b6108d2611621565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561091f57600080fd5b610927611647565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561096757808201518184015260208101905061094c565b50505050905090810190601f1680156109945780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156109ad57600080fd5b610a74600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035600019169060200190919080359060200190919050506116ef565b6040518082815260200191505060405180910390f35b3415610a9557600080fd5b610ac1600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611921565b005b3415610ace57600080fd5b610b05600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803515159060200190919050506119cb565b005b3415610b1257600080fd5b610b47600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506119f5565b005b3415610b5457600080fd5b610b5c611a04565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610b9c578082015181840152602081019050610b81565b50505050905090810190601f168015610bc95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610be257600080fd5b610c79600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611a3d565b005b3415610c8657600080fd5b610c9c6004808035906020019091905050611a75565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610cdc578082015181840152602081019050610cc1565b50505050905090810190601f168015610d095780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610d2257600080fd5b610d6d600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611b44565b604051808215151515815260200191505060405180910390f35b3415610d9257600080fd5b610dbe600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611bd8565b005b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610e1c57600080fd5b610e67816040805190810160405280600e81526020017f646562742d746f6b656e2d7572690000000000000000000000000000000000008152506010611d309092919063ffffffff16565b50565b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610ec061344a565b610eca600d612026565b905090565b610ed761345e565b60048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f6d5780601f10610f4257610100808354040283529160200191610f6d565b820191906000526020600020905b815481529060010190602001808311610f5057829003601f168201915b5050505050905090565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600b60149054906101000a900460ff16151515610fd057600080fd5b610fda82826120be565b5050565b600b60149054906101000a900460ff16151515610ffa57600080fd5b61100e33601061228490919063ffffffff16565b151561101957600080fd5b61102382826122dd565b5050565b6000600880549050905090565b6040805190810160405280601381526020017f646562742d746f6b656e2d6372656174696f6e0000000000000000000000000081525081565b61107561344a565b61107f6010612026565b905090565b600b60149054906101000a900460ff161515156110a057600080fd5b6110aa818361231d565b6110b58383836124f8565b505050565b60006110c58361140c565b821015156110d257600080fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110151561111e57fe5b906000526020600020900154905092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561118e57600080fd5b6111d9816040805190810160405280600e81526020017f646562742d746f6b656e2d757269000000000000000000000000000000000000815250601061260f9092919063ffffffff16565b50565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561123857600080fd5b600b60149054906101000a900460ff16151561125357600080fd5b6000600b60146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b600b60149054906101000a900460ff161515156112b857600080fd5b6112c2818361231d565b6112cd8383836127eb565b505050565b60008060008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b600061134d611027565b8210151561135a57600080fd5b60088281548110151561136957fe5b9060005260206000209001549050919050565b600b60149054906101000a900460ff1681565b60008060008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561140357600080fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561144957600080fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561151257600080fd5b61155d816040805190810160405280601381526020017f646562742d746f6b656e2d6372656174696f6e00000000000000000000000000815250600d611d309092919063ffffffff16565b50565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156115bc57600080fd5b600b60149054906101000a900460ff161515156115d857600080fd5b6001600b60146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61164f61345e565b60058054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116e55780601f106116ba576101008083540402835291602001916116e5565b820191906000526020600020905b8154815290600101906020018083116116c857829003601f168201915b5050505050905090565b600080600b60149054906101000a900460ff1615151561170e57600080fd5b61172233600d61228490919063ffffffff16565b151561172d57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cf9df5eb8b8b8b8b8b8b8b8b6000604051602001526040518963ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001836000191660001916815260200182815260200198505050505050505050602060405180830381600087803b15156118e257600080fd5b6102c65a03f115156118f357600080fd5b50505060405180519050905061190d898260019004612823565b806001900491505098975050505050505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561197d57600080fd5b6119c8816040805190810160405280601381526020017f646562742d746f6b656e2d6372656174696f6e00000000000000000000000000815250600d61260f9092919063ffffffff16565b50565b600b60149054906101000a900460ff161515156119e757600080fd5b6119f18282612877565b5050565b611a0033838361129c565b5050565b6040805190810160405280600e81526020017f646562742d746f6b656e2d75726900000000000000000000000000000000000081525081565b600b60149054906101000a900460ff16151515611a5957600080fd5b611a63828461231d565b611a6f848484846129b3565b50505050565b611a7d61345e565b611a86826112d2565b1515611a9157600080fd5b600a60008381526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b385780601f10611b0d57610100808354040283529160200191611b38565b820191906000526020600020905b815481529060010190602001808311611b1b57829003601f168201915b50505050509050919050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c3457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611c7057600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806000611d3f8686612284565b1515611d4a57600080fd5b8560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600186600201805490500391508560020182815481101515611dac57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055808660020184815481101515611e3d57fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090558560020182815481101515611f2257fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018660020181818054905003915081611f6a9190613472565b508473ffffffffffffffffffffffffffffffffffffffff167f0814e4ee85854cea446b4a27a460e5ffb41516230dbc02f226c07907e432241c856040518080602001828103825283818151815260200191508051906020019080838360005b83811015611fe4578082015181840152602081019050611fc9565b50505050905090810190601f1680156120115780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050505050565b61202e61344a565b816002018054806020026020016040519081016040528092919081815260200182805480156120b257602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612068575b50505050509050919050565b60006120c98261138f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561210657600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061214657506121458133611b44565b5b151561215157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff1661217283610f77565b73ffffffffffffffffffffffffffffffffffffffff161415806121c25750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b1561227f57826001600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a35b505050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122e6826112d2565b15156122f157600080fd5b80600a6000848152602001908152602001600020908051906020019061231892919061349e565b505050565b8073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ba20dda4846001026000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156123d857600080fd5b6102c65a03f115156123e957600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff161415156124f457600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635969549e83600102836040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b15156124df57600080fd5b6102c65a03f115156124f057600080fd5b5050505b5050565b8061250333826129f2565b151561250e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415151561254a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561258657600080fd5b6125908483612a87565b61259a8483612bf0565b6125a48383612e0b565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a350505050565b6126198383612edf565b151561262457600080fd5b60018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550826002018054806001018281612694919061351e565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060018360020180549050038360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f571925c699f9072cec76b6c6c000571cc8d0bb5c47e5819202e2e9496c6508b5826040518080602001828103825283818151815260200191508051906020019080838360005b838110156127ac578082015181840152602081019050612791565b50505050905090810190601f1680156127d95780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b806127f633826129f2565b151561280157600080fd5b61281d8484846020604051908101604052806000815250611a3d565b50505050565b61282d8282612ef4565b60088054905060096000838152602001908152602001600020819055506008805480600101828161285e919061354a565b9160005260206000209001600083909190915055505050565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156128b257600080fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b816129be33826129f2565b15156129c957600080fd5b6129d4858585611084565b6129e085858585612fa4565b15156129eb57600080fd5b5050505050565b6000806129fe8361138f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612a6d57508373ffffffffffffffffffffffffffffffffffffffff16612a5584610f77565b73ffffffffffffffffffffffffffffffffffffffff16145b80612a7e5750612a7d8185611b44565b5b91505092915050565b8173ffffffffffffffffffffffffffffffffffffffff16612aa78261138f565b73ffffffffffffffffffffffffffffffffffffffff16141515612ac957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515612bec5760006001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a35b5050565b6000806000612bff858561317a565b60076000858152602001908152602001600020549250612c6b6001600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506132a890919063ffffffff16565b9150600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515612cb957fe5b906000526020600020900154905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084815481101515612d1457fe5b9060005260206000209001819055506000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481101515612d7157fe5b906000526020600020900181905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480919060019003612dd29190613576565b50600060076000868152602001908152602001600020819055508260076000838152602001908152602001600020819055505050505050565b6000612e1783836132c1565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806001018281612ead919061354a565b916000526020600020900160008490919091505550806007600084815260200190815260200160002081905550505050565b6000612eeb8383612284565b15905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612f3057600080fd5b612f3a8282612e0b565b8173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600080612fc68573ffffffffffffffffffffffffffffffffffffffff16613419565b1515612fd55760019150613171565b8473ffffffffffffffffffffffffffffffffffffffff1663f0b9e5ba8786866000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156130a0578082015181840152602081019050613085565b50505050905090810190601f1680156130cd5780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15156130ed57600080fd5b6102c65a03f115156130fe57600080fd5b50505060405180519050905063f0b9e5ba7c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505b50949350505050565b8173ffffffffffffffffffffffffffffffffffffffff1661319a8261138f565b73ffffffffffffffffffffffffffffffffffffffff161415156131bc57600080fd5b61320f6001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546132a890919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600080600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008282111515156132b657fe5b818303905092915050565b600073ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561332e57600080fd5b8160008083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506133d26001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461342c90919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600080823b905060008111915050919050565b600080828401905083811015151561344057fe5b8091505092915050565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b8154818355818115116134995781836000526020600020918201910161349891906135a2565b5b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106134df57805160ff191683800117855561350d565b8280016001018555821561350d579182015b8281111561350c5782518255916020019190600101906134f1565b5b50905061351a91906135a2565b5090565b8154818355818115116135455781836000526020600020918201910161354491906135a2565b5b505050565b8154818355818115116135715781836000526020600020918201910161357091906135a2565b5b505050565b81548183558181151161359d5781836000526020600020918201910161359c91906135a2565b5b505050565b6135c491905b808211156135c05760008160009055506001016135a8565b5090565b905600a165627a7a72305820a06f7ebb5629e063d990ddf25ad858bb8d53ff1f3e3648d9ec7809bdc3692dc50029", - "deployedBytecode": "0x6060604052600436106101ab576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168062b0aeae146101b057806301ffc9a7146101e95780630343e1221461024357806306fdde03146102ad578063081812fc1461033b578063095ea7b31461039e578063162094c4146103e057806318160ddd146104465780631fe23d7f1461046f57806321d37127146104fd57806323b872dd146105675780632f745c59146105c857806333d261771461061e5780633f4ba83a1461065757806342842e0e1461066c5780634f558e79146106cd5780634f6ccce7146107085780635c975abb1461073f5780636352211e1461076c57806370a08231146107cf5780637b1039991461081c57806381ac3fbc146108715780638456cb59146108aa5780638da5cb5b146108bf57806395d89b411461091457806399f10501146109a25780639c0d9c4314610a8a578063a22cb46514610ac3578063a9059cbb14610b07578063b5c2f7ea14610b49578063b88d4fde14610bd7578063c87b56dd14610c7b578063e985e9c514610d17578063f2fde38b14610d87575b600080fd5b34156101bb57600080fd5b6101e7600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610dc0565b005b34156101f457600080fd5b61022960048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050610e6a565b604051808215151515815260200191505060405180910390f35b341561024e57600080fd5b610256610eb8565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561029957808201518184015260208101905061027e565b505050509050019250505060405180910390f35b34156102b857600080fd5b6102c0610ecf565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103005780820151818401526020810190506102e5565b50505050905090810190601f16801561032d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561034657600080fd5b61035c6004808035906020019091905050610f77565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103a957600080fd5b6103de600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610fb4565b005b34156103eb57600080fd5b610444600480803590602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610fde565b005b341561045157600080fd5b610459611027565b6040518082815260200191505060405180910390f35b341561047a57600080fd5b610482611034565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104c25780820151818401526020810190506104a7565b50505050905090810190601f1680156104ef5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561050857600080fd5b61051061106d565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610553578082015181840152602081019050610538565b505050509050019250505060405180910390f35b341561057257600080fd5b6105c6600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611084565b005b34156105d357600080fd5b610608600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506110ba565b6040518082815260200191505060405180910390f35b341561062957600080fd5b610655600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611132565b005b341561066257600080fd5b61066a6111dc565b005b341561067757600080fd5b6106cb600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061129c565b005b34156106d857600080fd5b6106ee60048080359060200190919050506112d2565b604051808215151515815260200191505060405180910390f35b341561071357600080fd5b6107296004808035906020019091905050611343565b6040518082815260200191505060405180910390f35b341561074a57600080fd5b61075261137c565b604051808215151515815260200191505060405180910390f35b341561077757600080fd5b61078d600480803590602001909190505061138f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156107da57600080fd5b610806600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061140c565b6040518082815260200191505060405180910390f35b341561082757600080fd5b61082f611490565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561087c57600080fd5b6108a8600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506114b6565b005b34156108b557600080fd5b6108bd611560565b005b34156108ca57600080fd5b6108d2611621565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561091f57600080fd5b610927611647565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561096757808201518184015260208101905061094c565b50505050905090810190601f1680156109945780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156109ad57600080fd5b610a74600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035600019169060200190919080359060200190919050506116ef565b6040518082815260200191505060405180910390f35b3415610a9557600080fd5b610ac1600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611921565b005b3415610ace57600080fd5b610b05600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803515159060200190919050506119cb565b005b3415610b1257600080fd5b610b47600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506119f5565b005b3415610b5457600080fd5b610b5c611a04565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610b9c578082015181840152602081019050610b81565b50505050905090810190601f168015610bc95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610be257600080fd5b610c79600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611a3d565b005b3415610c8657600080fd5b610c9c6004808035906020019091905050611a75565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610cdc578082015181840152602081019050610cc1565b50505050905090810190601f168015610d095780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610d2257600080fd5b610d6d600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611b44565b604051808215151515815260200191505060405180910390f35b3415610d9257600080fd5b610dbe600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611bd8565b005b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610e1c57600080fd5b610e67816040805190810160405280600e81526020017f646562742d746f6b656e2d7572690000000000000000000000000000000000008152506010611d309092919063ffffffff16565b50565b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610ec061344a565b610eca600d612026565b905090565b610ed761345e565b60048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f6d5780601f10610f4257610100808354040283529160200191610f6d565b820191906000526020600020905b815481529060010190602001808311610f5057829003601f168201915b5050505050905090565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600b60149054906101000a900460ff16151515610fd057600080fd5b610fda82826120be565b5050565b600b60149054906101000a900460ff16151515610ffa57600080fd5b61100e33601061228490919063ffffffff16565b151561101957600080fd5b61102382826122dd565b5050565b6000600880549050905090565b6040805190810160405280601381526020017f646562742d746f6b656e2d6372656174696f6e0000000000000000000000000081525081565b61107561344a565b61107f6010612026565b905090565b600b60149054906101000a900460ff161515156110a057600080fd5b6110aa818361231d565b6110b58383836124f8565b505050565b60006110c58361140c565b821015156110d257600080fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110151561111e57fe5b906000526020600020900154905092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561118e57600080fd5b6111d9816040805190810160405280600e81526020017f646562742d746f6b656e2d757269000000000000000000000000000000000000815250601061260f9092919063ffffffff16565b50565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561123857600080fd5b600b60149054906101000a900460ff16151561125357600080fd5b6000600b60146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b600b60149054906101000a900460ff161515156112b857600080fd5b6112c2818361231d565b6112cd8383836127eb565b505050565b60008060008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b600061134d611027565b8210151561135a57600080fd5b60088281548110151561136957fe5b9060005260206000209001549050919050565b600b60149054906101000a900460ff1681565b60008060008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561140357600080fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561144957600080fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561151257600080fd5b61155d816040805190810160405280601381526020017f646562742d746f6b656e2d6372656174696f6e00000000000000000000000000815250600d611d309092919063ffffffff16565b50565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156115bc57600080fd5b600b60149054906101000a900460ff161515156115d857600080fd5b6001600b60146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61164f61345e565b60058054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116e55780601f106116ba576101008083540402835291602001916116e5565b820191906000526020600020905b8154815290600101906020018083116116c857829003601f168201915b5050505050905090565b600080600b60149054906101000a900460ff1615151561170e57600080fd5b61172233600d61228490919063ffffffff16565b151561172d57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cf9df5eb8b8b8b8b8b8b8b8b6000604051602001526040518963ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001836000191660001916815260200182815260200198505050505050505050602060405180830381600087803b15156118e257600080fd5b6102c65a03f115156118f357600080fd5b50505060405180519050905061190d898260019004612823565b806001900491505098975050505050505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561197d57600080fd5b6119c8816040805190810160405280601381526020017f646562742d746f6b656e2d6372656174696f6e00000000000000000000000000815250600d61260f9092919063ffffffff16565b50565b600b60149054906101000a900460ff161515156119e757600080fd5b6119f18282612877565b5050565b611a0033838361129c565b5050565b6040805190810160405280600e81526020017f646562742d746f6b656e2d75726900000000000000000000000000000000000081525081565b600b60149054906101000a900460ff16151515611a5957600080fd5b611a63828461231d565b611a6f848484846129b3565b50505050565b611a7d61345e565b611a86826112d2565b1515611a9157600080fd5b600a60008381526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b385780601f10611b0d57610100808354040283529160200191611b38565b820191906000526020600020905b815481529060010190602001808311611b1b57829003601f168201915b50505050509050919050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c3457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611c7057600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806000611d3f8686612284565b1515611d4a57600080fd5b8560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600186600201805490500391508560020182815481101515611dac57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055808660020184815481101515611e3d57fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090558560020182815481101515611f2257fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018660020181818054905003915081611f6a9190613472565b508473ffffffffffffffffffffffffffffffffffffffff167f0814e4ee85854cea446b4a27a460e5ffb41516230dbc02f226c07907e432241c856040518080602001828103825283818151815260200191508051906020019080838360005b83811015611fe4578082015181840152602081019050611fc9565b50505050905090810190601f1680156120115780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050505050565b61202e61344a565b816002018054806020026020016040519081016040528092919081815260200182805480156120b257602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612068575b50505050509050919050565b60006120c98261138f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561210657600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061214657506121458133611b44565b5b151561215157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff1661217283610f77565b73ffffffffffffffffffffffffffffffffffffffff161415806121c25750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b1561227f57826001600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a35b505050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122e6826112d2565b15156122f157600080fd5b80600a6000848152602001908152602001600020908051906020019061231892919061349e565b505050565b8073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ba20dda4846001026000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156123d857600080fd5b6102c65a03f115156123e957600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff161415156124f457600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635969549e83600102836040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b15156124df57600080fd5b6102c65a03f115156124f057600080fd5b5050505b5050565b8061250333826129f2565b151561250e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415151561254a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561258657600080fd5b6125908483612a87565b61259a8483612bf0565b6125a48383612e0b565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a350505050565b6126198383612edf565b151561262457600080fd5b60018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550826002018054806001018281612694919061351e565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060018360020180549050038360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f571925c699f9072cec76b6c6c000571cc8d0bb5c47e5819202e2e9496c6508b5826040518080602001828103825283818151815260200191508051906020019080838360005b838110156127ac578082015181840152602081019050612791565b50505050905090810190601f1680156127d95780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b806127f633826129f2565b151561280157600080fd5b61281d8484846020604051908101604052806000815250611a3d565b50505050565b61282d8282612ef4565b60088054905060096000838152602001908152602001600020819055506008805480600101828161285e919061354a565b9160005260206000209001600083909190915055505050565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156128b257600080fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b816129be33826129f2565b15156129c957600080fd5b6129d4858585611084565b6129e085858585612fa4565b15156129eb57600080fd5b5050505050565b6000806129fe8361138f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612a6d57508373ffffffffffffffffffffffffffffffffffffffff16612a5584610f77565b73ffffffffffffffffffffffffffffffffffffffff16145b80612a7e5750612a7d8185611b44565b5b91505092915050565b8173ffffffffffffffffffffffffffffffffffffffff16612aa78261138f565b73ffffffffffffffffffffffffffffffffffffffff16141515612ac957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515612bec5760006001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a35b5050565b6000806000612bff858561317a565b60076000858152602001908152602001600020549250612c6b6001600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506132a890919063ffffffff16565b9150600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515612cb957fe5b906000526020600020900154905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084815481101515612d1457fe5b9060005260206000209001819055506000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481101515612d7157fe5b906000526020600020900181905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480919060019003612dd29190613576565b50600060076000868152602001908152602001600020819055508260076000838152602001908152602001600020819055505050505050565b6000612e1783836132c1565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806001018281612ead919061354a565b916000526020600020900160008490919091505550806007600084815260200190815260200160002081905550505050565b6000612eeb8383612284565b15905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612f3057600080fd5b612f3a8282612e0b565b8173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600080612fc68573ffffffffffffffffffffffffffffffffffffffff16613419565b1515612fd55760019150613171565b8473ffffffffffffffffffffffffffffffffffffffff1663f0b9e5ba8786866000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156130a0578082015181840152602081019050613085565b50505050905090810190601f1680156130cd5780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15156130ed57600080fd5b6102c65a03f115156130fe57600080fd5b50505060405180519050905063f0b9e5ba7c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505b50949350505050565b8173ffffffffffffffffffffffffffffffffffffffff1661319a8261138f565b73ffffffffffffffffffffffffffffffffffffffff161415156131bc57600080fd5b61320f6001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546132a890919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600080600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008282111515156132b657fe5b818303905092915050565b600073ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561332e57600080fd5b8160008083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506133d26001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461342c90919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600080823b905060008111915050919050565b600080828401905083811015151561344057fe5b8091505092915050565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b8154818355818115116134995781836000526020600020918201910161349891906135a2565b5b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106134df57805160ff191683800117855561350d565b8280016001018555821561350d579182015b8281111561350c5782518255916020019190600101906134f1565b5b50905061351a91906135a2565b5090565b8154818355818115116135455781836000526020600020918201910161354491906135a2565b5b505050565b8154818355818115116135715781836000526020600020918201910161357091906135a2565b5b505050565b81548183558181151161359d5781836000526020600020918201910161359c91906135a2565b5b505050565b6135c491905b808211156135c05760008160009055506001016135a8565b5090565b905600a165627a7a72305820a06f7ebb5629e063d990ddf25ad858bb8d53ff1f3e3648d9ec7809bdc3692dc50029", + "bytecode": "0x60606040526000600b60146101000a81548160ff02191690831515021790555034156200002b57600080fd5b60405160208062003823833981016040528080519060200190919050506040805190810160405280600981526020017f44656274546f6b656e00000000000000000000000000000000000000000000008152506040805190810160405280600381526020017f44445400000000000000000000000000000000000000000000000000000000008152508160049080519060200190620000cc92919062000171565b508060059080519060200190620000e592919062000171565b50505033600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505062000220565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620001b457805160ff1916838001178555620001e5565b82800160010185558215620001e5579182015b82811115620001e4578251825591602001919060010190620001c7565b5b509050620001f49190620001f8565b5090565b6200021d91905b8082111562000219576000816000905550600101620001ff565b5090565b90565b6135f380620002306000396000f3006060604052600436106101ab576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168062b0aeae146101b057806301ffc9a7146101e95780630343e1221461024357806306fdde03146102ad578063081812fc1461033b578063095ea7b31461039e578063162094c4146103e057806318160ddd146104465780631fe23d7f1461046f57806321d37127146104fd57806323b872dd146105675780632f745c59146105c857806333d261771461061e5780633f4ba83a1461065757806342842e0e1461066c5780634f558e79146106cd5780634f6ccce7146107085780635c975abb1461073f5780636352211e1461076c57806370a08231146107cf5780637b1039991461081c57806381ac3fbc146108715780638456cb59146108aa5780638da5cb5b146108bf57806395d89b411461091457806399f10501146109a25780639c0d9c4314610a8a578063a22cb46514610ac3578063a9059cbb14610b07578063b5c2f7ea14610b49578063b88d4fde14610bd7578063c87b56dd14610c7b578063e985e9c514610d17578063f2fde38b14610d87575b600080fd5b34156101bb57600080fd5b6101e7600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610dc0565b005b34156101f457600080fd5b61022960048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050610e6a565b604051808215151515815260200191505060405180910390f35b341561024e57600080fd5b610256610eb8565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561029957808201518184015260208101905061027e565b505050509050019250505060405180910390f35b34156102b857600080fd5b6102c0610ecf565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103005780820151818401526020810190506102e5565b50505050905090810190601f16801561032d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561034657600080fd5b61035c6004808035906020019091905050610f77565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103a957600080fd5b6103de600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610fb4565b005b34156103eb57600080fd5b610444600480803590602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610fde565b005b341561045157600080fd5b610459611027565b6040518082815260200191505060405180910390f35b341561047a57600080fd5b610482611034565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104c25780820151818401526020810190506104a7565b50505050905090810190601f1680156104ef5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561050857600080fd5b61051061106d565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610553578082015181840152602081019050610538565b505050509050019250505060405180910390f35b341561057257600080fd5b6105c6600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611084565b005b34156105d357600080fd5b610608600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506110ba565b6040518082815260200191505060405180910390f35b341561062957600080fd5b610655600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611132565b005b341561066257600080fd5b61066a6111dc565b005b341561067757600080fd5b6106cb600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061129c565b005b34156106d857600080fd5b6106ee60048080359060200190919050506112d2565b604051808215151515815260200191505060405180910390f35b341561071357600080fd5b6107296004808035906020019091905050611343565b6040518082815260200191505060405180910390f35b341561074a57600080fd5b61075261137c565b604051808215151515815260200191505060405180910390f35b341561077757600080fd5b61078d600480803590602001909190505061138f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156107da57600080fd5b610806600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061140c565b6040518082815260200191505060405180910390f35b341561082757600080fd5b61082f611490565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561087c57600080fd5b6108a8600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506114b6565b005b34156108b557600080fd5b6108bd611560565b005b34156108ca57600080fd5b6108d2611621565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561091f57600080fd5b610927611647565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561096757808201518184015260208101905061094c565b50505050905090810190601f1680156109945780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156109ad57600080fd5b610a74600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035600019169060200190919080359060200190919050506116ef565b6040518082815260200191505060405180910390f35b3415610a9557600080fd5b610ac1600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611921565b005b3415610ace57600080fd5b610b05600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803515159060200190919050506119cb565b005b3415610b1257600080fd5b610b47600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506119f5565b005b3415610b5457600080fd5b610b5c611a04565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610b9c578082015181840152602081019050610b81565b50505050905090810190601f168015610bc95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610be257600080fd5b610c79600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611a3d565b005b3415610c8657600080fd5b610c9c6004808035906020019091905050611a75565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610cdc578082015181840152602081019050610cc1565b50505050905090810190601f168015610d095780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610d2257600080fd5b610d6d600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611b44565b604051808215151515815260200191505060405180910390f35b3415610d9257600080fd5b610dbe600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611bd8565b005b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610e1c57600080fd5b610e67816040805190810160405280600e81526020017f646562742d746f6b656e2d7572690000000000000000000000000000000000008152506010611d309092919063ffffffff16565b50565b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610ec061344a565b610eca600d612026565b905090565b610ed761345e565b60048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f6d5780601f10610f4257610100808354040283529160200191610f6d565b820191906000526020600020905b815481529060010190602001808311610f5057829003601f168201915b5050505050905090565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600b60149054906101000a900460ff16151515610fd057600080fd5b610fda82826120be565b5050565b600b60149054906101000a900460ff16151515610ffa57600080fd5b61100e33601061228490919063ffffffff16565b151561101957600080fd5b61102382826122dd565b5050565b6000600880549050905090565b6040805190810160405280601381526020017f646562742d746f6b656e2d6372656174696f6e0000000000000000000000000081525081565b61107561344a565b61107f6010612026565b905090565b600b60149054906101000a900460ff161515156110a057600080fd5b6110aa818361231d565b6110b58383836124f8565b505050565b60006110c58361140c565b821015156110d257600080fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110151561111e57fe5b906000526020600020900154905092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561118e57600080fd5b6111d9816040805190810160405280600e81526020017f646562742d746f6b656e2d757269000000000000000000000000000000000000815250601061260f9092919063ffffffff16565b50565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561123857600080fd5b600b60149054906101000a900460ff16151561125357600080fd5b6000600b60146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b600b60149054906101000a900460ff161515156112b857600080fd5b6112c2818361231d565b6112cd8383836127eb565b505050565b60008060008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b600061134d611027565b8210151561135a57600080fd5b60088281548110151561136957fe5b9060005260206000209001549050919050565b600b60149054906101000a900460ff1681565b60008060008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561140357600080fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561144957600080fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561151257600080fd5b61155d816040805190810160405280601381526020017f646562742d746f6b656e2d6372656174696f6e00000000000000000000000000815250600d611d309092919063ffffffff16565b50565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156115bc57600080fd5b600b60149054906101000a900460ff161515156115d857600080fd5b6001600b60146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61164f61345e565b60058054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116e55780601f106116ba576101008083540402835291602001916116e5565b820191906000526020600020905b8154815290600101906020018083116116c857829003601f168201915b5050505050905090565b600080600b60149054906101000a900460ff1615151561170e57600080fd5b61172233600d61228490919063ffffffff16565b151561172d57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cf9df5eb8b8b8b8b8b8b8b8b6000604051602001526040518963ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001836000191660001916815260200182815260200198505050505050505050602060405180830381600087803b15156118e257600080fd5b6102c65a03f115156118f357600080fd5b50505060405180519050905061190d898260019004612823565b806001900491505098975050505050505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561197d57600080fd5b6119c8816040805190810160405280601381526020017f646562742d746f6b656e2d6372656174696f6e00000000000000000000000000815250600d61260f9092919063ffffffff16565b50565b600b60149054906101000a900460ff161515156119e757600080fd5b6119f18282612877565b5050565b611a0033838361129c565b5050565b6040805190810160405280600e81526020017f646562742d746f6b656e2d75726900000000000000000000000000000000000081525081565b600b60149054906101000a900460ff16151515611a5957600080fd5b611a63828461231d565b611a6f848484846129b3565b50505050565b611a7d61345e565b611a86826112d2565b1515611a9157600080fd5b600a60008381526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b385780601f10611b0d57610100808354040283529160200191611b38565b820191906000526020600020905b815481529060010190602001808311611b1b57829003601f168201915b50505050509050919050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c3457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611c7057600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806000611d3f8686612284565b1515611d4a57600080fd5b8560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600186600201805490500391508560020182815481101515611dac57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055808660020184815481101515611e3d57fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090558560020182815481101515611f2257fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018660020181818054905003915081611f6a9190613472565b508473ffffffffffffffffffffffffffffffffffffffff167f0814e4ee85854cea446b4a27a460e5ffb41516230dbc02f226c07907e432241c856040518080602001828103825283818151815260200191508051906020019080838360005b83811015611fe4578082015181840152602081019050611fc9565b50505050905090810190601f1680156120115780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050505050565b61202e61344a565b816002018054806020026020016040519081016040528092919081815260200182805480156120b257602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612068575b50505050509050919050565b60006120c98261138f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561210657600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061214657506121458133611b44565b5b151561215157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff1661217283610f77565b73ffffffffffffffffffffffffffffffffffffffff161415806121c25750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b1561227f57826001600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a35b505050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122e6826112d2565b15156122f157600080fd5b80600a6000848152602001908152602001600020908051906020019061231892919061349e565b505050565b8073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ba20dda4846001026000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156123d857600080fd5b6102c65a03f115156123e957600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff161415156124f457600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635969549e83600102836040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b15156124df57600080fd5b6102c65a03f115156124f057600080fd5b5050505b5050565b8061250333826129f2565b151561250e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415151561254a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561258657600080fd5b6125908483612a87565b61259a8483612bf0565b6125a48383612e0b565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a350505050565b6126198383612edf565b151561262457600080fd5b60018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550826002018054806001018281612694919061351e565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060018360020180549050038360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f571925c699f9072cec76b6c6c000571cc8d0bb5c47e5819202e2e9496c6508b5826040518080602001828103825283818151815260200191508051906020019080838360005b838110156127ac578082015181840152602081019050612791565b50505050905090810190601f1680156127d95780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b806127f633826129f2565b151561280157600080fd5b61281d8484846020604051908101604052806000815250611a3d565b50505050565b61282d8282612ef4565b60088054905060096000838152602001908152602001600020819055506008805480600101828161285e919061354a565b9160005260206000209001600083909190915055505050565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156128b257600080fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b816129be33826129f2565b15156129c957600080fd5b6129d4858585611084565b6129e085858585612fa4565b15156129eb57600080fd5b5050505050565b6000806129fe8361138f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612a6d57508373ffffffffffffffffffffffffffffffffffffffff16612a5584610f77565b73ffffffffffffffffffffffffffffffffffffffff16145b80612a7e5750612a7d8185611b44565b5b91505092915050565b8173ffffffffffffffffffffffffffffffffffffffff16612aa78261138f565b73ffffffffffffffffffffffffffffffffffffffff16141515612ac957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515612bec5760006001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a35b5050565b6000806000612bff858561317a565b60076000858152602001908152602001600020549250612c6b6001600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506132a890919063ffffffff16565b9150600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515612cb957fe5b906000526020600020900154905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084815481101515612d1457fe5b9060005260206000209001819055506000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481101515612d7157fe5b906000526020600020900181905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480919060019003612dd29190613576565b50600060076000868152602001908152602001600020819055508260076000838152602001908152602001600020819055505050505050565b6000612e1783836132c1565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806001018281612ead919061354a565b916000526020600020900160008490919091505550806007600084815260200190815260200160002081905550505050565b6000612eeb8383612284565b15905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612f3057600080fd5b612f3a8282612e0b565b8173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600080612fc68573ffffffffffffffffffffffffffffffffffffffff16613419565b1515612fd55760019150613171565b8473ffffffffffffffffffffffffffffffffffffffff1663f0b9e5ba8786866000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156130a0578082015181840152602081019050613085565b50505050905090810190601f1680156130cd5780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15156130ed57600080fd5b6102c65a03f115156130fe57600080fd5b50505060405180519050905063f0b9e5ba7c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505b50949350505050565b8173ffffffffffffffffffffffffffffffffffffffff1661319a8261138f565b73ffffffffffffffffffffffffffffffffffffffff161415156131bc57600080fd5b61320f6001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546132a890919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600080600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008282111515156132b657fe5b818303905092915050565b600073ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561332e57600080fd5b8160008083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506133d26001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461342c90919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600080823b905060008111915050919050565b600080828401905083811015151561344057fe5b8091505092915050565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b8154818355818115116134995781836000526020600020918201910161349891906135a2565b5b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106134df57805160ff191683800117855561350d565b8280016001018555821561350d579182015b8281111561350c5782518255916020019190600101906134f1565b5b50905061351a91906135a2565b5090565b8154818355818115116135455781836000526020600020918201910161354491906135a2565b5b505050565b8154818355818115116135715781836000526020600020918201910161357091906135a2565b5b505050565b81548183558181151161359d5781836000526020600020918201910161359c91906135a2565b5b505050565b6135c491905b808211156135c05760008160009055506001016135a8565b5090565b905600a165627a7a7230582074db728e3ec6848db28867954bfe392ba4e952253ab40eff39894b329dea5cbe0029", + "deployedBytecode": "0x6060604052600436106101ab576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168062b0aeae146101b057806301ffc9a7146101e95780630343e1221461024357806306fdde03146102ad578063081812fc1461033b578063095ea7b31461039e578063162094c4146103e057806318160ddd146104465780631fe23d7f1461046f57806321d37127146104fd57806323b872dd146105675780632f745c59146105c857806333d261771461061e5780633f4ba83a1461065757806342842e0e1461066c5780634f558e79146106cd5780634f6ccce7146107085780635c975abb1461073f5780636352211e1461076c57806370a08231146107cf5780637b1039991461081c57806381ac3fbc146108715780638456cb59146108aa5780638da5cb5b146108bf57806395d89b411461091457806399f10501146109a25780639c0d9c4314610a8a578063a22cb46514610ac3578063a9059cbb14610b07578063b5c2f7ea14610b49578063b88d4fde14610bd7578063c87b56dd14610c7b578063e985e9c514610d17578063f2fde38b14610d87575b600080fd5b34156101bb57600080fd5b6101e7600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610dc0565b005b34156101f457600080fd5b61022960048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050610e6a565b604051808215151515815260200191505060405180910390f35b341561024e57600080fd5b610256610eb8565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561029957808201518184015260208101905061027e565b505050509050019250505060405180910390f35b34156102b857600080fd5b6102c0610ecf565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103005780820151818401526020810190506102e5565b50505050905090810190601f16801561032d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561034657600080fd5b61035c6004808035906020019091905050610f77565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103a957600080fd5b6103de600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610fb4565b005b34156103eb57600080fd5b610444600480803590602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610fde565b005b341561045157600080fd5b610459611027565b6040518082815260200191505060405180910390f35b341561047a57600080fd5b610482611034565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104c25780820151818401526020810190506104a7565b50505050905090810190601f1680156104ef5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561050857600080fd5b61051061106d565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610553578082015181840152602081019050610538565b505050509050019250505060405180910390f35b341561057257600080fd5b6105c6600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611084565b005b34156105d357600080fd5b610608600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506110ba565b6040518082815260200191505060405180910390f35b341561062957600080fd5b610655600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611132565b005b341561066257600080fd5b61066a6111dc565b005b341561067757600080fd5b6106cb600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061129c565b005b34156106d857600080fd5b6106ee60048080359060200190919050506112d2565b604051808215151515815260200191505060405180910390f35b341561071357600080fd5b6107296004808035906020019091905050611343565b6040518082815260200191505060405180910390f35b341561074a57600080fd5b61075261137c565b604051808215151515815260200191505060405180910390f35b341561077757600080fd5b61078d600480803590602001909190505061138f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156107da57600080fd5b610806600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061140c565b6040518082815260200191505060405180910390f35b341561082757600080fd5b61082f611490565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561087c57600080fd5b6108a8600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506114b6565b005b34156108b557600080fd5b6108bd611560565b005b34156108ca57600080fd5b6108d2611621565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561091f57600080fd5b610927611647565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561096757808201518184015260208101905061094c565b50505050905090810190601f1680156109945780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156109ad57600080fd5b610a74600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035600019169060200190919080359060200190919050506116ef565b6040518082815260200191505060405180910390f35b3415610a9557600080fd5b610ac1600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611921565b005b3415610ace57600080fd5b610b05600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803515159060200190919050506119cb565b005b3415610b1257600080fd5b610b47600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506119f5565b005b3415610b5457600080fd5b610b5c611a04565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610b9c578082015181840152602081019050610b81565b50505050905090810190601f168015610bc95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610be257600080fd5b610c79600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611a3d565b005b3415610c8657600080fd5b610c9c6004808035906020019091905050611a75565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610cdc578082015181840152602081019050610cc1565b50505050905090810190601f168015610d095780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610d2257600080fd5b610d6d600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611b44565b604051808215151515815260200191505060405180910390f35b3415610d9257600080fd5b610dbe600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611bd8565b005b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610e1c57600080fd5b610e67816040805190810160405280600e81526020017f646562742d746f6b656e2d7572690000000000000000000000000000000000008152506010611d309092919063ffffffff16565b50565b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610ec061344a565b610eca600d612026565b905090565b610ed761345e565b60048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f6d5780601f10610f4257610100808354040283529160200191610f6d565b820191906000526020600020905b815481529060010190602001808311610f5057829003601f168201915b5050505050905090565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600b60149054906101000a900460ff16151515610fd057600080fd5b610fda82826120be565b5050565b600b60149054906101000a900460ff16151515610ffa57600080fd5b61100e33601061228490919063ffffffff16565b151561101957600080fd5b61102382826122dd565b5050565b6000600880549050905090565b6040805190810160405280601381526020017f646562742d746f6b656e2d6372656174696f6e0000000000000000000000000081525081565b61107561344a565b61107f6010612026565b905090565b600b60149054906101000a900460ff161515156110a057600080fd5b6110aa818361231d565b6110b58383836124f8565b505050565b60006110c58361140c565b821015156110d257600080fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110151561111e57fe5b906000526020600020900154905092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561118e57600080fd5b6111d9816040805190810160405280600e81526020017f646562742d746f6b656e2d757269000000000000000000000000000000000000815250601061260f9092919063ffffffff16565b50565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561123857600080fd5b600b60149054906101000a900460ff16151561125357600080fd5b6000600b60146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b600b60149054906101000a900460ff161515156112b857600080fd5b6112c2818361231d565b6112cd8383836127eb565b505050565b60008060008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b600061134d611027565b8210151561135a57600080fd5b60088281548110151561136957fe5b9060005260206000209001549050919050565b600b60149054906101000a900460ff1681565b60008060008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561140357600080fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561144957600080fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561151257600080fd5b61155d816040805190810160405280601381526020017f646562742d746f6b656e2d6372656174696f6e00000000000000000000000000815250600d611d309092919063ffffffff16565b50565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156115bc57600080fd5b600b60149054906101000a900460ff161515156115d857600080fd5b6001600b60146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61164f61345e565b60058054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116e55780601f106116ba576101008083540402835291602001916116e5565b820191906000526020600020905b8154815290600101906020018083116116c857829003601f168201915b5050505050905090565b600080600b60149054906101000a900460ff1615151561170e57600080fd5b61172233600d61228490919063ffffffff16565b151561172d57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cf9df5eb8b8b8b8b8b8b8b8b6000604051602001526040518963ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001836000191660001916815260200182815260200198505050505050505050602060405180830381600087803b15156118e257600080fd5b6102c65a03f115156118f357600080fd5b50505060405180519050905061190d898260019004612823565b806001900491505098975050505050505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561197d57600080fd5b6119c8816040805190810160405280601381526020017f646562742d746f6b656e2d6372656174696f6e00000000000000000000000000815250600d61260f9092919063ffffffff16565b50565b600b60149054906101000a900460ff161515156119e757600080fd5b6119f18282612877565b5050565b611a0033838361129c565b5050565b6040805190810160405280600e81526020017f646562742d746f6b656e2d75726900000000000000000000000000000000000081525081565b600b60149054906101000a900460ff16151515611a5957600080fd5b611a63828461231d565b611a6f848484846129b3565b50505050565b611a7d61345e565b611a86826112d2565b1515611a9157600080fd5b600a60008381526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b385780601f10611b0d57610100808354040283529160200191611b38565b820191906000526020600020905b815481529060010190602001808311611b1b57829003601f168201915b50505050509050919050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c3457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611c7057600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806000611d3f8686612284565b1515611d4a57600080fd5b8560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600186600201805490500391508560020182815481101515611dac57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055808660020184815481101515611e3d57fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090558560020182815481101515611f2257fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018660020181818054905003915081611f6a9190613472565b508473ffffffffffffffffffffffffffffffffffffffff167f0814e4ee85854cea446b4a27a460e5ffb41516230dbc02f226c07907e432241c856040518080602001828103825283818151815260200191508051906020019080838360005b83811015611fe4578082015181840152602081019050611fc9565b50505050905090810190601f1680156120115780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050505050565b61202e61344a565b816002018054806020026020016040519081016040528092919081815260200182805480156120b257602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612068575b50505050509050919050565b60006120c98261138f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561210657600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061214657506121458133611b44565b5b151561215157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff1661217283610f77565b73ffffffffffffffffffffffffffffffffffffffff161415806121c25750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b1561227f57826001600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a35b505050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122e6826112d2565b15156122f157600080fd5b80600a6000848152602001908152602001600020908051906020019061231892919061349e565b505050565b8073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ba20dda4846001026000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156123d857600080fd5b6102c65a03f115156123e957600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff161415156124f457600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635969549e83600102836040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b15156124df57600080fd5b6102c65a03f115156124f057600080fd5b5050505b5050565b8061250333826129f2565b151561250e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415151561254a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561258657600080fd5b6125908483612a87565b61259a8483612bf0565b6125a48383612e0b565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a350505050565b6126198383612edf565b151561262457600080fd5b60018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550826002018054806001018281612694919061351e565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060018360020180549050038360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f571925c699f9072cec76b6c6c000571cc8d0bb5c47e5819202e2e9496c6508b5826040518080602001828103825283818151815260200191508051906020019080838360005b838110156127ac578082015181840152602081019050612791565b50505050905090810190601f1680156127d95780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b806127f633826129f2565b151561280157600080fd5b61281d8484846020604051908101604052806000815250611a3d565b50505050565b61282d8282612ef4565b60088054905060096000838152602001908152602001600020819055506008805480600101828161285e919061354a565b9160005260206000209001600083909190915055505050565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156128b257600080fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b816129be33826129f2565b15156129c957600080fd5b6129d4858585611084565b6129e085858585612fa4565b15156129eb57600080fd5b5050505050565b6000806129fe8361138f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612a6d57508373ffffffffffffffffffffffffffffffffffffffff16612a5584610f77565b73ffffffffffffffffffffffffffffffffffffffff16145b80612a7e5750612a7d8185611b44565b5b91505092915050565b8173ffffffffffffffffffffffffffffffffffffffff16612aa78261138f565b73ffffffffffffffffffffffffffffffffffffffff16141515612ac957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515612bec5760006001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a35b5050565b6000806000612bff858561317a565b60076000858152602001908152602001600020549250612c6b6001600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506132a890919063ffffffff16565b9150600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515612cb957fe5b906000526020600020900154905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084815481101515612d1457fe5b9060005260206000209001819055506000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481101515612d7157fe5b906000526020600020900181905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480919060019003612dd29190613576565b50600060076000868152602001908152602001600020819055508260076000838152602001908152602001600020819055505050505050565b6000612e1783836132c1565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806001018281612ead919061354a565b916000526020600020900160008490919091505550806007600084815260200190815260200160002081905550505050565b6000612eeb8383612284565b15905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612f3057600080fd5b612f3a8282612e0b565b8173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600080612fc68573ffffffffffffffffffffffffffffffffffffffff16613419565b1515612fd55760019150613171565b8473ffffffffffffffffffffffffffffffffffffffff1663f0b9e5ba8786866000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156130a0578082015181840152602081019050613085565b50505050905090810190601f1680156130cd5780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15156130ed57600080fd5b6102c65a03f115156130fe57600080fd5b50505060405180519050905063f0b9e5ba7c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505b50949350505050565b8173ffffffffffffffffffffffffffffffffffffffff1661319a8261138f565b73ffffffffffffffffffffffffffffffffffffffff161415156131bc57600080fd5b61320f6001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546132a890919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600080600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008282111515156132b657fe5b818303905092915050565b600073ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561332e57600080fd5b8160008083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506133d26001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461342c90919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600080823b905060008111915050919050565b600080828401905083811015151561344057fe5b8091505092915050565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b8154818355818115116134995781836000526020600020918201910161349891906135a2565b5b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106134df57805160ff191683800117855561350d565b8280016001018555821561350d579182015b8281111561350c5782518255916020019190600101906134f1565b5b50905061351a91906135a2565b5090565b8154818355818115116135455781836000526020600020918201910161354491906135a2565b5b505050565b8154818355818115116135715781836000526020600020918201910161357091906135a2565b5b505050565b81548183558181151161359d5781836000526020600020918201910161359c91906135a2565b5b505050565b6135c491905b808211156135c05760008160009055506001016135a8565b5090565b905600a165627a7a7230582074db728e3ec6848db28867954bfe392ba4e952253ab40eff39894b329dea5cbe0029", "sourceMap": "1362:6140:5:-;;;268:5:37;247:26;;;;;;;;;;;;;;;;;;;;1867:148:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1107:105:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1179:5;1171;:13;;;;;;;;;;;;:::i;:::-;;1200:7;1190;:17;;;;;;;;;;;;:::i;:::-;;1107:105;;509:10:39;501:5;;:18;;;;;;;;;;;;;;;;;;1998:9:5;1974:8;;:34;;;;;;;;;;;;;;;;;;1867:148;1362:6140;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;", "deployedSourceMap": "1362:6140:5:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4640:167;;;;;;;;;;;;;;;;;;;;;;;;;;;;2110:176;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3854:173;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;1303:68:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3577:111:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4974:131:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6913:207;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2887:87:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1659:63:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4366:172:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;5793:206:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2571:177:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4124:156:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;833:87:37;;;;;;;;;;;;;;6175:214:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2445:140:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3298::50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;247:26:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2107:164:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1756:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1496:28:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3589:178;;;;;;;;;;;;;;;;;;;;;;;;;;;;666:85:37;;;;;;;;;;;;;;238:20:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1466:72:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2455:770:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3324:162;;;;;;;;;;;;;;;;;;;;;;;;;;;;5281:153;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5496:125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1728:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6565:234:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1727:133:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4478:142:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;832:169:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;4640:167:5;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;4740:60:5;4780:6;4788:11;;;;;;;;;;;;;;;;;;4740:19;:39;;:60;;;;;:::i;:::-;4640:167;:::o;2110:176::-;2204:17;2259:10;2244:25;;:11;:25;;;;2237:32;;2110:176;;;:::o;3854:173::-;3934:17;;:::i;:::-;3974:46;:24;:44;:46::i;:::-;3967:53;;3854:173;:::o;1303:68:50:-;1340:6;;:::i;:::-;1361:5;1354:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1303:68;:::o;3577:111:48:-;3637:7;3659:14;:24;3674:8;3659:24;;;;;;;;;;;;;;;;;;;;;3652:31;;3577:111;;;:::o;4974:131:5:-;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;5070:28:5;5084:3;5089:8;5070:13;:28::i;:::-;4974:131;;:::o;6913:207::-;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;7024:44:5;7057:10;7024:19;:32;;:44;;;;:::i;:::-;7016:53;;;;;;;;7079:34;7098:8;7108:4;7079:18;:34::i;:::-;6913:207;;:::o;2887:87:50:-;2931:7;2953:9;:16;;;;2946:23;;2887:87;:::o;1659:63:5:-;;;;;;;;;;;;;;;;;;;;:::o;4366:172::-;4450:17;;:::i;:::-;4490:41;:19;:39;:41::i;:::-;4483:48;;4366:172;:::o;5793:206::-;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;5909:33:5;5928:8;5938:3;5909:18;:33::i;:::-;5952:40;5971:5;5978:3;5983:8;5952:18;:40::i;:::-;5793:206;;;:::o;2571:177:50:-;2653:7;2685:17;2695:6;2685:9;:17::i;:::-;2676:6;:26;2668:35;;;;;;;;2716:11;:19;2728:6;2716:19;;;;;;;;;;;;;;;2736:6;2716:27;;;;;;;;;;;;;;;;;;;2709:34;;2571:177;;;;:::o;4124:156:5:-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;4223:50:5;4253:6;4261:11;;;;;;;;;;;;;;;;;;4223:19;:29;;:50;;;;;:::i;:::-;4124:156;:::o;833:87:37:-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;568:6:37;;;;;;;;;;;560:15;;;;;;;;895:5;886:6;;:14;;;;;;;;;;;;;;;;;;906:9;;;;;;;;;;833:87::o;6175:214:5:-;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;6295:33:5;6314:8;6324:3;6295:18;:33::i;:::-;6338:44;6361:5;6368:3;6373:8;6338:22;:44::i;:::-;6175:214;;;:::o;2445:140:48:-;2500:4;2512:13;2528:10;:20;2539:8;2528:20;;;;;;;;;;;;;;;;;;;;;2512:36;;2578:1;2561:19;;:5;:19;;;;2554:26;;2445:140;;;;:::o;3298::50:-;3357:7;3389:13;:11;:13::i;:::-;3380:6;:22;3372:31;;;;;;;;3416:9;3426:6;3416:17;;;;;;;;;;;;;;;;;;;3409:24;;3298:140;;;:::o;247:26:37:-;;;;;;;;;;;;;:::o;2107:164:48:-;2163:7;2178:13;2194:10;:20;2205:8;2194:20;;;;;;;;;;;;;;;;;;;;;2178:36;;2245:1;2228:19;;:5;:19;;;;2220:28;;;;;;;;2261:5;2254:12;;2107:164;;;;:::o;1756:142::-;1812:7;1853:1;1835:20;;:6;:20;;;;1827:29;;;;;;;;1869:16;:24;1886:6;1869:24;;;;;;;;;;;;;;;;1862:31;;1756:142;;;:::o;1496:28:5:-;;;;;;;;;;;;;:::o;3589:178::-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;3690:70:5;3735:6;3743:16;;;;;;;;;;;;;;;;;;3690:24;:44;;:70;;;;;:::i;:::-;3589:178;:::o;666:85:37:-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;729:4;720:6;;:13;;;;;;;;;;;;;;;;;;739:7;;;;;;;;;;666:85::o;238:20:39:-;;;;;;;;;;;;;:::o;1466:72:50:-;1505:6;;:::i;:::-;1526:7;1519:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1466:72;:::o;2455:770:5:-;2773:13;2871:17;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;2810:49:5;2848:10;2810:24;:37;;:49;;;;:::i;:::-;2802:58;;;;;;;;2891:8;;;;;;;;;;;:15;;;2920:8;2942:12;2968:7;2989:12;3015:22;3051:14;3079:24;3117:5;2891:241;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2871:261;;3143:42;3155:12;3174:9;3169:15;;;3143:11;:42::i;:::-;3208:9;3203:15;;;3196:22;;2455:770;;;;;;;;;;;:::o;3324:162::-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;3419:60:5;3454:6;3462:16;;;;;;;;;;;;;;;;;;3419:24;:34;;:60;;;;;:::i;:::-;3324:162;:::o;5281:153::-;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;5388:39:5;5412:3;5417:9;5388:23;:39::i;:::-;5281:153;;:::o;5496:125::-;5571:43;5588:10;5600:3;5605:8;5571:16;:43::i;:::-;5496:125;;:::o;1728:53::-;;;;;;;;;;;;;;;;;;;;:::o;6565:234::-;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;6698:33:5;6717:8;6727:3;6698:18;:33::i;:::-;6741:51;6764:5;6771:3;6776:8;6786:5;6741:22;:51::i;:::-;6565:234;;;;:::o;1727:133:50:-;1784:6;;:::i;:::-;1806:16;1813:8;1806:6;:16::i;:::-;1798:25;;;;;;;;1836:9;:19;1846:8;1836:19;;;;;;;;;;;1829:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1727:133;;;:::o;4478:142:48:-;4560:4;4579:17;:25;4597:6;4579:25;;;;;;;;;;;;;;;:36;4605:9;4579:36;;;;;;;;;;;;;;;;;;;;;;;;;4572:43;;4478:142;;;;:::o;832:169:39:-;653:5;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;928:1;908:22;;:8;:22;;;;900:31;;;;;;;;965:8;937:37;;958:5;;;;;;;;;;;937:37;;;;;;;;;;;;988:8;980:5;;:16;;;;;;;;;;;;;;;;;;832:169;:::o;2121:1168:17:-;2489:25;2551:23;2619:19;2452:25;2465:4;2471:5;2452:12;:25::i;:::-;2444:34;;;;;;;;2517:4;:17;;:24;2535:5;2517:24;;;;;;;;;;;;;;;;2489:52;;2608:1;2577:4;:21;;:28;;;;:32;2551:58;;2641:4;:21;;2663:18;2641:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;2619:63;;2745:4;:15;;:22;2761:5;2745:22;;;;;;;;;;;;;;;;2738:29;;;;;;;;;;;2894:11;2848:4;:21;;2870:20;2848:43;;;;;;;;;;;;;;;;;;;:57;;;;;;;;;;;;;;;;;;3009:20;2976:4;:17;;:30;2994:11;2976:30;;;;;;;;;;;;;;;:53;;;;3046:4;:17;;:24;3064:5;3046:24;;;;;;;;;;;;;;;3039:31;;;3144:4;:21;;3166:18;3144:41;;;;;;;;;;;;;;;;;;;3137:48;;;;;;;;;;;3227:1;3195:4;:21;;:33;;;;;;;;;;;;;;:::i;:::-;;3260:5;3239:43;;;3267:14;3239:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2121:1168:17;;;;;;:::o;3646:162::-;3748:9;;:::i;:::-;3780:4;:21;;3773:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3646:162;;;:::o;2998:350:48:-;3059:13;3075:17;3083:8;3075:7;:17::i;:::-;3059:33;;3113:5;3106:12;;:3;:12;;;;3098:21;;;;;;;;3147:5;3133:19;;:10;:19;;;:58;;;;3156:35;3173:5;3180:10;3156:16;:35::i;:::-;3133:58;3125:67;;;;;;;;3236:1;3203:35;;:21;3215:8;3203:11;:21::i;:::-;:35;;;;:56;;;;3257:1;3242:17;;:3;:17;;;;3203:56;3199:145;;;3296:3;3269:14;:24;3284:8;3269:24;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;3323:3;3307:30;;3316:5;3307:30;;;3328:8;3307:30;;;;;;;;;;;;;;;;;;3199:145;2998:350;;;:::o;3295:166:17:-;3405:4;3432;:15;;:22;3448:5;3432:22;;;;;;;;;;;;;;;;;;;;;;;;;3425:29;;3295:166;;;;:::o;2085:130:50:-;2161:16;2168:8;2161:6;:16::i;:::-;2153:25;;;;;;;;2206:4;2184:9;:19;2194:8;2184:19;;;;;;;;;;;:26;;;;;;;;;;;;:::i;:::-;;2085:130;;:::o;7277:223:5:-;7414:3;7368:49;;:8;;;;;;;;;;;:23;;;7400:8;7392:17;;7368:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:49;;;;7364:130;;;7433:8;;;;;;;;;;;:26;;;7468:8;7460:17;;7479:3;7433:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7364:130;7277:223;;:::o;5042:315:48:-;5129:8;1516:39;1534:10;1546:8;1516:17;:39::i;:::-;1508:48;;;;;;;;5170:1;5153:19;;:5;:19;;;;5145:28;;;;;;;;5202:1;5187:17;;:3;:17;;;;5179:26;;;;;;;;5212:30;5226:5;5233:8;5212:13;:30::i;:::-;5248:32;5264:5;5271:8;5248:15;:32::i;:::-;5286:25;5297:3;5302:8;5286:10;:25::i;:::-;5338:3;5322:30;;5331:5;5322:30;;;5343:8;5322:30;;;;;;;;;;;;;;;;;;5042:315;;;;:::o;1732:383:17:-;1884:28;1900:4;1906:5;1884:15;:28::i;:::-;1876:37;;;;;;;;1949:4;1924;:15;;:22;1940:5;1924:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;1963:4;:21;;:33;;;;;;;;;;;:::i;:::-;;;;;;;;;;1990:5;1963:33;;;;;;;;;;;;;;;;;;;;;;;2064:1;2033:4;:21;;:28;;;;:32;2006:4;:17;;:24;2024:5;2006:24;;;;;;;;;;;;;;;:59;;;;2086:5;2075:33;;;2093:14;2075:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1732:383:17;;;:::o;5964:154:48:-;6055:8;1516:39;1534:10;1546:8;1516:17;:39::i;:::-;1508:48;;;;;;;;6071:42;6088:5;6095:3;6100:8;6071:42;;;;;;;;;;;;;:16;:42::i;:::-;5964:154;;;;:::o;5315:176:50:-;5376:26;5388:3;5393:8;5376:11;:26::i;:::-;5440:9;:16;;;;5413:14;:24;5428:8;5413:24;;;;;;;;;;;:43;;;;5462:9;:24;;;;;;;;;;;:::i;:::-;;;;;;;;;;5477:8;5462:24;;;;;;;5315:176;;:::o;3969:200:48:-;4053:10;4046:17;;:3;:17;;;;4038:26;;;;;;;;4107:9;4070:17;:29;4088:10;4070:29;;;;;;;;;;;;;;;:34;4100:3;4070:34;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;4149:3;4122:42;;4137:10;4122:42;;;4154:9;4122:42;;;;;;;;;;;;;;;;;;;;;;3969:200;;:::o;6794:227::-;6898:8;1516:39;1534:10;1546:8;1516:17;:39::i;:::-;1508:48;;;;;;;;6914:34;6927:5;6934:3;6939:8;6914:12;:34::i;:::-;6962:53;6987:5;6994:3;6999:8;7009:5;6962:24;:53::i;:::-;6954:62;;;;;;;;6794:227;;;;;:::o;7368:240::-;7454:4;7466:13;7482:17;7490:8;7482:7;:17::i;:::-;7466:33;;7524:5;7512:17;;:8;:17;;;:54;;;;7558:8;7533:33;;:21;7545:8;7533:11;:21::i;:::-;:33;;;7512:54;:91;;;;7570:33;7587:5;7594:8;7570:16;:33::i;:::-;7512:91;7505:98;;7368:240;;;;;:::o;8653:260::-;8754:6;8733:27;;:17;8741:8;8733:7;:17::i;:::-;:27;;;8725:36;;;;;;;;8807:1;8771:38;;:14;:24;8786:8;8771:24;;;;;;;;;;;;;;;;;;;;;:38;;;;8767:142;;;8854:1;8819:14;:24;8834:8;8819:24;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;8889:1;8864:38;;8873:6;8864:38;;;8893:8;8864:38;;;;;;;;;;;;;;;;;;8767:142;8653:260;;:::o;4198:856:50:-;4316:18;4369:22;4432:17;4271:38;4293:5;4300:8;4271:21;:38::i;:::-;4337:16;:26;4354:8;4337:26;;;;;;;;;;;;4316:47;;4394:32;4424:1;4394:11;:18;4406:5;4394:18;;;;;;;;;;;;;;;:25;;;;:29;;:32;;;;:::i;:::-;4369:57;;4452:11;:18;4464:5;4452:18;;;;;;;;;;;;;;;4471:14;4452:34;;;;;;;;;;;;;;;;;;;4432:54;;4526:9;4493:11;:18;4505:5;4493:18;;;;;;;;;;;;;;;4512:10;4493:30;;;;;;;;;;;;;;;;;;:42;;;;4578:1;4541:11;:18;4553:5;4541:18;;;;;;;;;;;;;;;4560:14;4541:34;;;;;;;;;;;;;;;;;;:38;;;;4940:11;:18;4952:5;4940:18;;;;;;;;;;;;;;;:27;;;;;;;;;;;;:::i;:::-;;5002:1;4973:16;:26;4990:8;4973:26;;;;;;;;;;;:30;;;;5039:10;5009:16;:27;5026:9;5009:27;;;;;;;;;;;:40;;;;4198:856;;;;;:::o;3697:226::-;3800:14;3763:31;3780:3;3785:8;3763:16;:31::i;:::-;3817:11;:16;3829:3;3817:16;;;;;;;;;;;;;;;:23;;;;3800:40;;3846:11;:16;3858:3;3846:16;;;;;;;;;;;;;;;:31;;;;;;;;;;;:::i;:::-;;;;;;;;;;3868:8;3846:31;;;;;;;3912:6;3883:16;:26;3900:8;3883:26;;;;;;;;;;;:35;;;;3697:226;;;:::o;3467:173:17:-;3580:4;3608:25;3621:4;3627:5;3608:12;:25::i;:::-;3607:26;3600:33;;3467:173;;;;:::o;7857:164:48:-;7941:1;7926:17;;:3;:17;;;;7918:26;;;;;;;;7950:25;7961:3;7966:8;7950:10;:25::i;:::-;8002:3;7981:35;;7998:1;7981:35;;;8007:8;7981:35;;;;;;;;;;;;;;;;;;7857:164;;:::o;10368:298::-;10479:4;10545:13;10496:16;:3;:14;;;:16::i;:::-;10495:17;10491:49;;;10529:4;10522:11;;;;10491:49;10576:3;10561:36;;;10598:5;10605:8;10615:5;10561:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10545:76:48;;605:10;10645:15;;10635:25;;;:6;:25;;;;10627:34;;10368:298;;;;;;;;:::o;9651:214::-;9753:5;9732:26;;:17;9740:8;9732:7;:17::i;:::-;:26;;;9724:35;;;;;;;;9791:30;9819:1;9791:16;:23;9808:5;9791:23;;;;;;;;;;;;;;;;:27;;:30;;;;:::i;:::-;9765:16;:23;9782:5;9765:23;;;;;;;;;;;;;;;:56;;;;9858:1;9827:10;:20;9838:8;9827:20;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;9651:214;;:::o;835:110:38:-;893:7;920:1;915;:6;;908:14;;;;;;939:1;935;:5;928:12;;835:110;;;;:::o;9172:204:48:-;9278:1;9246:34;;:10;:20;9257:8;9246:20;;;;;;;;;;;;;;;;;;;;;:34;;;9238:43;;;;;;;;9310:3;9287:10;:20;9298:8;9287:20;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;9343:28;9369:1;9343:16;:21;9360:3;9343:21;;;;;;;;;;;;;;;;:25;;:28;;;;:::i;:::-;9319:16;:21;9336:3;9319:21;;;;;;;;;;;;;;;:52;;;;9172:204;;:::o;451:150:36:-;508:4;520:12;569:4;557:11;549:25;;595:1;588:4;:8;581:15;;451:150;;;;:::o;1007:129:38:-;1065:7;1080:9;1096:1;1092;:5;1080:17;;1115:1;1110;:6;;1103:14;;;;;;1130:1;1123:8;;1007:129;;;;;:::o;1362:6140:5:-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\n// Internal dependencies.\nimport \"./DebtRegistry.sol\";\nimport \"./ERC165.sol\";\nimport { PermissionsLib, PermissionEvents } from \"./libraries/PermissionsLib.sol\";\n\n// External dependencies.\nimport \"zeppelin-solidity/contracts/lifecycle/Pausable.sol\";\nimport \"zeppelin-solidity/contracts/token/ERC721/ERC721Token.sol\";\nimport \"zeppelin-solidity/contracts/token/ERC20/ERC20.sol\";\n\n\n/**\n * The DebtToken contract governs all business logic for making a debt agreement\n * transferable as an ERC721 non-fungible token. Additionally, the contract\n * allows authorized contracts to trigger the minting of a debt agreement token\n * and, in turn, the insertion of a debt issuance into the DebtRegsitry.\n *\n * Author: Nadav Hollander -- Github: nadavhollander\n */\ncontract DebtToken is ERC721Token, ERC165, Pausable, PermissionEvents {\n using PermissionsLib for PermissionsLib.Permissions;\n\n DebtRegistry public registry;\n\n PermissionsLib.Permissions internal tokenCreationPermissions;\n PermissionsLib.Permissions internal tokenURIPermissions;\n\n string public constant CREATION_CONTEXT = \"debt-token-creation\";\n string public constant URI_CONTEXT = \"debt-token-uri\";\n\n /**\n * Constructor that sets the address of the debt registry.\n */\n function DebtToken(address _registry)\n public\n ERC721Token(\"DebtToken\", \"DDT\")\n {\n registry = DebtRegistry(_registry);\n }\n\n /**\n * ERC165 interface.\n * Returns true for ERC721, false otherwise\n */\n function supportsInterface(bytes4 interfaceID)\n external\n view\n returns (bool _isSupported)\n {\n return interfaceID == 0x80ac58cd; // ERC721\n }\n\n /**\n * Mints a unique debt token and inserts the associated issuance into\n * the debt registry, if the calling address is authorized to do so.\n */\n function create(\n address _version,\n address _beneficiary,\n address _debtor,\n address _underwriter,\n uint _underwriterRiskRating,\n address _termsContract,\n bytes32 _termsContractParameters,\n uint _salt\n )\n public\n whenNotPaused\n returns (uint _tokenId)\n {\n require(tokenCreationPermissions.isAuthorized(msg.sender));\n\n bytes32 entryHash = registry.insert(\n _version,\n _beneficiary,\n _debtor,\n _underwriter,\n _underwriterRiskRating,\n _termsContract,\n _termsContractParameters,\n _salt\n );\n\n super._mint(_beneficiary, uint(entryHash));\n\n return uint(entryHash);\n }\n\n /**\n * Adds an address to the list of agents authorized to mint debt tokens.\n */\n function addAuthorizedMintAgent(address _agent)\n public\n onlyOwner\n {\n tokenCreationPermissions.authorize(_agent, CREATION_CONTEXT);\n }\n\n /**\n * Removes an address from the list of agents authorized to mint debt tokens\n */\n function revokeMintAgentAuthorization(address _agent)\n public\n onlyOwner\n {\n tokenCreationPermissions.revokeAuthorization(_agent, CREATION_CONTEXT);\n }\n\n /**\n * Returns the list of agents authorized to mint debt tokens\n */\n function getAuthorizedMintAgents()\n public\n view\n returns (address[] _agents)\n {\n return tokenCreationPermissions.getAuthorizedAgents();\n }\n\n /**\n * Adds an address to the list of agents authorized to set token URIs.\n */\n function addAuthorizedTokenURIAgent(address _agent)\n public\n onlyOwner\n {\n tokenURIPermissions.authorize(_agent, URI_CONTEXT);\n }\n\n /**\n * Returns the list of agents authorized to set token URIs.\n */\n function getAuthorizedTokenURIAgents()\n public\n view\n returns (address[] _agents)\n {\n return tokenURIPermissions.getAuthorizedAgents();\n }\n\n /**\n * Removes an address from the list of agents authorized to set token URIs.\n */\n function revokeTokenURIAuthorization(address _agent)\n public\n onlyOwner\n {\n tokenURIPermissions.revokeAuthorization(_agent, URI_CONTEXT);\n }\n\n /**\n * We override approval method of the parent ERC721Token\n * contract to allow its functionality to be frozen in the case of an emergency\n */\n function approve(address _to, uint _tokenId)\n public\n whenNotPaused\n {\n super.approve(_to, _tokenId);\n }\n\n /**\n * We override setApprovalForAll method of the parent ERC721Token\n * contract to allow its functionality to be frozen in the case of an emergency\n */\n function setApprovalForAll(address _to, bool _approved)\n public\n whenNotPaused\n {\n super.setApprovalForAll(_to, _approved);\n }\n\n /**\n * Support deprecated ERC721 method\n */\n function transfer(address _to, uint _tokenId)\n public\n {\n safeTransferFrom(msg.sender, _to, _tokenId);\n }\n\n /**\n * We override transferFrom methods of the parent ERC721Token\n * contract to allow its functionality to be frozen in the case of an emergency\n */\n function transferFrom(address _from, address _to, uint _tokenId)\n public\n whenNotPaused\n {\n _modifyBeneficiary(_tokenId, _to);\n super.transferFrom(_from, _to, _tokenId);\n }\n\n /**\n * We override safeTransferFrom methods of the parent ERC721Token\n * contract to allow its functionality to be frozen in the case of an emergency\n */\n function safeTransferFrom(address _from, address _to, uint _tokenId)\n public\n whenNotPaused\n {\n _modifyBeneficiary(_tokenId, _to);\n super.safeTransferFrom(_from, _to, _tokenId);\n }\n\n /**\n * We override safeTransferFrom methods of the parent ERC721Token\n * contract to allow its functionality to be frozen in the case of an emergency\n */\n function safeTransferFrom(address _from, address _to, uint _tokenId, bytes _data)\n public\n whenNotPaused\n {\n _modifyBeneficiary(_tokenId, _to);\n super.safeTransferFrom(_from, _to, _tokenId, _data);\n }\n\n /**\n * Allows senders with special permissions to set the token URI for a given debt token.\n */\n function setTokenURI(uint256 _tokenId, string _uri)\n public\n whenNotPaused\n {\n require(tokenURIPermissions.isAuthorized(msg.sender));\n super._setTokenURI(_tokenId, _uri);\n }\n\n /**\n * _modifyBeneficiary mutates the debt registry. This function should be\n * called every time a token is transferred or minted\n */\n function _modifyBeneficiary(uint _tokenId, address _to)\n internal\n {\n if (registry.getBeneficiary(bytes32(_tokenId)) != _to) {\n registry.modifyBeneficiary(bytes32(_tokenId), _to);\n }\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/DebtToken.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/DebtToken.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/DebtToken.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/DebtToken.sol", "exportedSymbols": { "DebtToken": [ 3540 @@ -769,7 +769,7 @@ { "attributes": { "SourceUnit": 3159, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/DebtRegistry.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/DebtRegistry.sol", "file": "./DebtRegistry.sol", "scope": 3541, "symbolAliases": [ @@ -784,7 +784,7 @@ { "attributes": { "SourceUnit": 3551, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/ERC165.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/ERC165.sol", "file": "./ERC165.sol", "scope": 3541, "symbolAliases": [ @@ -799,7 +799,7 @@ { "attributes": { "SourceUnit": 6272, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/libraries/PermissionsLib.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/libraries/PermissionsLib.sol", "file": "./libraries/PermissionsLib.sol", "scope": 3541, "symbolAliases": [ @@ -6202,7 +6202,7 @@ } }, "links": {}, - "address": "0x3fd02c9e51dbf27b3f66e71ce1e5ce89ca1492d3" + "address": "0xa99e0834ce4ac707371cbd6d938773b660552b91" }, "70": { "events": { @@ -6341,5 +6341,5 @@ } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:16:13.726Z" + "updatedAt": "2018-10-09T17:53:04.888Z" } \ No newline at end of file diff --git a/artifacts/json/DeprecatedERC721.json b/artifacts/json/DeprecatedERC721.json index a205f56b..02c345d0 100644 --- a/artifacts/json/DeprecatedERC721.json +++ b/artifacts/json/DeprecatedERC721.json @@ -789,5 +789,5 @@ }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:48.049Z" + "updatedAt": "2018-10-09T17:45:35.433Z" } \ No newline at end of file diff --git a/artifacts/json/DharmaMultiSigWallet.json b/artifacts/json/DharmaMultiSigWallet.json index 9f9b3ffa..631e7bb4 100644 --- a/artifacts/json/DharmaMultiSigWallet.json +++ b/artifacts/json/DharmaMultiSigWallet.json @@ -627,15 +627,15 @@ "type": "event" } ], - "bytecode": "0x606060405234156200001057600080fd5b60405162002765380380620027658339810160405280805182019190602001805190602001909190805190602001909190505082826000825182603282111580156200005c5750818111155b80156200006a575060008114155b801562000078575060008214155b15156200008457600080fd5b600092505b8451831015620001bf57600260008685815181101515620000a657fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015620001355750600085848151811015156200011257fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1614155b15156200014157600080fd5b60016002600087868151811015156200015657fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550828060010193505062000089565b8460039080519060200190620001d7929190620001f4565b5083600481905550505050505080600681905550505050620002c9565b82805482825590600052602060002090810192821562000270579160200282015b828111156200026f5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019062000215565b5b5090506200027f919062000283565b5090565b620002c691905b80821115620002c257600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055506001016200028a565b5090565b90565b61248c80620002d96000396000f300606060405260043610610149576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063025e7c27146101a3578063173825d91461020657806319b83a7b1461023f57806320ea8d8614610276578063215ff46f146102995780632f54bf6e146102bc5780633411c81c1461030d57806354741525146103675780637065cb48146103ab578063733e1b68146103e4578063784547a71461040d5780637ad28c51146104485780638b51d13f1461046b5780639ace38c2146104a2578063a0e67e2b146105a0578063a8abe69a1461060a578063b5dc40c3146106a1578063b77bf60014610719578063ba51a6df14610742578063c01a8c8414610765578063c642747414610788578063d74f8edd14610821578063dc8452cd1461084a578063e20056e614610873578063ee22610b146108cb575b60003411156101a1573373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a25b005b34156101ae57600080fd5b6101c460048080359060200190919050506108ee565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561021157600080fd5b61023d600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061092d565b005b341561024a57600080fd5b6102606004808035906020019091905050610bc9565b6040518082815260200191505060405180910390f35b341561028157600080fd5b6102976004808035906020019091905050610be1565b005b34156102a457600080fd5b6102ba6004808035906020019091905050610da0565b005b34156102c757600080fd5b6102f3600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610ebc565b604051808215151515815260200191505060405180910390f35b341561031857600080fd5b61034d600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610edc565b604051808215151515815260200191505060405180910390f35b341561037257600080fd5b610395600480803515159060200190919080351515906020019091905050610f0b565b6040518082815260200191505060405180910390f35b34156103b657600080fd5b6103e2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610f9d565b005b34156103ef57600080fd5b6103f761119f565b6040518082815260200191505060405180910390f35b341561041857600080fd5b61042e60048080359060200190919050506111a5565b604051808215151515815260200191505060405180910390f35b341561045357600080fd5b610469600480803590602001909190505061128b565b005b341561047657600080fd5b61048c6004808035906020019091905050611306565b6040518082815260200191505060405180910390f35b34156104ad57600080fd5b6104c360048080359060200190919050506113d2565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018315151515815260200182810382528481815460018160011615610100020316600290048152602001915080546001816001161561010002031660029004801561058e5780601f106105635761010080835404028352916020019161058e565b820191906000526020600020905b81548152906001019060200180831161057157829003601f168201915b50509550505050505060405180910390f35b34156105ab57600080fd5b6105b361142e565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156105f65780820151818401526020810190506105db565b505050509050019250505060405180910390f35b341561061557600080fd5b61064a6004808035906020019091908035906020019091908035151590602001909190803515159060200190919050506114c2565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561068d578082015181840152602081019050610672565b505050509050019250505060405180910390f35b34156106ac57600080fd5b6106c2600480803590602001909190505061162d565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156107055780820151818401526020810190506106ea565b505050509050019250505060405180910390f35b341561072457600080fd5b61072c611857565b6040518082815260200191505060405180910390f35b341561074d57600080fd5b610763600480803590602001909190505061185d565b005b341561077057600080fd5b6107866004808035906020019091905050611917565b005b341561079357600080fd5b61080b600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611b1b565b6040518082815260200191505060405180910390f35b341561082c57600080fd5b610834611b3a565b6040518082815260200191505060405180910390f35b341561085557600080fd5b61085d611b3f565b6040518082815260200191505060405180910390f35b341561087e57600080fd5b6108c9600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611b45565b005b34156108d657600080fd5b6108ec6004808035906020019091905050611e5c565b005b6003818154811015156108fd57fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561096957600080fd5b81600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615156109c257600080fd5b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600091505b600160038054905003821015610b4a578273ffffffffffffffffffffffffffffffffffffffff16600383815481101515610a5557fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610b3d576003600160038054905003815481101515610ab457fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600383815481101515610aef57fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610b4a565b8180600101925050610a1f565b6001600381818054905003915081610b62919061233b565b506003805490506004541115610b8157610b8060038054905061185d565b5b8273ffffffffffffffffffffffffffffffffffffffff167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a2505050565b60076020528060005260406000206000915090505481565b33600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610c3a57600080fd5b81336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610ca557600080fd5b8360008082815260200190815260200160002060030160009054906101000a900460ff16151515610cd557600080fd5b84610cdf816111a5565b151515610ceb57600080fd5b60006001600088815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550853373ffffffffffffffffffffffffffffffffffffffff167ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e960405160405180910390a3505050505050565b8060008082815260200190815260200160002060030160009054906101000a900460ff16151515610dd057600080fd5b81610dda816111a5565b1515610de557600080fd5b8260008060008381526020019081526020016000209050610ea1816002018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610e975780601f10610e6c57610100808354040283529160200191610e97565b820191906000526020600020905b815481529060010190602001808311610e7a57829003601f168201915b5050505050611ed7565b1515610eac57600080fd5b610eb585612019565b5050505050565b60026020528060005260406000206000915054906101000a900460ff1681565b60016020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b600080600090505b600554811015610f9657838015610f4a575060008082815260200190815260200160002060030160009054906101000a900460ff16155b80610f7d5750828015610f7c575060008082815260200190815260200160002060030160009054906101000a900460ff165b5b15610f89576001820191505b8080600101915050610f13565b5092915050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610fd757600080fd5b80600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151561103157600080fd5b8160008173ffffffffffffffffffffffffffffffffffffffff161415151561105857600080fd5b600160038054905001600454603282111580156110755750818111155b8015611082575060008114155b801561108f575060008214155b151561109a57600080fd5b6001600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600380548060010182816111069190612367565b9160005260206000209001600087909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508473ffffffffffffffffffffffffffffffffffffffff167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b60065481565b6000806000809150600090505b600380549050811015611283576001600085815260200190815260200160002060006003838154811015156111e357fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611263576001820191505b6004548214156112765760019250611284565b80806001019150506111b2565b5b5050919050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156112c557600080fd5b806006819055507fd1c9101a34feff75cccef14a28785a0279cb0b49c1f321f21f5f422e746b4377816040518082815260200191505060405180910390a150565b600080600090505b6003805490508110156113cc5760016000848152602001908152602001600020600060038381548110151561133f57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156113bf576001820191505b808060010191505061130e565b50919050565b60006020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201908060030160009054906101000a900460ff16905084565b611436612393565b60038054806020026020016040519081016040528092919081815260200182805480156114b857602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161146e575b5050505050905090565b6114ca6123a7565b6114d26123a7565b6000808688111515156114e457600080fd5b6005546040518059106114f45750595b9080825280602002602001820160405250925060009150600090505b6005548110156115b057858015611547575060008082815260200190815260200160002060030160009054906101000a900460ff16155b8061157a5750848015611579575060008082815260200190815260200160002060030160009054906101000a900460ff165b5b156115a35780838381518110151561158e57fe5b90602001906020020181815250506001820191505b8080600101915050611510565b8787036040518059106115c05750595b908082528060200260200182016040525093508790505b868110156116225782818151811015156115ed57fe5b906020019060200201518489830381518110151561160757fe5b906020019060200201818152505080806001019150506115d7565b505050949350505050565b611635612393565b61163d612393565b6000806003805490506040518059106116535750595b9080825280602002602001820160405250925060009150600090505b6003805490508110156117b2576001600086815260200190815260200160002060006003838154811015156116a057fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156117a55760038181548110151561172857fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16838381518110151561176257fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506001820191505b808060010191505061166f565b816040518059106117c05750595b90808252806020026020018201604052509350600090505b8181101561184f5782818151811015156117ee57fe5b90602001906020020151848281518110151561180657fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080806001019150506117d8565b505050919050565b60055481565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561189757600080fd5b60038054905081603282111580156118af5750818111155b80156118bc575060008114155b80156118c9575060008214155b15156118d457600080fd5b826004819055507fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a836040518082815260200191505060405180910390a1505050565b33600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151561197057600080fd5b81600080600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156119cc57600080fd5b82336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151515611a3857600080fd5b84611a42816111a5565b151515611a4e57600080fd5b600180600088815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550853373ffffffffffffffffffffffffffffffffffffffff167f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef60405160405180910390a3611b03866111a5565b15611b1357611b128642612195565b5b505050505050565b6000611b288484846121e9565b9050611b3381611917565b9392505050565b603281565b60045481565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b8157600080fd5b82600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515611bda57600080fd5b82600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151515611c3457600080fd5b600092505b600380549050831015611d1f578473ffffffffffffffffffffffffffffffffffffffff16600384815481101515611c6c57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611d125783600384815481101515611cc457fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611d1f565b8280600101935050611c39565b6000600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508473ffffffffffffffffffffffffffffffffffffffff167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a28373ffffffffffffffffffffffffffffffffffffffff167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b8060008082815260200190815260200160002060030160009054906101000a900460ff16151515611e8c57600080fd5b81611e96816111a5565b1515611ea157600080fd5b826006546007600083815260200190815260200160002054014210151515611ec857600080fd5b611ed184612019565b50505050565b600080600060405180807f7061757365282900000000000000000000000000000000000000000000000000815250600701905060405180910390209150600090505b600481101561200d578181600481101515611f3057fe5b1a7f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168482815181101515611f8357fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415156120005760009250612012565b8080600101915050611f19565b600192505b5050919050565b6000806000838152602001908152602001600020905060018160030160006101000a81548160ff0219169083151502179055508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681600101548260020160405180828054600181600116156101000203166002900480156120f55780601f106120ca576101008083540402835291602001916120f5565b820191906000526020600020905b8154815290600101906020018083116120d857829003601f168201915b505091505060006040518083038185876187965a03f1925050501561214657817f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7560405160405180910390a2612191565b817f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923660405160405180910390a260008160030160006101000a81548160ff0219169083151502179055505b5050565b806007600084815260200190815260200160002081905550817f0b237afe65f1514fd7ea3f923ea4fe792bdd07000a912b6cd1602a8e7f573c8d826040518082815260200191505060405180910390a25050565b60008360008173ffffffffffffffffffffffffffffffffffffffff161415151561221257600080fd5b60055491506080604051908101604052808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020016000151581525060008084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020190805190602001906122d19291906123bb565b5060608201518160030160006101000a81548160ff0219169083151502179055509050506001600560008282540192505081905550817fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5160405160405180910390a2509392505050565b81548183558181151161236257818360005260206000209182019101612361919061243b565b5b505050565b81548183558181151161238e5781836000526020600020918201910161238d919061243b565b5b505050565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106123fc57805160ff191683800117855561242a565b8280016001018555821561242a579182015b8281111561242957825182559160200191906001019061240e565b5b509050612437919061243b565b5090565b61245d91905b80821115612459576000816000905550600101612441565b5090565b905600a165627a7a72305820868fc44ce290a258609668772cd1608fa8d4e705b012978b98fead679305fc1d0029", - "deployedBytecode": "0x606060405260043610610149576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063025e7c27146101a3578063173825d91461020657806319b83a7b1461023f57806320ea8d8614610276578063215ff46f146102995780632f54bf6e146102bc5780633411c81c1461030d57806354741525146103675780637065cb48146103ab578063733e1b68146103e4578063784547a71461040d5780637ad28c51146104485780638b51d13f1461046b5780639ace38c2146104a2578063a0e67e2b146105a0578063a8abe69a1461060a578063b5dc40c3146106a1578063b77bf60014610719578063ba51a6df14610742578063c01a8c8414610765578063c642747414610788578063d74f8edd14610821578063dc8452cd1461084a578063e20056e614610873578063ee22610b146108cb575b60003411156101a1573373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a25b005b34156101ae57600080fd5b6101c460048080359060200190919050506108ee565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561021157600080fd5b61023d600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061092d565b005b341561024a57600080fd5b6102606004808035906020019091905050610bc9565b6040518082815260200191505060405180910390f35b341561028157600080fd5b6102976004808035906020019091905050610be1565b005b34156102a457600080fd5b6102ba6004808035906020019091905050610da0565b005b34156102c757600080fd5b6102f3600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610ebc565b604051808215151515815260200191505060405180910390f35b341561031857600080fd5b61034d600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610edc565b604051808215151515815260200191505060405180910390f35b341561037257600080fd5b610395600480803515159060200190919080351515906020019091905050610f0b565b6040518082815260200191505060405180910390f35b34156103b657600080fd5b6103e2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610f9d565b005b34156103ef57600080fd5b6103f761119f565b6040518082815260200191505060405180910390f35b341561041857600080fd5b61042e60048080359060200190919050506111a5565b604051808215151515815260200191505060405180910390f35b341561045357600080fd5b610469600480803590602001909190505061128b565b005b341561047657600080fd5b61048c6004808035906020019091905050611306565b6040518082815260200191505060405180910390f35b34156104ad57600080fd5b6104c360048080359060200190919050506113d2565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018315151515815260200182810382528481815460018160011615610100020316600290048152602001915080546001816001161561010002031660029004801561058e5780601f106105635761010080835404028352916020019161058e565b820191906000526020600020905b81548152906001019060200180831161057157829003601f168201915b50509550505050505060405180910390f35b34156105ab57600080fd5b6105b361142e565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156105f65780820151818401526020810190506105db565b505050509050019250505060405180910390f35b341561061557600080fd5b61064a6004808035906020019091908035906020019091908035151590602001909190803515159060200190919050506114c2565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561068d578082015181840152602081019050610672565b505050509050019250505060405180910390f35b34156106ac57600080fd5b6106c2600480803590602001909190505061162d565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156107055780820151818401526020810190506106ea565b505050509050019250505060405180910390f35b341561072457600080fd5b61072c611857565b6040518082815260200191505060405180910390f35b341561074d57600080fd5b610763600480803590602001909190505061185d565b005b341561077057600080fd5b6107866004808035906020019091905050611917565b005b341561079357600080fd5b61080b600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611b1b565b6040518082815260200191505060405180910390f35b341561082c57600080fd5b610834611b3a565b6040518082815260200191505060405180910390f35b341561085557600080fd5b61085d611b3f565b6040518082815260200191505060405180910390f35b341561087e57600080fd5b6108c9600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611b45565b005b34156108d657600080fd5b6108ec6004808035906020019091905050611e5c565b005b6003818154811015156108fd57fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561096957600080fd5b81600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615156109c257600080fd5b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600091505b600160038054905003821015610b4a578273ffffffffffffffffffffffffffffffffffffffff16600383815481101515610a5557fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610b3d576003600160038054905003815481101515610ab457fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600383815481101515610aef57fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610b4a565b8180600101925050610a1f565b6001600381818054905003915081610b62919061233b565b506003805490506004541115610b8157610b8060038054905061185d565b5b8273ffffffffffffffffffffffffffffffffffffffff167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a2505050565b60076020528060005260406000206000915090505481565b33600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610c3a57600080fd5b81336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610ca557600080fd5b8360008082815260200190815260200160002060030160009054906101000a900460ff16151515610cd557600080fd5b84610cdf816111a5565b151515610ceb57600080fd5b60006001600088815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550853373ffffffffffffffffffffffffffffffffffffffff167ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e960405160405180910390a3505050505050565b8060008082815260200190815260200160002060030160009054906101000a900460ff16151515610dd057600080fd5b81610dda816111a5565b1515610de557600080fd5b8260008060008381526020019081526020016000209050610ea1816002018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610e975780601f10610e6c57610100808354040283529160200191610e97565b820191906000526020600020905b815481529060010190602001808311610e7a57829003601f168201915b5050505050611ed7565b1515610eac57600080fd5b610eb585612019565b5050505050565b60026020528060005260406000206000915054906101000a900460ff1681565b60016020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b600080600090505b600554811015610f9657838015610f4a575060008082815260200190815260200160002060030160009054906101000a900460ff16155b80610f7d5750828015610f7c575060008082815260200190815260200160002060030160009054906101000a900460ff165b5b15610f89576001820191505b8080600101915050610f13565b5092915050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610fd757600080fd5b80600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151561103157600080fd5b8160008173ffffffffffffffffffffffffffffffffffffffff161415151561105857600080fd5b600160038054905001600454603282111580156110755750818111155b8015611082575060008114155b801561108f575060008214155b151561109a57600080fd5b6001600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600380548060010182816111069190612367565b9160005260206000209001600087909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508473ffffffffffffffffffffffffffffffffffffffff167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b60065481565b6000806000809150600090505b600380549050811015611283576001600085815260200190815260200160002060006003838154811015156111e357fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611263576001820191505b6004548214156112765760019250611284565b80806001019150506111b2565b5b5050919050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156112c557600080fd5b806006819055507fd1c9101a34feff75cccef14a28785a0279cb0b49c1f321f21f5f422e746b4377816040518082815260200191505060405180910390a150565b600080600090505b6003805490508110156113cc5760016000848152602001908152602001600020600060038381548110151561133f57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156113bf576001820191505b808060010191505061130e565b50919050565b60006020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201908060030160009054906101000a900460ff16905084565b611436612393565b60038054806020026020016040519081016040528092919081815260200182805480156114b857602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161146e575b5050505050905090565b6114ca6123a7565b6114d26123a7565b6000808688111515156114e457600080fd5b6005546040518059106114f45750595b9080825280602002602001820160405250925060009150600090505b6005548110156115b057858015611547575060008082815260200190815260200160002060030160009054906101000a900460ff16155b8061157a5750848015611579575060008082815260200190815260200160002060030160009054906101000a900460ff165b5b156115a35780838381518110151561158e57fe5b90602001906020020181815250506001820191505b8080600101915050611510565b8787036040518059106115c05750595b908082528060200260200182016040525093508790505b868110156116225782818151811015156115ed57fe5b906020019060200201518489830381518110151561160757fe5b906020019060200201818152505080806001019150506115d7565b505050949350505050565b611635612393565b61163d612393565b6000806003805490506040518059106116535750595b9080825280602002602001820160405250925060009150600090505b6003805490508110156117b2576001600086815260200190815260200160002060006003838154811015156116a057fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156117a55760038181548110151561172857fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16838381518110151561176257fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506001820191505b808060010191505061166f565b816040518059106117c05750595b90808252806020026020018201604052509350600090505b8181101561184f5782818151811015156117ee57fe5b90602001906020020151848281518110151561180657fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080806001019150506117d8565b505050919050565b60055481565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561189757600080fd5b60038054905081603282111580156118af5750818111155b80156118bc575060008114155b80156118c9575060008214155b15156118d457600080fd5b826004819055507fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a836040518082815260200191505060405180910390a1505050565b33600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151561197057600080fd5b81600080600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156119cc57600080fd5b82336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151515611a3857600080fd5b84611a42816111a5565b151515611a4e57600080fd5b600180600088815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550853373ffffffffffffffffffffffffffffffffffffffff167f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef60405160405180910390a3611b03866111a5565b15611b1357611b128642612195565b5b505050505050565b6000611b288484846121e9565b9050611b3381611917565b9392505050565b603281565b60045481565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b8157600080fd5b82600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515611bda57600080fd5b82600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151515611c3457600080fd5b600092505b600380549050831015611d1f578473ffffffffffffffffffffffffffffffffffffffff16600384815481101515611c6c57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611d125783600384815481101515611cc457fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611d1f565b8280600101935050611c39565b6000600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508473ffffffffffffffffffffffffffffffffffffffff167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a28373ffffffffffffffffffffffffffffffffffffffff167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b8060008082815260200190815260200160002060030160009054906101000a900460ff16151515611e8c57600080fd5b81611e96816111a5565b1515611ea157600080fd5b826006546007600083815260200190815260200160002054014210151515611ec857600080fd5b611ed184612019565b50505050565b600080600060405180807f7061757365282900000000000000000000000000000000000000000000000000815250600701905060405180910390209150600090505b600481101561200d578181600481101515611f3057fe5b1a7f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168482815181101515611f8357fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415156120005760009250612012565b8080600101915050611f19565b600192505b5050919050565b6000806000838152602001908152602001600020905060018160030160006101000a81548160ff0219169083151502179055508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681600101548260020160405180828054600181600116156101000203166002900480156120f55780601f106120ca576101008083540402835291602001916120f5565b820191906000526020600020905b8154815290600101906020018083116120d857829003601f168201915b505091505060006040518083038185876187965a03f1925050501561214657817f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7560405160405180910390a2612191565b817f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923660405160405180910390a260008160030160006101000a81548160ff0219169083151502179055505b5050565b806007600084815260200190815260200160002081905550817f0b237afe65f1514fd7ea3f923ea4fe792bdd07000a912b6cd1602a8e7f573c8d826040518082815260200191505060405180910390a25050565b60008360008173ffffffffffffffffffffffffffffffffffffffff161415151561221257600080fd5b60055491506080604051908101604052808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020016000151581525060008084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020190805190602001906122d19291906123bb565b5060608201518160030160006101000a81548160ff0219169083151502179055509050506001600560008282540192505081905550817fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5160405160405180910390a2509392505050565b81548183558181151161236257818360005260206000209182019101612361919061243b565b5b505050565b81548183558181151161238e5781836000526020600020918201910161238d919061243b565b5b505050565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106123fc57805160ff191683800117855561242a565b8280016001018555821561242a579182015b8281111561242957825182559160200191906001019061240e565b5b509050612437919061243b565b5090565b61245d91905b80821115612459576000816000905550600101612441565b5090565b905600a165627a7a72305820868fc44ce290a258609668772cd1608fa8d4e705b012978b98fead679305fc1d0029", + "bytecode": "0x606060405234156200001057600080fd5b60405162002765380380620027658339810160405280805182019190602001805190602001909190805190602001909190505082826000825182603282111580156200005c5750818111155b80156200006a575060008114155b801562000078575060008214155b15156200008457600080fd5b600092505b8451831015620001bf57600260008685815181101515620000a657fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015620001355750600085848151811015156200011257fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1614155b15156200014157600080fd5b60016002600087868151811015156200015657fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550828060010193505062000089565b8460039080519060200190620001d7929190620001f4565b5083600481905550505050505080600681905550505050620002c9565b82805482825590600052602060002090810192821562000270579160200282015b828111156200026f5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019062000215565b5b5090506200027f919062000283565b5090565b620002c691905b80821115620002c257600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055506001016200028a565b5090565b90565b61248c80620002d96000396000f300606060405260043610610149576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063025e7c27146101a3578063173825d91461020657806319b83a7b1461023f57806320ea8d8614610276578063215ff46f146102995780632f54bf6e146102bc5780633411c81c1461030d57806354741525146103675780637065cb48146103ab578063733e1b68146103e4578063784547a71461040d5780637ad28c51146104485780638b51d13f1461046b5780639ace38c2146104a2578063a0e67e2b146105a0578063a8abe69a1461060a578063b5dc40c3146106a1578063b77bf60014610719578063ba51a6df14610742578063c01a8c8414610765578063c642747414610788578063d74f8edd14610821578063dc8452cd1461084a578063e20056e614610873578063ee22610b146108cb575b60003411156101a1573373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a25b005b34156101ae57600080fd5b6101c460048080359060200190919050506108ee565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561021157600080fd5b61023d600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061092d565b005b341561024a57600080fd5b6102606004808035906020019091905050610bc9565b6040518082815260200191505060405180910390f35b341561028157600080fd5b6102976004808035906020019091905050610be1565b005b34156102a457600080fd5b6102ba6004808035906020019091905050610da0565b005b34156102c757600080fd5b6102f3600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610ebc565b604051808215151515815260200191505060405180910390f35b341561031857600080fd5b61034d600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610edc565b604051808215151515815260200191505060405180910390f35b341561037257600080fd5b610395600480803515159060200190919080351515906020019091905050610f0b565b6040518082815260200191505060405180910390f35b34156103b657600080fd5b6103e2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610f9d565b005b34156103ef57600080fd5b6103f761119f565b6040518082815260200191505060405180910390f35b341561041857600080fd5b61042e60048080359060200190919050506111a5565b604051808215151515815260200191505060405180910390f35b341561045357600080fd5b610469600480803590602001909190505061128b565b005b341561047657600080fd5b61048c6004808035906020019091905050611306565b6040518082815260200191505060405180910390f35b34156104ad57600080fd5b6104c360048080359060200190919050506113d2565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018315151515815260200182810382528481815460018160011615610100020316600290048152602001915080546001816001161561010002031660029004801561058e5780601f106105635761010080835404028352916020019161058e565b820191906000526020600020905b81548152906001019060200180831161057157829003601f168201915b50509550505050505060405180910390f35b34156105ab57600080fd5b6105b361142e565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156105f65780820151818401526020810190506105db565b505050509050019250505060405180910390f35b341561061557600080fd5b61064a6004808035906020019091908035906020019091908035151590602001909190803515159060200190919050506114c2565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561068d578082015181840152602081019050610672565b505050509050019250505060405180910390f35b34156106ac57600080fd5b6106c2600480803590602001909190505061162d565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156107055780820151818401526020810190506106ea565b505050509050019250505060405180910390f35b341561072457600080fd5b61072c611857565b6040518082815260200191505060405180910390f35b341561074d57600080fd5b610763600480803590602001909190505061185d565b005b341561077057600080fd5b6107866004808035906020019091905050611917565b005b341561079357600080fd5b61080b600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611b1b565b6040518082815260200191505060405180910390f35b341561082c57600080fd5b610834611b3a565b6040518082815260200191505060405180910390f35b341561085557600080fd5b61085d611b3f565b6040518082815260200191505060405180910390f35b341561087e57600080fd5b6108c9600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611b45565b005b34156108d657600080fd5b6108ec6004808035906020019091905050611e5c565b005b6003818154811015156108fd57fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561096957600080fd5b81600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615156109c257600080fd5b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600091505b600160038054905003821015610b4a578273ffffffffffffffffffffffffffffffffffffffff16600383815481101515610a5557fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610b3d576003600160038054905003815481101515610ab457fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600383815481101515610aef57fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610b4a565b8180600101925050610a1f565b6001600381818054905003915081610b62919061233b565b506003805490506004541115610b8157610b8060038054905061185d565b5b8273ffffffffffffffffffffffffffffffffffffffff167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a2505050565b60076020528060005260406000206000915090505481565b33600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610c3a57600080fd5b81336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610ca557600080fd5b8360008082815260200190815260200160002060030160009054906101000a900460ff16151515610cd557600080fd5b84610cdf816111a5565b151515610ceb57600080fd5b60006001600088815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550853373ffffffffffffffffffffffffffffffffffffffff167ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e960405160405180910390a3505050505050565b8060008082815260200190815260200160002060030160009054906101000a900460ff16151515610dd057600080fd5b81610dda816111a5565b1515610de557600080fd5b8260008060008381526020019081526020016000209050610ea1816002018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610e975780601f10610e6c57610100808354040283529160200191610e97565b820191906000526020600020905b815481529060010190602001808311610e7a57829003601f168201915b5050505050611ed7565b1515610eac57600080fd5b610eb585612019565b5050505050565b60026020528060005260406000206000915054906101000a900460ff1681565b60016020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b600080600090505b600554811015610f9657838015610f4a575060008082815260200190815260200160002060030160009054906101000a900460ff16155b80610f7d5750828015610f7c575060008082815260200190815260200160002060030160009054906101000a900460ff165b5b15610f89576001820191505b8080600101915050610f13565b5092915050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610fd757600080fd5b80600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151561103157600080fd5b8160008173ffffffffffffffffffffffffffffffffffffffff161415151561105857600080fd5b600160038054905001600454603282111580156110755750818111155b8015611082575060008114155b801561108f575060008214155b151561109a57600080fd5b6001600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600380548060010182816111069190612367565b9160005260206000209001600087909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508473ffffffffffffffffffffffffffffffffffffffff167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b60065481565b6000806000809150600090505b600380549050811015611283576001600085815260200190815260200160002060006003838154811015156111e357fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611263576001820191505b6004548214156112765760019250611284565b80806001019150506111b2565b5b5050919050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156112c557600080fd5b806006819055507fd1c9101a34feff75cccef14a28785a0279cb0b49c1f321f21f5f422e746b4377816040518082815260200191505060405180910390a150565b600080600090505b6003805490508110156113cc5760016000848152602001908152602001600020600060038381548110151561133f57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156113bf576001820191505b808060010191505061130e565b50919050565b60006020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201908060030160009054906101000a900460ff16905084565b611436612393565b60038054806020026020016040519081016040528092919081815260200182805480156114b857602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161146e575b5050505050905090565b6114ca6123a7565b6114d26123a7565b6000808688111515156114e457600080fd5b6005546040518059106114f45750595b9080825280602002602001820160405250925060009150600090505b6005548110156115b057858015611547575060008082815260200190815260200160002060030160009054906101000a900460ff16155b8061157a5750848015611579575060008082815260200190815260200160002060030160009054906101000a900460ff165b5b156115a35780838381518110151561158e57fe5b90602001906020020181815250506001820191505b8080600101915050611510565b8787036040518059106115c05750595b908082528060200260200182016040525093508790505b868110156116225782818151811015156115ed57fe5b906020019060200201518489830381518110151561160757fe5b906020019060200201818152505080806001019150506115d7565b505050949350505050565b611635612393565b61163d612393565b6000806003805490506040518059106116535750595b9080825280602002602001820160405250925060009150600090505b6003805490508110156117b2576001600086815260200190815260200160002060006003838154811015156116a057fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156117a55760038181548110151561172857fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16838381518110151561176257fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506001820191505b808060010191505061166f565b816040518059106117c05750595b90808252806020026020018201604052509350600090505b8181101561184f5782818151811015156117ee57fe5b90602001906020020151848281518110151561180657fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080806001019150506117d8565b505050919050565b60055481565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561189757600080fd5b60038054905081603282111580156118af5750818111155b80156118bc575060008114155b80156118c9575060008214155b15156118d457600080fd5b826004819055507fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a836040518082815260200191505060405180910390a1505050565b33600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151561197057600080fd5b81600080600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156119cc57600080fd5b82336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151515611a3857600080fd5b84611a42816111a5565b151515611a4e57600080fd5b600180600088815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550853373ffffffffffffffffffffffffffffffffffffffff167f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef60405160405180910390a3611b03866111a5565b15611b1357611b128642612195565b5b505050505050565b6000611b288484846121e9565b9050611b3381611917565b9392505050565b603281565b60045481565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b8157600080fd5b82600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515611bda57600080fd5b82600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151515611c3457600080fd5b600092505b600380549050831015611d1f578473ffffffffffffffffffffffffffffffffffffffff16600384815481101515611c6c57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611d125783600384815481101515611cc457fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611d1f565b8280600101935050611c39565b6000600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508473ffffffffffffffffffffffffffffffffffffffff167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a28373ffffffffffffffffffffffffffffffffffffffff167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b8060008082815260200190815260200160002060030160009054906101000a900460ff16151515611e8c57600080fd5b81611e96816111a5565b1515611ea157600080fd5b826006546007600083815260200190815260200160002054014210151515611ec857600080fd5b611ed184612019565b50505050565b600080600060405180807f7061757365282900000000000000000000000000000000000000000000000000815250600701905060405180910390209150600090505b600481101561200d578181600481101515611f3057fe5b1a7f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168482815181101515611f8357fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415156120005760009250612012565b8080600101915050611f19565b600192505b5050919050565b6000806000838152602001908152602001600020905060018160030160006101000a81548160ff0219169083151502179055508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681600101548260020160405180828054600181600116156101000203166002900480156120f55780601f106120ca576101008083540402835291602001916120f5565b820191906000526020600020905b8154815290600101906020018083116120d857829003601f168201915b505091505060006040518083038185876187965a03f1925050501561214657817f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7560405160405180910390a2612191565b817f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923660405160405180910390a260008160030160006101000a81548160ff0219169083151502179055505b5050565b806007600084815260200190815260200160002081905550817f0b237afe65f1514fd7ea3f923ea4fe792bdd07000a912b6cd1602a8e7f573c8d826040518082815260200191505060405180910390a25050565b60008360008173ffffffffffffffffffffffffffffffffffffffff161415151561221257600080fd5b60055491506080604051908101604052808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020016000151581525060008084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020190805190602001906122d19291906123bb565b5060608201518160030160006101000a81548160ff0219169083151502179055509050506001600560008282540192505081905550817fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5160405160405180910390a2509392505050565b81548183558181151161236257818360005260206000209182019101612361919061243b565b5b505050565b81548183558181151161238e5781836000526020600020918201910161238d919061243b565b5b505050565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106123fc57805160ff191683800117855561242a565b8280016001018555821561242a579182015b8281111561242957825182559160200191906001019061240e565b5b509050612437919061243b565b5090565b61245d91905b80821115612459576000816000905550600101612441565b5090565b905600a165627a7a72305820670aa210266ccc388354173d8da609316c6abb3b83159e9942819b3dc679d1930029", + "deployedBytecode": "0x606060405260043610610149576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063025e7c27146101a3578063173825d91461020657806319b83a7b1461023f57806320ea8d8614610276578063215ff46f146102995780632f54bf6e146102bc5780633411c81c1461030d57806354741525146103675780637065cb48146103ab578063733e1b68146103e4578063784547a71461040d5780637ad28c51146104485780638b51d13f1461046b5780639ace38c2146104a2578063a0e67e2b146105a0578063a8abe69a1461060a578063b5dc40c3146106a1578063b77bf60014610719578063ba51a6df14610742578063c01a8c8414610765578063c642747414610788578063d74f8edd14610821578063dc8452cd1461084a578063e20056e614610873578063ee22610b146108cb575b60003411156101a1573373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a25b005b34156101ae57600080fd5b6101c460048080359060200190919050506108ee565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561021157600080fd5b61023d600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061092d565b005b341561024a57600080fd5b6102606004808035906020019091905050610bc9565b6040518082815260200191505060405180910390f35b341561028157600080fd5b6102976004808035906020019091905050610be1565b005b34156102a457600080fd5b6102ba6004808035906020019091905050610da0565b005b34156102c757600080fd5b6102f3600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610ebc565b604051808215151515815260200191505060405180910390f35b341561031857600080fd5b61034d600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610edc565b604051808215151515815260200191505060405180910390f35b341561037257600080fd5b610395600480803515159060200190919080351515906020019091905050610f0b565b6040518082815260200191505060405180910390f35b34156103b657600080fd5b6103e2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610f9d565b005b34156103ef57600080fd5b6103f761119f565b6040518082815260200191505060405180910390f35b341561041857600080fd5b61042e60048080359060200190919050506111a5565b604051808215151515815260200191505060405180910390f35b341561045357600080fd5b610469600480803590602001909190505061128b565b005b341561047657600080fd5b61048c6004808035906020019091905050611306565b6040518082815260200191505060405180910390f35b34156104ad57600080fd5b6104c360048080359060200190919050506113d2565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018315151515815260200182810382528481815460018160011615610100020316600290048152602001915080546001816001161561010002031660029004801561058e5780601f106105635761010080835404028352916020019161058e565b820191906000526020600020905b81548152906001019060200180831161057157829003601f168201915b50509550505050505060405180910390f35b34156105ab57600080fd5b6105b361142e565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156105f65780820151818401526020810190506105db565b505050509050019250505060405180910390f35b341561061557600080fd5b61064a6004808035906020019091908035906020019091908035151590602001909190803515159060200190919050506114c2565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561068d578082015181840152602081019050610672565b505050509050019250505060405180910390f35b34156106ac57600080fd5b6106c2600480803590602001909190505061162d565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156107055780820151818401526020810190506106ea565b505050509050019250505060405180910390f35b341561072457600080fd5b61072c611857565b6040518082815260200191505060405180910390f35b341561074d57600080fd5b610763600480803590602001909190505061185d565b005b341561077057600080fd5b6107866004808035906020019091905050611917565b005b341561079357600080fd5b61080b600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611b1b565b6040518082815260200191505060405180910390f35b341561082c57600080fd5b610834611b3a565b6040518082815260200191505060405180910390f35b341561085557600080fd5b61085d611b3f565b6040518082815260200191505060405180910390f35b341561087e57600080fd5b6108c9600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611b45565b005b34156108d657600080fd5b6108ec6004808035906020019091905050611e5c565b005b6003818154811015156108fd57fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561096957600080fd5b81600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615156109c257600080fd5b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600091505b600160038054905003821015610b4a578273ffffffffffffffffffffffffffffffffffffffff16600383815481101515610a5557fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610b3d576003600160038054905003815481101515610ab457fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600383815481101515610aef57fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610b4a565b8180600101925050610a1f565b6001600381818054905003915081610b62919061233b565b506003805490506004541115610b8157610b8060038054905061185d565b5b8273ffffffffffffffffffffffffffffffffffffffff167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a2505050565b60076020528060005260406000206000915090505481565b33600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610c3a57600080fd5b81336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610ca557600080fd5b8360008082815260200190815260200160002060030160009054906101000a900460ff16151515610cd557600080fd5b84610cdf816111a5565b151515610ceb57600080fd5b60006001600088815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550853373ffffffffffffffffffffffffffffffffffffffff167ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e960405160405180910390a3505050505050565b8060008082815260200190815260200160002060030160009054906101000a900460ff16151515610dd057600080fd5b81610dda816111a5565b1515610de557600080fd5b8260008060008381526020019081526020016000209050610ea1816002018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610e975780601f10610e6c57610100808354040283529160200191610e97565b820191906000526020600020905b815481529060010190602001808311610e7a57829003601f168201915b5050505050611ed7565b1515610eac57600080fd5b610eb585612019565b5050505050565b60026020528060005260406000206000915054906101000a900460ff1681565b60016020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b600080600090505b600554811015610f9657838015610f4a575060008082815260200190815260200160002060030160009054906101000a900460ff16155b80610f7d5750828015610f7c575060008082815260200190815260200160002060030160009054906101000a900460ff165b5b15610f89576001820191505b8080600101915050610f13565b5092915050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610fd757600080fd5b80600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151561103157600080fd5b8160008173ffffffffffffffffffffffffffffffffffffffff161415151561105857600080fd5b600160038054905001600454603282111580156110755750818111155b8015611082575060008114155b801561108f575060008214155b151561109a57600080fd5b6001600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600380548060010182816111069190612367565b9160005260206000209001600087909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508473ffffffffffffffffffffffffffffffffffffffff167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b60065481565b6000806000809150600090505b600380549050811015611283576001600085815260200190815260200160002060006003838154811015156111e357fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611263576001820191505b6004548214156112765760019250611284565b80806001019150506111b2565b5b5050919050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156112c557600080fd5b806006819055507fd1c9101a34feff75cccef14a28785a0279cb0b49c1f321f21f5f422e746b4377816040518082815260200191505060405180910390a150565b600080600090505b6003805490508110156113cc5760016000848152602001908152602001600020600060038381548110151561133f57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156113bf576001820191505b808060010191505061130e565b50919050565b60006020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201908060030160009054906101000a900460ff16905084565b611436612393565b60038054806020026020016040519081016040528092919081815260200182805480156114b857602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161146e575b5050505050905090565b6114ca6123a7565b6114d26123a7565b6000808688111515156114e457600080fd5b6005546040518059106114f45750595b9080825280602002602001820160405250925060009150600090505b6005548110156115b057858015611547575060008082815260200190815260200160002060030160009054906101000a900460ff16155b8061157a5750848015611579575060008082815260200190815260200160002060030160009054906101000a900460ff165b5b156115a35780838381518110151561158e57fe5b90602001906020020181815250506001820191505b8080600101915050611510565b8787036040518059106115c05750595b908082528060200260200182016040525093508790505b868110156116225782818151811015156115ed57fe5b906020019060200201518489830381518110151561160757fe5b906020019060200201818152505080806001019150506115d7565b505050949350505050565b611635612393565b61163d612393565b6000806003805490506040518059106116535750595b9080825280602002602001820160405250925060009150600090505b6003805490508110156117b2576001600086815260200190815260200160002060006003838154811015156116a057fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156117a55760038181548110151561172857fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16838381518110151561176257fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506001820191505b808060010191505061166f565b816040518059106117c05750595b90808252806020026020018201604052509350600090505b8181101561184f5782818151811015156117ee57fe5b90602001906020020151848281518110151561180657fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080806001019150506117d8565b505050919050565b60055481565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561189757600080fd5b60038054905081603282111580156118af5750818111155b80156118bc575060008114155b80156118c9575060008214155b15156118d457600080fd5b826004819055507fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a836040518082815260200191505060405180910390a1505050565b33600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151561197057600080fd5b81600080600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156119cc57600080fd5b82336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151515611a3857600080fd5b84611a42816111a5565b151515611a4e57600080fd5b600180600088815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550853373ffffffffffffffffffffffffffffffffffffffff167f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef60405160405180910390a3611b03866111a5565b15611b1357611b128642612195565b5b505050505050565b6000611b288484846121e9565b9050611b3381611917565b9392505050565b603281565b60045481565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b8157600080fd5b82600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515611bda57600080fd5b82600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151515611c3457600080fd5b600092505b600380549050831015611d1f578473ffffffffffffffffffffffffffffffffffffffff16600384815481101515611c6c57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611d125783600384815481101515611cc457fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611d1f565b8280600101935050611c39565b6000600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508473ffffffffffffffffffffffffffffffffffffffff167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a28373ffffffffffffffffffffffffffffffffffffffff167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b8060008082815260200190815260200160002060030160009054906101000a900460ff16151515611e8c57600080fd5b81611e96816111a5565b1515611ea157600080fd5b826006546007600083815260200190815260200160002054014210151515611ec857600080fd5b611ed184612019565b50505050565b600080600060405180807f7061757365282900000000000000000000000000000000000000000000000000815250600701905060405180910390209150600090505b600481101561200d578181600481101515611f3057fe5b1a7f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168482815181101515611f8357fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415156120005760009250612012565b8080600101915050611f19565b600192505b5050919050565b6000806000838152602001908152602001600020905060018160030160006101000a81548160ff0219169083151502179055508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681600101548260020160405180828054600181600116156101000203166002900480156120f55780601f106120ca576101008083540402835291602001916120f5565b820191906000526020600020905b8154815290600101906020018083116120d857829003601f168201915b505091505060006040518083038185876187965a03f1925050501561214657817f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7560405160405180910390a2612191565b817f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923660405160405180910390a260008160030160006101000a81548160ff0219169083151502179055505b5050565b806007600084815260200190815260200160002081905550817f0b237afe65f1514fd7ea3f923ea4fe792bdd07000a912b6cd1602a8e7f573c8d826040518082815260200191505060405180910390a25050565b60008360008173ffffffffffffffffffffffffffffffffffffffff161415151561221257600080fd5b60055491506080604051908101604052808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020016000151581525060008084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020190805190602001906122d19291906123bb565b5060608201518160030160006101000a81548160ff0219169083151502179055509050506001600560008282540192505081905550817fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5160405160405180910390a2509392505050565b81548183558181151161236257818360005260206000209182019101612361919061243b565b5b505050565b81548183558181151161238e5781836000526020600020918201910161238d919061243b565b5b505050565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106123fc57805160ff191683800117855561242a565b8280016001018555821561242a579182015b8281111561242957825182559160200191906001019061240e565b5b509050612437919061243b565b5090565b61245d91905b80821115612459576000816000905550600101612441565b5090565b905600a165627a7a72305820670aa210266ccc388354173d8da609316c6abb3b83159e9942819b3dc679d1930029", "sourceMap": "642:5334:34:-;;;1548:237;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1706:7;1715:9;2975:6:35;2929:7;:14;2945:9;819:2;2253:10;:29;;:68;;;;;2311:10;2298:9;:23;;2253:68;:98;;;;;2350:1;2337:9;:14;;2253:98;:129;;;;;2381:1;2367:10;:15;;2253:129;2245:138;;;;;;;;2982:1;2975:8;;2970:151;2987:7;:14;2985:1;:16;2970:151;;;3031:7;:19;3039:7;3047:1;3039:10;;;;;;;;;;;;;;;;;;3031:19;;;;;;;;;;;;;;;;;;;;;;;;;3030:20;:39;;;;;3068:1;3054:7;3062:1;3054:10;;;;;;;;;;;;;;;;;;:15;;;;3030:39;3022:48;;;;;;;;3106:4;3084:7;:19;3092:7;3100:1;3092:10;;;;;;;;;;;;;;;;;;3084:19;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;3003:3;;;;;;;2970:151;;;3139:7;3130:6;:16;;;;;;;;;;;;:::i;:::-;;3167:9;3156:8;:20;;;;2830:353;;;;;1760:18:34;1740:17;:38;;;;1548:237;;;642:5334;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;", "deployedSourceMap": "642:5334:34:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2535:1:35;2523:9;:13;2519:61;;;2558:10;2550:30;;;2570:9;2550:30;;;;;;;;;;;;;;;;;;2519:61;642:5334:34;1030:23:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3710:460;;;;;;;;;;;;;;;;;;;;;;;;;;;;866:64:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3179:338;;;;;;;;;;;;;;;;;;;;;;;;;;4097:259;;;;;;;;;;;;;;;;;;;;;;;;;;984:40:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;914:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9221:315;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3310:277;;;;;;;;;;;;;;;;;;;;;;;;;;;;830:29:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7397:333:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1993:186:34;;;;;;;;;;;;;;;;;;;;;;;;;;8711:248:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;859:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9620:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;10830:702:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;9910:571:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;1085:28:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4992:207;;;;;;;;;;;;;;;;;;;;;;;;;;2337:604:34;;;;;;;;;;;;;;;;;;;;;;;;;;5458:244:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;780:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1059:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4372:449;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3646:234:34;;;;;;;;;;;;;;;;;;;;;;;;;;1030:23:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3710:460::-;3858:6;1339:4;1317:27;;:10;:27;;;1309:36;;;;;;;;3800:5;1523:7;:14;1531:5;1523:14;;;;;;;;;;;;;;;;;;;;;;;;;1515:23;;;;;;;;3838:5;3821:7;:14;3829:5;3821:14;;;;;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;3865:1;3858:8;;3853:170;3886:1;3870:6;:13;;;;:17;3868:1;:19;3853:170;;;3923:5;3910:18;;:6;3917:1;3910:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;:18;;;3906:117;;;3960:6;3983:1;3967:6;:13;;;;:17;3960:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;3948:6;3955:1;3948:9;;;;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;4003:5;;3906:117;3889:3;;;;;;;3853:170;;;4049:1;4032:6;:18;;;;;;;;;;;;;;:::i;:::-;;4075:6;:13;;;;4064:8;;:24;4060:74;;;4102:32;4120:6;:13;;;;4102:17;:32::i;:::-;4060:74;4157:5;4144:19;;;;;;;;;;;;1355:1;3710:460;;:::o;866:64:34:-;;;;;;;;;;;;;;;;;:::o;3179:338::-;3262:10;1523:7:35;:14;1531:5;1523:14;;;;;;;;;;;;;;;;;;;;;;;;;1515:23;;;;;;;;3292:13:34;3307:10;1768:13:35;:28;1782:13;1768:28;;;;;;;;;;;:35;1797:5;1768:35;;;;;;;;;;;;;;;;;;;;;;;;;1760:44;;;;;;;;3339:13:34;2024:12:35;:27;2037:13;2024:27;;;;;;;;;;;:36;;;;;;;;;;;;2023:37;2015:46;;;;;;;;3386:13:34;1129:26;1141:13;1129:11;:26::i;:::-;1128:27;1120:36;;;;;;;;3458:5;3415:13;:28;3429:13;3415:28;;;;;;;;;;;:40;3444:10;3415:40;;;;;;;;;;;;;;;;:48;;;;;;;;;;;;;;;;;;3496:13;3484:10;3473:37;;;;;;;;;;;;2071:1:35;1814;1548;;3179:338:34;;:::o;4097:259::-;4196:13;2024:12:35;:27;2037:13;2024:27;;;;;;;;;;;:36;;;;;;;;;;;;2023:37;2015:46;;;;;;;;4241:13:34;1006:26;1018:13;1006:11;:26::i;:::-;998:35;;;;;;;;4286:13;1414:23;1440:12;:27;1453:13;1440:27;;;;;;;;;;;1414:53;;1486:37;1514:3;:8;;1486:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:27;:37::i;:::-;1478:46;;;;;;;;4315:34;4335:13;4315:19;:34::i;:::-;1043:1;;2071::35;4097:259:34;;:::o;984:40:35:-;;;;;;;;;;;;;;;;;;;;;;:::o;914:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;9221:315::-;9324:10;9355:6;9362:1;9355:8;;9350:179;9367:16;;9365:1;:18;9350:179;;;9409:7;:36;;;;;9421:12;:15;9434:1;9421:15;;;;;;;;;;;:24;;;;;;;;;;;;9420:25;9409:36;:92;;;;9465:8;:36;;;;;9477:12;:15;9490:1;9477:15;;;;;;;;;;;:24;;;;;;;;;;;;9465:36;9409:92;9402:127;;;9528:1;9519:10;;;;9402:127;9385:3;;;;;;;9350:179;;;9221:315;;;;;:::o;3310:277::-;1339:4;1317:27;;:10;:27;;;1309:36;;;;;;;;3403:5;1430:7;:14;1438:5;1430:14;;;;;;;;;;;;;;;;;;;;;;;;;1429:15;1421:24;;;;;;;;3426:5;2150:1;2138:8;:13;;;;2130:22;;;;;;;;3474:1;3458:6;:13;;;;:17;3477:8;;819:2;2253:10;:29;;:68;;;;;2311:10;2298:9;:23;;2253:68;:98;;;;;2350:1;2337:9;:14;;2253:98;:129;;;;;2381:1;2367:10;:15;;2253:129;2245:138;;;;;;;;3518:4;3501:7;:14;3509:5;3501:14;;;;;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;3532:6;:18;;;;;;;;;;;:::i;:::-;;;;;;;;;;3544:5;3532:18;;;;;;;;;;;;;;;;;;;;;;;3574:5;3560:20;;;;;;;;;;;;2162:1;;1455;1355;3310:277;:::o;830:29:34:-;;;;:::o;7397:333:35:-;7483:4;7503:10;7532:6;7516:1;7503:14;;7539:1;7532:8;;7527:197;7544:6;:13;;;;7542:1;:15;7527:197;;;7582:13;:28;7596:13;7582:28;;;;;;;;;;;:39;7611:6;7618:1;7611:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;7582:39;;;;;;;;;;;;;;;;;;;;;;;;;7578:71;;;7648:1;7639:10;;;;7578:71;7676:8;;7667:5;:17;7663:50;;;7709:4;7702:11;;;;7663:50;7559:3;;;;;;;7527:197;;;7397:333;;;;;;:::o;1993:186:34:-;1339:4:35;1317:27;;:10;:27;;;1309:36;;;;;;;;2110:18:34;2090:17;:38;;;;2138:34;2153:18;2138:34;;;;;;;;;;;;;;;;;;1993:186;:::o;8711:248:35:-;8806:10;8837:6;8844:1;8837:8;;8832:120;8849:6;:13;;;;8847:1;:15;8832:120;;;8885:13;:28;8899:13;8885:28;;;;;;;;;;;:39;8914:6;8921:1;8914:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;8885:39;;;;;;;;;;;;;;;;;;;;;;;;;8881:71;;;8951:1;8942:10;;;;8881:71;8864:3;;;;;;;8832:120;;;8711:248;;;;:::o;859:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;9620:111::-;9686:9;;:::i;:::-;9718:6;9711:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9620:111;:::o;10830:702::-;10951:22;;:::i;:::-;11019:32;;:::i;:::-;11092:10;11116:6;11005:2;10997:4;:10;;10989:19;;;;;;;;11065:16;;11054:28;;;;;;;;;;;;;;;;;;;;;;;;11019:63;;11105:1;11092:14;;11139:1;11137:3;;11132:250;11144:16;;11142:1;:18;11132:250;;;11186:7;:36;;;;;11198:12;:15;11211:1;11198:15;;;;;;;;;;;:24;;;;;;;;;;;;11197:25;11186:36;:92;;;;11242:8;:36;;;;;11254:12;:15;11267:1;11254:15;;;;;;;;;;;:24;;;;;;;;;;;;11242:36;11186:92;11179:203;;;11338:1;11310:18;11329:5;11310:25;;;;;;;;;;;;;;;;;:29;;;;;11366:1;11357:10;;;;11179:203;11162:3;;;;;;;11132:250;;;11425:4;11420:2;:9;11409:21;;;;;;;;;;;;;;;;;;;;;;;;11391:39;;11447:4;11445:6;;11440:85;11455:2;11453:1;:4;11440:85;;;11504:18;11523:1;11504:21;;;;;;;;;;;;;;;;;;11476:15;11496:4;11492:1;:8;11476:25;;;;;;;;;;;;;;;;;:49;;;;;11459:3;;;;;;;11440:85;;;10830:702;;;;;;;;;:::o;9910:571::-;10001:24;;:::i;:::-;10041:34;;:::i;:::-;10116:10;10140:6;10092;:13;;;;10078:28;;;;;;;;;;;;;;;;;;;;;;;;10041:65;;10129:1;10116:14;;10163:1;10161:3;;10156:186;10168:6;:13;;;;10166:1;:15;10156:186;;;10204:13;:28;10218:13;10204:28;;;;;;;;;;;:39;10233:6;10240:1;10233:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;10204:39;;;;;;;;;;;;;;;;;;;;;;;;;10200:142;;;10290:6;10297:1;10290:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;10263:17;10281:5;10263:24;;;;;;;;;;;;;;;;;:36;;;;;;;;;;;10326:1;10317:10;;;;10200:142;10183:3;;;;;;;10156:186;;;10382:5;10368:20;;;;;;;;;;;;;;;;;;;;;;;;10351:37;;10405:1;10403:3;;10398:76;10410:5;10408:1;:7;10398:76;;;10454:17;10472:1;10454:20;;;;;;;;;;;;;;;;;;10434:14;10449:1;10434:17;;;;;;;;;;;;;;;;;:40;;;;;;;;;;;10417:3;;;;;;;10398:76;;;9910:571;;;;;;:::o;1085:28::-;;;;:::o;4992:207::-;1339:4;1317:27;;:10;:27;;;1309:36;;;;;;;;5094:6;:13;;;;5109:9;819:2;2253:10;:29;;:68;;;;;2311:10;2298:9;:23;;2253:68;:98;;;;;2350:1;2337:9;:14;;2253:98;:129;;;;;2381:1;2367:10;:15;;2253:129;2245:138;;;;;;;;5145:9;5134:8;:20;;;;5164:28;5182:9;5164:28;;;;;;;;;;;;;;;;;;1355:1;;4992:207;:::o;2337:604:34:-;2420:10;1523:7:35;:14;1531:5;1523:14;;;;;;;;;;;;;;;;;;;;;;;;;1515:23;;;;;;;;2458:13:34;1670:1:35;1627:12;:27;1640:13;1627:27;;;;;;;;;;;:39;;;;;;;;;;;;:44;;;;1619:53;;;;;;;;2494:13:34;2509:10;1904:13:35;:28;1918:13;1904:28;;;;;;;;;;;:35;1933:5;1904:35;;;;;;;;;;;;;;;;;;;;;;;;;1903:36;1895:45;;;;;;;;2553:13:34;1129:26;1141:13;1129:11;:26::i;:::-;1128:27;1120:36;;;;;;;;2625:4;2582:13;:28;2596:13;2582:28;;;;;;;;;;;:40;2611:10;2582:40;;;;;;;;;;;;;;;;:47;;;;;;;;;;;;;;;;;;2664:13;2652:10;2639:39;;;;;;;;;;;;2830:26;2842:13;2830:11;:26::i;:::-;2826:109;;;2872:52;2893:13;2908:15;2872:20;:52::i;:::-;2826:109;1950:1:35;1682;;1548;2337:604:34;;:::o;5458:244:35:-;5562:18;5612:40;5627:11;5640:5;5647:4;5612:14;:40::i;:::-;5596:56;;5662:33;5681:13;5662:18;:33::i;:::-;5458:244;;;;;:::o;780:41::-;819:2;780:41;:::o;1059:20::-;;;;:::o;4372:449::-;4543:6;1339:4;1317:27;;:10;:27;;;1309:36;;;;;;;;4481:5;1523:7;:14;1531:5;1523:14;;;;;;;;;;;;;;;;;;;;;;;;;1515:23;;;;;;;;4514:8;1430:7;:14;1438:5;1430:14;;;;;;;;;;;;;;;;;;;;;;;;;1429:15;1421:24;;;;;;;;4550:1;4543:8;;4538:149;4555:6;:13;;;;4553:1;:15;4538:149;;;4604:5;4591:18;;:6;4598:1;4591:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;:18;;;4587:100;;;4641:8;4629:6;4636:1;4629:9;;;;;;;;;;;;;;;;;;;:20;;;;;;;;;;;;;;;;;;4667:5;;4587:100;4570:3;;;;;;;4538:149;;;4713:5;4696:7;:14;4704:5;4696:14;;;;;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;4748:4;4728:7;:17;4736:8;4728:17;;;;;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;4775:5;4762:19;;;;;;;;;;;;4805:8;4791:23;;;;;;;;;;;;1548:1;1355;4372:449;;;:::o;3646:234:34:-;3729:13;2024:12:35;:27;2037:13;2024:27;;;;;;;;;;;:36;;;;;;;;;;;;2023:37;2015:46;;;;;;;;3774:13:34;1006:26;1018:13;1006:11;:26::i;:::-;998:35;;;;;;;;3810:13;1311:17;;1259:34;:49;1294:13;1259:49;;;;;;;;;;;;:69;1240:15;:88;;1232:97;;;;;;;;3839:34;3859:13;3839:19;:34::i;:::-;1043:1;2071::35;3646:234:34;;:::o;5620:354::-;5716:4;5736:29;5811:6;5775:20;;;;;;;;;;;;;;;;;;;5736:60;;5820:1;5811:10;;5806:140;5827:1;5823;:5;5806:140;;;5864:22;5887:1;5864:25;;;;;;;;;;;;5853:36;;;:4;5858:1;5853:7;;;;;;;;;;;;;;;;;;;;:36;;;;;5849:87;;;5916:5;5909:12;;;;5849:87;5830:3;;;;;;;5806:140;;;5963:4;5956:11;;5620:354;;;;;;:::o;4548:372::-;4628:23;4654:12;:27;4667:13;4654:27;;;;;;;;;;;4628:53;;4706:4;4691:3;:12;;;:19;;;;;;;;;;;;;;;;;;4724:3;:15;;;;;;;;;;;;:20;;4751:3;:9;;;4762:3;:8;;4724:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4720:194;;;4795:13;4785:24;;;;;;;;;;4720:194;;;4855:13;4838:31;;;;;;;;;;4898:5;4883:3;:12;;;:20;;;;;;;;;;;;;;;;;;4720:194;4548:372;;:::o;5074:241::-;5230:16;5178:34;:49;5213:13;5178:49;;;;;;;;;;;:68;;;;5276:13;5256:52;5291:16;5256:52;;;;;;;;;;;;;;;;;;5074:241;;:::o;8063:451:35:-;8195:18;8165:11;2150:1;2138:8;:13;;;;2130:22;;;;;;;;8245:16;;8229:32;;8301:140;;;;;;;;;8340:11;8301:140;;;;;;8372:5;8301:140;;;;8397:4;8301:140;;;;8425:5;8301:140;;;;;8271:12;:27;8284:13;8271:27;;;;;;;;;;;:170;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8471:1;8451:16;;:21;;;;;;;;;;;8493:13;8482:25;;;;;;;;;;8063:451;;;;;;:::o;642:5334:34:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", "source": "/*\n\n Copyright 2018 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\nimport \"./MultiSigWallet.sol\";\n\n\ncontract DharmaMultiSigWallet is MultiSigWallet {\n\n event ConfirmationTimeSet(uint indexed transactionId, uint confirmationTime);\n event TimeLockChange(uint timelockInSeconds);\n\n uint public timelockInSeconds;\n\n mapping (uint => uint) public transactionConfirmedBlockTimestamp;\n\n modifier sufficientlyConfirmed(uint transactionId) {\n require(isConfirmed(transactionId));\n _;\n }\n\n modifier insufficientlyConfirmed(uint transactionId) {\n require(!isConfirmed(transactionId));\n _;\n }\n\n modifier pastTimeLock(uint transactionId) {\n require(block.timestamp >= transactionConfirmedBlockTimestamp[transactionId] + timelockInSeconds);\n _;\n }\n\n modifier validPauseTransaction(uint transactionId) {\n Transaction storage txn = transactions[transactionId];\n\n require(_isPauseFunctionTransaction(txn.data));\n _;\n }\n\n function DharmaMultiSigWallet(\n address[] _owners,\n uint _required,\n uint _timelockInSeconds\n )\n public\n MultiSigWallet(_owners, _required)\n {\n timelockInSeconds = _timelockInSeconds;\n }\n\n ////////////////////////\n // EXTERNAL FUNCTIONS //\n ////////////////////////\n\n /**\n * Changes the duration of the time lock for transactions. Can only be called by the wallet.\n */\n function changeTimeLock(uint _timelockInSeconds)\n public\n onlyWallet\n {\n timelockInSeconds = _timelockInSeconds;\n TimeLockChange(_timelockInSeconds);\n }\n\n /**\n * Allows an owner to confirm a transaction if the transaction has\n * not yet received a sufficient threshold of confirmations.\n */\n function confirmTransaction(uint transactionId)\n public\n ownerExists(msg.sender)\n transactionExists(transactionId)\n notConfirmed(transactionId, msg.sender)\n insufficientlyConfirmed(transactionId)\n {\n confirmations[transactionId][msg.sender] = true;\n Confirmation(msg.sender, transactionId);\n\n // If the transaction is now sufficiently confirmed, we record\n // the timestamp in order to kick off the timelock period\n if (isConfirmed(transactionId)) {\n _setConfirmationTime(transactionId, block.timestamp);\n }\n }\n\n /**\n * Allows an owner to revoke a confirmation they've submitted\n * previously for the transaction if the transaction has not\n * already been sufficiently confirmed (and entered the timelock\n * period).\n */\n function revokeConfirmation(uint transactionId)\n public\n ownerExists(msg.sender)\n confirmed(transactionId, msg.sender)\n notExecuted(transactionId)\n insufficientlyConfirmed(transactionId)\n {\n confirmations[transactionId][msg.sender] = false;\n Revocation(msg.sender, transactionId);\n }\n\n /**\n * Allows anyone to execute a transaction if it has been\n * confirmed and the timelock has passed.\n */\n function executeTransaction(uint transactionId)\n public\n notExecuted(transactionId)\n sufficientlyConfirmed(transactionId)\n pastTimeLock(transactionId)\n {\n _executeTransaction(transactionId);\n }\n\n /**\n * In case of an emergency, allows anyone to execute a transaction if it has\n * been confirmed and matches the \"pause\" function signature WITHOUT waiting\n * for the timelock to pass.\n */\n function executePauseTransactionImmediately(uint transactionId)\n public\n notExecuted(transactionId)\n sufficientlyConfirmed(transactionId)\n validPauseTransaction(transactionId)\n {\n _executeTransaction(transactionId);\n }\n\n ////////////////////////\n // INTERNAL FUNCTIONS //\n ////////////////////////\n\n /**\n * Internal helper function that attempts to execute a confirmed transaction.\n */\n function _executeTransaction(uint transactionId)\n internal\n {\n Transaction storage txn = transactions[transactionId];\n txn.executed = true;\n if (txn.destination.call.value(txn.value)(txn.data))\n Execution(transactionId);\n else {\n ExecutionFailure(transactionId);\n txn.executed = false;\n }\n }\n\n /**\n * Internal function that records the time at which\n * a transaction reached the minimal threshold of\n * confirmations.\n */\n function _setConfirmationTime(uint transactionId, uint confirmationTime)\n internal\n {\n transactionConfirmedBlockTimestamp[transactionId] = confirmationTime;\n ConfirmationTimeSet(transactionId, confirmationTime);\n }\n\n /**\n * Returns true if the first four bytes of the given data matches\n * the function selector Method ID for the \"pause\" method --\n * for more information, see the Ethereum wiki's contract ABI specification:\n * https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI\n */\n function _isPauseFunctionTransaction(bytes data)\n internal\n view\n returns (bool)\n {\n bytes4 pauseFunctionSignature = bytes4(keccak256(\"pause()\"));\n for (uint i = 0; i < 4; i++) {\n if (data[i] != pauseFunctionSignature[i]) {\n return false;\n }\n }\n\n return true;\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/wallet/DharmaMultiSigWallet.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/wallet/DharmaMultiSigWallet.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/wallet/DharmaMultiSigWallet.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/wallet/DharmaMultiSigWallet.sol", "exportedSymbols": { "DharmaMultiSigWallet": [ 12928 @@ -658,7 +658,7 @@ { "attributes": { "SourceUnit": 13919, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/wallet/MultiSigWallet.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/wallet/MultiSigWallet.sol", "file": "./MultiSigWallet.sol", "scope": 12929, "symbolAliases": [ @@ -5191,7 +5191,7 @@ "42": { "events": {}, "links": {}, - "address": "0xc6846f1c094c354055d5cf4c093127f398753546" + "address": "0x73b8e624c2e0e55e7eaf5ff669a7c63f95781bb4" }, "70": { "events": {}, @@ -5200,5 +5200,5 @@ } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:16:36.723Z" + "updatedAt": "2018-10-09T17:53:24.844Z" } \ No newline at end of file diff --git a/artifacts/json/DummyContract.json b/artifacts/json/DummyContract.json index 780477bc..2e0ee28e 100644 --- a/artifacts/json/DummyContract.json +++ b/artifacts/json/DummyContract.json @@ -186,15 +186,15 @@ "type": "event" } ], - "bytecode": "0x6060604052341561000f57600080fd5b610cc68061001e6000396000f3006060604052600436106100a4576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633dd6020f146100a95780633fe1b53314610137578063589e9a75146101705780637a381130146101da5780638eb509a11461022b578063a224cfac14610264578063b38b5e58146102ce578063bcd3486614610307578063c305630214610340578063ffe1712114610391575b600080fd5b34156100b457600080fd5b6100bc61041f565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100fc5780820151818401526020810190506100e1565b50505050905090810190601f1680156101295780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561014257600080fd5b61016e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610458565b005b341561017b57600080fd5b6101836104a6565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156101c65780820151818401526020810190506101ab565b505050509050019250505060405180910390f35b34156101e557600080fd5b610211600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506104bd565b604051808215151515815260200191505060405180910390f35b341561023657600080fd5b610262600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506104da565b005b341561026f57600080fd5b610277610528565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156102ba57808201518184015260208101905061029f565b505050509050019250505060405180910390f35b34156102d957600080fd5b610305600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061053f565b005b341561031257600080fd5b61033e600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061058d565b005b341561034b57600080fd5b610377600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506105db565b604051808215151515815260200191505060405180910390f35b341561039c57600080fd5b6103a46105f8565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103e45780820151818401526020810190506103c9565b50505050905090810190601f1680156104115780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6040805190810160405280601981526020017f64756d6d792d636f6e74726163742d7365636f6e642d7365740000000000000081525081565b6104a3816040805190810160405280601881526020017f64756d6d792d636f6e74726163742d66697273742d736574000000000000000081525060006106319092919063ffffffff16565b50565b6104ae610c09565b6104b86003610927565b905090565b60006104d38260036109bf90919063ffffffff16565b9050919050565b610525816040805190810160405280601981526020017f64756d6d792d636f6e74726163742d7365636f6e642d7365740000000000000081525060036106319092919063ffffffff16565b50565b610530610c09565b61053a6000610927565b905090565b61058a816040805190810160405280601981526020017f64756d6d792d636f6e74726163742d7365636f6e642d736574000000000000008152506003610a189092919063ffffffff16565b50565b6105d8816040805190810160405280601881526020017f64756d6d792d636f6e74726163742d66697273742d73657400000000000000008152506000610a189092919063ffffffff16565b50565b60006105f18260006109bf90919063ffffffff16565b9050919050565b6040805190810160405280601881526020017f64756d6d792d636f6e74726163742d66697273742d736574000000000000000081525081565b600080600061064086866109bf565b151561064b57600080fd5b8560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205492506001866002018054905003915085600201828154811015156106ad57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff021916905580866002018481548110151561073e57fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055856002018281548110151561082357fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001866002018181805490500391508161086b9190610c1d565b508473ffffffffffffffffffffffffffffffffffffffff167f0814e4ee85854cea446b4a27a460e5ffb41516230dbc02f226c07907e432241c856040518080602001828103825283818151815260200191508051906020019080838360005b838110156108e55780820151818401526020810190506108ca565b50505050905090810190601f1680156109125780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050505050565b61092f610c09565b816002018054806020026020016040519081016040528092919081815260200182805480156109b357602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610969575b50505050509050919050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610a228383610bf4565b1515610a2d57600080fd5b60018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550826002018054806001018281610a9d9190610c49565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060018360020180549050038360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f571925c699f9072cec76b6c6c000571cc8d0bb5c47e5819202e2e9496c6508b5826040518080602001828103825283818151815260200191508051906020019080838360005b83811015610bb5578082015181840152602081019050610b9a565b50505050905090810190601f168015610be25780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b6000610c0083836109bf565b15905092915050565b602060405190810160405280600081525090565b815481835581811511610c4457818360005260206000209182019101610c439190610c75565b5b505050565b815481835581811511610c7057818360005260206000209182019101610c6f9190610c75565b5b505050565b610c9791905b80821115610c93576000816000905550600101610c7b565b5090565b905600a165627a7a7230582064883f9a4c3cb7c4539d84bea2868effc17918d95047339155a82b6e1f99ece90029", - "deployedBytecode": "0x6060604052600436106100a4576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633dd6020f146100a95780633fe1b53314610137578063589e9a75146101705780637a381130146101da5780638eb509a11461022b578063a224cfac14610264578063b38b5e58146102ce578063bcd3486614610307578063c305630214610340578063ffe1712114610391575b600080fd5b34156100b457600080fd5b6100bc61041f565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100fc5780820151818401526020810190506100e1565b50505050905090810190601f1680156101295780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561014257600080fd5b61016e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610458565b005b341561017b57600080fd5b6101836104a6565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156101c65780820151818401526020810190506101ab565b505050509050019250505060405180910390f35b34156101e557600080fd5b610211600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506104bd565b604051808215151515815260200191505060405180910390f35b341561023657600080fd5b610262600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506104da565b005b341561026f57600080fd5b610277610528565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156102ba57808201518184015260208101905061029f565b505050509050019250505060405180910390f35b34156102d957600080fd5b610305600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061053f565b005b341561031257600080fd5b61033e600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061058d565b005b341561034b57600080fd5b610377600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506105db565b604051808215151515815260200191505060405180910390f35b341561039c57600080fd5b6103a46105f8565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103e45780820151818401526020810190506103c9565b50505050905090810190601f1680156104115780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6040805190810160405280601981526020017f64756d6d792d636f6e74726163742d7365636f6e642d7365740000000000000081525081565b6104a3816040805190810160405280601881526020017f64756d6d792d636f6e74726163742d66697273742d736574000000000000000081525060006106319092919063ffffffff16565b50565b6104ae610c09565b6104b86003610927565b905090565b60006104d38260036109bf90919063ffffffff16565b9050919050565b610525816040805190810160405280601981526020017f64756d6d792d636f6e74726163742d7365636f6e642d7365740000000000000081525060036106319092919063ffffffff16565b50565b610530610c09565b61053a6000610927565b905090565b61058a816040805190810160405280601981526020017f64756d6d792d636f6e74726163742d7365636f6e642d736574000000000000008152506003610a189092919063ffffffff16565b50565b6105d8816040805190810160405280601881526020017f64756d6d792d636f6e74726163742d66697273742d73657400000000000000008152506000610a189092919063ffffffff16565b50565b60006105f18260006109bf90919063ffffffff16565b9050919050565b6040805190810160405280601881526020017f64756d6d792d636f6e74726163742d66697273742d736574000000000000000081525081565b600080600061064086866109bf565b151561064b57600080fd5b8560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205492506001866002018054905003915085600201828154811015156106ad57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff021916905580866002018481548110151561073e57fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055856002018281548110151561082357fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001866002018181805490500391508161086b9190610c1d565b508473ffffffffffffffffffffffffffffffffffffffff167f0814e4ee85854cea446b4a27a460e5ffb41516230dbc02f226c07907e432241c856040518080602001828103825283818151815260200191508051906020019080838360005b838110156108e55780820151818401526020810190506108ca565b50505050905090810190601f1680156109125780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050505050565b61092f610c09565b816002018054806020026020016040519081016040528092919081815260200182805480156109b357602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610969575b50505050509050919050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610a228383610bf4565b1515610a2d57600080fd5b60018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550826002018054806001018281610a9d9190610c49565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060018360020180549050038360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f571925c699f9072cec76b6c6c000571cc8d0bb5c47e5819202e2e9496c6508b5826040518080602001828103825283818151815260200191508051906020019080838360005b83811015610bb5578082015181840152602081019050610b9a565b50505050905090810190601f168015610be25780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b6000610c0083836109bf565b15905092915050565b602060405190810160405280600081525090565b815481835581811511610c4457818360005260206000209182019101610c439190610c75565b5b505050565b815481835581811511610c7057818360005260206000209182019101610c6f9190610c75565b5b505050565b610c9791905b80821115610c93576000816000905550600101610c7b565b5090565b905600a165627a7a7230582064883f9a4c3cb7c4539d84bea2868effc17918d95047339155a82b6e1f99ece90029", + "bytecode": "0x6060604052341561000f57600080fd5b610cc68061001e6000396000f3006060604052600436106100a4576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633dd6020f146100a95780633fe1b53314610137578063589e9a75146101705780637a381130146101da5780638eb509a11461022b578063a224cfac14610264578063b38b5e58146102ce578063bcd3486614610307578063c305630214610340578063ffe1712114610391575b600080fd5b34156100b457600080fd5b6100bc61041f565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100fc5780820151818401526020810190506100e1565b50505050905090810190601f1680156101295780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561014257600080fd5b61016e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610458565b005b341561017b57600080fd5b6101836104a6565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156101c65780820151818401526020810190506101ab565b505050509050019250505060405180910390f35b34156101e557600080fd5b610211600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506104bd565b604051808215151515815260200191505060405180910390f35b341561023657600080fd5b610262600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506104da565b005b341561026f57600080fd5b610277610528565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156102ba57808201518184015260208101905061029f565b505050509050019250505060405180910390f35b34156102d957600080fd5b610305600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061053f565b005b341561031257600080fd5b61033e600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061058d565b005b341561034b57600080fd5b610377600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506105db565b604051808215151515815260200191505060405180910390f35b341561039c57600080fd5b6103a46105f8565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103e45780820151818401526020810190506103c9565b50505050905090810190601f1680156104115780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6040805190810160405280601981526020017f64756d6d792d636f6e74726163742d7365636f6e642d7365740000000000000081525081565b6104a3816040805190810160405280601881526020017f64756d6d792d636f6e74726163742d66697273742d736574000000000000000081525060006106319092919063ffffffff16565b50565b6104ae610c09565b6104b86003610927565b905090565b60006104d38260036109bf90919063ffffffff16565b9050919050565b610525816040805190810160405280601981526020017f64756d6d792d636f6e74726163742d7365636f6e642d7365740000000000000081525060036106319092919063ffffffff16565b50565b610530610c09565b61053a6000610927565b905090565b61058a816040805190810160405280601981526020017f64756d6d792d636f6e74726163742d7365636f6e642d736574000000000000008152506003610a189092919063ffffffff16565b50565b6105d8816040805190810160405280601881526020017f64756d6d792d636f6e74726163742d66697273742d73657400000000000000008152506000610a189092919063ffffffff16565b50565b60006105f18260006109bf90919063ffffffff16565b9050919050565b6040805190810160405280601881526020017f64756d6d792d636f6e74726163742d66697273742d736574000000000000000081525081565b600080600061064086866109bf565b151561064b57600080fd5b8560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205492506001866002018054905003915085600201828154811015156106ad57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff021916905580866002018481548110151561073e57fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055856002018281548110151561082357fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001866002018181805490500391508161086b9190610c1d565b508473ffffffffffffffffffffffffffffffffffffffff167f0814e4ee85854cea446b4a27a460e5ffb41516230dbc02f226c07907e432241c856040518080602001828103825283818151815260200191508051906020019080838360005b838110156108e55780820151818401526020810190506108ca565b50505050905090810190601f1680156109125780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050505050565b61092f610c09565b816002018054806020026020016040519081016040528092919081815260200182805480156109b357602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610969575b50505050509050919050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610a228383610bf4565b1515610a2d57600080fd5b60018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550826002018054806001018281610a9d9190610c49565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060018360020180549050038360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f571925c699f9072cec76b6c6c000571cc8d0bb5c47e5819202e2e9496c6508b5826040518080602001828103825283818151815260200191508051906020019080838360005b83811015610bb5578082015181840152602081019050610b9a565b50505050905090810190601f168015610be25780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b6000610c0083836109bf565b15905092915050565b602060405190810160405280600081525090565b815481835581811511610c4457818360005260206000209182019101610c439190610c75565b5b505050565b815481835581811511610c7057818360005260206000209182019101610c6f9190610c75565b5b505050565b610c9791905b80821115610c93576000816000905550600101610c7b565b5090565b905600a165627a7a72305820bac620d71c35e25e3105a656b7b02ddb91f13d34260ff3cc0f1d603c1690e8600029", + "deployedBytecode": "0x6060604052600436106100a4576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633dd6020f146100a95780633fe1b53314610137578063589e9a75146101705780637a381130146101da5780638eb509a11461022b578063a224cfac14610264578063b38b5e58146102ce578063bcd3486614610307578063c305630214610340578063ffe1712114610391575b600080fd5b34156100b457600080fd5b6100bc61041f565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100fc5780820151818401526020810190506100e1565b50505050905090810190601f1680156101295780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561014257600080fd5b61016e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610458565b005b341561017b57600080fd5b6101836104a6565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156101c65780820151818401526020810190506101ab565b505050509050019250505060405180910390f35b34156101e557600080fd5b610211600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506104bd565b604051808215151515815260200191505060405180910390f35b341561023657600080fd5b610262600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506104da565b005b341561026f57600080fd5b610277610528565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156102ba57808201518184015260208101905061029f565b505050509050019250505060405180910390f35b34156102d957600080fd5b610305600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061053f565b005b341561031257600080fd5b61033e600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061058d565b005b341561034b57600080fd5b610377600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506105db565b604051808215151515815260200191505060405180910390f35b341561039c57600080fd5b6103a46105f8565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103e45780820151818401526020810190506103c9565b50505050905090810190601f1680156104115780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6040805190810160405280601981526020017f64756d6d792d636f6e74726163742d7365636f6e642d7365740000000000000081525081565b6104a3816040805190810160405280601881526020017f64756d6d792d636f6e74726163742d66697273742d736574000000000000000081525060006106319092919063ffffffff16565b50565b6104ae610c09565b6104b86003610927565b905090565b60006104d38260036109bf90919063ffffffff16565b9050919050565b610525816040805190810160405280601981526020017f64756d6d792d636f6e74726163742d7365636f6e642d7365740000000000000081525060036106319092919063ffffffff16565b50565b610530610c09565b61053a6000610927565b905090565b61058a816040805190810160405280601981526020017f64756d6d792d636f6e74726163742d7365636f6e642d736574000000000000008152506003610a189092919063ffffffff16565b50565b6105d8816040805190810160405280601881526020017f64756d6d792d636f6e74726163742d66697273742d73657400000000000000008152506000610a189092919063ffffffff16565b50565b60006105f18260006109bf90919063ffffffff16565b9050919050565b6040805190810160405280601881526020017f64756d6d792d636f6e74726163742d66697273742d736574000000000000000081525081565b600080600061064086866109bf565b151561064b57600080fd5b8560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205492506001866002018054905003915085600201828154811015156106ad57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff021916905580866002018481548110151561073e57fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055856002018281548110151561082357fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001866002018181805490500391508161086b9190610c1d565b508473ffffffffffffffffffffffffffffffffffffffff167f0814e4ee85854cea446b4a27a460e5ffb41516230dbc02f226c07907e432241c856040518080602001828103825283818151815260200191508051906020019080838360005b838110156108e55780820151818401526020810190506108ca565b50505050905090810190601f1680156109125780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050505050565b61092f610c09565b816002018054806020026020016040519081016040528092919081815260200182805480156109b357602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610969575b50505050509050919050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610a228383610bf4565b1515610a2d57600080fd5b60018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550826002018054806001018281610a9d9190610c49565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060018360020180549050038360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f571925c699f9072cec76b6c6c000571cc8d0bb5c47e5819202e2e9496c6508b5826040518080602001828103825283818151815260200191508051906020019080838360005b83811015610bb5578082015181840152602081019050610b9a565b50505050905090810190601f168015610be25780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b6000610c0083836109bf565b15905092915050565b602060405190810160405280600081525090565b815481835581811511610c4457818360005260206000209182019101610c439190610c75565b5b505050565b815481835581811511610c7057818360005260206000209182019101610c6f9190610c75565b5b505050565b610c9791905b80821115610c93576000816000905550600101610c7b565b5090565b905600a165627a7a72305820bac620d71c35e25e3105a656b7b02ddb91f13d34260ff3cc0f1d603c1690e8600029", "sourceMap": "653:1438:19:-;;;;;;;;;;;;;;;;;", "deployedSourceMap": "653:1438:19:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;947:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1260:121:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;1952:137;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;1663:142:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1387:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;1811:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;1137:117:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;1017:114;;;;;;;;;;;;;;;;;;;;;;;;;;;;1517:140;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;880:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;947:63:19;;;;;;;;;;;;;;;;;;;;:::o;1260:121::-;1318:56;1357:5;1364:9;;;;;;;;;;;;;;;;;;1318:18;:38;;:56;;;;;:::i;:::-;1260:121;:::o;1952:137::-;2013:9;;:::i;:::-;2041:41;:19;:39;:41::i;:::-;2034:48;;1952:137;:::o;1663:142::-;1736:4;1759:39;1792:5;1759:19;:32;;:39;;;;:::i;:::-;1752:46;;1663:142;;;:::o;1387:124::-;1446:58;1486:5;1493:10;;;;;;;;;;;;;;;;;;1446:19;:39;;:58;;;;;:::i;:::-;1387:124;:::o;1811:135::-;1871:9;;:::i;:::-;1899:40;:18;:38;:40::i;:::-;1892:47;;1811:135;:::o;1137:117::-;1199:48;1229:5;1236:10;;;;;;;;;;;;;;;;;;1199:19;:29;;:48;;;;;:::i;:::-;1137:117;:::o;1017:114::-;1078:46;1107:5;1114:9;;;;;;;;;;;;;;;;;;1078:18;:28;;:46;;;;;:::i;:::-;1017:114;:::o;1517:140::-;1589:4;1612:38;1644:5;1612:18;:31;;:38;;;;:::i;:::-;1605:45;;1517:140;;;:::o;880:61::-;;;;;;;;;;;;;;;;;;;;:::o;2121:1168:17:-;2489:25;2551:23;2619:19;2452:25;2465:4;2471:5;2452:12;:25::i;:::-;2444:34;;;;;;;;2517:4;:17;;:24;2535:5;2517:24;;;;;;;;;;;;;;;;2489:52;;2608:1;2577:4;:21;;:28;;;;:32;2551:58;;2641:4;:21;;2663:18;2641:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;2619:63;;2745:4;:15;;:22;2761:5;2745:22;;;;;;;;;;;;;;;;2738:29;;;;;;;;;;;2894:11;2848:4;:21;;2870:20;2848:43;;;;;;;;;;;;;;;;;;;:57;;;;;;;;;;;;;;;;;;3009:20;2976:4;:17;;:30;2994:11;2976:30;;;;;;;;;;;;;;;:53;;;;3046:4;:17;;:24;3064:5;3046:24;;;;;;;;;;;;;;;3039:31;;;3144:4;:21;;3166:18;3144:41;;;;;;;;;;;;;;;;;;;3137:48;;;;;;;;;;;3227:1;3195:4;:21;;:33;;;;;;;;;;;;;;:::i;:::-;;3260:5;3239:43;;;3267:14;3239:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2121:1168:17;;;;;;:::o;3646:162::-;3748:9;;:::i;:::-;3780:4;:21;;3773:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3646:162;;;:::o;3295:166::-;3405:4;3432;:15;;:22;3448:5;3432:22;;;;;;;;;;;;;;;;;;;;;;;;;3425:29;;3295:166;;;;:::o;1732:383::-;1884:28;1900:4;1906:5;1884:15;:28::i;:::-;1876:37;;;;;;;;1949:4;1924;:15;;:22;1940:5;1924:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;1963:4;:21;;:33;;;;;;;;;;;:::i;:::-;;;;;;;;;;1990:5;1963:33;;;;;;;;;;;;;;;;;;;;;;;2064:1;2033:4;:21;;:28;;;;:32;2006:4;:17;;:24;2024:5;2006:24;;;;;;;;;;;;;;;:59;;;;2086:5;2075:33;;;2093:14;2075:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1732:383:17;;;:::o;3467:173::-;3580:4;3608:25;3621:4;3627:5;3608:12;:25::i;:::-;3607:26;3600:33;;3467:173;;;;:::o;653:1438:19:-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\nimport \"../libraries/PermissionsLib.sol\";\n\n\ncontract DummyContract is PermissionEvents {\n using PermissionsLib for PermissionsLib.Permissions;\n\n PermissionsLib.Permissions private firstPermissionSet;\n PermissionsLib.Permissions private secondPermissionSet;\n\n string public constant FIRST_SET = \"dummy-contract-first-set\";\n string public constant SECOND_SET = \"dummy-contract-second-set\";\n\n function authorizeInFirstSet(address agent) public {\n firstPermissionSet.authorize(agent, FIRST_SET);\n }\n\n function authorizeInSecondSet(address agent) public {\n secondPermissionSet.authorize(agent, SECOND_SET);\n }\n\n function revokeInFirstSet(address agent) public {\n firstPermissionSet.revokeAuthorization(agent, FIRST_SET);\n }\n\n function revokeInSecondSet(address agent) public {\n secondPermissionSet.revokeAuthorization(agent, SECOND_SET);\n }\n\n function isAuthorizedInFirstSet(address agent) public constant returns (bool) {\n return firstPermissionSet.isAuthorized(agent);\n }\n\n function isAuthorizedInSecondSet(address agent) public constant returns (bool) {\n return secondPermissionSet.isAuthorized(agent);\n }\n\n function getFirstSetAuthorizedAgents() public view returns (address[]) {\n return firstPermissionSet.getAuthorizedAgents();\n }\n\n function getSecondSetAuthorizedAgents() public view returns (address[]) {\n return secondPermissionSet.getAuthorizedAgents();\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/DummyContract.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/DummyContract.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/DummyContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/DummyContract.sol", "exportedSymbols": { "DummyContract": [ 9935 @@ -217,7 +217,7 @@ { "attributes": { "SourceUnit": 6272, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/libraries/PermissionsLib.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/libraries/PermissionsLib.sol", "file": "../libraries/PermissionsLib.sol", "scope": 9936, "symbolAliases": [ @@ -1769,7 +1769,7 @@ "42": { "events": {}, "links": {}, - "address": "0x6b5b54ab51ab15d4fd5e8991791c8dc1d90df5e2" + "address": "0x64481c13201a7baabd3a440eeba57170336f0e70" }, "70": { "events": {}, @@ -1778,5 +1778,5 @@ } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:13:01.009Z" + "updatedAt": "2018-10-09T17:50:01.258Z" } \ No newline at end of file diff --git a/artifacts/json/DummyToken.json b/artifacts/json/DummyToken.json index 459ac99f..47a08b15 100644 --- a/artifacts/json/DummyToken.json +++ b/artifacts/json/DummyToken.json @@ -427,15 +427,15 @@ "type": "event" } ], - "bytecode": "0x60606040526000600360146101000a81548160ff02191690831515021790555034156200002b57600080fd5b60405162001bfc38038062001bfc83398101604052808051820191906020018051820191906020018051906020019091908051906020019091908051820191905050600080600033600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508760049080519060200190620000cb9291906200018d565b508660059080519060200190620000e49291906200018d565b50856006819055508460018190555083519250600091505b828210156200017f5783828151811015156200011457fe5b906020019060200201519050826001548115156200012e57fe5b046000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508180600101925050620000fc565b50505050505050506200023c565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620001d057805160ff191683800117855562000201565b8280016001018555821562000201579182015b8281111562000200578251825591602001919060010190620001e3565b5b50905062000210919062000214565b5090565b6200023991905b80821115620002355760008160009055506001016200021b565b5090565b90565b6119b0806200024c6000396000f3006060604052600436106100f1576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806305d2035b146100f657806306fdde0314610123578063095ea7b3146101b157806318160ddd1461020b57806323b872dd14610234578063313ce567146102ad57806340c10f19146102d6578063661884631461033057806370a082311461038a5780637d64bcb4146103d75780638da5cb5b1461040457806395d89b4114610459578063a9059cbb146104e7578063d73dd62314610541578063dd62ed3e1461059b578063e30443bc14610607578063f2fde38b14610649575b600080fd5b341561010157600080fd5b610109610682565b604051808215151515815260200191505060405180910390f35b341561012e57600080fd5b610136610695565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561017657808201518184015260208101905061015b565b50505050905090810190601f1680156101a35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101bc57600080fd5b6101f1600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610733565b604051808215151515815260200191505060405180910390f35b341561021657600080fd5b61021e610825565b6040518082815260200191505060405180910390f35b341561023f57600080fd5b610293600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061082f565b604051808215151515815260200191505060405180910390f35b34156102b857600080fd5b6102c0610be9565b6040518082815260200191505060405180910390f35b34156102e157600080fd5b610316600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610bef565b604051808215151515815260200191505060405180910390f35b341561033b57600080fd5b610370600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610dd5565b604051808215151515815260200191505060405180910390f35b341561039557600080fd5b6103c1600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611066565b6040518082815260200191505060405180910390f35b34156103e257600080fd5b6103ea6110ae565b604051808215151515815260200191505060405180910390f35b341561040f57600080fd5b610417611176565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561046457600080fd5b61046c61119c565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104ac578082015181840152602081019050610491565b50505050905090810190601f1680156104d95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156104f257600080fd5b610527600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061123a565b604051808215151515815260200191505060405180910390f35b341561054c57600080fd5b610581600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611459565b604051808215151515815260200191505060405180910390f35b34156105a657600080fd5b6105f1600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611655565b6040518082815260200191505060405180910390f35b341561061257600080fd5b610647600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506116dc565b005b341561065457600080fd5b610680600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506117f5565b005b600360149054906101000a900460ff1681565b60048054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561072b5780601f106107005761010080835404028352916020019161072b565b820191906000526020600020905b81548152906001019060200180831161070e57829003601f168201915b505050505081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600154905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561086c57600080fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111515156108b957600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561094457600080fd5b610995826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461194d90919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610a28826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461196690919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610af982600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461194d90919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b60065481565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610c4d57600080fd5b600360149054906101000a900460ff16151515610c6957600080fd5b610c7e8260015461196690919063ffffffff16565b600181905550610cd5826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461196690919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885836040518082815260200191505060405180910390a28273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905080831115610ee6576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f7a565b610ef9838261194d90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561110c57600080fd5b600360149054906101000a900460ff1615151561112857600080fd5b6001600360146101000a81548160ff0219169083151502179055507fae5184fba832cb2b1f702aca6117b8d265eaf03ad33eb133f19dde0f5920fa0860405160405180910390a16001905090565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60058054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156112325780601f1061120757610100808354040283529160200191611232565b820191906000526020600020905b81548152906001019060200180831161121557829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561127757600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111515156112c457600080fd5b611315826000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461194d90919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506113a8826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461196690919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b60006114ea82600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461196690919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561173a57600080fd5b61174383611066565b90508082101561177f57611774611763838361194d90919063ffffffff16565b60015461194d90919063ffffffff16565b6001819055506117ad565b6117a6611795828461194d90919063ffffffff16565b60015461196690919063ffffffff16565b6001819055505b816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561185157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561188d57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600082821115151561195b57fe5b818303905092915050565b600080828401905083811015151561197a57fe5b80915050929150505600a165627a7a72305820fc88baf7bbca20a9e8f5d4a785227ef6c81b35cafaa47ce68d68441eb59760160029", - "deployedBytecode": "0x6060604052600436106100f1576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806305d2035b146100f657806306fdde0314610123578063095ea7b3146101b157806318160ddd1461020b57806323b872dd14610234578063313ce567146102ad57806340c10f19146102d6578063661884631461033057806370a082311461038a5780637d64bcb4146103d75780638da5cb5b1461040457806395d89b4114610459578063a9059cbb146104e7578063d73dd62314610541578063dd62ed3e1461059b578063e30443bc14610607578063f2fde38b14610649575b600080fd5b341561010157600080fd5b610109610682565b604051808215151515815260200191505060405180910390f35b341561012e57600080fd5b610136610695565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561017657808201518184015260208101905061015b565b50505050905090810190601f1680156101a35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101bc57600080fd5b6101f1600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610733565b604051808215151515815260200191505060405180910390f35b341561021657600080fd5b61021e610825565b6040518082815260200191505060405180910390f35b341561023f57600080fd5b610293600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061082f565b604051808215151515815260200191505060405180910390f35b34156102b857600080fd5b6102c0610be9565b6040518082815260200191505060405180910390f35b34156102e157600080fd5b610316600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610bef565b604051808215151515815260200191505060405180910390f35b341561033b57600080fd5b610370600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610dd5565b604051808215151515815260200191505060405180910390f35b341561039557600080fd5b6103c1600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611066565b6040518082815260200191505060405180910390f35b34156103e257600080fd5b6103ea6110ae565b604051808215151515815260200191505060405180910390f35b341561040f57600080fd5b610417611176565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561046457600080fd5b61046c61119c565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104ac578082015181840152602081019050610491565b50505050905090810190601f1680156104d95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156104f257600080fd5b610527600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061123a565b604051808215151515815260200191505060405180910390f35b341561054c57600080fd5b610581600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611459565b604051808215151515815260200191505060405180910390f35b34156105a657600080fd5b6105f1600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611655565b6040518082815260200191505060405180910390f35b341561061257600080fd5b610647600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506116dc565b005b341561065457600080fd5b610680600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506117f5565b005b600360149054906101000a900460ff1681565b60048054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561072b5780601f106107005761010080835404028352916020019161072b565b820191906000526020600020905b81548152906001019060200180831161070e57829003601f168201915b505050505081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600154905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561086c57600080fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111515156108b957600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561094457600080fd5b610995826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461194d90919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610a28826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461196690919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610af982600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461194d90919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b60065481565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610c4d57600080fd5b600360149054906101000a900460ff16151515610c6957600080fd5b610c7e8260015461196690919063ffffffff16565b600181905550610cd5826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461196690919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885836040518082815260200191505060405180910390a28273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905080831115610ee6576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f7a565b610ef9838261194d90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561110c57600080fd5b600360149054906101000a900460ff1615151561112857600080fd5b6001600360146101000a81548160ff0219169083151502179055507fae5184fba832cb2b1f702aca6117b8d265eaf03ad33eb133f19dde0f5920fa0860405160405180910390a16001905090565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60058054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156112325780601f1061120757610100808354040283529160200191611232565b820191906000526020600020905b81548152906001019060200180831161121557829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561127757600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111515156112c457600080fd5b611315826000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461194d90919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506113a8826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461196690919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b60006114ea82600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461196690919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561173a57600080fd5b61174383611066565b90508082101561177f57611774611763838361194d90919063ffffffff16565b60015461194d90919063ffffffff16565b6001819055506117ad565b6117a6611795828461194d90919063ffffffff16565b60015461196690919063ffffffff16565b6001819055505b816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561185157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561188d57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600082821115151561195b57fe5b818303905092915050565b600080828401905083811015151561197a57fe5b80915050929150505600a165627a7a72305820fc88baf7bbca20a9e8f5d4a785227ef6c81b35cafaa47ce68d68441eb59760160029", + "bytecode": "0x60606040526000600360146101000a81548160ff02191690831515021790555034156200002b57600080fd5b60405162001bfc38038062001bfc83398101604052808051820191906020018051820191906020018051906020019091908051906020019091908051820191905050600080600033600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508760049080519060200190620000cb9291906200018d565b508660059080519060200190620000e49291906200018d565b50856006819055508460018190555083519250600091505b828210156200017f5783828151811015156200011457fe5b906020019060200201519050826001548115156200012e57fe5b046000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508180600101925050620000fc565b50505050505050506200023c565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620001d057805160ff191683800117855562000201565b8280016001018555821562000201579182015b8281111562000200578251825591602001919060010190620001e3565b5b50905062000210919062000214565b5090565b6200023991905b80821115620002355760008160009055506001016200021b565b5090565b90565b6119b0806200024c6000396000f3006060604052600436106100f1576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806305d2035b146100f657806306fdde0314610123578063095ea7b3146101b157806318160ddd1461020b57806323b872dd14610234578063313ce567146102ad57806340c10f19146102d6578063661884631461033057806370a082311461038a5780637d64bcb4146103d75780638da5cb5b1461040457806395d89b4114610459578063a9059cbb146104e7578063d73dd62314610541578063dd62ed3e1461059b578063e30443bc14610607578063f2fde38b14610649575b600080fd5b341561010157600080fd5b610109610682565b604051808215151515815260200191505060405180910390f35b341561012e57600080fd5b610136610695565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561017657808201518184015260208101905061015b565b50505050905090810190601f1680156101a35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101bc57600080fd5b6101f1600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610733565b604051808215151515815260200191505060405180910390f35b341561021657600080fd5b61021e610825565b6040518082815260200191505060405180910390f35b341561023f57600080fd5b610293600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061082f565b604051808215151515815260200191505060405180910390f35b34156102b857600080fd5b6102c0610be9565b6040518082815260200191505060405180910390f35b34156102e157600080fd5b610316600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610bef565b604051808215151515815260200191505060405180910390f35b341561033b57600080fd5b610370600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610dd5565b604051808215151515815260200191505060405180910390f35b341561039557600080fd5b6103c1600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611066565b6040518082815260200191505060405180910390f35b34156103e257600080fd5b6103ea6110ae565b604051808215151515815260200191505060405180910390f35b341561040f57600080fd5b610417611176565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561046457600080fd5b61046c61119c565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104ac578082015181840152602081019050610491565b50505050905090810190601f1680156104d95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156104f257600080fd5b610527600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061123a565b604051808215151515815260200191505060405180910390f35b341561054c57600080fd5b610581600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611459565b604051808215151515815260200191505060405180910390f35b34156105a657600080fd5b6105f1600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611655565b6040518082815260200191505060405180910390f35b341561061257600080fd5b610647600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506116dc565b005b341561065457600080fd5b610680600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506117f5565b005b600360149054906101000a900460ff1681565b60048054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561072b5780601f106107005761010080835404028352916020019161072b565b820191906000526020600020905b81548152906001019060200180831161070e57829003601f168201915b505050505081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600154905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561086c57600080fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111515156108b957600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561094457600080fd5b610995826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461194d90919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610a28826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461196690919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610af982600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461194d90919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b60065481565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610c4d57600080fd5b600360149054906101000a900460ff16151515610c6957600080fd5b610c7e8260015461196690919063ffffffff16565b600181905550610cd5826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461196690919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885836040518082815260200191505060405180910390a28273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905080831115610ee6576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f7a565b610ef9838261194d90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561110c57600080fd5b600360149054906101000a900460ff1615151561112857600080fd5b6001600360146101000a81548160ff0219169083151502179055507fae5184fba832cb2b1f702aca6117b8d265eaf03ad33eb133f19dde0f5920fa0860405160405180910390a16001905090565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60058054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156112325780601f1061120757610100808354040283529160200191611232565b820191906000526020600020905b81548152906001019060200180831161121557829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561127757600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111515156112c457600080fd5b611315826000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461194d90919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506113a8826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461196690919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b60006114ea82600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461196690919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561173a57600080fd5b61174383611066565b90508082101561177f57611774611763838361194d90919063ffffffff16565b60015461194d90919063ffffffff16565b6001819055506117ad565b6117a6611795828461194d90919063ffffffff16565b60015461196690919063ffffffff16565b6001819055505b816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561185157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561188d57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600082821115151561195b57fe5b818303905092915050565b600080828401905083811015151561197a57fe5b80915050929150505600a165627a7a723058204f0837d94d911389c3ac6c5dbd30a75b8d11fb82276226d87b0900d885ef3c210029", + "deployedBytecode": "0x6060604052600436106100f1576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806305d2035b146100f657806306fdde0314610123578063095ea7b3146101b157806318160ddd1461020b57806323b872dd14610234578063313ce567146102ad57806340c10f19146102d6578063661884631461033057806370a082311461038a5780637d64bcb4146103d75780638da5cb5b1461040457806395d89b4114610459578063a9059cbb146104e7578063d73dd62314610541578063dd62ed3e1461059b578063e30443bc14610607578063f2fde38b14610649575b600080fd5b341561010157600080fd5b610109610682565b604051808215151515815260200191505060405180910390f35b341561012e57600080fd5b610136610695565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561017657808201518184015260208101905061015b565b50505050905090810190601f1680156101a35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101bc57600080fd5b6101f1600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610733565b604051808215151515815260200191505060405180910390f35b341561021657600080fd5b61021e610825565b6040518082815260200191505060405180910390f35b341561023f57600080fd5b610293600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061082f565b604051808215151515815260200191505060405180910390f35b34156102b857600080fd5b6102c0610be9565b6040518082815260200191505060405180910390f35b34156102e157600080fd5b610316600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610bef565b604051808215151515815260200191505060405180910390f35b341561033b57600080fd5b610370600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610dd5565b604051808215151515815260200191505060405180910390f35b341561039557600080fd5b6103c1600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611066565b6040518082815260200191505060405180910390f35b34156103e257600080fd5b6103ea6110ae565b604051808215151515815260200191505060405180910390f35b341561040f57600080fd5b610417611176565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561046457600080fd5b61046c61119c565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104ac578082015181840152602081019050610491565b50505050905090810190601f1680156104d95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156104f257600080fd5b610527600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061123a565b604051808215151515815260200191505060405180910390f35b341561054c57600080fd5b610581600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611459565b604051808215151515815260200191505060405180910390f35b34156105a657600080fd5b6105f1600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611655565b6040518082815260200191505060405180910390f35b341561061257600080fd5b610647600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506116dc565b005b341561065457600080fd5b610680600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506117f5565b005b600360149054906101000a900460ff1681565b60048054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561072b5780601f106107005761010080835404028352916020019161072b565b820191906000526020600020905b81548152906001019060200180831161070e57829003601f168201915b505050505081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600154905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561086c57600080fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111515156108b957600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561094457600080fd5b610995826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461194d90919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610a28826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461196690919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610af982600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461194d90919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b60065481565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610c4d57600080fd5b600360149054906101000a900460ff16151515610c6957600080fd5b610c7e8260015461196690919063ffffffff16565b600181905550610cd5826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461196690919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885836040518082815260200191505060405180910390a28273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905080831115610ee6576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f7a565b610ef9838261194d90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561110c57600080fd5b600360149054906101000a900460ff1615151561112857600080fd5b6001600360146101000a81548160ff0219169083151502179055507fae5184fba832cb2b1f702aca6117b8d265eaf03ad33eb133f19dde0f5920fa0860405160405180910390a16001905090565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60058054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156112325780601f1061120757610100808354040283529160200191611232565b820191906000526020600020905b81548152906001019060200180831161121557829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561127757600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111515156112c457600080fd5b611315826000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461194d90919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506113a8826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461196690919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b60006114ea82600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461196690919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561173a57600080fd5b61174383611066565b90508082101561177f57611774611763838361194d90919063ffffffff16565b60015461194d90919063ffffffff16565b6001819055506117ad565b6117a6611795828461194d90919063ffffffff16565b60015461196690919063ffffffff16565b6001819055505b816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561185157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561188d57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600082821115151561195b57fe5b818303905092915050565b600080828401905083811015151561197a57fe5b80915050929150505600a165627a7a723058204f0837d94d911389c3ac6c5dbd30a75b8d11fb82276226d87b0900d885ef3c210029", "sourceMap": "151:1173:21:-;;;544:5:43;514:35;;;;;;;;;;;;;;;;;;;;300:656:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;605:29;762:6;823:15;509:10:39;501:5;;:18;;;;;;;;;;;;;;;;;;496:5:21;489:4;:12;;;;;;;;;;;;:::i;:::-;;520:7;511:6;:16;;;;;;;;;;;;:::i;:::-;;548:9;537:8;:20;;;;582:12;567;:27;;;;637:22;:29;605:61;;771:1;762:10;;757:193;778:24;774:1;:28;757:193;;;841:22;864:1;841:25;;;;;;;;;;;;;;;;;;823:43;;915:24;900:12;;:39;;;;;;;;880:8;:17;889:7;880:17;;;;;;;;;;;;;;;:59;;;;804:3;;;;;;;757:193;;;300:656;;;;;;;;151:1173;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;", "deployedSourceMap": "151:1173:21:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;514:35:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;223:18:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1798:183:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;371:83:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;736:439:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;273:20:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;853:264:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3602:398:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1189:107:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1231:135:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;238:20:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;247::21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;608:379:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2883:257:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2300:126;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;962:360:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;832:169:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;514:35:43;;;;;;;;;;;;;:::o;223:18:21:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1798:183:44:-;1865:4;1909:6;1877:7;:19;1885:10;1877:19;;;;;;;;;;;;;;;:29;1897:8;1877:29;;;;;;;;;;;;;;;:38;;;;1942:8;1921:38;;1930:10;1921:38;;;1952:6;1921:38;;;;;;;;;;;;;;;;;;1972:4;1965:11;;1798:183;;;;:::o;371:83:40:-;415:7;437:12;;430:19;;371:83;:::o;736:439:44:-;818:4;853:1;838:17;;:3;:17;;;;830:26;;;;;;;;880:8;:15;889:5;880:15;;;;;;;;;;;;;;;;870:6;:25;;862:34;;;;;;;;920:7;:14;928:5;920:14;;;;;;;;;;;;;;;:26;935:10;920:26;;;;;;;;;;;;;;;;910:6;:36;;902:45;;;;;;;;972:27;992:6;972:8;:15;981:5;972:15;;;;;;;;;;;;;;;;:19;;:27;;;;:::i;:::-;954:8;:15;963:5;954:15;;;;;;;;;;;;;;;:45;;;;1021:25;1039:6;1021:8;:13;1030:3;1021:13;;;;;;;;;;;;;;;;:17;;:25;;;;:::i;:::-;1005:8;:13;1014:3;1005:13;;;;;;;;;;;;;;;:41;;;;1081:38;1112:6;1081:7;:14;1089:5;1081:14;;;;;;;;;;;;;;;:26;1096:10;1081:26;;;;;;;;;;;;;;;;:30;;:38;;;;:::i;:::-;1052:7;:14;1060:5;1052:14;;;;;;;;;;;;;;;:26;1067:10;1052:26;;;;;;;;;;;;;;;:67;;;;1141:3;1125:28;;1134:5;1125:28;;;1146:6;1125:28;;;;;;;;;;;;;;;;;;1166:4;1159:11;;736:439;;;;;:::o;273:20:21:-;;;;:::o;853:264:43:-;931:4;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;589:15:43;;;;;;;;;;;588:16;580:25;;;;;;;;958;975:7;958:12;;:16;;:25;;;;:::i;:::-;943:12;:40;;;;1005:26;1023:7;1005:8;:13;1014:3;1005:13;;;;;;;;;;;;;;;;:17;;:26;;;;:::i;:::-;989:8;:13;998:3;989:13;;;;;;;;;;;;;;;:42;;;;1042:3;1037:18;;;1047:7;1037:18;;;;;;;;;;;;;;;;;;1082:3;1061:34;;1078:1;1061:34;;;1087:7;1061:34;;;;;;;;;;;;;;;;;;1108:4;1101:11;;853:264;;;;:::o;3602:398:44:-;3685:4;3697:13;3713:7;:19;3721:10;3713:19;;;;;;;;;;;;;;;:29;3733:8;3713:29;;;;;;;;;;;;;;;;3697:45;;3771:8;3752:16;:27;3748:164;;;3821:1;3789:7;:19;3797:10;3789:19;;;;;;;;;;;;;;;:29;3809:8;3789:29;;;;;;;;;;;;;;;:33;;;;3748:164;;;3875:30;3888:16;3875:8;:12;;:30;;;;:::i;:::-;3843:7;:19;3851:10;3843:19;;;;;;;;;;;;;;;:29;3863:8;3843:29;;;;;;;;;;;;;;;:62;;;;3748:164;3938:8;3917:61;;3926:10;3917:61;;;3948:7;:19;3956:10;3948:19;;;;;;;;;;;;;;;:29;3968:8;3948:29;;;;;;;;;;;;;;;;3917:61;;;;;;;;;;;;;;;;;;3991:4;3984:11;;3602:398;;;;;:::o;1189:107:40:-;1245:15;1275:8;:16;1284:6;1275:16;;;;;;;;;;;;;;;;1268:23;;1189:107;;;:::o;1231:135:43:-;1290:4;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;589:15:43;;;;;;;;;;;588:16;580:25;;;;;;;;1320:4;1302:15;;:22;;;;;;;;;;;;;;;;;;1330:14;;;;;;;;;;1357:4;1350:11;;1231:135;:::o;238:20:39:-;;;;;;;;;;;;;:::o;247::21:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;608:379:40:-;671:4;706:1;691:17;;:3;:17;;;;683:26;;;;;;;;733:8;:20;742:10;733:20;;;;;;;;;;;;;;;;723:6;:30;;715:39;;;;;;;;847:32;872:6;847:8;:20;856:10;847:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;824:8;:20;833:10;824:20;;;;;;;;;;;;;;;:55;;;;901:25;919:6;901:8;:13;910:3;901:13;;;;;;;;;;;;;;;;:17;;:25;;;;:::i;:::-;885:8;:13;894:3;885:13;;;;;;;;;;;;;;;:41;;;;953:3;932:33;;941:10;932:33;;;958:6;932:33;;;;;;;;;;;;;;;;;;978:4;971:11;;608:379;;;;:::o;2883:257:44:-;2961:4;3005:46;3039:11;3005:7;:19;3013:10;3005:19;;;;;;;;;;;;;;;:29;3025:8;3005:29;;;;;;;;;;;;;;;;:33;;:46;;;;:::i;:::-;2973:7;:19;2981:10;2973:19;;;;;;;;;;;;;;;:29;2993:8;2973:29;;;;;;;;;;;;;;;:78;;;;3078:8;3057:61;;3066:10;3057:61;;;3088:7;:19;3096:10;3088:19;;;;;;;;;;;;;;;:29;3108:8;3088:29;;;;;;;;;;;;;;;;3057:61;;;;;;;;;;;;;;;;;;3131:4;3124:11;;2883:257;;;;:::o;2300:126::-;2374:7;2396;:15;2404:6;2396:15;;;;;;;;;;;;;;;:25;2412:8;2396:25;;;;;;;;;;;;;;;;2389:32;;2300:126;;;;:::o;962:360:21:-;1039:16;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;1058:18:21;1068:7;1058:9;:18::i;:::-;1039:37;;1099:11;1090:6;:20;1086:194;;;1141:41;1158:23;1174:6;1158:11;:15;;:23;;;;:::i;:::-;1141:12;;:16;;:41;;;;:::i;:::-;1126:12;:56;;;;1086:194;;;1228:41;1245:23;1256:11;1245:6;:10;;:23;;;;:::i;:::-;1228:12;;:16;;:41;;;;:::i;:::-;1213:12;:56;;;;1086:194;1309:6;1289:8;:17;1298:7;1289:17;;;;;;;;;;;;;;;:26;;;;962:360;;;:::o;832:169:39:-;653:5;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;928:1;908:22;;:8;:22;;;;900:31;;;;;;;;965:8;937:37;;958:5;;;;;;;;;;;937:37;;;;;;;;;;;;988:8;980:5;;:16;;;;;;;;;;;;;;;;;;832:169;:::o;835:110:38:-;893:7;920:1;915;:6;;908:14;;;;;;939:1;935;:5;928:12;;835:110;;;;:::o;1007:129::-;1065:7;1080:9;1096:1;1092;:5;1080:17;;1115:1;1110;:6;;1103:14;;;;;;1130:1;1123:8;;1007:129;;;;;:::o", "source": "pragma solidity 0.4.18;\n\nimport \"zeppelin-solidity/contracts/token/ERC20/MintableToken.sol\";\nimport \"zeppelin-solidity/contracts/math/SafeMath.sol\";\n\n\ncontract DummyToken is MintableToken {\n using SafeMath for uint;\n string public name;\n string public symbol;\n uint public decimals;\n\n function DummyToken(\n string _name,\n string _symbol,\n uint _decimals,\n uint _totalSupply,\n address[] _initialBalanceHolders)\n public\n {\n name = _name;\n symbol = _symbol;\n decimals = _decimals;\n totalSupply_ = _totalSupply;\n\n uint numInitialBalanceHolders = _initialBalanceHolders.length;\n\n // Distribute the total supply evenly among the initial balance holders\n for (uint i = 0; i < numInitialBalanceHolders; i++) {\n address account = _initialBalanceHolders[i];\n balances[account] = totalSupply_ / numInitialBalanceHolders;\n }\n }\n\n function setBalance(address _target, uint _value) public onlyOwner {\n uint currBalance = balanceOf(_target);\n if (_value < currBalance) {\n totalSupply_ = totalSupply_.sub(currBalance.sub(_value));\n } else {\n totalSupply_ = totalSupply_.add(_value.sub(currBalance));\n }\n balances[_target] = _value;\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/dummy_tokens/DummyToken.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/dummy_tokens/DummyToken.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/dummy_tokens/DummyToken.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/dummy_tokens/DummyToken.sol", "exportedSymbols": { "DummyToken": [ 10118 @@ -2152,5 +2152,5 @@ }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:11:37.139Z" + "updatedAt": "2018-10-09T17:48:16.849Z" } \ No newline at end of file diff --git a/artifacts/json/ERC165.json b/artifacts/json/ERC165.json index 8b875ec1..124e9893 100644 --- a/artifacts/json/ERC165.json +++ b/artifacts/json/ERC165.json @@ -26,10 +26,10 @@ "sourceMap": "", "deployedSourceMap": "", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\n\n/**\n * ERC165 interface required by ERC721 non-fungible token.\n *\n * https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md\n * https://github.com/ethereum/EIPs/blob/master/EIPS/eip-165.md\n */\ninterface ERC165 {\n /// @notice Query if a contract implements an interface\n /// @param interfaceID The interface identifier, as specified in ERC-165\n /// @dev Interface identification is specified in ERC-165. This function\n /// uses less than 30,000 gas.\n /// @return `true` if the contract implements `interfaceID` and\n /// `interfaceID` is not 0xffffffff, `false` otherwise\n function supportsInterface(bytes4 interfaceID) external view returns (bool);\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/ERC165.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/ERC165.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/ERC165.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/ERC165.sol", "exportedSymbols": { "ERC165": [ 3550 @@ -171,5 +171,5 @@ }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:47.577Z" + "updatedAt": "2018-10-09T17:45:35.420Z" } \ No newline at end of file diff --git a/artifacts/json/ERC20.json b/artifacts/json/ERC20.json index b6c46ad7..2e2dceab 100644 --- a/artifacts/json/ERC20.json +++ b/artifacts/json/ERC20.json @@ -741,5 +741,5 @@ }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:48.047Z" + "updatedAt": "2018-10-09T17:45:35.433Z" } \ No newline at end of file diff --git a/artifacts/json/ERC20Basic.json b/artifacts/json/ERC20Basic.json index 322aab9a..f8d8b5b5 100644 --- a/artifacts/json/ERC20Basic.json +++ b/artifacts/json/ERC20Basic.json @@ -510,5 +510,5 @@ }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:48.048Z" + "updatedAt": "2018-10-09T17:45:35.427Z" } \ No newline at end of file diff --git a/artifacts/json/ERC721.json b/artifacts/json/ERC721.json index 1c338a38..8bd5406d 100644 --- a/artifacts/json/ERC721.json +++ b/artifacts/json/ERC721.json @@ -1110,5 +1110,5 @@ }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:48.049Z" + "updatedAt": "2018-10-09T17:45:35.439Z" } \ No newline at end of file diff --git a/artifacts/json/ERC721Basic.json b/artifacts/json/ERC721Basic.json index 4370b785..855a8e82 100644 --- a/artifacts/json/ERC721Basic.json +++ b/artifacts/json/ERC721Basic.json @@ -1663,5 +1663,5 @@ }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:48.052Z" + "updatedAt": "2018-10-09T17:45:35.452Z" } \ No newline at end of file diff --git a/artifacts/json/ERC721BasicToken.json b/artifacts/json/ERC721BasicToken.json index 60903aa8..75fd2bba 100644 --- a/artifacts/json/ERC721BasicToken.json +++ b/artifacts/json/ERC721BasicToken.json @@ -8709,5 +8709,5 @@ }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:48.056Z" + "updatedAt": "2018-10-09T17:45:35.625Z" } \ No newline at end of file diff --git a/artifacts/json/ERC721CollateralizedSimpleInterestTermsContract.json b/artifacts/json/ERC721CollateralizedSimpleInterestTermsContract.json index bdea074c..b0bf0095 100644 --- a/artifacts/json/ERC721CollateralizedSimpleInterestTermsContract.json +++ b/artifacts/json/ERC721CollateralizedSimpleInterestTermsContract.json @@ -399,15 +399,15 @@ "type": "event" } ], - "bytecode": "0x6060604052341561000f57600080fd5b604051604080611ab3833981016040528080519060200190919080519060200190919050508180600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050506119ea806100c96000396000f3006060604052600436106100f1576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a896a1146100f65780630776298214610131578063208638941461015a5780632762dd8c1461018357806340018a0d146101be5780635f0280ba146101e75780636f69c96f1461028c57806379035396146102b55780638b47e58a1461030a57806393529cdf14610333578063977a5e641461035c57806399114d84146103ba578063abf410e5146103fe578063de53a13c14610453578063ed8907d71461047c578063fd127a41146104d3578063fd40d52e146104fc575b600080fd5b341561010157600080fd5b61011b600480803560001916906020019091905050610537565b6040518082815260200191505060405180910390f35b341561013c57600080fd5b61014461055b565b6040518082815260200191505060405180910390f35b341561016557600080fd5b61016d610564565b6040518082815260200191505060405180910390f35b341561018e57600080fd5b6101a8600480803560001916906020019091905050610570565b6040518082815260200191505060405180910390f35b34156101c957600080fd5b6101d1610592565b6040518082815260200191505060405180910390f35b34156101f257600080fd5b61027260048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061059e565b604051808215151515815260200191505060405180910390f35b341561029757600080fd5b61029f610813565b6040518082815260200191505060405180910390f35b34156102c057600080fd5b6102c8610819565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561031557600080fd5b61031d61083f565b6040518082815260200191505060405180910390f35b341561033e57600080fd5b610346610844565b6040518082815260200191505060405180910390f35b341561036757600080fd5b6103a060048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061084a565b604051808215151515815260200191505060405180910390f35b34156103c557600080fd5b6103e8600480803560001916906020019091908035906020019091905050610a43565b6040518082815260200191505060405180910390f35b341561040957600080fd5b610411610c4f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561045e57600080fd5b610466610c75565b6040518082815260200191505060405180910390f35b341561048757600080fd5b6104a1600480803560001916906020019091905050610c7e565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b34156104de57600080fd5b6104e6610d76565b6040518082815260200191505060405180910390f35b341561050757600080fd5b610521600480803560001916906020019091905050610d83565b6040518082815260200191505060405180910390f35b60008060008360001916600019168152602001908152602001600020549050919050565b6018610e100281565b601e6018610e10020281565b600061057a61195f565b61058383610d9b565b90508060600151915050919050565b60076018610e10020281565b60006105a861195f565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636fa9d0566000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561063657600080fd5b6102c65a03f1151561064757600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561068a57600080fd5b61069387610d9b565b9050806000015173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610804576106fa846000808a600019166000191681526020019081526020016000205461129790919063ffffffff16565b6000808960001916600019168152602001908152602001600020819055507ff1a888d220228f843ac3044ef257c80642e6434d1ddc7ebee0a2813cced3406c87878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405180910390a160019150610809565b600091505b5095945050505050565b610e1081565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600581565b61271081565b6000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663079dd4b76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156108dd57600080fd5b6102c65a03f115156108ee57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561093157600080fd5b61093b85856112b5565b9150600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663649404bd86866000604051602001526040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1515610a1257600080fd5b6102c65a03f11515610a2357600080fd5b505050604051805190509050818015610a395750805b9250505092915050565b6000610a4d61195f565b60008085600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610adf57600080fd5b6102c65a03f11515610af057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663f6f494c9826000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610b7857600080fd5b6102c65a03f11515610b8957600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16141515610bcc57600080fd5b610bd587610d9b565b9350610be084611746565b9250836040015186111515610bf85760009450610c45565b836060015186101515610c0d57829450610c45565b610c17868561179c565b9150610c428460a00151610c3484866117e690919063ffffffff16565b61182190919063ffffffff16565b94505b5050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60646127100281565b6000806000806000806000806000807fff000000000000000000000000000000000000000000000000000000000000006001028b1694507effffffffffffffffffffffff000000000000000000000000000000000000006001028b16935072ffffff000000000000000000000000000000006001028b1692506ff00000000000000000000000000000006001028b1691506f0ffff0000000000000000000000000006001028b169050610d328560f861183c565b610d3d85609861183c565b610d4885608061183c565b610d5385607c61183c565b610d5e85606c61183c565b99509950995099509950505050505091939590929450565b61016d6018610e10020281565b60006020528060005260406000206000915090505481565b610da361195f565b600080600080600080600080600080600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610e4357600080fd5b6102c65a03f11515610e5457600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663314a522e8f6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610edc57600080fd5b6102c65a03f11515610eed57600080fd5b505050604051805190509b50610f028c610c7e565b809b50819c50829d50839e50849f505050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d23c4c76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610fa457600080fd5b6102c65a03f11515610fb557600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16635715c5b78c6000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561103557600080fd5b6102c65a03f1151561104657600080fd5b505050604051805190509550600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415151561108e57600080fd5b60048081111561109a57fe5b88111515156110a857600080fd5b8760048111156110b457fe5b94506110bf85611859565b9350600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561114f57600080fd5b6102c65a03f1151561116057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663d69dbf638f6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156111e857600080fd5b6102c65a03f115156111f957600080fd5b50505060405180519050925061121884886117e690919063ffffffff16565b915061122d838361129790919063ffffffff16565b905060e0604051908101604052808773ffffffffffffffffffffffffffffffffffffffff1681526020018b815260200184815260200182815260200186600481111561127557fe5b81526020018881526020018a8152509c50505050505050505050505050919050565b60008082840190508381101515156112ab57fe5b8091505092915050565b6000806000806000806000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663079dd4b76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561135157600080fd5b6102c65a03f1151561136257600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156113a557600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561143357600080fd5b6102c65a03f1151561144457600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16636be39bda8c6000604051604001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082600019166000191681526020019150506040805180830381600087803b15156114cb57600080fd5b6102c65a03f115156114dc57600080fd5b5050506040518051906020018051905080985081995050506114fd87610c7e565b809650819750829850839950849a505050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d23c4c76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561159f57600080fd5b6102c65a03f115156115b057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16635715c5b7876000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561163057600080fd5b6102c65a03f1151561164157600080fd5b505050604051805190509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561168a5750600583105b80156116c157503073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b1561173357828173ffffffffffffffffffffffffffffffffffffffff168c600019167f2c500aaec6833a053693d8c2a18a3ed5649a4609699abaf7778c3d389cc40c0588888760405180848152602001838152602001828152602001935050505060405180910390a460019850611738565b600098505b505050505050505092915050565b60008061177b60646127100261176d8560c0015186602001516117e690919063ffffffff16565b61182190919063ffffffff16565b905061179481846020015161129790919063ffffffff16565b915050919050565b60008060006117b884604001518661194690919063ffffffff16565b91506117c78460800151611859565b90506117dc818361182190919063ffffffff16565b9250505092915050565b60008060008414156117fb576000915061181a565b828402905082848281151561180c57fe5b0414151561181657fe5b8091505b5092915050565b600080828481151561182f57fe5b0490508091505092915050565b60008160020a836001900481151561185057fe5b04905092915050565b600080600481111561186757fe5b82600481111561187357fe5b141561188357610e109050611941565b6001600481111561189057fe5b82600481111561189c57fe5b14156118af576018610e10029050611941565b600260048111156118bc57fe5b8260048111156118c857fe5b14156118de5760076018610e1002029050611941565b600360048111156118eb57fe5b8260048111156118f757fe5b141561190d57601e6018610e1002029050611941565b60048081111561191957fe5b82600481111561192557fe5b141561193c5761016d6018610e1002029050611941565b600080fd5b919050565b600082821115151561195457fe5b818303905092915050565b60e060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600060048111156119aa57fe5b8152602001600081526020016000815250905600a165627a7a72305820b26d3a4b77ce7858ba09572df89d326a11d6337e397ef5fe830c8858913e60360029", - "deployedBytecode": "0x6060604052600436106100f1576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a896a1146100f65780630776298214610131578063208638941461015a5780632762dd8c1461018357806340018a0d146101be5780635f0280ba146101e75780636f69c96f1461028c57806379035396146102b55780638b47e58a1461030a57806393529cdf14610333578063977a5e641461035c57806399114d84146103ba578063abf410e5146103fe578063de53a13c14610453578063ed8907d71461047c578063fd127a41146104d3578063fd40d52e146104fc575b600080fd5b341561010157600080fd5b61011b600480803560001916906020019091905050610537565b6040518082815260200191505060405180910390f35b341561013c57600080fd5b61014461055b565b6040518082815260200191505060405180910390f35b341561016557600080fd5b61016d610564565b6040518082815260200191505060405180910390f35b341561018e57600080fd5b6101a8600480803560001916906020019091905050610570565b6040518082815260200191505060405180910390f35b34156101c957600080fd5b6101d1610592565b6040518082815260200191505060405180910390f35b34156101f257600080fd5b61027260048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061059e565b604051808215151515815260200191505060405180910390f35b341561029757600080fd5b61029f610813565b6040518082815260200191505060405180910390f35b34156102c057600080fd5b6102c8610819565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561031557600080fd5b61031d61083f565b6040518082815260200191505060405180910390f35b341561033e57600080fd5b610346610844565b6040518082815260200191505060405180910390f35b341561036757600080fd5b6103a060048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061084a565b604051808215151515815260200191505060405180910390f35b34156103c557600080fd5b6103e8600480803560001916906020019091908035906020019091905050610a43565b6040518082815260200191505060405180910390f35b341561040957600080fd5b610411610c4f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561045e57600080fd5b610466610c75565b6040518082815260200191505060405180910390f35b341561048757600080fd5b6104a1600480803560001916906020019091905050610c7e565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b34156104de57600080fd5b6104e6610d76565b6040518082815260200191505060405180910390f35b341561050757600080fd5b610521600480803560001916906020019091905050610d83565b6040518082815260200191505060405180910390f35b60008060008360001916600019168152602001908152602001600020549050919050565b6018610e100281565b601e6018610e10020281565b600061057a61195f565b61058383610d9b565b90508060600151915050919050565b60076018610e10020281565b60006105a861195f565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636fa9d0566000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561063657600080fd5b6102c65a03f1151561064757600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561068a57600080fd5b61069387610d9b565b9050806000015173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610804576106fa846000808a600019166000191681526020019081526020016000205461129790919063ffffffff16565b6000808960001916600019168152602001908152602001600020819055507ff1a888d220228f843ac3044ef257c80642e6434d1ddc7ebee0a2813cced3406c87878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405180910390a160019150610809565b600091505b5095945050505050565b610e1081565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600581565b61271081565b6000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663079dd4b76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156108dd57600080fd5b6102c65a03f115156108ee57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561093157600080fd5b61093b85856112b5565b9150600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663649404bd86866000604051602001526040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1515610a1257600080fd5b6102c65a03f11515610a2357600080fd5b505050604051805190509050818015610a395750805b9250505092915050565b6000610a4d61195f565b60008085600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610adf57600080fd5b6102c65a03f11515610af057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663f6f494c9826000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610b7857600080fd5b6102c65a03f11515610b8957600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16141515610bcc57600080fd5b610bd587610d9b565b9350610be084611746565b9250836040015186111515610bf85760009450610c45565b836060015186101515610c0d57829450610c45565b610c17868561179c565b9150610c428460a00151610c3484866117e690919063ffffffff16565b61182190919063ffffffff16565b94505b5050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60646127100281565b6000806000806000806000806000807fff000000000000000000000000000000000000000000000000000000000000006001028b1694507effffffffffffffffffffffff000000000000000000000000000000000000006001028b16935072ffffff000000000000000000000000000000006001028b1692506ff00000000000000000000000000000006001028b1691506f0ffff0000000000000000000000000006001028b169050610d328560f861183c565b610d3d85609861183c565b610d4885608061183c565b610d5385607c61183c565b610d5e85606c61183c565b99509950995099509950505050505091939590929450565b61016d6018610e10020281565b60006020528060005260406000206000915090505481565b610da361195f565b600080600080600080600080600080600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610e4357600080fd5b6102c65a03f11515610e5457600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663314a522e8f6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610edc57600080fd5b6102c65a03f11515610eed57600080fd5b505050604051805190509b50610f028c610c7e565b809b50819c50829d50839e50849f505050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d23c4c76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610fa457600080fd5b6102c65a03f11515610fb557600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16635715c5b78c6000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561103557600080fd5b6102c65a03f1151561104657600080fd5b505050604051805190509550600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415151561108e57600080fd5b60048081111561109a57fe5b88111515156110a857600080fd5b8760048111156110b457fe5b94506110bf85611859565b9350600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561114f57600080fd5b6102c65a03f1151561116057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663d69dbf638f6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156111e857600080fd5b6102c65a03f115156111f957600080fd5b50505060405180519050925061121884886117e690919063ffffffff16565b915061122d838361129790919063ffffffff16565b905060e0604051908101604052808773ffffffffffffffffffffffffffffffffffffffff1681526020018b815260200184815260200182815260200186600481111561127557fe5b81526020018881526020018a8152509c50505050505050505050505050919050565b60008082840190508381101515156112ab57fe5b8091505092915050565b6000806000806000806000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663079dd4b76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561135157600080fd5b6102c65a03f1151561136257600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156113a557600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561143357600080fd5b6102c65a03f1151561144457600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16636be39bda8c6000604051604001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082600019166000191681526020019150506040805180830381600087803b15156114cb57600080fd5b6102c65a03f115156114dc57600080fd5b5050506040518051906020018051905080985081995050506114fd87610c7e565b809650819750829850839950849a505050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d23c4c76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561159f57600080fd5b6102c65a03f115156115b057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16635715c5b7876000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561163057600080fd5b6102c65a03f1151561164157600080fd5b505050604051805190509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561168a5750600583105b80156116c157503073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b1561173357828173ffffffffffffffffffffffffffffffffffffffff168c600019167f2c500aaec6833a053693d8c2a18a3ed5649a4609699abaf7778c3d389cc40c0588888760405180848152602001838152602001828152602001935050505060405180910390a460019850611738565b600098505b505050505050505092915050565b60008061177b60646127100261176d8560c0015186602001516117e690919063ffffffff16565b61182190919063ffffffff16565b905061179481846020015161129790919063ffffffff16565b915050919050565b60008060006117b884604001518661194690919063ffffffff16565b91506117c78460800151611859565b90506117dc818361182190919063ffffffff16565b9250505092915050565b60008060008414156117fb576000915061181a565b828402905082848281151561180c57fe5b0414151561181657fe5b8091505b5092915050565b600080828481151561182f57fe5b0490508091505092915050565b60008160020a836001900481151561185057fe5b04905092915050565b600080600481111561186757fe5b82600481111561187357fe5b141561188357610e109050611941565b6001600481111561189057fe5b82600481111561189c57fe5b14156118af576018610e10029050611941565b600260048111156118bc57fe5b8260048111156118c857fe5b14156118de5760076018610e1002029050611941565b600360048111156118eb57fe5b8260048111156118f757fe5b141561190d57601e6018610e1002029050611941565b60048081111561191957fe5b82600481111561192557fe5b141561193c5761016d6018610e1002029050611941565b600080fd5b919050565b600082821115151561195457fe5b818303905092915050565b60e060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600060048111156119aa57fe5b8152602001600081526020016000815250905600a165627a7a72305820b26d3a4b77ce7858ba09572df89d326a11d6337e397ef5fe830c8858913e60360029", + "bytecode": "0x6060604052341561000f57600080fd5b604051604080611ab3833981016040528080519060200190919080519060200190919050508180600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050506119ea806100c96000396000f3006060604052600436106100f1576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a896a1146100f65780630776298214610131578063208638941461015a5780632762dd8c1461018357806340018a0d146101be5780635f0280ba146101e75780636f69c96f1461028c57806379035396146102b55780638b47e58a1461030a57806393529cdf14610333578063977a5e641461035c57806399114d84146103ba578063abf410e5146103fe578063de53a13c14610453578063ed8907d71461047c578063fd127a41146104d3578063fd40d52e146104fc575b600080fd5b341561010157600080fd5b61011b600480803560001916906020019091905050610537565b6040518082815260200191505060405180910390f35b341561013c57600080fd5b61014461055b565b6040518082815260200191505060405180910390f35b341561016557600080fd5b61016d610564565b6040518082815260200191505060405180910390f35b341561018e57600080fd5b6101a8600480803560001916906020019091905050610570565b6040518082815260200191505060405180910390f35b34156101c957600080fd5b6101d1610592565b6040518082815260200191505060405180910390f35b34156101f257600080fd5b61027260048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061059e565b604051808215151515815260200191505060405180910390f35b341561029757600080fd5b61029f610813565b6040518082815260200191505060405180910390f35b34156102c057600080fd5b6102c8610819565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561031557600080fd5b61031d61083f565b6040518082815260200191505060405180910390f35b341561033e57600080fd5b610346610844565b6040518082815260200191505060405180910390f35b341561036757600080fd5b6103a060048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061084a565b604051808215151515815260200191505060405180910390f35b34156103c557600080fd5b6103e8600480803560001916906020019091908035906020019091905050610a43565b6040518082815260200191505060405180910390f35b341561040957600080fd5b610411610c4f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561045e57600080fd5b610466610c75565b6040518082815260200191505060405180910390f35b341561048757600080fd5b6104a1600480803560001916906020019091905050610c7e565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b34156104de57600080fd5b6104e6610d76565b6040518082815260200191505060405180910390f35b341561050757600080fd5b610521600480803560001916906020019091905050610d83565b6040518082815260200191505060405180910390f35b60008060008360001916600019168152602001908152602001600020549050919050565b6018610e100281565b601e6018610e10020281565b600061057a61195f565b61058383610d9b565b90508060600151915050919050565b60076018610e10020281565b60006105a861195f565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636fa9d0566000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561063657600080fd5b6102c65a03f1151561064757600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561068a57600080fd5b61069387610d9b565b9050806000015173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610804576106fa846000808a600019166000191681526020019081526020016000205461129790919063ffffffff16565b6000808960001916600019168152602001908152602001600020819055507ff1a888d220228f843ac3044ef257c80642e6434d1ddc7ebee0a2813cced3406c87878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405180910390a160019150610809565b600091505b5095945050505050565b610e1081565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600581565b61271081565b6000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663079dd4b76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156108dd57600080fd5b6102c65a03f115156108ee57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561093157600080fd5b61093b85856112b5565b9150600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663649404bd86866000604051602001526040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1515610a1257600080fd5b6102c65a03f11515610a2357600080fd5b505050604051805190509050818015610a395750805b9250505092915050565b6000610a4d61195f565b60008085600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610adf57600080fd5b6102c65a03f11515610af057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663f6f494c9826000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610b7857600080fd5b6102c65a03f11515610b8957600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16141515610bcc57600080fd5b610bd587610d9b565b9350610be084611746565b9250836040015186111515610bf85760009450610c45565b836060015186101515610c0d57829450610c45565b610c17868561179c565b9150610c428460a00151610c3484866117e690919063ffffffff16565b61182190919063ffffffff16565b94505b5050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60646127100281565b6000806000806000806000806000807fff000000000000000000000000000000000000000000000000000000000000006001028b1694507effffffffffffffffffffffff000000000000000000000000000000000000006001028b16935072ffffff000000000000000000000000000000006001028b1692506ff00000000000000000000000000000006001028b1691506f0ffff0000000000000000000000000006001028b169050610d328560f861183c565b610d3d85609861183c565b610d4885608061183c565b610d5385607c61183c565b610d5e85606c61183c565b99509950995099509950505050505091939590929450565b61016d6018610e10020281565b60006020528060005260406000206000915090505481565b610da361195f565b600080600080600080600080600080600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610e4357600080fd5b6102c65a03f11515610e5457600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663314a522e8f6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610edc57600080fd5b6102c65a03f11515610eed57600080fd5b505050604051805190509b50610f028c610c7e565b809b50819c50829d50839e50849f505050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d23c4c76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610fa457600080fd5b6102c65a03f11515610fb557600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16635715c5b78c6000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561103557600080fd5b6102c65a03f1151561104657600080fd5b505050604051805190509550600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415151561108e57600080fd5b60048081111561109a57fe5b88111515156110a857600080fd5b8760048111156110b457fe5b94506110bf85611859565b9350600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561114f57600080fd5b6102c65a03f1151561116057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663d69dbf638f6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156111e857600080fd5b6102c65a03f115156111f957600080fd5b50505060405180519050925061121884886117e690919063ffffffff16565b915061122d838361129790919063ffffffff16565b905060e0604051908101604052808773ffffffffffffffffffffffffffffffffffffffff1681526020018b815260200184815260200182815260200186600481111561127557fe5b81526020018881526020018a8152509c50505050505050505050505050919050565b60008082840190508381101515156112ab57fe5b8091505092915050565b6000806000806000806000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663079dd4b76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561135157600080fd5b6102c65a03f1151561136257600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156113a557600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561143357600080fd5b6102c65a03f1151561144457600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16636be39bda8c6000604051604001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082600019166000191681526020019150506040805180830381600087803b15156114cb57600080fd5b6102c65a03f115156114dc57600080fd5b5050506040518051906020018051905080985081995050506114fd87610c7e565b809650819750829850839950849a505050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d23c4c76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561159f57600080fd5b6102c65a03f115156115b057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16635715c5b7876000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561163057600080fd5b6102c65a03f1151561164157600080fd5b505050604051805190509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561168a5750600583105b80156116c157503073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b1561173357828173ffffffffffffffffffffffffffffffffffffffff168c600019167f2c500aaec6833a053693d8c2a18a3ed5649a4609699abaf7778c3d389cc40c0588888760405180848152602001838152602001828152602001935050505060405180910390a460019850611738565b600098505b505050505050505092915050565b60008061177b60646127100261176d8560c0015186602001516117e690919063ffffffff16565b61182190919063ffffffff16565b905061179481846020015161129790919063ffffffff16565b915050919050565b60008060006117b884604001518661194690919063ffffffff16565b91506117c78460800151611859565b90506117dc818361182190919063ffffffff16565b9250505092915050565b60008060008414156117fb576000915061181a565b828402905082848281151561180c57fe5b0414151561181657fe5b8091505b5092915050565b600080828481151561182f57fe5b0490508091505092915050565b60008160020a836001900481151561185057fe5b04905092915050565b600080600481111561186757fe5b82600481111561187357fe5b141561188357610e109050611941565b6001600481111561189057fe5b82600481111561189c57fe5b14156118af576018610e10029050611941565b600260048111156118bc57fe5b8260048111156118c857fe5b14156118de5760076018610e1002029050611941565b600360048111156118eb57fe5b8260048111156118f757fe5b141561190d57601e6018610e1002029050611941565b60048081111561191957fe5b82600481111561192557fe5b141561193c5761016d6018610e1002029050611941565b600080fd5b919050565b600082821115151561195457fe5b818303905092915050565b60e060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600060048111156119aa57fe5b8152602001600081526020016000815250905600a165627a7a72305820a218433efc34d5d86e128ee9006cec41f8bfea23c5d2b1b339a73c9b29a46caf0029", + "deployedBytecode": "0x6060604052600436106100f1576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a896a1146100f65780630776298214610131578063208638941461015a5780632762dd8c1461018357806340018a0d146101be5780635f0280ba146101e75780636f69c96f1461028c57806379035396146102b55780638b47e58a1461030a57806393529cdf14610333578063977a5e641461035c57806399114d84146103ba578063abf410e5146103fe578063de53a13c14610453578063ed8907d71461047c578063fd127a41146104d3578063fd40d52e146104fc575b600080fd5b341561010157600080fd5b61011b600480803560001916906020019091905050610537565b6040518082815260200191505060405180910390f35b341561013c57600080fd5b61014461055b565b6040518082815260200191505060405180910390f35b341561016557600080fd5b61016d610564565b6040518082815260200191505060405180910390f35b341561018e57600080fd5b6101a8600480803560001916906020019091905050610570565b6040518082815260200191505060405180910390f35b34156101c957600080fd5b6101d1610592565b6040518082815260200191505060405180910390f35b34156101f257600080fd5b61027260048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061059e565b604051808215151515815260200191505060405180910390f35b341561029757600080fd5b61029f610813565b6040518082815260200191505060405180910390f35b34156102c057600080fd5b6102c8610819565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561031557600080fd5b61031d61083f565b6040518082815260200191505060405180910390f35b341561033e57600080fd5b610346610844565b6040518082815260200191505060405180910390f35b341561036757600080fd5b6103a060048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061084a565b604051808215151515815260200191505060405180910390f35b34156103c557600080fd5b6103e8600480803560001916906020019091908035906020019091905050610a43565b6040518082815260200191505060405180910390f35b341561040957600080fd5b610411610c4f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561045e57600080fd5b610466610c75565b6040518082815260200191505060405180910390f35b341561048757600080fd5b6104a1600480803560001916906020019091905050610c7e565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b34156104de57600080fd5b6104e6610d76565b6040518082815260200191505060405180910390f35b341561050757600080fd5b610521600480803560001916906020019091905050610d83565b6040518082815260200191505060405180910390f35b60008060008360001916600019168152602001908152602001600020549050919050565b6018610e100281565b601e6018610e10020281565b600061057a61195f565b61058383610d9b565b90508060600151915050919050565b60076018610e10020281565b60006105a861195f565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636fa9d0566000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561063657600080fd5b6102c65a03f1151561064757600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561068a57600080fd5b61069387610d9b565b9050806000015173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610804576106fa846000808a600019166000191681526020019081526020016000205461129790919063ffffffff16565b6000808960001916600019168152602001908152602001600020819055507ff1a888d220228f843ac3044ef257c80642e6434d1ddc7ebee0a2813cced3406c87878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405180910390a160019150610809565b600091505b5095945050505050565b610e1081565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600581565b61271081565b6000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663079dd4b76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156108dd57600080fd5b6102c65a03f115156108ee57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561093157600080fd5b61093b85856112b5565b9150600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663649404bd86866000604051602001526040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1515610a1257600080fd5b6102c65a03f11515610a2357600080fd5b505050604051805190509050818015610a395750805b9250505092915050565b6000610a4d61195f565b60008085600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610adf57600080fd5b6102c65a03f11515610af057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663f6f494c9826000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610b7857600080fd5b6102c65a03f11515610b8957600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16141515610bcc57600080fd5b610bd587610d9b565b9350610be084611746565b9250836040015186111515610bf85760009450610c45565b836060015186101515610c0d57829450610c45565b610c17868561179c565b9150610c428460a00151610c3484866117e690919063ffffffff16565b61182190919063ffffffff16565b94505b5050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60646127100281565b6000806000806000806000806000807fff000000000000000000000000000000000000000000000000000000000000006001028b1694507effffffffffffffffffffffff000000000000000000000000000000000000006001028b16935072ffffff000000000000000000000000000000006001028b1692506ff00000000000000000000000000000006001028b1691506f0ffff0000000000000000000000000006001028b169050610d328560f861183c565b610d3d85609861183c565b610d4885608061183c565b610d5385607c61183c565b610d5e85606c61183c565b99509950995099509950505050505091939590929450565b61016d6018610e10020281565b60006020528060005260406000206000915090505481565b610da361195f565b600080600080600080600080600080600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610e4357600080fd5b6102c65a03f11515610e5457600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663314a522e8f6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610edc57600080fd5b6102c65a03f11515610eed57600080fd5b505050604051805190509b50610f028c610c7e565b809b50819c50829d50839e50849f505050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d23c4c76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610fa457600080fd5b6102c65a03f11515610fb557600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16635715c5b78c6000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561103557600080fd5b6102c65a03f1151561104657600080fd5b505050604051805190509550600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415151561108e57600080fd5b60048081111561109a57fe5b88111515156110a857600080fd5b8760048111156110b457fe5b94506110bf85611859565b9350600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561114f57600080fd5b6102c65a03f1151561116057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663d69dbf638f6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156111e857600080fd5b6102c65a03f115156111f957600080fd5b50505060405180519050925061121884886117e690919063ffffffff16565b915061122d838361129790919063ffffffff16565b905060e0604051908101604052808773ffffffffffffffffffffffffffffffffffffffff1681526020018b815260200184815260200182815260200186600481111561127557fe5b81526020018881526020018a8152509c50505050505050505050505050919050565b60008082840190508381101515156112ab57fe5b8091505092915050565b6000806000806000806000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663079dd4b76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561135157600080fd5b6102c65a03f1151561136257600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156113a557600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561143357600080fd5b6102c65a03f1151561144457600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16636be39bda8c6000604051604001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082600019166000191681526020019150506040805180830381600087803b15156114cb57600080fd5b6102c65a03f115156114dc57600080fd5b5050506040518051906020018051905080985081995050506114fd87610c7e565b809650819750829850839950849a505050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d23c4c76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561159f57600080fd5b6102c65a03f115156115b057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16635715c5b7876000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561163057600080fd5b6102c65a03f1151561164157600080fd5b505050604051805190509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561168a5750600583105b80156116c157503073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b1561173357828173ffffffffffffffffffffffffffffffffffffffff168c600019167f2c500aaec6833a053693d8c2a18a3ed5649a4609699abaf7778c3d389cc40c0588888760405180848152602001838152602001828152602001935050505060405180910390a460019850611738565b600098505b505050505050505092915050565b60008061177b60646127100261176d8560c0015186602001516117e690919063ffffffff16565b61182190919063ffffffff16565b905061179481846020015161129790919063ffffffff16565b915050919050565b60008060006117b884604001518661194690919063ffffffff16565b91506117c78460800151611859565b90506117dc818361182190919063ffffffff16565b9250505092915050565b60008060008414156117fb576000915061181a565b828402905082848281151561180c57fe5b0414151561181657fe5b8091505b5092915050565b600080828481151561182f57fe5b0490508091505092915050565b60008160020a836001900481151561185057fe5b04905092915050565b600080600481111561186757fe5b82600481111561187357fe5b141561188357610e109050611941565b6001600481111561189057fe5b82600481111561189c57fe5b14156118af576018610e10029050611941565b600260048111156118bc57fe5b8260048111156118c857fe5b14156118de5760076018610e1002029050611941565b600360048111156118eb57fe5b8260048111156118f757fe5b141561190d57601e6018610e1002029050611941565b60048081111561191957fe5b82600481111561192557fe5b141561193c5761016d6018610e1002029050611941565b600080fd5b919050565b600082821115151561195457fe5b818303905092915050565b60e060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600060048111156119aa57fe5b8152602001600081526020016000815250905600a165627a7a72305820a218433efc34d5d86e128ee9006cec41f8bfea23c5d2b1b339a73c9b29a46caf0029", "sourceMap": "873:1479:15:-;;;1022:274;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1194:17;3551::16;3515:16;;:54;;;;;;;;;;;;;;;;;;3408:168;1267:21:15;1223:20;;:66;;;;;;;;;;;;;;;;;;1022:274;;873:1479;;;;;;", "deployedSourceMap": "873:1479:15:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9334:167:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1532:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1687:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2091:259:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1610:71:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6636:742;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1473:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;967:48:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;860:52:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2025:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1583:372:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7987:1066:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2492:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2329:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9507:2790;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1766:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2441:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9334:167;9430:17;9470:11;:24;9482:11;9470:24;;;;;;;;;;;;;;;;;;9463:31;;9334:167;;;:::o;1532:72::-;1602:2;1519:7;1577:27;1532:72;:::o;1687:73::-;1758:2;1602;1519:7;1577:27;1734:26;1687:73;:::o;2091:259:15:-;2201:4;2221:34;;:::i;:::-;2258:40;2285:12;2258:26;:40::i;:::-;2221:77;;2316:6;:27;;;2309:34;;2091:259;;;;:::o;1610:71:16:-;1680:1;1602:2;1519:7;1577:27;1656:25;1610:71;:::o;6636:742::-;6865:13;6894:34;;:::i;:::-;3051:16;;;;;;;;;;;:32;;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3029:57;;:10;:57;;;3021:66;;;;;;;;6931:39;6958:11;6931:26;:39::i;:::-;6894:76;;7001:6;:28;;;6985:44;;:12;:44;;;6981:368;;;7072:46;7101:16;7072:11;:24;7084:11;7072:24;;;;;;;;;;;;;;;;;;:28;;:46;;;;:::i;:::-;7045:11;:24;7057:11;7045:24;;;;;;;;;;;;;;;;;:73;;;;7133:179;7171:11;7200:5;7223:11;7252:16;7286:12;7133:179;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7334:4;7327:11;;;;6981:368;7366:5;7359:12;;3097:1;6636:742;;;;;;;;:::o;1473:53::-;1519:7;1473:53;:::o;967:48:15:-;;;;;;;;;;;;;:::o;860:52:16:-;911:1;860:52;:::o;2025:67::-;2085:7;2025:67;:::o;1583:372:15:-;1724:13;1753:15;1825:19;3353:16:16;;;;;;;;;;;:27;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3331:52;;:10;:52;;;3323:61;;;;;;;;1771:44:15;1795:11;1808:6;1771:23;:44::i;:::-;1753:62;;1847:20;;;;;;;;;;;:34;;;1882:11;1895:6;1847:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1825:77;;1920:10;:28;;;;;1934:14;1920:28;1913:35;;1583:372;;;;;;:::o;7987:1066:16:-;8175:28;8219:34;;:::i;:::-;8305:26;8871:13;8145:11;3201:16;;;;;;;;;;;:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:48;;;3250:11;3201:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3184:78;;3192:4;3184:78;;;3176:87;;;;;;;;8256:39;8283:11;8256:26;:39::i;:::-;8219:76;;8334:43;8370:6;8334:35;:43::i;:::-;8305:72;;8405:6;:29;;;8392:9;:42;;8388:659;;;8587:1;8580:8;;;;8388:659;8622:6;:27;;;8609:9;:40;;8605:442;;;8819:21;8812:28;;;;8605:442;8887:51;8920:9;8931:6;8887:32;:51::i;:::-;8871:67;;8959:77;8999:6;:36;;;8959:35;8985:8;8959:21;:25;;:35;;;;:::i;:::-;:39;;:77;;;;:::i;:::-;8952:84;;3273:1;7987:1066;;;;;;;;:::o;2492:40::-;;;;;;;;;;;;;:::o;2329:105::-;2431:3;2085:7;2392:42;2329:105;:::o;9507:2790::-;9620:25;9659:21;9694:18;9726:26;9766:35;9940:34;10160:30;10372:27;10588:35;10845:44;10002:66;9989:79;;:10;:79;9940:128;;10218:66;10205:79;;:10;:79;10160:124;;10427:66;10414:79;;:10;:79;10372:121;;10651:66;10638:79;;:10;:79;10588:129;;10917:66;10904:79;;:10;:79;10845:138;;11994:46;12008:26;12036:3;11994:13;:46::i;:::-;12054:42;12068:22;12092:3;12054:13;:42::i;:::-;12110:39;12124:19;12145:3;12110:13;:39::i;:::-;12163:47;12177:27;12206:3;12163:13;:47::i;:::-;12224:56;12238:36;12276:3;12224:13;:56::i;:::-;11973:317;;;;;;;;;;9507:2790;;;;;;;;;;;;:::o;1766:73::-;1836:3;1602:2;1519:7;1577:27;1812;1766:73;:::o;2441:44::-;;;;;;;;;;;;;;;;;:::o;14136:2420::-;14241:27;;:::i;:::-;14284:18;14467:24;14574:20;14664:17;14782:28;14917:34;15133:29;15568:41;15668:36;15785:27;15907:24;16022:25;14305:16;;;;;;;;;;;:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:58;;;14364:11;14305:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14284:92;;15085:37;15111:10;15085:25;:37::i;:::-;14962:160;;;;;;;;;;;;;;;;;;;;15177:16;;;;;;;;;;;:30;;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:55;;;15233:19;15177:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15133:120;;15373:1;15340:35;;:21;:35;;;;15332:44;;;;;;;;15529:26;15524:32;;;;;;;;15497:23;:59;;15489:68;;;;;;;;15633:23;15612:45;;;;;;;;15568:89;;15719:56;15754:20;15719:34;:56::i;:::-;15668:107;;15827:16;;;;;;;;;;;:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:57;;;15885:11;15827:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15785:112;;15946:66;15980:31;15946:29;:33;;:66;;;;:::i;:::-;15907:105;;16062:47;16086:22;16062:19;:23;;:47;;;;:::i;:::-;16022:87;;16127:422;;;;;;;;;16185:21;16127:422;;;;;;16237:15;16127:422;;;;16330:22;16127:422;;;;16388:20;16127:422;;;;16444:20;16127:422;;;;;;;;;;;;16509:29;16127:422;;;;16280:12;16127:422;;;16120:429;;14136:2420;;;;;;;;;;;;;;;:::o;1007:129:38:-;1065:7;1080:9;1096:1;1092;:5;1080:17;;1115:1;1110;:6;;1103:14;;;;;;1130:1;1123:8;;1007:129;;;;;:::o;4229:1696:16:-;4370:13;4399:21;4430:31;4579:24;4613:20;4643:17;4670:25;4705:34;4931:29;3353:16;;;;;;;;;;;:27;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3331:52;;:10;:52;;;3323:61;;;;;;;;4515:16;;;;;;;;;;;:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:40;;;4556:11;4515:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4472:96;;;;;;;;4870:50;4896:23;4870:25;:50::i;:::-;4750:170;;;;;;;;;;;;;;;;;;;;4975:16;;;;;;;;;;;:30;;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:55;;;5031:19;4975:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4931:120;;5473:1;5440:35;;:21;:35;;;;:101;;;;;911:1;5491:20;:50;5440:101;:147;;;;;5582:4;5557:30;;:13;:30;;;5440:147;5436:460;;;5778:20;5676:21;5603:256;;5647:11;5603:256;;;;5715:15;5748:12;5816:29;5603:256;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5881:4;5874:11;;;;5436:460;5913:5;5906:12;;3394:1;4229:1696;;;;;;;;;;;;:::o;13492:638::-;13614:27;13925:18;13946:118;2431:3;2085:7;2392:42;13946:60;13986:6;:19;;;13946:6;:22;;;:39;;:60;;;;:::i;:::-;:77;;:118;;;;:::i;:::-;13925:139;;14082:41;14109:13;14082:6;:22;;;:26;;:41;;;;:::i;:::-;14075:48;;13492:638;;;;:::o;12707:404::-;12850:10;12876;12943:36;12889:44;12903:6;:29;;;12889:9;:13;;:44;;;;:::i;:::-;12876:57;;12982:63;13017:6;:27;;;12982:34;:63::i;:::-;12943:102;;13062:42;13072:31;13062:5;:9;;:42;;;;:::i;:::-;13055:49;;12707:404;;;;;;:::o;203:173:38:-;261:7;316:9;285:1;280;:6;276:35;;;303:1;296:8;;;;276:35;332:1;328;:5;316:17;;355:1;350;346;:5;;;;;;;;:10;339:18;;;;;;370:1;363:8;;203:173;;;;;;:::o;458:265::-;516:7;605:9;621:1;617;:5;;;;;;;;605:17;;717:1;710:8;;458:265;;;;;:::o;12544:157:16:-;12642:4;12688:6;12683:1;:11;12674:5;12669:11;;;:25;;;;;;;;12662:32;;12544:157;;;;:::o;16562:806::-;16696:37;16777:26;16753:50;;;;;;;;:20;:50;;;;;;;;;16749:613;;;1519:7;16819:29;;;;16749:613;16893:25;16869:49;;;;;;;;:20;:49;;;;;;;;;16865:497;;;1602:2;1519:7;1577:27;16934:28;;;;16865:497;17007:26;16983:50;;;;;;;;:20;:50;;;;;;;;;16979:383;;;1680:1;1602:2;1519:7;1577:27;1656:25;17049:29;;;;16979:383;17123:27;17099:51;;;;;;;;:20;:51;;;;;;;;;17095:267;;;1758:2;1602;1519:7;1577:27;1734:26;17166:30;;;;17095:267;17241:26;17217:50;;;;;;;;:20;:50;;;;;;;;;17213:149;;;1836:3;1602:2;1519:7;1577:27;1812;17283:29;;;;17213:149;17343:8;;;16562:806;;;;:::o;835:110:38:-;893:7;920:1;915;:6;;908:14;;;;;;939:1;935;:5;928:12;;835:110;;;;:::o;873:1479:15:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\nimport \"./SimpleInterestTermsContract.sol\";\nimport \"../ERC721Collateralizer.sol\";\n\n\n/**\n * A Terms Contract that can be used for debt agreements where the collateral token is a\n * non-fungible ERC721 token. It contains functionality for simple interest loans.\n */\ncontract ERC721CollateralizedSimpleInterestTermsContract is SimpleInterestTermsContract {\n ERC721Collateralizer public erc721Collateralizer;\n\n function ERC721CollateralizedSimpleInterestTermsContract(\n address _contractRegistry,\n address _erc721Collateralizer\n ) public SimpleInterestTermsContract(_contractRegistry) {\n erc721Collateralizer = ERC721Collateralizer(_erc721Collateralizer);\n }\n\n /**\n * This method is called by the DebtKernel when an Debt Order is filled. Here, we use it\n * as a hook to collateralize the debtor's ERC721 asset, and to call the same method on the\n * parent contract - which registers that the debt agreement has begun.\n */\n function registerTermStart(\n bytes32 agreementId,\n address debtor\n )\n public\n onlyDebtKernel\n returns (bool _success)\n {\n bool registered = super.registerTermStart(agreementId, debtor);\n bool collateralized = erc721Collateralizer.collateralize(agreementId, debtor);\n\n return registered && collateralized;\n }\n\n /**\n * A method that returns a Unix timestamp representing the end of the debt agreement's term.\n * contract.\n */\n function getTermEndTimestamp(\n bytes32 _agreementId\n )\n public\n view\n returns (uint)\n {\n SimpleInterestParams memory params = unpackParamsForAgreementID(_agreementId);\n\n return params.termEndUnixTimestamp;\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/examples/ERC721CollateralizedSimpleInterestTermsContract.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/examples/ERC721CollateralizedSimpleInterestTermsContract.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/examples/ERC721CollateralizedSimpleInterestTermsContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/examples/ERC721CollateralizedSimpleInterestTermsContract.sol", "exportedSymbols": { "ERC721CollateralizedSimpleInterestTermsContract": [ 5348 @@ -430,7 +430,7 @@ { "attributes": { "SourceUnit": 6053, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/examples/SimpleInterestTermsContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/examples/SimpleInterestTermsContract.sol", "file": "./SimpleInterestTermsContract.sol", "scope": 5349, "symbolAliases": [ @@ -445,7 +445,7 @@ { "attributes": { "SourceUnit": 4167, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/ERC721Collateralizer.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/ERC721Collateralizer.sol", "file": "../ERC721Collateralizer.sol", "scope": 5349, "symbolAliases": [ @@ -1445,7 +1445,7 @@ "42": { "events": {}, "links": {}, - "address": "0x13a93b0e027f419556271a3cb1060ef7156103e6" + "address": "0xe44c8dbcb6dab51c4d5291788ec3fb82d2fbad12" }, "70": { "events": {}, @@ -1454,5 +1454,5 @@ } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:16:13.721Z" + "updatedAt": "2018-10-09T17:53:04.862Z" } \ No newline at end of file diff --git a/artifacts/json/ERC721Collateralizer.json b/artifacts/json/ERC721Collateralizer.json index 6b67b8c4..5f6f13af 100644 --- a/artifacts/json/ERC721Collateralizer.json +++ b/artifacts/json/ERC721Collateralizer.json @@ -456,15 +456,15 @@ "type": "event" } ], - "bytecode": "0x606060405260008060146101000a81548160ff021916908315150217905550341561002957600080fd5b6040516060806127ab833981016040528080519060200190919080519060200190919080519060200190919050506000336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508390508073ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561010857600080fd5b6102c65a03f1151561011957600080fd5b50505060405180519050600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050506125b3806101f86000396000f300606060405260043610610107576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632e667c4e1461010c5780632f866f731461019a578063399f120f146101ef5780633f4ba83a1461029057806344c4ea95146102a55780635c975abb146102cc57806361a52a36146102f9578063649404bd14610322578063656e903b146103805780636f16f14a146103e75780638456cb591461043c5780638da5cb5b146104515780639ae1c1f3146104a65780639d23c4c7146104df578063ae72c6ef14610534578063ca0626471461056d578063ed8e52bd146105ba578063f2fde38b146105e1578063f466f42e1461061a575b600080fd5b341561011757600080fd5b61011f610684565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561015f578082015181840152602081019050610144565b50505050905090810190601f16801561018c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101a557600080fd5b6101ad6106bd565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101fa57600080fd5b6102146004808035600019169060200190919050506106e3565b604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390f35b341561029b57600080fd5b6102a3610946565b005b34156102b057600080fd5b6102ca600480803560001916906020019091905050610a04565b005b34156102d757600080fd5b6102df611062565b604051808215151515815260200191505060405180910390f35b341561030457600080fd5b61030c611075565b6040518082815260200191505060405180910390f35b341561032d57600080fd5b61036660048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061107c565b604051808215151515815260200191505060405180910390f35b341561038b57600080fd5b6103a5600480803560001916906020019091905050611435565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103f257600080fd5b6103fa611468565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561044757600080fd5b61044f61148e565b005b341561045c57600080fd5b61046461154e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104b157600080fd5b6104dd600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611573565b005b34156104ea57600080fd5b6104f261161c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561053f57600080fd5b61056b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611642565b005b341561057857600080fd5b6105926004808035600019169060200190919050506116eb565b6040518084151515158152602001838152602001828152602001935050505060405180910390f35b34156105c557600080fd5b6105df60048080356000191690602001909190505061176e565b005b34156105ec57600080fd5b610618600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611db2565b005b341561062557600080fd5b61062d611f07565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610670578082015181840152602081019050610655565b505050509050019250505060405180910390f35b6040805190810160405280601481526020017f455243373231436f6c6c61746572616c697a657200000000000000000000000081525081565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000806000806000806000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636be39bda8d6000604051604001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082600019166000191681526020019150506040805180830381600087803b151561079457600080fd5b6102c65a03f115156107a557600080fd5b5050506040518051906020018051905080985081995050506107c6876116eb565b809650819750829850505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635715c5b7866000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561086b57600080fd5b6102c65a03f1151561087c57600080fd5b505050604051805190509150819050851561092a578073ffffffffffffffffffffffffffffffffffffffff16634f6ccce7856000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561090857600080fd5b6102c65a03f1151561091957600080fd5b50505060405180519050925061092e565b8392505b8183899a509a509a5050505050505050509193909250565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156109a157600080fd5b600060149054906101000a900460ff1615156109bc57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b60008060008060008060149054906101000a900460ff16151515610a2757600080fd5b610a30866106e3565b809550819650829750505050600073ffffffffffffffffffffffffffffffffffffffff1660046000886000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515610ab357600080fd5b60046000876000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915060046000876000191660001916815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690558273ffffffffffffffffffffffffffffffffffffffff166303a896a1876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610bae57600080fd5b6102c65a03f11515610bbf57600080fd5b505050604051805190508373ffffffffffffffffffffffffffffffffffffffff166399114d84888673ffffffffffffffffffffffffffffffffffffffff16632762dd8c8b6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610c6557600080fd5b6102c65a03f11515610c7657600080fd5b505050604051805190506000604051602001526040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050602060405180830381600087803b1515610ce957600080fd5b6102c65a03f11515610cfa57600080fd5b5050506040518051905011151515610d1157600080fd5b8490508473ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610e21578073ffffffffffffffffffffffffffffffffffffffff1663095ea7b330866040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1515610e0c57600080fd5b6102c65a03f11515610e1d57600080fd5b5050505b8073ffffffffffffffffffffffffffffffffffffffff166323b872dd3084876040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1515610ef757600080fd5b6102c65a03f11515610f0857600080fd5b5050508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e866000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515610f9957600080fd5b6102c65a03f11515610faa57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16141515610fd357fe5b8173ffffffffffffffffffffffffffffffffffffffff1686600019167f2621540e2b91ca10330d6a7cbd6fb8cab2396f91c4935ad76b1183770819fa1f8787604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a3505050505050565b600060149054906101000a900460ff1681565b6201518081565b600080600080600080611099336005611f1e90919063ffffffff16565b15156110a457600080fd5b600060149054906101000a900460ff161515156110c057600080fd5b6110c9886106e3565b8095508196508297505050503373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151561110f57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415151561114b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600460008a6000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156111c157600080fd5b86600460008a6000191660001916815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508491503090508173ffffffffffffffffffffffffffffffffffffffff166323b872dd8883876040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b15156112f757600080fd5b6102c65a03f1151561130857600080fd5b5050508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16636352211e866000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561139957600080fd5b6102c65a03f115156113aa57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff161415156113d357fe5b8473ffffffffffffffffffffffffffffffffffffffff1688600019167f38f12634ebefbe7f6767652aae05e220f95e0ca8ef8353c9c9c5ae439a592aec866040518082815260200191505060405180910390a360019550505050505092915050565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156114e957600080fd5b600060149054906101000a900460ff1615151561150557600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156115ce57600080fd5b611619816040805190810160405280601481526020017f455243373231436f6c6c61746572616c697a65720000000000000000000000008152506005611f779092919063ffffffff16565b50565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561169d57600080fd5b6116e8816040805190810160405280601481526020017f455243373231436f6c6c61746572616c697a6572000000000000000000000000815250600561226d9092919063ffffffff16565b50565b60008060008060008060008060018002891694506d0ffffffffffff00000000000000060010289169350670ffffffffffffff060010289169250671000000000000000846001900481151561173c57fe5b0491506010836001900481151561174f57fe5b0490506001856001900414828297509750975050505050509193909250565b60008060008060008060149054906101000a900460ff1615151561179157600080fd5b61179a866106e3565b809550819650829750505050600073ffffffffffffffffffffffffffffffffffffffff1660046000886000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561181d57600080fd5b60046000876000191660001916815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690558273ffffffffffffffffffffffffffffffffffffffff166303a896a1876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156118da57600080fd5b6102c65a03f115156118eb57600080fd5b505050604051805190508373ffffffffffffffffffffffffffffffffffffffff166399114d8488426000604051602001526040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050602060405180830381600087803b151561197c57600080fd5b6102c65a03f1151561198d57600080fd5b505050604051805190501115156119a357600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ba20dda4876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515611a4457600080fd5b6102c65a03f11515611a5557600080fd5b5050506040518051905091508490508473ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611b71578073ffffffffffffffffffffffffffffffffffffffff1663095ea7b330866040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1515611b5c57600080fd5b6102c65a03f11515611b6d57600080fd5b5050505b8073ffffffffffffffffffffffffffffffffffffffff166323b872dd3084876040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1515611c4757600080fd5b6102c65a03f11515611c5857600080fd5b5050508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e866000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515611ce957600080fd5b6102c65a03f11515611cfa57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16141515611d2357fe5b8173ffffffffffffffffffffffffffffffffffffffff1686600019167f50d195a4b80a950617a8e0e18ac9dd4c0236ac72d5e12355d881443823870d398787604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a3505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611e0d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611e4957600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611f0f6124f6565b611f196005612449565b905090565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000806000611f868686611f1e565b1515611f9157600080fd5b8560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600186600201805490500391508560020182815481101515611ff357fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff021916905580866002018481548110151561208457fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055856002018281548110151561216957fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600186600201818180549050039150816121b1919061250a565b508473ffffffffffffffffffffffffffffffffffffffff167f0814e4ee85854cea446b4a27a460e5ffb41516230dbc02f226c07907e432241c856040518080602001828103825283818151815260200191508051906020019080838360005b8381101561222b578082015181840152602081019050612210565b50505050905090810190601f1680156122585780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050505050565b61227783836124e1565b151561228257600080fd5b60018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508260020180548060010182816122f29190612536565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060018360020180549050038360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f571925c699f9072cec76b6c6c000571cc8d0bb5c47e5819202e2e9496c6508b5826040518080602001828103825283818151815260200191508051906020019080838360005b8381101561240a5780820151818401526020810190506123ef565b50505050905090810190601f1680156124375780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b6124516124f6565b816002018054806020026020016040519081016040528092919081815260200182805480156124d557602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161248b575b50505050509050919050565b60006124ed8383611f1e565b15905092915050565b602060405190810160405280600081525090565b815481835581811511612531578183600052602060002091820191016125309190612562565b5b505050565b81548183558181151161255d5781836000526020600020918201910161255c9190612562565b5b505050565b61258491905b80821115612580576000816000905550600101612568565b5090565b905600a165627a7a723058205ae7c5eda77b75a6a5bd7b4f19339aa2b15640aab6ebf045e59b47b1a439ddc60029", - "deployedBytecode": "0x606060405260043610610107576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632e667c4e1461010c5780632f866f731461019a578063399f120f146101ef5780633f4ba83a1461029057806344c4ea95146102a55780635c975abb146102cc57806361a52a36146102f9578063649404bd14610322578063656e903b146103805780636f16f14a146103e75780638456cb591461043c5780638da5cb5b146104515780639ae1c1f3146104a65780639d23c4c7146104df578063ae72c6ef14610534578063ca0626471461056d578063ed8e52bd146105ba578063f2fde38b146105e1578063f466f42e1461061a575b600080fd5b341561011757600080fd5b61011f610684565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561015f578082015181840152602081019050610144565b50505050905090810190601f16801561018c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101a557600080fd5b6101ad6106bd565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101fa57600080fd5b6102146004808035600019169060200190919050506106e3565b604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390f35b341561029b57600080fd5b6102a3610946565b005b34156102b057600080fd5b6102ca600480803560001916906020019091905050610a04565b005b34156102d757600080fd5b6102df611062565b604051808215151515815260200191505060405180910390f35b341561030457600080fd5b61030c611075565b6040518082815260200191505060405180910390f35b341561032d57600080fd5b61036660048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061107c565b604051808215151515815260200191505060405180910390f35b341561038b57600080fd5b6103a5600480803560001916906020019091905050611435565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103f257600080fd5b6103fa611468565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561044757600080fd5b61044f61148e565b005b341561045c57600080fd5b61046461154e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104b157600080fd5b6104dd600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611573565b005b34156104ea57600080fd5b6104f261161c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561053f57600080fd5b61056b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611642565b005b341561057857600080fd5b6105926004808035600019169060200190919050506116eb565b6040518084151515158152602001838152602001828152602001935050505060405180910390f35b34156105c557600080fd5b6105df60048080356000191690602001909190505061176e565b005b34156105ec57600080fd5b610618600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611db2565b005b341561062557600080fd5b61062d611f07565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610670578082015181840152602081019050610655565b505050509050019250505060405180910390f35b6040805190810160405280601481526020017f455243373231436f6c6c61746572616c697a657200000000000000000000000081525081565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000806000806000806000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636be39bda8d6000604051604001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082600019166000191681526020019150506040805180830381600087803b151561079457600080fd5b6102c65a03f115156107a557600080fd5b5050506040518051906020018051905080985081995050506107c6876116eb565b809650819750829850505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635715c5b7866000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561086b57600080fd5b6102c65a03f1151561087c57600080fd5b505050604051805190509150819050851561092a578073ffffffffffffffffffffffffffffffffffffffff16634f6ccce7856000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561090857600080fd5b6102c65a03f1151561091957600080fd5b50505060405180519050925061092e565b8392505b8183899a509a509a5050505050505050509193909250565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156109a157600080fd5b600060149054906101000a900460ff1615156109bc57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b60008060008060008060149054906101000a900460ff16151515610a2757600080fd5b610a30866106e3565b809550819650829750505050600073ffffffffffffffffffffffffffffffffffffffff1660046000886000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515610ab357600080fd5b60046000876000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915060046000876000191660001916815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690558273ffffffffffffffffffffffffffffffffffffffff166303a896a1876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610bae57600080fd5b6102c65a03f11515610bbf57600080fd5b505050604051805190508373ffffffffffffffffffffffffffffffffffffffff166399114d84888673ffffffffffffffffffffffffffffffffffffffff16632762dd8c8b6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610c6557600080fd5b6102c65a03f11515610c7657600080fd5b505050604051805190506000604051602001526040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050602060405180830381600087803b1515610ce957600080fd5b6102c65a03f11515610cfa57600080fd5b5050506040518051905011151515610d1157600080fd5b8490508473ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610e21578073ffffffffffffffffffffffffffffffffffffffff1663095ea7b330866040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1515610e0c57600080fd5b6102c65a03f11515610e1d57600080fd5b5050505b8073ffffffffffffffffffffffffffffffffffffffff166323b872dd3084876040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1515610ef757600080fd5b6102c65a03f11515610f0857600080fd5b5050508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e866000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515610f9957600080fd5b6102c65a03f11515610faa57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16141515610fd357fe5b8173ffffffffffffffffffffffffffffffffffffffff1686600019167f2621540e2b91ca10330d6a7cbd6fb8cab2396f91c4935ad76b1183770819fa1f8787604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a3505050505050565b600060149054906101000a900460ff1681565b6201518081565b600080600080600080611099336005611f1e90919063ffffffff16565b15156110a457600080fd5b600060149054906101000a900460ff161515156110c057600080fd5b6110c9886106e3565b8095508196508297505050503373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151561110f57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415151561114b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600460008a6000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156111c157600080fd5b86600460008a6000191660001916815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508491503090508173ffffffffffffffffffffffffffffffffffffffff166323b872dd8883876040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b15156112f757600080fd5b6102c65a03f1151561130857600080fd5b5050508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16636352211e866000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561139957600080fd5b6102c65a03f115156113aa57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff161415156113d357fe5b8473ffffffffffffffffffffffffffffffffffffffff1688600019167f38f12634ebefbe7f6767652aae05e220f95e0ca8ef8353c9c9c5ae439a592aec866040518082815260200191505060405180910390a360019550505050505092915050565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156114e957600080fd5b600060149054906101000a900460ff1615151561150557600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156115ce57600080fd5b611619816040805190810160405280601481526020017f455243373231436f6c6c61746572616c697a65720000000000000000000000008152506005611f779092919063ffffffff16565b50565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561169d57600080fd5b6116e8816040805190810160405280601481526020017f455243373231436f6c6c61746572616c697a6572000000000000000000000000815250600561226d9092919063ffffffff16565b50565b60008060008060008060008060018002891694506d0ffffffffffff00000000000000060010289169350670ffffffffffffff060010289169250671000000000000000846001900481151561173c57fe5b0491506010836001900481151561174f57fe5b0490506001856001900414828297509750975050505050509193909250565b60008060008060008060149054906101000a900460ff1615151561179157600080fd5b61179a866106e3565b809550819650829750505050600073ffffffffffffffffffffffffffffffffffffffff1660046000886000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561181d57600080fd5b60046000876000191660001916815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690558273ffffffffffffffffffffffffffffffffffffffff166303a896a1876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156118da57600080fd5b6102c65a03f115156118eb57600080fd5b505050604051805190508373ffffffffffffffffffffffffffffffffffffffff166399114d8488426000604051602001526040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050602060405180830381600087803b151561197c57600080fd5b6102c65a03f1151561198d57600080fd5b505050604051805190501115156119a357600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ba20dda4876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515611a4457600080fd5b6102c65a03f11515611a5557600080fd5b5050506040518051905091508490508473ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611b71578073ffffffffffffffffffffffffffffffffffffffff1663095ea7b330866040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1515611b5c57600080fd5b6102c65a03f11515611b6d57600080fd5b5050505b8073ffffffffffffffffffffffffffffffffffffffff166323b872dd3084876040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1515611c4757600080fd5b6102c65a03f11515611c5857600080fd5b5050508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e866000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515611ce957600080fd5b6102c65a03f11515611cfa57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16141515611d2357fe5b8173ffffffffffffffffffffffffffffffffffffffff1686600019167f50d195a4b80a950617a8e0e18ac9dd4c0236ac72d5e12355d881443823870d398787604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a3505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611e0d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611e4957600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611f0f6124f6565b611f196005612449565b905090565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000806000611f868686611f1e565b1515611f9157600080fd5b8560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600186600201805490500391508560020182815481101515611ff357fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff021916905580866002018481548110151561208457fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055856002018281548110151561216957fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600186600201818180549050039150816121b1919061250a565b508473ffffffffffffffffffffffffffffffffffffffff167f0814e4ee85854cea446b4a27a460e5ffb41516230dbc02f226c07907e432241c856040518080602001828103825283818151815260200191508051906020019080838360005b8381101561222b578082015181840152602081019050612210565b50505050905090810190601f1680156122585780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050505050565b61227783836124e1565b151561228257600080fd5b60018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508260020180548060010182816122f29190612536565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060018360020180549050038360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f571925c699f9072cec76b6c6c000571cc8d0bb5c47e5819202e2e9496c6508b5826040518080602001828103825283818151815260200191508051906020019080838360005b8381101561240a5780820151818401526020810190506123ef565b50505050905090810190601f1680156124375780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b6124516124f6565b816002018054806020026020016040519081016040528092919081815260200182805480156124d557602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161248b575b50505050509050919050565b60006124ed8383611f1e565b15905092915050565b602060405190810160405280600081525090565b815481835581811511612531578183600052602060002091820191016125309190612562565b5b505050565b81548183558181151161255d5781836000526020600020918201910161255c9190612562565b5b505050565b61258491905b80821115612580576000816000905550600101612568565b5090565b905600a165627a7a723058205ae7c5eda77b75a6a5bd7b4f19339aa2b15640aab6ebf045e59b47b1a439ddc60029", + "bytecode": "0x606060405260008060146101000a81548160ff021916908315150217905550341561002957600080fd5b6040516060806127ab833981016040528080519060200190919080519060200190919080519060200190919050506000336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508390508073ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561010857600080fd5b6102c65a03f1151561011957600080fd5b50505060405180519050600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050506125b3806101f86000396000f300606060405260043610610107576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632e667c4e1461010c5780632f866f731461019a578063399f120f146101ef5780633f4ba83a1461029057806344c4ea95146102a55780635c975abb146102cc57806361a52a36146102f9578063649404bd14610322578063656e903b146103805780636f16f14a146103e75780638456cb591461043c5780638da5cb5b146104515780639ae1c1f3146104a65780639d23c4c7146104df578063ae72c6ef14610534578063ca0626471461056d578063ed8e52bd146105ba578063f2fde38b146105e1578063f466f42e1461061a575b600080fd5b341561011757600080fd5b61011f610684565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561015f578082015181840152602081019050610144565b50505050905090810190601f16801561018c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101a557600080fd5b6101ad6106bd565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101fa57600080fd5b6102146004808035600019169060200190919050506106e3565b604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390f35b341561029b57600080fd5b6102a3610946565b005b34156102b057600080fd5b6102ca600480803560001916906020019091905050610a04565b005b34156102d757600080fd5b6102df611062565b604051808215151515815260200191505060405180910390f35b341561030457600080fd5b61030c611075565b6040518082815260200191505060405180910390f35b341561032d57600080fd5b61036660048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061107c565b604051808215151515815260200191505060405180910390f35b341561038b57600080fd5b6103a5600480803560001916906020019091905050611435565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103f257600080fd5b6103fa611468565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561044757600080fd5b61044f61148e565b005b341561045c57600080fd5b61046461154e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104b157600080fd5b6104dd600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611573565b005b34156104ea57600080fd5b6104f261161c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561053f57600080fd5b61056b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611642565b005b341561057857600080fd5b6105926004808035600019169060200190919050506116eb565b6040518084151515158152602001838152602001828152602001935050505060405180910390f35b34156105c557600080fd5b6105df60048080356000191690602001909190505061176e565b005b34156105ec57600080fd5b610618600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611db2565b005b341561062557600080fd5b61062d611f07565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610670578082015181840152602081019050610655565b505050509050019250505060405180910390f35b6040805190810160405280601481526020017f455243373231436f6c6c61746572616c697a657200000000000000000000000081525081565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000806000806000806000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636be39bda8d6000604051604001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082600019166000191681526020019150506040805180830381600087803b151561079457600080fd5b6102c65a03f115156107a557600080fd5b5050506040518051906020018051905080985081995050506107c6876116eb565b809650819750829850505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635715c5b7866000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561086b57600080fd5b6102c65a03f1151561087c57600080fd5b505050604051805190509150819050851561092a578073ffffffffffffffffffffffffffffffffffffffff16634f6ccce7856000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561090857600080fd5b6102c65a03f1151561091957600080fd5b50505060405180519050925061092e565b8392505b8183899a509a509a5050505050505050509193909250565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156109a157600080fd5b600060149054906101000a900460ff1615156109bc57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b60008060008060008060149054906101000a900460ff16151515610a2757600080fd5b610a30866106e3565b809550819650829750505050600073ffffffffffffffffffffffffffffffffffffffff1660046000886000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515610ab357600080fd5b60046000876000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915060046000876000191660001916815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690558273ffffffffffffffffffffffffffffffffffffffff166303a896a1876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610bae57600080fd5b6102c65a03f11515610bbf57600080fd5b505050604051805190508373ffffffffffffffffffffffffffffffffffffffff166399114d84888673ffffffffffffffffffffffffffffffffffffffff16632762dd8c8b6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610c6557600080fd5b6102c65a03f11515610c7657600080fd5b505050604051805190506000604051602001526040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050602060405180830381600087803b1515610ce957600080fd5b6102c65a03f11515610cfa57600080fd5b5050506040518051905011151515610d1157600080fd5b8490508473ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610e21578073ffffffffffffffffffffffffffffffffffffffff1663095ea7b330866040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1515610e0c57600080fd5b6102c65a03f11515610e1d57600080fd5b5050505b8073ffffffffffffffffffffffffffffffffffffffff166323b872dd3084876040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1515610ef757600080fd5b6102c65a03f11515610f0857600080fd5b5050508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e866000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515610f9957600080fd5b6102c65a03f11515610faa57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16141515610fd357fe5b8173ffffffffffffffffffffffffffffffffffffffff1686600019167f2621540e2b91ca10330d6a7cbd6fb8cab2396f91c4935ad76b1183770819fa1f8787604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a3505050505050565b600060149054906101000a900460ff1681565b6201518081565b600080600080600080611099336005611f1e90919063ffffffff16565b15156110a457600080fd5b600060149054906101000a900460ff161515156110c057600080fd5b6110c9886106e3565b8095508196508297505050503373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151561110f57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415151561114b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600460008a6000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156111c157600080fd5b86600460008a6000191660001916815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508491503090508173ffffffffffffffffffffffffffffffffffffffff166323b872dd8883876040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b15156112f757600080fd5b6102c65a03f1151561130857600080fd5b5050508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16636352211e866000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561139957600080fd5b6102c65a03f115156113aa57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff161415156113d357fe5b8473ffffffffffffffffffffffffffffffffffffffff1688600019167f38f12634ebefbe7f6767652aae05e220f95e0ca8ef8353c9c9c5ae439a592aec866040518082815260200191505060405180910390a360019550505050505092915050565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156114e957600080fd5b600060149054906101000a900460ff1615151561150557600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156115ce57600080fd5b611619816040805190810160405280601481526020017f455243373231436f6c6c61746572616c697a65720000000000000000000000008152506005611f779092919063ffffffff16565b50565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561169d57600080fd5b6116e8816040805190810160405280601481526020017f455243373231436f6c6c61746572616c697a6572000000000000000000000000815250600561226d9092919063ffffffff16565b50565b60008060008060008060008060018002891694506d0ffffffffffff00000000000000060010289169350670ffffffffffffff060010289169250671000000000000000846001900481151561173c57fe5b0491506010836001900481151561174f57fe5b0490506001856001900414828297509750975050505050509193909250565b60008060008060008060149054906101000a900460ff1615151561179157600080fd5b61179a866106e3565b809550819650829750505050600073ffffffffffffffffffffffffffffffffffffffff1660046000886000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561181d57600080fd5b60046000876000191660001916815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690558273ffffffffffffffffffffffffffffffffffffffff166303a896a1876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156118da57600080fd5b6102c65a03f115156118eb57600080fd5b505050604051805190508373ffffffffffffffffffffffffffffffffffffffff166399114d8488426000604051602001526040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050602060405180830381600087803b151561197c57600080fd5b6102c65a03f1151561198d57600080fd5b505050604051805190501115156119a357600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ba20dda4876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515611a4457600080fd5b6102c65a03f11515611a5557600080fd5b5050506040518051905091508490508473ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611b71578073ffffffffffffffffffffffffffffffffffffffff1663095ea7b330866040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1515611b5c57600080fd5b6102c65a03f11515611b6d57600080fd5b5050505b8073ffffffffffffffffffffffffffffffffffffffff166323b872dd3084876040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1515611c4757600080fd5b6102c65a03f11515611c5857600080fd5b5050508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e866000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515611ce957600080fd5b6102c65a03f11515611cfa57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16141515611d2357fe5b8173ffffffffffffffffffffffffffffffffffffffff1686600019167f50d195a4b80a950617a8e0e18ac9dd4c0236ac72d5e12355d881443823870d398787604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a3505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611e0d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611e4957600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611f0f6124f6565b611f196005612449565b905090565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000806000611f868686611f1e565b1515611f9157600080fd5b8560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600186600201805490500391508560020182815481101515611ff357fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff021916905580866002018481548110151561208457fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055856002018281548110151561216957fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600186600201818180549050039150816121b1919061250a565b508473ffffffffffffffffffffffffffffffffffffffff167f0814e4ee85854cea446b4a27a460e5ffb41516230dbc02f226c07907e432241c856040518080602001828103825283818151815260200191508051906020019080838360005b8381101561222b578082015181840152602081019050612210565b50505050905090810190601f1680156122585780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050505050565b61227783836124e1565b151561228257600080fd5b60018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508260020180548060010182816122f29190612536565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060018360020180549050038360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f571925c699f9072cec76b6c6c000571cc8d0bb5c47e5819202e2e9496c6508b5826040518080602001828103825283818151815260200191508051906020019080838360005b8381101561240a5780820151818401526020810190506123ef565b50505050905090810190601f1680156124375780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b6124516124f6565b816002018054806020026020016040519081016040528092919081815260200182805480156124d557602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161248b575b50505050509050919050565b60006124ed8383611f1e565b15905092915050565b602060405190810160405280600081525090565b815481835581811511612531578183600052602060002091820191016125309190612562565b5b505050565b81548183558181151161255d5781836000526020600020918201910161255c9190612562565b5b505050565b61258491905b80821115612580576000816000905550600101612568565b5090565b905600a165627a7a72305820174fc2db41de3309c96220bced24b21e31ba65315015272c9874182b9cf3b6d60029", + "deployedBytecode": "0x606060405260043610610107576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632e667c4e1461010c5780632f866f731461019a578063399f120f146101ef5780633f4ba83a1461029057806344c4ea95146102a55780635c975abb146102cc57806361a52a36146102f9578063649404bd14610322578063656e903b146103805780636f16f14a146103e75780638456cb591461043c5780638da5cb5b146104515780639ae1c1f3146104a65780639d23c4c7146104df578063ae72c6ef14610534578063ca0626471461056d578063ed8e52bd146105ba578063f2fde38b146105e1578063f466f42e1461061a575b600080fd5b341561011757600080fd5b61011f610684565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561015f578082015181840152602081019050610144565b50505050905090810190601f16801561018c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101a557600080fd5b6101ad6106bd565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101fa57600080fd5b6102146004808035600019169060200190919050506106e3565b604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390f35b341561029b57600080fd5b6102a3610946565b005b34156102b057600080fd5b6102ca600480803560001916906020019091905050610a04565b005b34156102d757600080fd5b6102df611062565b604051808215151515815260200191505060405180910390f35b341561030457600080fd5b61030c611075565b6040518082815260200191505060405180910390f35b341561032d57600080fd5b61036660048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061107c565b604051808215151515815260200191505060405180910390f35b341561038b57600080fd5b6103a5600480803560001916906020019091905050611435565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103f257600080fd5b6103fa611468565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561044757600080fd5b61044f61148e565b005b341561045c57600080fd5b61046461154e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104b157600080fd5b6104dd600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611573565b005b34156104ea57600080fd5b6104f261161c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561053f57600080fd5b61056b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611642565b005b341561057857600080fd5b6105926004808035600019169060200190919050506116eb565b6040518084151515158152602001838152602001828152602001935050505060405180910390f35b34156105c557600080fd5b6105df60048080356000191690602001909190505061176e565b005b34156105ec57600080fd5b610618600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611db2565b005b341561062557600080fd5b61062d611f07565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610670578082015181840152602081019050610655565b505050509050019250505060405180910390f35b6040805190810160405280601481526020017f455243373231436f6c6c61746572616c697a657200000000000000000000000081525081565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000806000806000806000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636be39bda8d6000604051604001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082600019166000191681526020019150506040805180830381600087803b151561079457600080fd5b6102c65a03f115156107a557600080fd5b5050506040518051906020018051905080985081995050506107c6876116eb565b809650819750829850505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635715c5b7866000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561086b57600080fd5b6102c65a03f1151561087c57600080fd5b505050604051805190509150819050851561092a578073ffffffffffffffffffffffffffffffffffffffff16634f6ccce7856000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561090857600080fd5b6102c65a03f1151561091957600080fd5b50505060405180519050925061092e565b8392505b8183899a509a509a5050505050505050509193909250565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156109a157600080fd5b600060149054906101000a900460ff1615156109bc57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b60008060008060008060149054906101000a900460ff16151515610a2757600080fd5b610a30866106e3565b809550819650829750505050600073ffffffffffffffffffffffffffffffffffffffff1660046000886000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515610ab357600080fd5b60046000876000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915060046000876000191660001916815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690558273ffffffffffffffffffffffffffffffffffffffff166303a896a1876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610bae57600080fd5b6102c65a03f11515610bbf57600080fd5b505050604051805190508373ffffffffffffffffffffffffffffffffffffffff166399114d84888673ffffffffffffffffffffffffffffffffffffffff16632762dd8c8b6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610c6557600080fd5b6102c65a03f11515610c7657600080fd5b505050604051805190506000604051602001526040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050602060405180830381600087803b1515610ce957600080fd5b6102c65a03f11515610cfa57600080fd5b5050506040518051905011151515610d1157600080fd5b8490508473ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610e21578073ffffffffffffffffffffffffffffffffffffffff1663095ea7b330866040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1515610e0c57600080fd5b6102c65a03f11515610e1d57600080fd5b5050505b8073ffffffffffffffffffffffffffffffffffffffff166323b872dd3084876040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1515610ef757600080fd5b6102c65a03f11515610f0857600080fd5b5050508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e866000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515610f9957600080fd5b6102c65a03f11515610faa57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16141515610fd357fe5b8173ffffffffffffffffffffffffffffffffffffffff1686600019167f2621540e2b91ca10330d6a7cbd6fb8cab2396f91c4935ad76b1183770819fa1f8787604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a3505050505050565b600060149054906101000a900460ff1681565b6201518081565b600080600080600080611099336005611f1e90919063ffffffff16565b15156110a457600080fd5b600060149054906101000a900460ff161515156110c057600080fd5b6110c9886106e3565b8095508196508297505050503373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151561110f57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415151561114b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600460008a6000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156111c157600080fd5b86600460008a6000191660001916815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508491503090508173ffffffffffffffffffffffffffffffffffffffff166323b872dd8883876040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b15156112f757600080fd5b6102c65a03f1151561130857600080fd5b5050508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16636352211e866000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561139957600080fd5b6102c65a03f115156113aa57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff161415156113d357fe5b8473ffffffffffffffffffffffffffffffffffffffff1688600019167f38f12634ebefbe7f6767652aae05e220f95e0ca8ef8353c9c9c5ae439a592aec866040518082815260200191505060405180910390a360019550505050505092915050565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156114e957600080fd5b600060149054906101000a900460ff1615151561150557600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156115ce57600080fd5b611619816040805190810160405280601481526020017f455243373231436f6c6c61746572616c697a65720000000000000000000000008152506005611f779092919063ffffffff16565b50565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561169d57600080fd5b6116e8816040805190810160405280601481526020017f455243373231436f6c6c61746572616c697a6572000000000000000000000000815250600561226d9092919063ffffffff16565b50565b60008060008060008060008060018002891694506d0ffffffffffff00000000000000060010289169350670ffffffffffffff060010289169250671000000000000000846001900481151561173c57fe5b0491506010836001900481151561174f57fe5b0490506001856001900414828297509750975050505050509193909250565b60008060008060008060149054906101000a900460ff1615151561179157600080fd5b61179a866106e3565b809550819650829750505050600073ffffffffffffffffffffffffffffffffffffffff1660046000886000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561181d57600080fd5b60046000876000191660001916815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690558273ffffffffffffffffffffffffffffffffffffffff166303a896a1876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156118da57600080fd5b6102c65a03f115156118eb57600080fd5b505050604051805190508373ffffffffffffffffffffffffffffffffffffffff166399114d8488426000604051602001526040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050602060405180830381600087803b151561197c57600080fd5b6102c65a03f1151561198d57600080fd5b505050604051805190501115156119a357600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ba20dda4876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515611a4457600080fd5b6102c65a03f11515611a5557600080fd5b5050506040518051905091508490508473ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611b71578073ffffffffffffffffffffffffffffffffffffffff1663095ea7b330866040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1515611b5c57600080fd5b6102c65a03f11515611b6d57600080fd5b5050505b8073ffffffffffffffffffffffffffffffffffffffff166323b872dd3084876040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1515611c4757600080fd5b6102c65a03f11515611c5857600080fd5b5050508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e866000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515611ce957600080fd5b6102c65a03f11515611cfa57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16141515611d2357fe5b8173ffffffffffffffffffffffffffffffffffffffff1686600019167f50d195a4b80a950617a8e0e18ac9dd4c0236ac72d5e12355d881443823870d398787604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a3505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611e0d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611e4957600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611f0f6124f6565b611f196005612449565b905090565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000806000611f868686611f1e565b1515611f9157600080fd5b8560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600186600201805490500391508560020182815481101515611ff357fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff021916905580866002018481548110151561208457fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055856002018281548110151561216957fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600186600201818180549050039150816121b1919061250a565b508473ffffffffffffffffffffffffffffffffffffffff167f0814e4ee85854cea446b4a27a460e5ffb41516230dbc02f226c07907e432241c856040518080602001828103825283818151815260200191508051906020019080838360005b8381101561222b578082015181840152602081019050612210565b50505050905090810190601f1680156122585780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050505050565b61227783836124e1565b151561228257600080fd5b60018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508260020180548060010182816122f29190612536565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060018360020180549050038360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f571925c699f9072cec76b6c6c000571cc8d0bb5c47e5819202e2e9496c6508b5826040518080602001828103825283818151815260200191508051906020019080838360005b8381101561240a5780820151818401526020810190506123ef565b50505050905090810190601f1680156124375780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b6124516124f6565b816002018054806020026020016040519081016040528092919081815260200182805480156124d557602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161248b575b50505050509050919050565b60006124ed8383611f1e565b15905092915050565b602060405190810160405280600081525090565b815481835581811511612531578183600052602060002091820191016125309190612562565b5b505050565b81548183558181151161255d5781836000526020600020918201910161255c9190612562565b5b505050565b61258491905b80821115612580576000816000905550600101612568565b5090565b905600a165627a7a72305820174fc2db41de3309c96220bced24b21e31ba65315015272c9874182b9cf3b6d60029", "sourceMap": "1353:14629:7:-;;;268:5:37;247:26;;;;;;;;;;;;;;;;;;;;2885:620:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3045:33;509:10:39;501:5;;:18;;;;;;;;;;;;;;;;;;3098:17:7;3045:71;;3210:16;:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3195:12;;:46;;;;;;;;;;;;;;;;;;3348:14;3312:13;;:51;;;;;;;;;;;;;;;;;;3476:22;3452:21;;:46;;;;;;;;;;;;;;;;;;2885:620;;;;1353:14629;;;;;;", "deployedSourceMap": "1353:14629:7:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2091:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1506:32:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14227:1753;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;833:87:37;;;;;;;;;;;;;;6098:2355:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;247:26:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2034:50:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3748:2091;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1904:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1779:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;666:85:37;;;;;;;;;;;;;;238:20:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11482:175:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;1544:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11188:164;;;;;;;;;;;;;;;;;;;;;;;;;;;;12101:1816;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8713:2350;;;;;;;;;;;;;;;;;;;;;;;;;;;;;832:169:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;11762:178:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;2091:55:7;;;;;;;;;;;;;;;;;;;;:::o;1506:32::-;;;;;;;;;;;;;:::o;14227:1753::-;14344:31;14389:26;14429:28;14482;14520:31;14737:17;14764:28;14802:26;14838:22;15242:30;15346:18;14692:12;;;;;;;;;;;:21;;;14714:11;14692:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14642:84;;;;;;;;15075:60;15111:23;15075:35;:60::i;:::-;14966:169;;;;;;;;;;;;15275:13;;;;;;;;;;;:36;;;15312:23;15275:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15242:94;;15374:22;15346:51;;15658:12;15654:176;;;15706:11;:24;;;15731:18;15706:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15686:64;;15654:176;;;15801:18;15781:38;;15654:176;15861:22;15897:17;15942:20;15840:133;;;;;;14227:1753;;;;;;;;;;;;;:::o;833:87:37:-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;568:6:37;;;;;;;;;;;560:15;;;;;;;;895:5;886:6;;:14;;;;;;;;;;;;;;;;;;906:9;;;;;;;;;;833:87::o;6098:2355:7:-;6257:30;6386:25;6506:27;7110:14;7693:18;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;6711:41:7;6740:11;6711:28;:41::i;:::-;6604:148;;;;;;;;;;;;7049:1;7007:44;;:17;:30;7025:11;7007:30;;;;;;;;;;;;;;;;;;;;;;;;;;;:44;;;;6999:53;;;;;;;;7127:17;:30;7145:11;7127:30;;;;;;;;;;;;;;;;;;;;;;;;;;;7110:47;;7269:17;:30;7287:11;7269:30;;;;;;;;;;;;;;;;;;7262:37;;;;;;;;;;;7543:13;:34;;;7578:11;7543:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7393:13;:39;;;7450:11;7479:13;:33;;;7513:11;7479:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7393:146;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:197;;7372:228;;;;;;;;7721:22;7693:51;;7879:22;7854:47;;:21;;;;;;;;;;;:47;;;7850:131;;;7917:11;:19;;;7945:4;7952:17;7917:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7850:131;8082:11;:24;;;8115:4;8122:6;8130:17;8082:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8255:6;8213:48;;:11;:19;;;8233:17;8213:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:48;;;8206:56;;;;;;8363:6;8306:140;;8338:11;8306:140;;;;8383:22;8419:17;8306:140;;;;;;;;;;;;;;;;;;;;;;;;;;;;6098:2355;;;;;;:::o;247:26:37:-;;;;;;;;;;;;;:::o;2034:50:7:-;2072:12;2034:50;:::o;3748:2091::-;3922:13;3998:30;4127:25;4247:27;5295:18;5356:17;2807:53;2849:10;2807:28;:41;;:53;;;;:::i;:::-;2799:62;;;;;;;;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;4451:41:7;4480:11;4451:28;:41::i;:::-;4344:148;;;;;;;;;;;;4528:10;4511:27;;:13;:27;;;4503:36;;;;;;;;4591:1;4557:36;;:22;:36;;;;4549:45;;;;;;;;5129:1;5087:44;;:17;:30;5105:11;5087:30;;;;;;;;;;;;;;;;;;;;;;;;;;;:44;;;5079:53;;;;;;;;5278:6;5245:17;:30;5263:11;5245:30;;;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;5323:22;5295:51;;5384:4;5356:33;;5459:11;:24;;;5484:6;5492:9;5503:17;5459:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5658:9;5616:51;;:11;:19;;;5636:17;5616:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:51;;;5609:59;;;;;;5768:22;5738:72;;5755:11;5738:72;;;;5792:17;5738:72;;;;;;;;;;;;;;;;;;5828:4;5821:11;;3748:2091;;;;;;;;;:::o;1904:52::-;;;;;;;;;;;;;;;;;;;;;;:::o;1779:36::-;;;;;;;;;;;;;:::o;666:85:37:-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;729:4;720:6;;:13;;;;;;;;;;;;;;;;;;739:7;;;;;;;;;;666:85::o;238:20:39:-;;;;;;;;;;;;;:::o;11482:175:7:-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;11586:64:7;11635:5;11642:7;;;;;;;;;;;;;;;;;;11586:28;:48;;:64;;;;;:::i;:::-;11482:175;:::o;1544:40::-;;;;;;;;;;;;;:::o;11188:164::-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;11291:54:7;11330:5;11337:7;;;;;;;;;;;;;;;;;;11291:28;:38;;:54;;;;;:::i;:::-;11188:164;:::o;12101:1816::-;12211:4;12217;12223;12478:20;12853:38;13307:23;13501:28;13641:13;12526:66;12513:79;;:10;:79;12478:114;;12919:66;12906:79;;:10;:79;12853:132;;13358:66;13345:79;;:10;:79;13307:117;;13571:7;13537:30;13532:36;;;:46;;;;;;;;13501:77;;13681:6;13662:15;13657:21;;;:30;;;;;;;;13641:46;;13840:1;13823:12;13818:18;;;:23;13855;13892:8;13698:212;;;;;;12101:1816;;;;;;;;;;:::o;8713:2350::-;8872:30;9001:25;9121:27;10138:19;10293:18;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;9326:41:7;9355:11;9326:28;:41::i;:::-;9219:148;;;;;;;;;;;;9661:1;9619:44;;:17;:30;9637:11;9619:30;;;;;;;;;;;;;;;;;;;;;;;;;;;:44;;;;9611:53;;;;;;;;9776:17;:30;9794:11;9776:30;;;;;;;;;;;;;;;;;;9769:37;;;;;;;;;;;10005:13;:34;;;10040:11;10005:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9887:13;:39;;;9944:11;9973:15;9887:115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:165;9866:196;;;;;;;;10160:12;;;;;;;;;;;:27;;;10188:11;10160:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10138:62;;10321:22;10293:51;;10479:22;10454:47;;:21;;;;;;;;;;;:47;;;10450:131;;;10517:11;:19;;;10545:4;10552:17;10517:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10450:131;10678:11;:24;;;10711:4;10718:11;10731:17;10678:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10856:11;10814:53;;:11;:19;;;10834:17;10814:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:53;;;10807:61;;;;;;10968:11;10913:143;;10943:11;10913:143;;;;10993:22;11029:17;10913:143;;;;;;;;;;;;;;;;;;;;;;;;;;;;8713:2350;;;;;;:::o;832:169:39:-;653:5;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;928:1;908:22;;:8;:22;;;;900:31;;;;;;;;965:8;937:37;;958:5;;;;;;;;;;;937:37;;;;;;;;;;;;988:8;980:5;;:16;;;;;;;;;;;;;;;;;;832:169;:::o;11762:178:7:-;11851:9;;:::i;:::-;11883:50;:28;:48;:50::i;:::-;11876:57;;11762:178;:::o;3295:166:17:-;3405:4;3432;:15;;:22;3448:5;3432:22;;;;;;;;;;;;;;;;;;;;;;;;;3425:29;;3295:166;;;;:::o;2121:1168::-;2489:25;2551:23;2619:19;2452:25;2465:4;2471:5;2452:12;:25::i;:::-;2444:34;;;;;;;;2517:4;:17;;:24;2535:5;2517:24;;;;;;;;;;;;;;;;2489:52;;2608:1;2577:4;:21;;:28;;;;:32;2551:58;;2641:4;:21;;2663:18;2641:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;2619:63;;2745:4;:15;;:22;2761:5;2745:22;;;;;;;;;;;;;;;;2738:29;;;;;;;;;;;2894:11;2848:4;:21;;2870:20;2848:43;;;;;;;;;;;;;;;;;;;:57;;;;;;;;;;;;;;;;;;3009:20;2976:4;:17;;:30;2994:11;2976:30;;;;;;;;;;;;;;;:53;;;;3046:4;:17;;:24;3064:5;3046:24;;;;;;;;;;;;;;;3039:31;;;3144:4;:21;;3166:18;3144:41;;;;;;;;;;;;;;;;;;;3137:48;;;;;;;;;;;3227:1;3195:4;:21;;:33;;;;;;;;;;;;;;:::i;:::-;;3260:5;3239:43;;;3267:14;3239:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2121:1168:17;;;;;;:::o;1732:383::-;1884:28;1900:4;1906:5;1884:15;:28::i;:::-;1876:37;;;;;;;;1949:4;1924;:15;;:22;1940:5;1924:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;1963:4;:21;;:33;;;;;;;;;;;:::i;:::-;;;;;;;;;;1990:5;1963:33;;;;;;;;;;;;;;;;;;;;;;;2064:1;2033:4;:21;;:28;;;;:32;2006:4;:17;;:24;2024:5;2006:24;;;;;;;;;;;;;;;:59;;;;2086:5;2075:33;;;2093:14;2075:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1732:383:17;;;:::o;3646:162::-;3748:9;;:::i;:::-;3780:4;:21;;3773:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3646:162;;;:::o;3467:173::-;3580:4;3608:25;3621:4;3627:5;3608:12;:25::i;:::-;3607:26;3600:33;;3467:173;;;;:::o;1353:14629:7:-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\nimport \"zeppelin-solidity/contracts/math/SafeMath.sol\";\nimport \"zeppelin-solidity/contracts/token/ERC721/ERC721.sol\";\n\nimport \"./TermsContract.sol\";\nimport \"./DebtRegistry.sol\";\nimport \"./ContractRegistry.sol\";\nimport \"./ERC721TokenRegistry.sol\";\n\nimport {PermissionsLib, PermissionEvents} from \"./libraries/PermissionsLib.sol\";\n\n\n/**\n * Contains functionality for collateralizing NFTs, including a `collateralize` method for\n * transferring a debtor's asset to this contract, as well as methods for returning\n * or seizing collateral depending on the state of the underlying debt agreement.\n *\n * NOTE: The `collateralize` method in this contract can only be called by a trusted TermsContract,\n * specified by the contract's owner.\n */\ncontract ERC721Collateralizer is Pausable, PermissionEvents {\n using PermissionsLib for PermissionsLib.Permissions;\n using SafeMath for uint;\n\n DebtRegistry public debtRegistry;\n ERC721TokenRegistry public tokenRegistry;\n\n // We store the address of the CryptoKitties contract, in order to work around a minor issue\n // relating to transfers, since its contract does not comply with the ERC721 standard.\n address public cryptoKittiesContract;\n\n // Debtor here refers to the owner of the asset that is being collateralized.\n mapping(bytes32 => address) public agreementToDebtor;\n\n PermissionsLib.Permissions internal collateralizationPermissions;\n\n uint public constant SECONDS_IN_DAY = 24 * 60 * 60;\n\n string public constant CONTEXT = \"ERC721Collateralizer\";\n\n event CollateralLocked(\n bytes32 indexed agreementID,\n // The address of the ERC721 contract for the token.\n address indexed erc721Contract,\n // The id of the token associated with the ERC721 contract.\n uint256 tokenID\n );\n\n event CollateralReturned(\n bytes32 indexed agreementID,\n address indexed debtor,\n address erc721Contract,\n uint256 tokenID\n );\n\n event CollateralSeized(\n bytes32 indexed agreementID,\n address indexed beneficiary,\n address erc721Contract,\n uint256 tokenID\n );\n\n modifier onlyAuthorizedToCollateralize() {\n require(collateralizationPermissions.isAuthorized(msg.sender));\n _;\n }\n\n function ERC721Collateralizer(\n address _contractRegistry,\n address _tokenRegistry,\n address _cryptoKittiesContract\n ) public {\n ContractRegistry contractRegistry = ContractRegistry(_contractRegistry);\n\n // Get the DebtRegistry contract from the ContractRegistry.\n debtRegistry = contractRegistry.debtRegistry();\n // Instantiate a special token registry for ERC721s.\n tokenRegistry = ERC721TokenRegistry(_tokenRegistry);\n // Keep track of the CryptoKitties contract, for specific workarounds.\n cryptoKittiesContract = _cryptoKittiesContract;\n }\n\n /**\n * Transfers collateral from the debtor to the current contract, as custodian.\n *\n * @param agreementId bytes32 The debt agreement's ID\n * @param debtor address The owner of the asset being collateralized\n */\n function collateralize(\n bytes32 agreementId,\n address debtor\n )\n public\n onlyAuthorizedToCollateralize\n whenNotPaused\n returns (bool _success)\n {\n // The address of the ERC721 contract.\n address collateralTokenAddress;\n // The token id, associating the collateral token and the given ERC721 contract.\n uint256 collateralTokenID;\n // The terms contract according to which this asset is being collateralized.\n TermsContract termsContract;\n\n // Fetch all relevant collateralization parameters\n (\n collateralTokenAddress,\n collateralTokenID,\n termsContract\n ) = retrieveCollateralParameters(agreementId);\n\n require(termsContract == msg.sender);\n require(collateralTokenAddress != address(0));\n\n /*\n Ensure that the agreement has not already been collateralized.\n\n If the agreement has already been collateralized, this check will fail\n because any valid collateralization must have some sort of valid\n address associated with it as a debtor. Given that it is impossible\n to send transactions from address 0x0, this check will only fail\n when the agreement is already collateralized.\n */\n require(agreementToDebtor[agreementId] == address(0));\n\n // Store debtor in mapping, effectively demarcating that the agreement is now collateralized.\n agreementToDebtor[agreementId] = debtor;\n\n ERC721 erc721token = ERC721(collateralTokenAddress);\n address custodian = address(this);\n\n // Transfer the collateral asset to this contract.\n erc721token.transferFrom(debtor, custodian, collateralTokenID);\n\n // Ensure that this contract is in fact the owner of the collateral.\n assert(erc721token.ownerOf(collateralTokenID) == custodian);\n\n // Emit an event that collateral has been secured.\n CollateralLocked(agreementId, collateralTokenAddress, collateralTokenID);\n\n return true;\n }\n\n /**\n * Returns collateral to the debt agreement's debtor if and only if the debt agreement's\n * term has lapsed and the total expected repayment value has been repaid.\n *\n * @param agreementId bytes32 The debt agreement's ID\n */\n function returnCollateral(\n bytes32 agreementId\n )\n public\n whenNotPaused\n {\n // The address of the ERC721 contract.\n address collateralTokenAddress;\n // The token id, associating the collateral token and the given ERC721 contract.\n uint256 collateralTokenID;\n // The terms contract according to which this asset is being collateralized.\n TermsContract termsContract;\n\n // Fetch all relevant collateralization parameters.\n (\n collateralTokenAddress,\n collateralTokenID,\n termsContract\n ) = retrieveCollateralParameters(agreementId);\n\n // Withdrawal can only occur if the collateral has yet to be withdrawn.\n // When we withdraw collateral, we reset the collateral agreement\n // in a gas-efficient manner by resetting the address of the debtor to 0.\n require(agreementToDebtor[agreementId] != address(0));\n\n // Determine debtor of the collateral.\n address debtor = agreementToDebtor[agreementId];\n\n // Mark agreement's collateral as withdrawn by setting the agreement's debtor to 0x0.\n delete agreementToDebtor[agreementId];\n\n // Ensure that the debt is not in a state of default.\n require(\n termsContract.getExpectedRepaymentValue(\n agreementId,\n termsContract.getTermEndTimestamp(agreementId)\n ) <= termsContract.getValueRepaidToDate(agreementId)\n );\n\n // Instantiate an instance of the token, in order to initiate a transfer.\n ERC721 erc721token = ERC721(collateralTokenAddress);\n\n // Apply a hack for CryptoKitties, granting transfer approval to this contract itself.\n if (cryptoKittiesContract == collateralTokenAddress) {\n erc721token.approve(address(this), collateralTokenID);\n }\n\n // Transfer the collateral this contract was holding in escrow back to the debtor.\n erc721token.transferFrom(address(this), debtor, collateralTokenID);\n\n // Ensure that transfer has succeeded.\n assert(erc721token.ownerOf(collateralTokenID) == debtor);\n\n // Log the return event.\n CollateralReturned(\n agreementId,\n debtor,\n collateralTokenAddress,\n collateralTokenID\n );\n }\n\n /**\n * Seizes the collateral from the given debt agreement and\n * transfers it to the debt agreement's current beneficiary\n * (i.e. the person who \"owns\" the debt).\n *\n * @param agreementId bytes32 The debt agreement's ID\n */\n function seizeCollateral(\n bytes32 agreementId\n )\n public\n whenNotPaused\n {\n\n // The address of the ERC721 contract.\n address collateralTokenAddress;\n // The token id, associating the collateral token and the given ERC721 contract.\n uint256 collateralTokenID;\n // The terms contract according to which this asset is being collateralized.\n TermsContract termsContract;\n\n // Fetch all relevant collateralization parameters.\n (\n collateralTokenAddress,\n collateralTokenID,\n termsContract\n ) = retrieveCollateralParameters(agreementId);\n\n // Seizure can only occur if the collateral has yet to be withdrawn.\n // When we withdraw collateral, we reset the collateral agreement\n // in a gas-efficient manner by resetting the address of the debtor to 0.\n require(agreementToDebtor[agreementId] != address(0));\n\n // Mark agreement's collateral as withdrawn by setting the agreement's debtor to 0x0.\n delete agreementToDebtor[agreementId];\n\n // Ensure debt is in a state of default.\n require(\n termsContract.getExpectedRepaymentValue(\n agreementId,\n block.timestamp\n ) > termsContract.getValueRepaidToDate(agreementId)\n );\n\n // Determine beneficiary of the collateral to be seized.\n address beneficiary = debtRegistry.getBeneficiary(agreementId);\n\n // Instantiate an instance of the token, in order to initiate a transfer.\n ERC721 erc721token = ERC721(collateralTokenAddress);\n\n // Apply a hack for CryptoKitties, granting transfer approval to this contract itself.\n if (cryptoKittiesContract == collateralTokenAddress) {\n erc721token.approve(address(this), collateralTokenID);\n }\n\n // Transfer the collateral this contract was holding in escrow to beneficiary.\n erc721token.transferFrom(address(this), beneficiary, collateralTokenID);\n\n // Ensure that transfer has succeeded.\n assert(erc721token.ownerOf(collateralTokenID) == beneficiary);\n\n // Log the seizure event.\n CollateralSeized(\n agreementId,\n beneficiary,\n collateralTokenAddress,\n collateralTokenID\n );\n }\n\n /**\n * Adds an address to the list of agents authorized\n * to invoke the `collateralize` function.\n */\n function addAuthorizedCollateralizeAgent(address agent)\n public\n onlyOwner\n {\n collateralizationPermissions.authorize(agent, CONTEXT);\n }\n\n /**\n * Removes an address from the list of agents authorized\n * to invoke the `collateralize` function.\n */\n function revokeCollateralizeAuthorization(address agent)\n public\n onlyOwner\n {\n collateralizationPermissions.revokeAuthorization(agent, CONTEXT);\n }\n\n /**\n * Returns the list of agents authorized to invoke the 'collateralize' function.\n */\n function getAuthorizedCollateralizeAgents()\n public\n view\n returns (address[])\n {\n return collateralizationPermissions.getAuthorizedAgents();\n }\n\n /**\n * Unpacks collateralization-specific parameters from their tightly-packed\n * representation in a terms contract parameter string.\n */\n function unpackCollateralParametersFromBytes(bytes32 parameters)\n public\n pure\n returns (bool, uint, uint)\n {\n // We use use a flag, 0 or 1, to specify whether the given collateral token's contract\n // implements the Enumerable extension. If so, we can refer to a token by its index instead\n // of its ID to conserve space.\n bytes32 isEnumerable =\n parameters & 0x0000000000000000000000000000000000000000000000000000000000000001;\n // Here we get the index of the ERC721 contract within the ERC721TokenRegistry.\n // In its raw form it will be \"shifted\" 15 characters to the left (I.E. it has 15 \"0\"s after\n // the actual value), so we still need to unshift it.\n bytes32 collateralContractIndexShifted =\n parameters & 0x0000000000000000000000000000000000000ffffffffffff000000000000000;\n // We get the id or index of the ERC721 token associated with the ERC721 contract.\n // To retrieve this token reference, we take only the value of the specific\n // parameters that encode it, and then shift that value 1 place to the right - thereby\n // ignoring all other parameters.\n bytes32 tokenRefShifted =\n parameters & 0x0000000000000000000000000000000000000000000000000ffffffffffffff0;\n\n // Shift the contract index value 15 places to the right.\n uint collateralContractIndex = uint(collateralContractIndexShifted) / 2 ** 60;\n // Shift the token ref 1 space to the right.\n uint tokenRef = uint(tokenRefShifted) / 2 ** 4;\n\n return (\n // Since we want to return a boolean, we return whether or not the flag is equal to 1.\n uint(isEnumerable) == 1,\n collateralContractIndex,\n tokenRef\n );\n }\n\n /**\n * Unpacks the terms contract parameters, and uses those parameters to retrieve specific\n * values that are pertinent to this collateralizer contract -- such as the address of the\n * collateral token and the token's ID, which are not encoded in the terms contract parameters.\n */\n function retrieveCollateralParameters(bytes32 agreementId)\n public\n view\n returns (\n address _collateralTokenAddress,\n uint256 _collateralTokenID,\n TermsContract _termsContract\n )\n {\n address termsContractAddress;\n bytes32 termsContractParameters;\n\n // Pull the terms contract and associated parameters for the agreement.\n (termsContractAddress, termsContractParameters) = debtRegistry.getTerms(agreementId);\n\n bool isEnumerable;\n uint collateralContractIndex;\n uint256 collateralTokenRef;\n uint collateralTokenID;\n\n // Unpack terms contract parameters in order to get collateralization-specific params.\n (\n isEnumerable,\n collateralContractIndex,\n collateralTokenRef,\n ) = unpackCollateralParametersFromBytes(termsContractParameters);\n\n // Resolve address of ERC721 contract associated with this agreement in token registry.\n address collateralTokenAddress = tokenRegistry.getTokenAddressByIndex(collateralContractIndex);\n ERC721 erc721token = ERC721(collateralTokenAddress);\n\n // If the contract implements the Enumerable extension, then we can use the token reference\n // parameters as an index to the token. Otherwise, we assume that the token reference parameter\n // refers to the token id itself.\n if (isEnumerable) {\n collateralTokenID = erc721token.tokenByIndex(collateralTokenRef);\n } else {\n collateralTokenID = collateralTokenRef;\n }\n\n return (\n collateralTokenAddress,\n collateralTokenID,\n TermsContract(termsContractAddress)\n );\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/ERC721Collateralizer.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/ERC721Collateralizer.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/ERC721Collateralizer.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/ERC721Collateralizer.sol", "exportedSymbols": { "ERC721Collateralizer": [ 4166 @@ -517,7 +517,7 @@ { "attributes": { "SourceUnit": 4758, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/TermsContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/TermsContract.sol", "file": "./TermsContract.sol", "scope": 4167, "symbolAliases": [ @@ -532,7 +532,7 @@ { "attributes": { "SourceUnit": 3159, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/DebtRegistry.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/DebtRegistry.sol", "file": "./DebtRegistry.sol", "scope": 4167, "symbolAliases": [ @@ -547,7 +547,7 @@ { "attributes": { "SourceUnit": 924, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/ContractRegistry.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/ContractRegistry.sol", "file": "./ContractRegistry.sol", "scope": 4167, "symbolAliases": [ @@ -562,7 +562,7 @@ { "attributes": { "SourceUnit": 4458, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/ERC721TokenRegistry.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/ERC721TokenRegistry.sol", "file": "./ERC721TokenRegistry.sol", "scope": 4167, "symbolAliases": [ @@ -577,7 +577,7 @@ { "attributes": { "SourceUnit": 6272, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/libraries/PermissionsLib.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/libraries/PermissionsLib.sol", "file": "./libraries/PermissionsLib.sol", "scope": 4167, "symbolAliases": [ @@ -9498,7 +9498,7 @@ } }, "links": {}, - "address": "0xc241691f9c1663b4452c3d867de6cb72ce4ccb4b" + "address": "0xf3abfc01a071e8bbf3f820c2629510b9bc5e3229" }, "70": { "events": { @@ -9647,5 +9647,5 @@ } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:16:13.736Z" + "updatedAt": "2018-10-09T17:53:04.896Z" } \ No newline at end of file diff --git a/artifacts/json/ERC721Enumerable.json b/artifacts/json/ERC721Enumerable.json index 5a69c450..9fba69dd 100644 --- a/artifacts/json/ERC721Enumerable.json +++ b/artifacts/json/ERC721Enumerable.json @@ -1063,5 +1063,5 @@ }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:48.050Z" + "updatedAt": "2018-10-09T17:45:35.440Z" } \ No newline at end of file diff --git a/artifacts/json/ERC721Metadata.json b/artifacts/json/ERC721Metadata.json index 3d39811e..439e8995 100644 --- a/artifacts/json/ERC721Metadata.json +++ b/artifacts/json/ERC721Metadata.json @@ -1054,5 +1054,5 @@ }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:48.050Z" + "updatedAt": "2018-10-09T17:45:35.441Z" } \ No newline at end of file diff --git a/artifacts/json/ERC721Receiver.json b/artifacts/json/ERC721Receiver.json index f0ed3fea..a4199fbe 100644 --- a/artifacts/json/ERC721Receiver.json +++ b/artifacts/json/ERC721Receiver.json @@ -274,5 +274,5 @@ }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:48.053Z" + "updatedAt": "2018-10-09T17:45:35.427Z" } \ No newline at end of file diff --git a/artifacts/json/ERC721Token.json b/artifacts/json/ERC721Token.json index 7a6f7a1e..421b73fc 100644 --- a/artifacts/json/ERC721Token.json +++ b/artifacts/json/ERC721Token.json @@ -5399,7 +5399,7 @@ "42": { "events": {}, "links": {}, - "address": "0x29fbda47ddc8b9853a0cf9bf0abf4611ff5f3abe" + "address": "0xebc1a917d464d779ad5eba480de9935bf4ce9760" }, "70": { "events": {}, @@ -5408,5 +5408,5 @@ } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:13:01.017Z" + "updatedAt": "2018-10-09T17:50:01.301Z" } \ No newline at end of file diff --git a/artifacts/json/ERC721TokenRegistry.json b/artifacts/json/ERC721TokenRegistry.json index 5047e214..06fcf189 100644 --- a/artifacts/json/ERC721TokenRegistry.json +++ b/artifacts/json/ERC721TokenRegistry.json @@ -297,15 +297,15 @@ "type": "event" } ], - "bytecode": "0x6060604052336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061190b806100536000396000f3006060604052600436106100d0576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680631e71f8d1146100d55780632e1e1bb3146102105780633550b6d9146102815780633dbe284a1461031e5780635715c5b7146104155780636e7cbb0d146104785780638052348b146105145780638da5cb5b1461062457806395f121bf14610679578063bd7b564d14610715578063c0d0b6ff146107eb578063c51ccb40146108aa578063f2fde38b146108df578063fa7f369714610918575b600080fd5b34156100e057600080fd5b6100f660048080359060200190919050506109b4565b604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018060200180602001838103835285818151815260200191508051906020019080838360005b8381101561016c578082015181840152602081019050610151565b50505050905090810190601f1680156101995780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b838110156101d25780820151818401526020810190506101b7565b50505050905090810190601f1680156101ff5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b341561021b57600080fd5b61026b600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610b34565b6040518082815260200191505060405180910390f35b341561028c57600080fd5b6102dc600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610bc9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561032957600080fd5b610343600480803560001916906020019091905050610c7e565b604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001806020018281038252838181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156104045780601f106103d957610100808354040283529160200191610404565b820191906000526020600020905b8154815290600101906020018083116103e757829003601f168201915b505094505050505060405180910390f35b341561042057600080fd5b6104366004808035906020019091905050610cc7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561048357600080fd5b6104996004808035906020019091905050610d89565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104d95780820151818401526020810190506104be565b50505050905090810190601f1680156105065780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561051f57600080fd5b61056f600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610e44565b604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156105e75780820151818401526020810190506105cc565b50505050905090810190601f1680156106145780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b341561062f57600080fd5b610637610fad565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561068457600080fd5b61069a6004808035906020019091905050610fd2565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156106da5780820151818401526020810190506106bf565b50505050905090810190601f1680156107075780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561072057600080fd5b610770600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611087565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156107b0578082015181840152602081019050610795565b50505050905090810190601f1680156107dd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156107f657600080fd5b6108a8600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506111ba565b005b34156108b557600080fd5b6108bd6115ad565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b34156108ea57600080fd5b610916600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506115c7565b005b341561092357600080fd5b610939600480803590602001909190505061171c565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561097957808201518184015260208101905061095e565b50505050905090810190601f1680156109a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b60006109be611754565b6109c6611754565b6109ce611754565b6000806109da87610d89565b9250826040518082805190602001908083835b602083101515610a1257805182526020820191506020810190506020830392506109ed565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168382600201808054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610b1d5780601f10610af257610100808354040283529160200191610b1d565b820191906000526020600020905b815481529060010190602001808311610b0057829003601f168201915b505050505090509550955095505050509193909250565b6000806000836040518082805190602001908083835b602083101515610b6f5780518252602082019150602081019050602083039250610b4a565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902091506001600083600019166000191681526020019081526020016000209050806001015492505050919050565b6000806000836040518082805190602001908083835b602083101515610c045780518252602082019150602081019050602083039250610bdf565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692505050919050565b60016020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201905083565b60008060028363ffffffff81101515610cdc57fe5b019050610d81818054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610d775780601f10610d4c57610100808354040283529160200191610d77565b820191906000526020600020905b815481529060010190602001808311610d5a57829003601f168201915b5050505050610bc9565b915050919050565b610d91611754565b60028263ffffffff81101515610da357fe5b018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610e385780601f10610e0d57610100808354040283529160200191610e38565b820191906000526020600020905b815481529060010190602001808311610e1b57829003601f168201915b50505050509050919050565b600080610e4f611754565b600080856040518082805190602001908083835b602083101515610e885780518252602082019150602081019050602083039250610e63565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816001015482600201808054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f975780601f10610f6c57610100808354040283529160200191610f97565b820191906000526020600020905b815481529060010190602001808311610f7a57829003601f168201915b5050505050905094509450945050509193909250565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60028163ffffffff81101515610fe457fe5b016000915090508054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561107f5780601f106110545761010080835404028352916020019161107f565b820191906000526020600020905b81548152906001019060200180831161106257829003601f168201915b505050505081565b61108f611754565b600080836040518082805190602001908083835b6020831015156110c857805182526020820191506020810190506020830392506110a3565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902091506001600083600019166000191681526020019081526020016000209050806002018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156111ac5780601f10611181576101008083540402835291602001916111ac565b820191906000526020600020905b81548152906001019060200180831161118f57829003601f168201915b505050505092505050919050565b60006111c4611768565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561121f57600080fd5b846040518082805190602001908083835b6020831015156112555780518252602082019150602081019050602083039250611230565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209150600160008360001916600019168152602001908152602001600020606060405190810160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113a45780601f10611379576101008083540402835291602001916113a4565b820191906000526020600020905b81548152906001019060200180831161138757829003601f168201915b5050505050815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614156114d75783816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505082816040018190525064010000000160009054906101000a900463ffffffff1663ffffffff1681602001818152505084600264010000000160009054906101000a900463ffffffff1663ffffffff1663ffffffff8110151561147e57fe5b0190805190602001906114929291906117a6565b50640100000001600081819054906101000a900463ffffffff168092919060010191906101000a81548163ffffffff021916908363ffffffff16021790555050611519565b83816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508281604001819052505b8060016000846000191660001916815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020190805190602001906115a2929190611826565b509050505050505050565b64010000000160009054906101000a900463ffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561162257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561165e57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611724611754565b61172c611754565b611734611754565b61173d84610d89565b915061174882611087565b90508092505050919050565b602060405190810160405280600081525090565b606060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016117a06118a6565b81525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106117e757805160ff1916838001178555611815565b82800160010185558215611815579182015b828111156118145782518255916020019190600101906117f9565b5b50905061182291906118ba565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061186757805160ff1916838001178555611895565b82800160010185558215611895579182015b82811115611894578251825591602001919060010190611879565b5b5090506118a291906118ba565b5090565b602060405190810160405280600081525090565b6118dc91905b808211156118d85760008160009055506001016118c0565b5090565b905600a165627a7a72305820f22d5c2dca4b280dc3e034bc981fb302c312a7b910a5a1b99d91838dc3c28f420029", - "deployedBytecode": "0x6060604052600436106100d0576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680631e71f8d1146100d55780632e1e1bb3146102105780633550b6d9146102815780633dbe284a1461031e5780635715c5b7146104155780636e7cbb0d146104785780638052348b146105145780638da5cb5b1461062457806395f121bf14610679578063bd7b564d14610715578063c0d0b6ff146107eb578063c51ccb40146108aa578063f2fde38b146108df578063fa7f369714610918575b600080fd5b34156100e057600080fd5b6100f660048080359060200190919050506109b4565b604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018060200180602001838103835285818151815260200191508051906020019080838360005b8381101561016c578082015181840152602081019050610151565b50505050905090810190601f1680156101995780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b838110156101d25780820151818401526020810190506101b7565b50505050905090810190601f1680156101ff5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b341561021b57600080fd5b61026b600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610b34565b6040518082815260200191505060405180910390f35b341561028c57600080fd5b6102dc600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610bc9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561032957600080fd5b610343600480803560001916906020019091905050610c7e565b604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001806020018281038252838181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156104045780601f106103d957610100808354040283529160200191610404565b820191906000526020600020905b8154815290600101906020018083116103e757829003601f168201915b505094505050505060405180910390f35b341561042057600080fd5b6104366004808035906020019091905050610cc7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561048357600080fd5b6104996004808035906020019091905050610d89565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104d95780820151818401526020810190506104be565b50505050905090810190601f1680156105065780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561051f57600080fd5b61056f600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610e44565b604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156105e75780820151818401526020810190506105cc565b50505050905090810190601f1680156106145780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b341561062f57600080fd5b610637610fad565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561068457600080fd5b61069a6004808035906020019091905050610fd2565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156106da5780820151818401526020810190506106bf565b50505050905090810190601f1680156107075780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561072057600080fd5b610770600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611087565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156107b0578082015181840152602081019050610795565b50505050905090810190601f1680156107dd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156107f657600080fd5b6108a8600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506111ba565b005b34156108b557600080fd5b6108bd6115ad565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b34156108ea57600080fd5b610916600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506115c7565b005b341561092357600080fd5b610939600480803590602001909190505061171c565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561097957808201518184015260208101905061095e565b50505050905090810190601f1680156109a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b60006109be611754565b6109c6611754565b6109ce611754565b6000806109da87610d89565b9250826040518082805190602001908083835b602083101515610a1257805182526020820191506020810190506020830392506109ed565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168382600201808054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610b1d5780601f10610af257610100808354040283529160200191610b1d565b820191906000526020600020905b815481529060010190602001808311610b0057829003601f168201915b505050505090509550955095505050509193909250565b6000806000836040518082805190602001908083835b602083101515610b6f5780518252602082019150602081019050602083039250610b4a565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902091506001600083600019166000191681526020019081526020016000209050806001015492505050919050565b6000806000836040518082805190602001908083835b602083101515610c045780518252602082019150602081019050602083039250610bdf565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692505050919050565b60016020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201905083565b60008060028363ffffffff81101515610cdc57fe5b019050610d81818054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610d775780601f10610d4c57610100808354040283529160200191610d77565b820191906000526020600020905b815481529060010190602001808311610d5a57829003601f168201915b5050505050610bc9565b915050919050565b610d91611754565b60028263ffffffff81101515610da357fe5b018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610e385780601f10610e0d57610100808354040283529160200191610e38565b820191906000526020600020905b815481529060010190602001808311610e1b57829003601f168201915b50505050509050919050565b600080610e4f611754565b600080856040518082805190602001908083835b602083101515610e885780518252602082019150602081019050602083039250610e63565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816001015482600201808054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f975780601f10610f6c57610100808354040283529160200191610f97565b820191906000526020600020905b815481529060010190602001808311610f7a57829003601f168201915b5050505050905094509450945050509193909250565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60028163ffffffff81101515610fe457fe5b016000915090508054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561107f5780601f106110545761010080835404028352916020019161107f565b820191906000526020600020905b81548152906001019060200180831161106257829003601f168201915b505050505081565b61108f611754565b600080836040518082805190602001908083835b6020831015156110c857805182526020820191506020810190506020830392506110a3565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902091506001600083600019166000191681526020019081526020016000209050806002018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156111ac5780601f10611181576101008083540402835291602001916111ac565b820191906000526020600020905b81548152906001019060200180831161118f57829003601f168201915b505050505092505050919050565b60006111c4611768565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561121f57600080fd5b846040518082805190602001908083835b6020831015156112555780518252602082019150602081019050602083039250611230565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209150600160008360001916600019168152602001908152602001600020606060405190810160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113a45780601f10611379576101008083540402835291602001916113a4565b820191906000526020600020905b81548152906001019060200180831161138757829003601f168201915b5050505050815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614156114d75783816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505082816040018190525064010000000160009054906101000a900463ffffffff1663ffffffff1681602001818152505084600264010000000160009054906101000a900463ffffffff1663ffffffff1663ffffffff8110151561147e57fe5b0190805190602001906114929291906117a6565b50640100000001600081819054906101000a900463ffffffff168092919060010191906101000a81548163ffffffff021916908363ffffffff16021790555050611519565b83816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508281604001819052505b8060016000846000191660001916815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020190805190602001906115a2929190611826565b509050505050505050565b64010000000160009054906101000a900463ffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561162257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561165e57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611724611754565b61172c611754565b611734611754565b61173d84610d89565b915061174882611087565b90508092505050919050565b602060405190810160405280600081525090565b606060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016117a06118a6565b81525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106117e757805160ff1916838001178555611815565b82800160010185558215611815579182015b828111156118145782518255916020019190600101906117f9565b5b50905061182291906118ba565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061186757805160ff1916838001178555611895565b82800160010185558215611895579182015b82811115611894578251825591602001919060010190611879565b5b5090506118a291906118ba565b5090565b602060405190810160405280600081525090565b6118dc91905b808211156118d85760008160009055506001016118c0565b5090565b905600a165627a7a72305820f22d5c2dca4b280dc3e034bc981fb302c312a7b910a5a1b99d91838dc3c28f420029", + "bytecode": "0x6060604052336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061190b806100536000396000f3006060604052600436106100d0576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680631e71f8d1146100d55780632e1e1bb3146102105780633550b6d9146102815780633dbe284a1461031e5780635715c5b7146104155780636e7cbb0d146104785780638052348b146105145780638da5cb5b1461062457806395f121bf14610679578063bd7b564d14610715578063c0d0b6ff146107eb578063c51ccb40146108aa578063f2fde38b146108df578063fa7f369714610918575b600080fd5b34156100e057600080fd5b6100f660048080359060200190919050506109b4565b604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018060200180602001838103835285818151815260200191508051906020019080838360005b8381101561016c578082015181840152602081019050610151565b50505050905090810190601f1680156101995780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b838110156101d25780820151818401526020810190506101b7565b50505050905090810190601f1680156101ff5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b341561021b57600080fd5b61026b600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610b34565b6040518082815260200191505060405180910390f35b341561028c57600080fd5b6102dc600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610bc9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561032957600080fd5b610343600480803560001916906020019091905050610c7e565b604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001806020018281038252838181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156104045780601f106103d957610100808354040283529160200191610404565b820191906000526020600020905b8154815290600101906020018083116103e757829003601f168201915b505094505050505060405180910390f35b341561042057600080fd5b6104366004808035906020019091905050610cc7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561048357600080fd5b6104996004808035906020019091905050610d89565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104d95780820151818401526020810190506104be565b50505050905090810190601f1680156105065780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561051f57600080fd5b61056f600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610e44565b604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156105e75780820151818401526020810190506105cc565b50505050905090810190601f1680156106145780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b341561062f57600080fd5b610637610fad565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561068457600080fd5b61069a6004808035906020019091905050610fd2565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156106da5780820151818401526020810190506106bf565b50505050905090810190601f1680156107075780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561072057600080fd5b610770600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611087565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156107b0578082015181840152602081019050610795565b50505050905090810190601f1680156107dd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156107f657600080fd5b6108a8600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506111ba565b005b34156108b557600080fd5b6108bd6115ad565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b34156108ea57600080fd5b610916600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506115c7565b005b341561092357600080fd5b610939600480803590602001909190505061171c565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561097957808201518184015260208101905061095e565b50505050905090810190601f1680156109a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b60006109be611754565b6109c6611754565b6109ce611754565b6000806109da87610d89565b9250826040518082805190602001908083835b602083101515610a1257805182526020820191506020810190506020830392506109ed565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168382600201808054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610b1d5780601f10610af257610100808354040283529160200191610b1d565b820191906000526020600020905b815481529060010190602001808311610b0057829003601f168201915b505050505090509550955095505050509193909250565b6000806000836040518082805190602001908083835b602083101515610b6f5780518252602082019150602081019050602083039250610b4a565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902091506001600083600019166000191681526020019081526020016000209050806001015492505050919050565b6000806000836040518082805190602001908083835b602083101515610c045780518252602082019150602081019050602083039250610bdf565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692505050919050565b60016020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201905083565b60008060028363ffffffff81101515610cdc57fe5b019050610d81818054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610d775780601f10610d4c57610100808354040283529160200191610d77565b820191906000526020600020905b815481529060010190602001808311610d5a57829003601f168201915b5050505050610bc9565b915050919050565b610d91611754565b60028263ffffffff81101515610da357fe5b018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610e385780601f10610e0d57610100808354040283529160200191610e38565b820191906000526020600020905b815481529060010190602001808311610e1b57829003601f168201915b50505050509050919050565b600080610e4f611754565b600080856040518082805190602001908083835b602083101515610e885780518252602082019150602081019050602083039250610e63565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816001015482600201808054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f975780601f10610f6c57610100808354040283529160200191610f97565b820191906000526020600020905b815481529060010190602001808311610f7a57829003601f168201915b5050505050905094509450945050509193909250565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60028163ffffffff81101515610fe457fe5b016000915090508054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561107f5780601f106110545761010080835404028352916020019161107f565b820191906000526020600020905b81548152906001019060200180831161106257829003601f168201915b505050505081565b61108f611754565b600080836040518082805190602001908083835b6020831015156110c857805182526020820191506020810190506020830392506110a3565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902091506001600083600019166000191681526020019081526020016000209050806002018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156111ac5780601f10611181576101008083540402835291602001916111ac565b820191906000526020600020905b81548152906001019060200180831161118f57829003601f168201915b505050505092505050919050565b60006111c4611768565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561121f57600080fd5b846040518082805190602001908083835b6020831015156112555780518252602082019150602081019050602083039250611230565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209150600160008360001916600019168152602001908152602001600020606060405190810160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113a45780601f10611379576101008083540402835291602001916113a4565b820191906000526020600020905b81548152906001019060200180831161138757829003601f168201915b5050505050815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614156114d75783816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505082816040018190525064010000000160009054906101000a900463ffffffff1663ffffffff1681602001818152505084600264010000000160009054906101000a900463ffffffff1663ffffffff1663ffffffff8110151561147e57fe5b0190805190602001906114929291906117a6565b50640100000001600081819054906101000a900463ffffffff168092919060010191906101000a81548163ffffffff021916908363ffffffff16021790555050611519565b83816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508281604001819052505b8060016000846000191660001916815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020190805190602001906115a2929190611826565b509050505050505050565b64010000000160009054906101000a900463ffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561162257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561165e57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611724611754565b61172c611754565b611734611754565b61173d84610d89565b915061174882611087565b90508092505050919050565b602060405190810160405280600081525090565b606060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016117a06118a6565b81525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106117e757805160ff1916838001178555611815565b82800160010185558215611815579182015b828111156118145782518255916020019190600101906117f9565b5b50905061182291906118ba565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061186757805160ff1916838001178555611895565b82800160010185558215611895579182015b82811115611894578251825591602001919060010190611879565b5b5090506118a291906118ba565b5090565b602060405190810160405280600081525090565b6118dc91905b808211156118d85760008160009055506001016118c0565b5090565b905600a165627a7a7230582093736f14a2a7953661c655fbb4db97570aa227e6101717eb0a4801c1606e56140029", + "deployedBytecode": "0x6060604052600436106100d0576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680631e71f8d1146100d55780632e1e1bb3146102105780633550b6d9146102815780633dbe284a1461031e5780635715c5b7146104155780636e7cbb0d146104785780638052348b146105145780638da5cb5b1461062457806395f121bf14610679578063bd7b564d14610715578063c0d0b6ff146107eb578063c51ccb40146108aa578063f2fde38b146108df578063fa7f369714610918575b600080fd5b34156100e057600080fd5b6100f660048080359060200190919050506109b4565b604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018060200180602001838103835285818151815260200191508051906020019080838360005b8381101561016c578082015181840152602081019050610151565b50505050905090810190601f1680156101995780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b838110156101d25780820151818401526020810190506101b7565b50505050905090810190601f1680156101ff5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b341561021b57600080fd5b61026b600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610b34565b6040518082815260200191505060405180910390f35b341561028c57600080fd5b6102dc600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610bc9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561032957600080fd5b610343600480803560001916906020019091905050610c7e565b604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001806020018281038252838181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156104045780601f106103d957610100808354040283529160200191610404565b820191906000526020600020905b8154815290600101906020018083116103e757829003601f168201915b505094505050505060405180910390f35b341561042057600080fd5b6104366004808035906020019091905050610cc7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561048357600080fd5b6104996004808035906020019091905050610d89565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104d95780820151818401526020810190506104be565b50505050905090810190601f1680156105065780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561051f57600080fd5b61056f600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610e44565b604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156105e75780820151818401526020810190506105cc565b50505050905090810190601f1680156106145780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b341561062f57600080fd5b610637610fad565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561068457600080fd5b61069a6004808035906020019091905050610fd2565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156106da5780820151818401526020810190506106bf565b50505050905090810190601f1680156107075780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561072057600080fd5b610770600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611087565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156107b0578082015181840152602081019050610795565b50505050905090810190601f1680156107dd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156107f657600080fd5b6108a8600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506111ba565b005b34156108b557600080fd5b6108bd6115ad565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b34156108ea57600080fd5b610916600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506115c7565b005b341561092357600080fd5b610939600480803590602001909190505061171c565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561097957808201518184015260208101905061095e565b50505050905090810190601f1680156109a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b60006109be611754565b6109c6611754565b6109ce611754565b6000806109da87610d89565b9250826040518082805190602001908083835b602083101515610a1257805182526020820191506020810190506020830392506109ed565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168382600201808054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610b1d5780601f10610af257610100808354040283529160200191610b1d565b820191906000526020600020905b815481529060010190602001808311610b0057829003601f168201915b505050505090509550955095505050509193909250565b6000806000836040518082805190602001908083835b602083101515610b6f5780518252602082019150602081019050602083039250610b4a565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902091506001600083600019166000191681526020019081526020016000209050806001015492505050919050565b6000806000836040518082805190602001908083835b602083101515610c045780518252602082019150602081019050602083039250610bdf565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692505050919050565b60016020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201905083565b60008060028363ffffffff81101515610cdc57fe5b019050610d81818054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610d775780601f10610d4c57610100808354040283529160200191610d77565b820191906000526020600020905b815481529060010190602001808311610d5a57829003601f168201915b5050505050610bc9565b915050919050565b610d91611754565b60028263ffffffff81101515610da357fe5b018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610e385780601f10610e0d57610100808354040283529160200191610e38565b820191906000526020600020905b815481529060010190602001808311610e1b57829003601f168201915b50505050509050919050565b600080610e4f611754565b600080856040518082805190602001908083835b602083101515610e885780518252602082019150602081019050602083039250610e63565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816001015482600201808054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f975780601f10610f6c57610100808354040283529160200191610f97565b820191906000526020600020905b815481529060010190602001808311610f7a57829003601f168201915b5050505050905094509450945050509193909250565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60028163ffffffff81101515610fe457fe5b016000915090508054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561107f5780601f106110545761010080835404028352916020019161107f565b820191906000526020600020905b81548152906001019060200180831161106257829003601f168201915b505050505081565b61108f611754565b600080836040518082805190602001908083835b6020831015156110c857805182526020820191506020810190506020830392506110a3565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902091506001600083600019166000191681526020019081526020016000209050806002018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156111ac5780601f10611181576101008083540402835291602001916111ac565b820191906000526020600020905b81548152906001019060200180831161118f57829003601f168201915b505050505092505050919050565b60006111c4611768565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561121f57600080fd5b846040518082805190602001908083835b6020831015156112555780518252602082019150602081019050602083039250611230565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209150600160008360001916600019168152602001908152602001600020606060405190810160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113a45780601f10611379576101008083540402835291602001916113a4565b820191906000526020600020905b81548152906001019060200180831161138757829003601f168201915b5050505050815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614156114d75783816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505082816040018190525064010000000160009054906101000a900463ffffffff1663ffffffff1681602001818152505084600264010000000160009054906101000a900463ffffffff1663ffffffff1663ffffffff8110151561147e57fe5b0190805190602001906114929291906117a6565b50640100000001600081819054906101000a900463ffffffff168092919060010191906101000a81548163ffffffff021916908363ffffffff16021790555050611519565b83816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508281604001819052505b8060016000846000191660001916815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020190805190602001906115a2929190611826565b509050505050505050565b64010000000160009054906101000a900463ffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561162257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561165e57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611724611754565b61172c611754565b611734611754565b61173d84610d89565b915061174882611087565b90508092505050919050565b602060405190810160405280600081525090565b606060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016117a06118a6565b81525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106117e757805160ff1916838001178555611815565b82800160010185558215611815579182015b828111156118145782518255916020019190600101906117f9565b5b50905061182291906118ba565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061186757805160ff1916838001178555611895565b82800160010185558215611895579182015b82811115611894578251825591602001919060010190611879565b5b5090506118a291906118ba565b5090565b602060405190810160405280600081525090565b6118dc91905b808211156118d85760008160009055506001016118c0565b5090565b905600a165627a7a7230582093736f14a2a7953661c655fbb4db97570aa227e6101717eb0a4801c1606e56140029", "sourceMap": "723:5693:8:-;;;509:10:39;501:5;;:18;;;;;;;;;;;;;;;;;;723:5693:8;;;;;;", "deployedSourceMap": "723:5693:8:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5927:487;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3453:256:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2686:263;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;769:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3122:188;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3845:120;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5170:442:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;238:20:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1070:41:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4106:251:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1529:1045:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1117:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;832:169:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;4606:232:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5927:487:8;6033:7;6054:6;;:::i;:::-;6074;;:::i;:::-;6105:20;;:::i;:::-;6168:18;6217:34;6128:29;6150:6;6128:21;:29::i;:::-;6105:52;;6199:6;6189:17;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;6168:38:8;;6254:27;:39;6282:10;6254:39;;;;;;;;;;;;;;;;;6217:76;;6325:10;:23;;;;;;;;;;;;6362:6;6382:10;:15;;6304:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5927:487;;;;;;;;:::o;3453:256::-;3521:4;3537:18;3587:34;3568:7;3558:18;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;3537:39:8;;3624:27;:39;3652:10;3624:39;;;;;;;;;;;;;;;;;3587:76;;3681:10;:21;;;3674:28;;3453:256;;;;;:::o;2686:263::-;2756:7;2775:18;2825:34;2806:7;2796:18;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;2775:39:8;;2862:27;:39;2890:10;2862:39;;;;;;;;;;;;;;;;;2825:76;;2919:10;:23;;;;;;;;;;;;2912:30;;2686:263;;;;;:::o;769:71::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3122:188::-;3188:7;3207:21;3231:15;3247:6;3231:23;;;;;;;;;;3207:47;;3272:31;3296:6;3272:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:23;:31::i;:::-;3265:38;;3122:188;;;;:::o;3845:120::-;3910:6;;:::i;:::-;3935:15;3951:6;3935:23;;;;;;;;;;3928:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3845:120;;;:::o;5170:442::-;5280:7;5301:4;5319:6;;:::i;:::-;5350:18;5400:34;5381:7;5371:18;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;5350:39:8;;5437:27;:39;5465:10;5437:39;;;;;;;;;;;;;;;;;5400:76;;5508:10;:23;;;;;;;;;;;;5545:10;:21;;;5580:10;:15;;5487:118;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5170:442;;;;;;;:::o;238:20:39:-;;;;;;;;;;;;;:::o;1070:41:8:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4106:251::-;4173:6;;:::i;:::-;4191:18;4241:34;4222:7;4212:18;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;4191:39:8;;4278:27;:39;4306:10;4278:39;;;;;;;;;;;;;;;;;4241:76;;4335:10;:15;;4328:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4106:251;;;;;:::o;1529:1045::-;1684:18;1807:33;;:::i;:::-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;1715:7:8;1705:18;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;1684:39:8;;1843:27;:39;1871:10;1843:39;;;;;;;;;;;;;;;;;1807:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1932:1;1897:37;;:10;:23;;;:37;;;1893:569;;;2041:13;2015:10;:23;;:39;;;;;;;;;;;2086:10;2068;:15;;:28;;;;2134:21;;;;;;;;;;;2110:45;;:10;:21;;:45;;;;;2211:7;2170:15;2186:21;;;;;;;;;;;2170:38;;;;;;;;;;;;:48;;;;;;;;;;;;:::i;:::-;;2232:21;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1893:569;;;2396:13;2370:10;:23;;:39;;;;;;;;;;;2441:10;2423;:15;;:28;;;;1893:569;2557:10;2515:27;:39;2543:10;2515:39;;;;;;;;;;;;;;;;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;1529:1045;;;;;:::o;1117:35::-;;;;;;;;;;;;;:::o;832:169:39:-;653:5;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;928:1;908:22;;:8;:22;;;;900:31;;;;;;;;965:8;937:37;;958:5;;;;;;;;;;;937:37;;;;;;;;;;;;988:8;980:5;;:16;;;;;;;;;;;;;;;;;;832:169;:::o;4606:232:8:-;4669:6;;:::i;:::-;4687:20;;:::i;:::-;4750:23;;:::i;:::-;4710:29;4732:6;4710:21;:29::i;:::-;4687:52;;4776:28;4797:6;4776:20;:28::i;:::-;4750:54;;4822:9;4815:16;;4606:232;;;;;:::o;723:5693::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", "source": "pragma solidity 0.4.18;\n\nimport \"zeppelin-solidity/contracts/ownership/Ownable.sol\";\n\n\n/**\n * The ERC721TokenRegistry is a basic registry mapping token symbols\n * to their known, deployed addresses on the current blockchain.\n *\n * Note that the TokenRegistry does *not* mediate any of the\n * core protocol's business logic, but, rather, is a helpful\n * utility for Terms Contracts to use in encoding, decoding, and\n * resolving the addresses of currently deployed tokens.\n *\n * At this point in time, administration of the Token Registry is\n * under Dharma Labs' control. With more sophisticated decentralized\n * governance mechanisms, we intend to shift ownership of this utility\n * contract to the Dharma community.\n */\ncontract ERC721TokenRegistry is Ownable {\n mapping (bytes32 => TokenAttributes) public symbolHashToTokenAttributes;\n // Solidity prevents us from declaring a dynamically sized string array (since a string is\n // itself an array, and 2D arrays are not supported), and so here we specify the maximum\n // size of the tokenSymbolList.\n string[4294967295] public tokenSymbolList;\n uint32 public tokenSymbolListLength;\n\n struct TokenAttributes {\n // The ERC721 contract address.\n address tokenAddress;\n // The index in `tokenSymbolList` where the token's symbol can be found.\n uint tokenIndex;\n // The name of the given token, e.g. \"CryptoKitties\"\n string name;\n }\n\n /**\n * Maps the given symbol to the given token attributes.\n */\n function setTokenAttributes(\n string _symbol,\n address _tokenAddress,\n string _tokenName\n )\n public onlyOwner\n {\n bytes32 symbolHash = keccak256(_symbol);\n\n // Attempt to retrieve the token's attributes from the registry.\n TokenAttributes memory attributes = symbolHashToTokenAttributes[symbolHash];\n\n if (attributes.tokenAddress == address(0)) {\n // The token has not yet been added to the registry.\n attributes.tokenAddress = _tokenAddress;\n attributes.name = _tokenName;\n attributes.tokenIndex = tokenSymbolListLength;\n\n tokenSymbolList[tokenSymbolListLength] = _symbol;\n tokenSymbolListLength++;\n } else {\n // The token has already been added to the registry; update attributes.\n attributes.tokenAddress = _tokenAddress;\n attributes.name = _tokenName;\n }\n\n // Update this contract's storage.\n symbolHashToTokenAttributes[symbolHash] = attributes;\n }\n\n /**\n * Given a symbol, resolves the current address of the token the symbol is mapped to.\n */\n function getTokenAddressBySymbol(string _symbol) public view returns (address) {\n bytes32 symbolHash = keccak256(_symbol);\n\n TokenAttributes storage attributes = symbolHashToTokenAttributes[symbolHash];\n\n return attributes.tokenAddress;\n }\n\n /**\n * Given the known index of a token within the registry's symbol list,\n * returns the address of the token mapped to the symbol at that index.\n */\n function getTokenAddressByIndex(uint _index) public view returns (address) {\n string storage symbol = tokenSymbolList[_index];\n\n return getTokenAddressBySymbol(symbol);\n }\n\n /**\n * Given a symbol, resolves the index of the token the symbol is mapped to within the registry's\n * symbol list.\n */\n function getTokenIndexBySymbol(string _symbol) public view returns (uint) {\n bytes32 symbolHash = keccak256(_symbol);\n\n TokenAttributes storage attributes = symbolHashToTokenAttributes[symbolHash];\n\n return attributes.tokenIndex;\n }\n\n /**\n * Given an index, resolves the symbol of the token at that index in the registry's\n * token symbol list.\n */\n function getTokenSymbolByIndex(uint _index) public view returns (string) {\n return tokenSymbolList[_index];\n }\n\n /**\n * Given a symbol, returns the name of the token the symbol is mapped to within the registry's\n * symbol list.\n */\n function getTokenNameBySymbol(string _symbol) public view returns (string) {\n bytes32 symbolHash = keccak256(_symbol);\n\n TokenAttributes storage attributes = symbolHashToTokenAttributes[symbolHash];\n\n return attributes.name;\n }\n\n /**\n * Given the index for a token in the registry, returns the name of the token as provided in\n * the associated TokensAttribute struct.\n *\n * Example:\n * getTokenNameByIndex(1);\n * => \"CryptoKitties\"\n */\n function getTokenNameByIndex(uint _index) public view returns (string) {\n string memory symbol = getTokenSymbolByIndex(_index);\n\n string memory tokenName = getTokenNameBySymbol(symbol);\n\n return tokenName;\n }\n\n /**\n * Given the symbol for a token in the registry, returns a tuple containing the token's address,\n * the token's index in the registry, and the token's name.\n *\n * Example:\n * getTokenAttributesBySymbol(\"CK\");\n * => [\"0x06012c8cf97BEaD5deAe237070F9587f8E7A266d\", 1, \"CryptoKitties\"]\n */\n function getTokenAttributesBySymbol(string _symbol)\n public\n view\n returns (\n address,\n uint,\n string\n )\n {\n bytes32 symbolHash = keccak256(_symbol);\n\n TokenAttributes storage attributes = symbolHashToTokenAttributes[symbolHash];\n\n return (\n attributes.tokenAddress,\n attributes.tokenIndex,\n attributes.name\n );\n }\n\n /**\n * Given the index for a token in the registry, returns a tuple containing the token's address,\n * the token's symbol, and the token's name.\n *\n * Example:\n * getTokenAttributesByIndex(1);\n * => [\"0x06012c8cf97BEaD5deAe237070F9587f8E7A266d\", \"CK\", \"CryptoKitties\"]\n */\n function getTokenAttributesByIndex(uint _index)\n public\n view\n returns (\n address,\n string,\n string\n )\n {\n string memory symbol = getTokenSymbolByIndex(_index);\n\n bytes32 symbolHash = keccak256(symbol);\n\n TokenAttributes storage attributes = symbolHashToTokenAttributes[symbolHash];\n\n return (\n attributes.tokenAddress,\n symbol,\n attributes.name\n );\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/ERC721TokenRegistry.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/ERC721TokenRegistry.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/ERC721TokenRegistry.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/ERC721TokenRegistry.sol", "exportedSymbols": { "ERC721TokenRegistry": [ 4457 @@ -4183,7 +4183,7 @@ } }, "links": {}, - "address": "0xc7e95d984d2abdb012e25975c622477f31a0473f" + "address": "0xd1ec79ec665dddf7a65024c44dd75f625e88271f" }, "70": { "events": { @@ -4210,5 +4210,5 @@ } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:16:13.717Z" + "updatedAt": "2018-10-09T17:53:04.870Z" } \ No newline at end of file diff --git a/artifacts/json/GeneScienceInterface.json b/artifacts/json/GeneScienceInterface.json index 4d6e73e1..aa494013 100644 --- a/artifacts/json/GeneScienceInterface.json +++ b/artifacts/json/GeneScienceInterface.json @@ -48,10 +48,10 @@ "sourceMap": "", "deployedSourceMap": "", "source": "pragma solidity 0.4.18;\n\n/**\n The following contract code, titled KittyCore, was written by Cryptokitties and published\n and retrieved from https://etherscan.io/address/0x06012c8cf97bead5deae237070f9587f8e7a266d#code.\n\n It is included in the current project for test purposes, to ensure that our collateralizer can\n handle ERC721 tokens created by the KittyCore contract.\n*/\n\n/**\n * @title KittiesOwnable\n * @dev The KittiesOwnable contract has an owner address, and provides basic authorization control\n * functions, this simplifies the implementation of \"user permissions\".\n */\ncontract KittiesOwnable {\n address public owner;\n\n\n /**\n\t * @dev The KittiesOwnable constructor sets the original `owner` of the contract to the sender\n\t * account.\n\t */\n function KittiesOwnable() {\n owner = msg.sender;\n }\n\n\n /**\n\t * @dev Throws if called by any account other than the owner.\n\t */\n modifier onlyOwner() {\n require(msg.sender == owner);\n _;\n }\n\n\n /**\n\t * @dev Allows the current owner to transfer control of the contract to a newOwner.\n\t * @param newOwner The address to transfer ownership to.\n\t */\n function transferOwnership(address newOwner) onlyOwner {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n\n}\n\n\n\n/// @title Interface for contracts conforming to ERC-721: Non-Fungible Tokens\n/// @author Dieter Shirley (https://github.com/dete)\ncontract KittiesERC721 {\n // Required methods\n function totalSupply() public view returns (uint256 total);\n function balanceOf(address _owner) public view returns (uint256 balance);\n function ownerOf(uint256 _tokenId) external view returns (address owner);\n function approve(address _to, uint256 _tokenId) external;\n function transfer(address _to, uint256 _tokenId) external;\n function transferFrom(address _from, address _to, uint256 _tokenId) external;\n\n // Events\n event Transfer(address from, address to, uint256 tokenId);\n event Approval(address owner, address approved, uint256 tokenId);\n\n // Optional\n // function name() public view returns (string name);\n // function symbol() public view returns (string symbol);\n // function tokensOfOwner(address _owner) external view returns (uint256[] tokenIds);\n // function tokenMetadata(uint256 _tokenId, string _preferredTransport) public view returns (string infoUrl);\n\n // ERC-165 Compatibility (https://github.com/ethereum/EIPs/issues/165)\n function supportsInterface(bytes4 _interfaceID) external view returns (bool);\n}\n\n\n// // Auction wrapper functions\n\n\n// Auction wrapper functions\n\n\n\n\n\n\n\n/// @title SEKRETOOOO\ncontract GeneScienceInterface {\n /// @dev simply a boolean to indicate this is the contract we expect to be\n function isGeneScience() public pure returns (bool);\n\n /// @dev given genes of kitten 1 & 2, return a genetic combination - may have a random factor\n /// @param genes1 genes of mom\n /// @param genes2 genes of sire\n /// @return the genes that are supposed to be passed down the child\n function mixGenes(uint256 genes1, uint256 genes2, uint256 targetBlock) public returns (uint256);\n}\n\n\n\n\n\n\n\n/// @title A facet of KittyCore that manages special access privileges.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyAccessControl {\n // This facet controls access control for CryptoKitties. There are four roles managed here:\n //\n // - The CEO: The CEO can reassign other roles and change the addresses of our dependent smart\n // contracts. It is also the only role that can unpause the smart contract. It is initially\n // set to the address that created the smart contract in the KittyCore constructor.\n //\n // - The CFO: The CFO can withdraw funds from KittyCore and its auction contracts.\n //\n // - The COO: The COO can release gen0 kitties to auction, and mint promo cats.\n //\n // It should be noted that these roles are distinct without overlap in their access abilities, the\n // abilities listed for each role above are exhaustive. In particular, while the CEO can assign any\n // address to any role, the CEO address itself doesn't have the ability to act in those roles. This\n // restriction is intentional so that we aren't tempted to use the CEO address frequently out of\n // convenience. The less we use an address, the less likely it is that we somehow compromise the\n // account.\n\n /// @dev Emited when contract is upgraded - See README.md for updgrade plan\n event ContractUpgrade(address newContract);\n\n // The addresses of the accounts (or contracts) that can execute actions within each roles.\n address public ceoAddress;\n address public cfoAddress;\n address public cooAddress;\n\n // @dev Keeps track whether the contract is paused. When that is true, most actions are blocked\n bool public paused = false;\n\n /// @dev Access modifier for CEO-only functionality\n modifier onlyCEO() {\n require(msg.sender == ceoAddress);\n _;\n }\n\n /// @dev Access modifier for CFO-only functionality\n modifier onlyCFO() {\n require(msg.sender == cfoAddress);\n _;\n }\n\n /// @dev Access modifier for COO-only functionality\n modifier onlyCOO() {\n require(msg.sender == cooAddress);\n _;\n }\n\n modifier onlyCLevel() {\n require(\n msg.sender == cooAddress ||\n msg.sender == ceoAddress ||\n msg.sender == cfoAddress\n );\n _;\n }\n\n /// @dev Assigns a new address to act as the CEO. Only available to the current CEO.\n /// @param _newCEO The address of the new CEO\n function setCEO(address _newCEO) external onlyCEO {\n require(_newCEO != address(0));\n\n ceoAddress = _newCEO;\n }\n\n /// @dev Assigns a new address to act as the CFO. Only available to the current CEO.\n /// @param _newCFO The address of the new CFO\n function setCFO(address _newCFO) external onlyCEO {\n require(_newCFO != address(0));\n\n cfoAddress = _newCFO;\n }\n\n /// @dev Assigns a new address to act as the COO. Only available to the current CEO.\n /// @param _newCOO The address of the new COO\n function setCOO(address _newCOO) external onlyCEO {\n require(_newCOO != address(0));\n\n cooAddress = _newCOO;\n }\n\n /*** KittiesPausable functionality adapted from OpenZeppelin ***/\n\n /// @dev Modifier to allow actions only when the contract IS NOT paused\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /// @dev Modifier to allow actions only when the contract IS paused\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /// @dev Called by any \"C-level\" role to pause the contract. Used only when\n /// a bug or exploit is detected and we need to limit damage.\n function pause() external onlyCLevel whenNotPaused {\n paused = true;\n }\n\n /// @dev Unpauses the smart contract. Can only be called by the CEO, since\n /// one reason we may pause the contract is when CFO or COO accounts are\n /// compromised.\n /// @notice This is public rather than external so it can be called by\n /// derived contracts.\n function unpause() public onlyCEO whenPaused {\n // can't unpause if contract was upgraded\n paused = false;\n }\n}\n\n\n\n\n/// @title Base contract for CryptoKitties. Holds all common structs, events and base variables.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBase is KittyAccessControl {\n /*** EVENTS ***/\n\n /// @dev The Birth event is fired whenever a new kitten comes into existence. This obviously\n /// includes any time a cat is created through the giveBirth method, but it is also called\n /// when a new gen0 cat is created.\n event Birth(address owner, uint256 kittyId, uint256 matronId, uint256 sireId, uint256 genes);\n\n /// @dev Transfer event as defined in current draft of ERC721. Emitted every time a kitten\n /// ownership is assigned, including births.\n event Transfer(address from, address to, uint256 tokenId);\n\n /*** DATA TYPES ***/\n\n /// @dev The main Kitty struct. Every cat in CryptoKitties is represented by a copy\n /// of this structure, so great care was taken to ensure that it fits neatly into\n /// exactly two 256-bit words. Note that the order of the members in this structure\n /// is important because of the byte-packing rules used by Ethereum.\n /// Ref: http://solidity.readthedocs.io/en/develop/miscellaneous.html\n struct Kitty {\n // The Kitty's genetic code is packed into these 256-bits, the format is\n // sooper-sekret! A cat's genes never change.\n uint256 genes;\n\n // The timestamp from the block when this cat came into existence.\n uint64 birthTime;\n\n // The minimum timestamp after which this cat can engage in breeding\n // activities again. This same timestamp is used for the pregnancy\n // timer (for matrons) as well as the siring cooldown.\n uint64 cooldownEndBlock;\n\n // The ID of the parents of this kitty, set to 0 for gen0 cats.\n // Note that using 32-bit unsigned integers limits us to a \"mere\"\n // 4 billion cats. This number might seem small until you realize\n // that Ethereum currently has a limit of about 500 million\n // transactions per year! So, this definitely won't be a problem\n // for several years (even as Ethereum learns to scale).\n uint32 matronId;\n uint32 sireId;\n\n // Set to the ID of the sire cat for matrons that are pregnant,\n // zero otherwise. A non-zero value here is how we know a cat\n // is pregnant. Used to retrieve the genetic material for the new\n // kitten when the birth transpires.\n uint32 siringWithId;\n\n // Set to the index in the cooldown array (see below) that represents\n // the current cooldown duration for this Kitty. This starts at zero\n // for gen0 cats, and is initialized to floor(generation/2) for others.\n // Incremented by one for each successful breeding action, regardless\n // of whether this cat is acting as matron or sire.\n uint16 cooldownIndex;\n\n // The \"generation number\" of this cat. Cats minted by the CK contract\n // for sale are called \"gen0\" and have a generation number of 0. The\n // generation number of all other cats is the larger of the two generation\n // numbers of their parents, plus one.\n // (i.e. max(matron.generation, sire.generation) + 1)\n uint16 generation;\n }\n\n /*** CONSTANTS ***/\n\n /// @dev A lookup table indicating the cooldown duration after any successful\n /// breeding action, called \"pregnancy time\" for matrons and \"siring cooldown\"\n /// for sires. Designed such that the cooldown roughly doubles each time a cat\n /// is bred, encouraging owners not to just keep breeding the same cat over\n /// and over again. Caps out at one week (a cat can breed an unbounded number\n /// of times, and the maximum cooldown is always seven days).\n uint32[14] public cooldowns = [\n uint32(1 minutes),\n uint32(2 minutes),\n uint32(5 minutes),\n uint32(10 minutes),\n uint32(30 minutes),\n uint32(1 hours),\n uint32(2 hours),\n uint32(4 hours),\n uint32(8 hours),\n uint32(16 hours),\n uint32(1 days),\n uint32(2 days),\n uint32(4 days),\n uint32(7 days)\n ];\n\n // An approximation of currently how many seconds are in between blocks.\n uint256 public secondsPerBlock = 15;\n\n /*** STORAGE ***/\n\n /// @dev An array containing the Kitty struct for all Kitties in existence. The ID\n /// of each cat is actually an index into this array. Note that ID 0 is a negacat,\n /// the unKitty, the mythical beast that is the parent of all gen0 cats. A bizarre\n /// creature that is both matron and sire... to itself! Has an invalid genetic code.\n /// In other words, cat ID 0 is invalid... ;-)\n Kitty[] kitties;\n\n /// @dev A mapping from cat IDs to the address that owns them. All cats have\n /// some valid owner address, even gen0 cats are created with a non-zero owner.\n mapping (uint256 => address) public kittyIndexToOwner;\n\n // @dev A mapping from owner address to count of tokens that address owns.\n // Used internally inside balanceOf() to resolve ownership count.\n mapping (address => uint256) ownershipTokenCount;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to call\n /// transferFrom(). Each Kitty can only have one approved address for transfer\n /// at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public kittyIndexToApproved;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to use\n /// this Kitty for siring via breedWith(). Each Kitty can only have one approved\n /// address for siring at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public sireAllowedToAddress;\n\n /// @dev The address of the ClockAuction contract that handles sales of Kitties. This\n /// same contract handles both peer-to-peer sales as well as the gen0 sales which are\n /// initiated every 15 minutes.\n SaleClockAuction public saleAuction;\n\n /// @dev The address of a custom ClockAuction subclassed contract that handles siring\n /// auctions. Needs to be separate from saleAuction because the actions taken on success\n /// after a sales and siring auction are quite different.\n SiringClockAuction public siringAuction;\n\n /// @dev Assigns ownership of a specific Kitty to an address.\n function _transfer(address _from, address _to, uint256 _tokenId) internal {\n // Since the number of kittens is capped to 2^32 we can't overflow this\n ownershipTokenCount[_to]++;\n // transfer ownership\n kittyIndexToOwner[_tokenId] = _to;\n // When creating new kittens _from is 0x0, but we can't account that address.\n if (_from != address(0)) {\n ownershipTokenCount[_from]--;\n // once the kitten is transferred also clear sire allowances\n delete sireAllowedToAddress[_tokenId];\n // clear any previously approved ownership exchange\n delete kittyIndexToApproved[_tokenId];\n }\n // Emit the transfer event.\n Transfer(_from, _to, _tokenId);\n }\n\n /// @dev An internal method that creates a new kitty and stores it. This\n /// method doesn't do any checking and should only be called when the\n /// input data is known to be valid. Will generate both a Birth event\n /// and a Transfer event.\n /// @param _matronId The kitty ID of the matron of this cat (zero for gen0)\n /// @param _sireId The kitty ID of the sire of this cat (zero for gen0)\n /// @param _generation The generation number of this cat, must be computed by caller.\n /// @param _genes The kitty's genetic code.\n /// @param _owner The inital owner of this cat, must be non-zero (except for the unKitty, ID 0)\n function _createKitty(\n uint256 _matronId,\n uint256 _sireId,\n uint256 _generation,\n uint256 _genes,\n address _owner\n )\n internal\n returns (uint)\n {\n // These requires are not strictly necessary, our calling code should make\n // sure that these conditions are never broken. However! _createKitty() is already\n // an expensive call (for storage), and it doesn't hurt to be especially careful\n // to ensure our data structures are always valid.\n require(_matronId == uint256(uint32(_matronId)));\n require(_sireId == uint256(uint32(_sireId)));\n require(_generation == uint256(uint16(_generation)));\n\n // New kitty starts with the same cooldown as parent gen/2\n uint16 cooldownIndex = uint16(_generation / 2);\n if (cooldownIndex > 13) {\n cooldownIndex = 13;\n }\n\n Kitty memory _kitty = Kitty({\n genes: _genes,\n birthTime: uint64(now),\n cooldownEndBlock: 0,\n matronId: uint32(_matronId),\n sireId: uint32(_sireId),\n siringWithId: 0,\n cooldownIndex: cooldownIndex,\n generation: uint16(_generation)\n });\n uint256 newKittenId = kitties.push(_kitty) - 1;\n\n // It's probably never going to happen, 4 billion cats is A LOT, but\n // let's just be 100% sure we never let this happen.\n require(newKittenId == uint256(uint32(newKittenId)));\n\n // emit the birth event\n Birth(\n _owner,\n newKittenId,\n uint256(_kitty.matronId),\n uint256(_kitty.sireId),\n _kitty.genes\n );\n\n // This will assign ownership, and also emit the Transfer event as\n // per ERC721 draft\n _transfer(0, _owner, newKittenId);\n\n return newKittenId;\n }\n\n // Any C-level can fix how many seconds per blocks are currently observed.\n function setSecondsPerBlock(uint256 secs) external onlyCLevel {\n require(secs < cooldowns[0]);\n secondsPerBlock = secs;\n }\n}\n\n\n\n\n\n/// @title The external contract that is responsible for generating metadata for the kitties,\n/// it has one function that will return the data as bytes.\ncontract KittiesERC721Metadata {\n /// @dev Given a token Id, returns a byte array that is supposed to be converted into string.\n function getMetadata(uint256 _tokenId, string) public view returns (bytes32[4] buffer, uint256 count) {\n if (_tokenId == 1) {\n buffer[0] = \"Hello World! :D\";\n count = 15;\n } else if (_tokenId == 2) {\n buffer[0] = \"I would definitely choose a medi\";\n buffer[1] = \"um length string.\";\n count = 49;\n } else if (_tokenId == 3) {\n buffer[0] = \"Lorem ipsum dolor sit amet, mi e\";\n buffer[1] = \"st accumsan dapibus augue lorem,\";\n buffer[2] = \" tristique vestibulum id, libero\";\n buffer[3] = \" suscipit varius sapien aliquam.\";\n count = 128;\n }\n }\n}\n\n\n/// @title The facet of the CryptoKitties core contract that manages ownership, ERC-721 (draft) compliant.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev Ref: https://github.com/ethereum/EIPs/issues/721\n/// See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyOwnership is KittyBase, KittiesERC721 {\n\n /// @notice Name and symbol of the non fungible token, as defined in ERC721.\n string public constant name = \"CryptoKitties\";\n string public constant symbol = \"CK\";\n\n // The contract that will return kitty metadata\n KittiesERC721Metadata public erc721Metadata;\n\n bytes4 constant InterfaceSignature_ERC165 =\n bytes4(keccak256('supportsInterface(bytes4)'));\n\n bytes4 constant InterfaceSignature_ERC721 =\n bytes4(keccak256('name()')) ^\n bytes4(keccak256('symbol()')) ^\n bytes4(keccak256('totalSupply()')) ^\n bytes4(keccak256('balanceOf(address)')) ^\n bytes4(keccak256('ownerOf(uint256)')) ^\n bytes4(keccak256('approve(address,uint256)')) ^\n bytes4(keccak256('transfer(address,uint256)')) ^\n bytes4(keccak256('transferFrom(address,address,uint256)')) ^\n bytes4(keccak256('tokensOfOwner(address)')) ^\n bytes4(keccak256('tokenMetadata(uint256,string)'));\n\n /// @notice Introspection interface as per ERC-165 (https://github.com/ethereum/EIPs/issues/165).\n /// Returns true for any standardized interfaces implemented by this contract. We implement\n /// ERC-165 (obviously!) and ERC-721.\n function supportsInterface(bytes4 _interfaceID) external view returns (bool)\n {\n // DEBUG ONLY\n //require((InterfaceSignature_ERC165 == 0x01ffc9a7) && (InterfaceSignature_ERC721 == 0x9a20483d));\n\n return ((_interfaceID == InterfaceSignature_ERC165) || (_interfaceID == InterfaceSignature_ERC721));\n }\n\n /// @dev Set the address of the sibling contract that tracks metadata.\n /// CEO only.\n function setMetadataAddress(address _contractAddress) public onlyCEO {\n erc721Metadata = KittiesERC721Metadata(_contractAddress);\n }\n\n // Internal utility functions: These functions all assume that their input arguments\n // are valid. We leave it to public methods to sanitize their inputs and follow\n // the required logic.\n\n /// @dev Checks if a given address is the current owner of a particular Kitty.\n /// @param _claimant the address we are validating against.\n /// @param _tokenId kitten id, only valid when > 0\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToOwner[_tokenId] == _claimant;\n }\n\n /// @dev Checks if a given address currently has transferApproval for a particular Kitty.\n /// @param _claimant the address we are confirming kitten is approved for.\n /// @param _tokenId kitten id, only valid when > 0\n function _approvedFor(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToApproved[_tokenId] == _claimant;\n }\n\n /// @dev Marks an address as being approved for transferFrom(), overwriting any previous\n /// approval. Setting _approved to address(0) clears all transfer approval.\n /// NOTE: _approve() does NOT send the Approval event. This is intentional because\n /// _approve() and transferFrom() are used together for putting Kitties on auction, and\n /// there is no value in spamming the log with Approval events in that case.\n function _approve(uint256 _tokenId, address _approved) internal {\n kittyIndexToApproved[_tokenId] = _approved;\n }\n\n /// @notice Returns the number of Kitties owned by a specific address.\n /// @param _owner The owner address to check.\n /// @dev Required for ERC-721 compliance\n function balanceOf(address _owner) public view returns (uint256 count) {\n return ownershipTokenCount[_owner];\n }\n\n /// @notice Transfers a Kitty to another address. If transferring to a smart\n /// contract be VERY CAREFUL to ensure that it is aware of ERC-721 (or\n /// CryptoKitties specifically) or your Kitty may be lost forever. Seriously.\n /// @param _to The address of the recipient, can be a user or contract.\n /// @param _tokenId The ID of the Kitty to transfer.\n /// @dev Required for ERC-721 compliance.\n function transfer(\n address _to,\n uint256 _tokenId\n )\n external\n whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Disallow transfers to the auction contracts to prevent accidental\n // misuse. Auction contracts should only take ownership of kitties\n // through the allow + transferFrom flow.\n require(_to != address(saleAuction));\n require(_to != address(siringAuction));\n\n // You can only send your own cat.\n require(_owns(msg.sender, _tokenId));\n\n // Reassign ownership, clear pending approvals, emit Transfer event.\n _transfer(msg.sender, _to, _tokenId);\n }\n\n /// @notice Grant another address the right to transfer a specific Kitty via\n /// transferFrom(). This is the preferred flow for transfering NFTs to contracts.\n /// @param _to The address to be granted transfer approval. Pass address(0) to\n /// clear all approvals.\n /// @param _tokenId The ID of the Kitty that can be transferred if this call succeeds.\n /// @dev Required for ERC-721 compliance.\n function approve(\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Only an owner can grant transfer approval.\n require(_owns(msg.sender, _tokenId));\n\n // Register the approval (replacing any previous approval).\n _approve(_tokenId, _to);\n\n // Emit approval event.\n Approval(msg.sender, _to, _tokenId);\n }\n\n /// @notice Transfer a Kitty owned by another address, for which the calling address\n /// has previously been granted transfer approval by the owner.\n /// @param _from The address that owns the Kitty to be transfered.\n /// @param _to The address that should take ownership of the Kitty. Can be any address,\n /// including the caller.\n /// @param _tokenId The ID of the Kitty to be transferred.\n /// @dev Required for ERC-721 compliance.\n function transferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Check for approval and valid ownership\n require(_approvedFor(msg.sender, _tokenId));\n require(_owns(_from, _tokenId));\n\n // Reassign ownership (also clears pending approvals and emits Transfer event).\n _transfer(_from, _to, _tokenId);\n }\n\n /// @notice Returns the total number of Kitties currently in existence.\n /// @dev Required for ERC-721 compliance.\n function totalSupply() public view returns (uint) {\n return kitties.length - 1;\n }\n\n /// @notice Returns the address currently assigned ownership of a given Kitty.\n /// @dev Required for ERC-721 compliance.\n function ownerOf(uint256 _tokenId)\n external\n view\n returns (address owner)\n {\n owner = kittyIndexToOwner[_tokenId];\n\n require(owner != address(0));\n }\n\n /// @notice Returns a list of all Kitty IDs assigned to an address.\n /// @param _owner The owner whose Kitties we are interested in.\n /// @dev This method MUST NEVER be called by smart contract code. First, it's fairly\n /// expensive (it walks the entire Kitty array looking for cats belonging to owner),\n /// but it also returns a dynamic array, which is only supported for web3 calls, and\n /// not contract-to-contract calls.\n function tokensOfOwner(address _owner) external view returns(uint256[] ownerTokens) {\n uint256 tokenCount = balanceOf(_owner);\n\n if (tokenCount == 0) {\n // Return an empty array\n return new uint256[](0);\n } else {\n uint256[] memory result = new uint256[](tokenCount);\n uint256 totalCats = totalSupply();\n uint256 resultIndex = 0;\n\n // We count on the fact that all cats have IDs starting at 1 and increasing\n // sequentially up to the totalCat count.\n uint256 catId;\n\n for (catId = 1; catId <= totalCats; catId++) {\n if (kittyIndexToOwner[catId] == _owner) {\n result[resultIndex] = catId;\n resultIndex++;\n }\n }\n\n return result;\n }\n }\n\n /// @dev Adapted from memcpy() by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _memcpy(uint _dest, uint _src, uint _len) private view {\n // Copy word-length chunks while possible\n for(; _len >= 32; _len -= 32) {\n assembly {\n mstore(_dest, mload(_src))\n }\n _dest += 32;\n _src += 32;\n }\n\n // Copy remaining bytes\n uint256 mask = 256 ** (32 - _len) - 1;\n assembly {\n let srcpart := and(mload(_src), not(mask))\n let destpart := and(mload(_dest), mask)\n mstore(_dest, or(destpart, srcpart))\n }\n }\n\n /// @dev Adapted from toString(slice) by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _toString(bytes32[4] _rawBytes, uint256 _stringLength) private view returns (string) {\n var outputString = new string(_stringLength);\n uint256 outputPtr;\n uint256 bytesPtr;\n\n assembly {\n outputPtr := add(outputString, 32)\n bytesPtr := _rawBytes\n }\n\n _memcpy(outputPtr, bytesPtr, _stringLength);\n\n return outputString;\n }\n\n /// @notice Returns a URI pointing to a metadata package for this token conforming to\n /// ERC-721 (https://github.com/ethereum/EIPs/issues/721)\n /// @param _tokenId The ID number of the Kitty whose metadata should be returned.\n function tokenMetadata(uint256 _tokenId, string _preferredTransport) external view returns (string infoUrl) {\n require(erc721Metadata != address(0));\n bytes32[4] memory buffer;\n uint256 count;\n (buffer, count) = erc721Metadata.getMetadata(_tokenId, _preferredTransport);\n\n return _toString(buffer, count);\n }\n}\n\n\n\n/// @title A facet of KittyCore that manages Kitty siring, gestation, and birth.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBreeding is KittyOwnership {\n\n /// @dev The Pregnant event is fired when two cats successfully breed and the pregnancy\n /// timer begins for the matron.\n event Pregnant(address owner, uint256 matronId, uint256 sireId, uint256 cooldownEndBlock);\n\n /// @notice The minimum payment required to use breedWithAuto(). This fee goes towards\n /// the gas cost paid by whatever calls giveBirth(), and can be dynamically updated by\n /// the COO role as the gas price changes.\n uint256 public autoBirthFee = 2 finney;\n\n // Keeps track of number of pregnant kitties.\n uint256 public pregnantKitties;\n\n /// @dev The address of the sibling contract that is used to implement the sooper-sekret\n /// genetic combination algorithm.\n GeneScienceInterface public geneScience;\n\n /// @dev Update the address of the genetic contract, can only be called by the CEO.\n /// @param _address An address of a GeneScience contract instance to be used from this point forward.\n function setGeneScienceAddress(address _address) external onlyCEO {\n GeneScienceInterface candidateContract = GeneScienceInterface(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isGeneScience());\n\n // Set the new contract address\n geneScience = candidateContract;\n }\n\n /// @dev Checks that a given kitten is able to breed. Requires that the\n /// current cooldown is finished (for sires) and also checks that there is\n /// no pending pregnancy.\n function _isReadyToBreed(Kitty _kit) internal view returns (bool) {\n // In addition to checking the cooldownEndBlock, we also need to check to see if\n // the cat has a pending birth; there can be some period of time between the end\n // of the pregnacy timer and the birth event.\n return (_kit.siringWithId == 0) && (_kit.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @dev Check if a sire has authorized breeding with this matron. True if both sire\n /// and matron have the same owner, or if the sire has given siring permission to\n /// the matron's owner (via approveSiring()).\n function _isSiringPermitted(uint256 _sireId, uint256 _matronId) internal view returns (bool) {\n address matronOwner = kittyIndexToOwner[_matronId];\n address sireOwner = kittyIndexToOwner[_sireId];\n\n // Siring is okay if they have same owner, or if the matron's owner was given\n // permission to breed with this sire.\n return (matronOwner == sireOwner || sireAllowedToAddress[_sireId] == matronOwner);\n }\n\n /// @dev Set the cooldownEndTime for the given Kitty, based on its current cooldownIndex.\n /// Also increments the cooldownIndex (unless it has hit the cap).\n /// @param _kitten A reference to the Kitty in storage which needs its timer started.\n function _triggerCooldown(Kitty storage _kitten) internal {\n // Compute an estimation of the cooldown time in blocks (based on current cooldownIndex).\n _kitten.cooldownEndBlock = uint64((cooldowns[_kitten.cooldownIndex]/secondsPerBlock) + block.number);\n\n // Increment the breeding count, clamping it at 13, which is the length of the\n // cooldowns array. We could check the array size dynamically, but hard-coding\n // this as a constant saves gas. Yay, Solidity!\n if (_kitten.cooldownIndex < 13) {\n _kitten.cooldownIndex += 1;\n }\n }\n\n /// @notice Grants approval to another user to sire with one of your Kitties.\n /// @param _addr The address that will be able to sire with your Kitty. Set to\n /// address(0) to clear all siring approvals for this Kitty.\n /// @param _sireId A Kitty that you own that _addr will now be able to sire with.\n function approveSiring(address _addr, uint256 _sireId)\n external\n whenNotPaused\n {\n require(_owns(msg.sender, _sireId));\n sireAllowedToAddress[_sireId] = _addr;\n }\n\n /// @dev Updates the minimum payment required for calling giveBirthAuto(). Can only\n /// be called by the COO address. (This fee is used to offset the gas cost incurred\n /// by the autobirth daemon).\n function setAutoBirthFee(uint256 val) external onlyCOO {\n autoBirthFee = val;\n }\n\n /// @dev Checks to see if a given Kitty is pregnant and (if so) if the gestation\n /// period has passed.\n function _isReadyToGiveBirth(Kitty _matron) private view returns (bool) {\n return (_matron.siringWithId != 0) && (_matron.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @notice Checks that a given kitten is able to breed (i.e. it is not pregnant or\n /// in the middle of a siring cooldown).\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isReadyToBreed(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n Kitty storage kit = kitties[_kittyId];\n return _isReadyToBreed(kit);\n }\n\n /// @dev Checks whether a kitty is currently pregnant.\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isPregnant(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n // A kitty is pregnant if and only if this field is set\n return kitties[_kittyId].siringWithId != 0;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair. DOES NOT\n /// check ownership permissions (that is up to the caller).\n /// @param _matron A reference to the Kitty struct of the potential matron.\n /// @param _matronId The matron's ID.\n /// @param _sire A reference to the Kitty struct of the potential sire.\n /// @param _sireId The sire's ID\n function _isValidMatingPair(\n Kitty storage _matron,\n uint256 _matronId,\n Kitty storage _sire,\n uint256 _sireId\n )\n private\n view\n returns(bool)\n {\n // A Kitty can't breed with itself!\n if (_matronId == _sireId) {\n return false;\n }\n\n // Kitties can't breed with their parents.\n if (_matron.matronId == _sireId || _matron.sireId == _sireId) {\n return false;\n }\n if (_sire.matronId == _matronId || _sire.sireId == _matronId) {\n return false;\n }\n\n // We can short circuit the sibling check (below) if either cat is\n // gen zero (has a matron ID of zero).\n if (_sire.matronId == 0 || _matron.matronId == 0) {\n return true;\n }\n\n // Kitties can't breed with full or half siblings.\n if (_sire.matronId == _matron.matronId || _sire.matronId == _matron.sireId) {\n return false;\n }\n if (_sire.sireId == _matron.matronId || _sire.sireId == _matron.sireId) {\n return false;\n }\n\n // Everything seems cool! Let's get DTF.\n return true;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair for\n /// breeding via auction (i.e. skips ownership and siring approval checks).\n function _canBreedWithViaAuction(uint256 _matronId, uint256 _sireId)\n internal\n view\n returns (bool)\n {\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId);\n }\n\n /// @notice Checks to see if two cats can breed together, including checks for\n /// ownership and siring approvals. Does NOT check that both cats are ready for\n /// breeding (i.e. breedWith could still fail until the cooldowns are finished).\n /// TODO: Shouldn't this check pregnancy and cooldowns?!?\n /// @param _matronId The ID of the proposed matron.\n /// @param _sireId The ID of the proposed sire.\n function canBreedWith(uint256 _matronId, uint256 _sireId)\n external\n view\n returns(bool)\n {\n require(_matronId > 0);\n require(_sireId > 0);\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId) &&\n _isSiringPermitted(_sireId, _matronId);\n }\n\n /// @dev Internal utility function to initiate breeding, assumes that all breeding\n /// requirements have been checked.\n function _breedWith(uint256 _matronId, uint256 _sireId) internal {\n // Grab a reference to the Kitties from storage.\n Kitty storage sire = kitties[_sireId];\n Kitty storage matron = kitties[_matronId];\n\n // Mark the matron as pregnant, keeping track of who the sire is.\n matron.siringWithId = uint32(_sireId);\n\n // Trigger the cooldown for both parents.\n _triggerCooldown(sire);\n _triggerCooldown(matron);\n\n // Clear siring permission for both parents. This may not be strictly necessary\n // but it's likely to avoid confusion!\n delete sireAllowedToAddress[_matronId];\n delete sireAllowedToAddress[_sireId];\n\n // Every time a kitty gets pregnant, counter is incremented.\n pregnantKitties++;\n\n // Emit the pregnancy event.\n Pregnant(kittyIndexToOwner[_matronId], _matronId, _sireId, matron.cooldownEndBlock);\n }\n\n /// @notice Breed a Kitty you own (as matron) with a sire that you own, or for which you\n /// have previously been given Siring approval. Will either make your cat pregnant, or will\n /// fail entirely. Requires a pre-payment of the fee given out to the first caller of giveBirth()\n /// @param _matronId The ID of the Kitty acting as matron (will end up pregnant if successful)\n /// @param _sireId The ID of the Kitty acting as sire (will begin its siring cooldown if successful)\n function breedWithAuto(uint256 _matronId, uint256 _sireId)\n external\n payable\n whenNotPaused\n {\n // Checks for payment.\n require(msg.value >= autoBirthFee);\n\n // Caller must own the matron.\n require(_owns(msg.sender, _matronId));\n\n // Neither sire nor matron are allowed to be on auction during a normal\n // breeding operation, but we don't need to check that explicitly.\n // For matron: The caller of this function can't be the owner of the matron\n // because the owner of a Kitty on auction is the auction house, and the\n // auction house will never call breedWith().\n // For sire: Similarly, a sire on auction will be owned by the auction house\n // and the act of transferring ownership will have cleared any oustanding\n // siring approval.\n // Thus we don't need to spend gas explicitly checking to see if either cat\n // is on auction.\n\n // Check that matron and sire are both owned by caller, or that the sire\n // has given siring permission to caller (i.e. matron's owner).\n // Will fail for _sireId = 0\n require(_isSiringPermitted(_sireId, _matronId));\n\n // Grab a reference to the potential matron\n Kitty storage matron = kitties[_matronId];\n\n // Make sure matron isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(matron));\n\n // Grab a reference to the potential sire\n Kitty storage sire = kitties[_sireId];\n\n // Make sure sire isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(sire));\n\n // Test that these cats are a valid mating pair.\n require(_isValidMatingPair(\n matron,\n _matronId,\n sire,\n _sireId\n ));\n\n // All checks passed, kitty gets pregnant!\n _breedWith(_matronId, _sireId);\n }\n\n /// @notice Have a pregnant Kitty give birth!\n /// @param _matronId A Kitty ready to give birth.\n /// @return The Kitty ID of the new kitten.\n /// @dev Looks at a given Kitty and, if pregnant and if the gestation period has passed,\n /// combines the genes of the two parents to create a new kitten. The new Kitty is assigned\n /// to the current owner of the matron. Upon successful completion, both the matron and the\n /// new kitten will be ready to breed again. Note that anyone can call this function (if they\n /// are willing to pay the gas!), but the new kitten always goes to the mother's owner.\n function giveBirth(uint256 _matronId)\n external\n whenNotPaused\n returns(uint256)\n {\n // Grab a reference to the matron in storage.\n Kitty storage matron = kitties[_matronId];\n\n // Check that the matron is a valid cat.\n require(matron.birthTime != 0);\n\n // Check that the matron is pregnant, and that its time has come!\n require(_isReadyToGiveBirth(matron));\n\n // Grab a reference to the sire in storage.\n uint256 sireId = matron.siringWithId;\n Kitty storage sire = kitties[sireId];\n\n // Determine the higher generation number of the two parents\n uint16 parentGen = matron.generation;\n if (sire.generation > matron.generation) {\n parentGen = sire.generation;\n }\n\n // Call the sooper-sekret gene mixing operation.\n uint256 childGenes = geneScience.mixGenes(matron.genes, sire.genes, matron.cooldownEndBlock - 1);\n\n // Make the new kitten!\n address owner = kittyIndexToOwner[_matronId];\n uint256 kittenId = _createKitty(_matronId, matron.siringWithId, parentGen + 1, childGenes, owner);\n\n // Clear the reference to sire from the matron (REQUIRED! Having siringWithId\n // set is what marks a matron as being pregnant.)\n delete matron.siringWithId;\n\n // Every time a kitty gives birth counter is decremented.\n pregnantKitties--;\n\n // Send the balance fee to the person who made birth happen.\n msg.sender.send(autoBirthFee);\n\n // return the new kitten's ID\n return kittenId;\n }\n}\n\n\n\n\n\n\n\n\n\n\n/// @title Auction Core\n/// @dev Contains models, variables, and internal methods for the auction.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuctionBase {\n\n // Represents an auction on an NFT\n struct Auction {\n // Current owner of NFT\n address seller;\n // Price (in wei) at beginning of auction\n uint128 startingPrice;\n // Price (in wei) at end of auction\n uint128 endingPrice;\n // Duration (in seconds) of auction\n uint64 duration;\n // Time when auction started\n // NOTE: 0 if this auction has been concluded\n uint64 startedAt;\n }\n\n // Reference to contract tracking NFT ownership\n KittiesERC721 public nonFungibleContract;\n\n // Cut owner takes on each auction, measured in basis points (1/100 of a percent).\n // Values 0-10,000 map to 0%-100%\n uint256 public ownerCut;\n\n // Map from token ID to their corresponding auction.\n mapping (uint256 => Auction) tokenIdToAuction;\n\n event AuctionCreated(uint256 tokenId, uint256 startingPrice, uint256 endingPrice, uint256 duration);\n event AuctionSuccessful(uint256 tokenId, uint256 totalPrice, address winner);\n event AuctionCancelled(uint256 tokenId);\n\n /// @dev Returns true if the claimant owns the token.\n /// @param _claimant - Address claiming to own the token.\n /// @param _tokenId - ID of token whose ownership to verify.\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return (nonFungibleContract.ownerOf(_tokenId) == _claimant);\n }\n\n /// @dev Escrows the NFT, assigning ownership to this contract.\n /// Throws if the escrow fails.\n /// @param _owner - Current owner address of token to escrow.\n /// @param _tokenId - ID of token whose approval to verify.\n function _escrow(address _owner, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transferFrom(_owner, this, _tokenId);\n }\n\n /// @dev Transfers an NFT owned by this contract to another address.\n /// Returns true if the transfer succeeds.\n /// @param _receiver - Address to transfer NFT to.\n /// @param _tokenId - ID of token to transfer.\n function _transfer(address _receiver, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transfer(_receiver, _tokenId);\n }\n\n /// @dev Adds an auction to the list of open auctions. Also fires the\n /// AuctionCreated event.\n /// @param _tokenId The ID of the token to be put on auction.\n /// @param _auction Auction to add.\n function _addAuction(uint256 _tokenId, Auction _auction) internal {\n // Require that all auctions have a duration of\n // at least one minute. (Keeps our math from getting hairy!)\n require(_auction.duration >= 1 minutes);\n\n tokenIdToAuction[_tokenId] = _auction;\n\n AuctionCreated(\n uint256(_tokenId),\n uint256(_auction.startingPrice),\n uint256(_auction.endingPrice),\n uint256(_auction.duration)\n );\n }\n\n /// @dev Cancels an auction unconditionally.\n function _cancelAuction(uint256 _tokenId, address _seller) internal {\n _removeAuction(_tokenId);\n _transfer(_seller, _tokenId);\n AuctionCancelled(_tokenId);\n }\n\n /// @dev Computes the price and transfers winnings.\n /// Does NOT transfer ownership of token.\n function _bid(uint256 _tokenId, uint256 _bidAmount)\n internal\n returns (uint256)\n {\n // Get a reference to the auction struct\n Auction storage auction = tokenIdToAuction[_tokenId];\n\n // Explicitly check that this auction is currently live.\n // (Because of how Ethereum mappings work, we can't just count\n // on the lookup above failing. An invalid _tokenId will just\n // return an auction object that is all zeros.)\n require(_isOnAuction(auction));\n\n // Check that the bid is greater than or equal to the current price\n uint256 price = _currentPrice(auction);\n require(_bidAmount >= price);\n\n // Grab a reference to the seller before the auction struct\n // gets deleted.\n address seller = auction.seller;\n\n // The bid is good! Remove the auction before sending the fees\n // to the sender so we can't have a reentrancy attack.\n _removeAuction(_tokenId);\n\n // Transfer proceeds to seller (if there are any!)\n if (price > 0) {\n // Calculate the auctioneer's cut.\n // (NOTE: _computeCut() is guaranteed to return a\n // value <= price, so this subtraction can't go negative.)\n uint256 auctioneerCut = _computeCut(price);\n uint256 sellerProceeds = price - auctioneerCut;\n\n // NOTE: Doing a transfer() in the middle of a complex\n // method like this is generally discouraged because of\n // reentrancy attacks and DoS attacks if the seller is\n // a contract with an invalid fallback function. We explicitly\n // guard against reentrancy attacks by removing the auction\n // before calling transfer(), and the only thing the seller\n // can DoS is the sale of their own asset! (And if it's an\n // accident, they can call cancelAuction(). )\n seller.transfer(sellerProceeds);\n }\n\n // Calculate any excess funds included with the bid. If the excess\n // is anything worth worrying about, transfer it back to bidder.\n // NOTE: We checked above that the bid amount is greater than or\n // equal to the price so this cannot underflow.\n uint256 bidExcess = _bidAmount - price;\n\n // Return the funds. Similar to the previous transfer, this is\n // not susceptible to a re-entry attack because the auction is\n // removed before any transfers occur.\n msg.sender.transfer(bidExcess);\n\n // Tell the world!\n AuctionSuccessful(_tokenId, price, msg.sender);\n\n return price;\n }\n\n /// @dev Removes an auction from the list of open auctions.\n /// @param _tokenId - ID of NFT on auction.\n function _removeAuction(uint256 _tokenId) internal {\n delete tokenIdToAuction[_tokenId];\n }\n\n /// @dev Returns true if the NFT is on auction.\n /// @param _auction - Auction to check.\n function _isOnAuction(Auction storage _auction) internal view returns (bool) {\n return (_auction.startedAt > 0);\n }\n\n /// @dev Returns current price of an NFT on auction. Broken into two\n /// functions (this one, that computes the duration from the auction\n /// structure, and the other that does the price computation) so we\n /// can easily test that the price computation works correctly.\n function _currentPrice(Auction storage _auction)\n internal\n view\n returns (uint256)\n {\n uint256 secondsPassed = 0;\n\n // A bit of insurance against negative values (or wraparound).\n // Probably not necessary (since Ethereum guarnatees that the\n // now variable doesn't ever go backwards).\n if (now > _auction.startedAt) {\n secondsPassed = now - _auction.startedAt;\n }\n\n return _computeCurrentPrice(\n _auction.startingPrice,\n _auction.endingPrice,\n _auction.duration,\n secondsPassed\n );\n }\n\n /// @dev Computes the current price of an auction. Factored out\n /// from _currentPrice so we can run extensive unit tests.\n /// When testing, make this function public and turn on\n /// `Current price computation` test suite.\n function _computeCurrentPrice(\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n uint256 _secondsPassed\n )\n internal\n pure\n returns (uint256)\n {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our public functions carefully cap the maximum values for\n // time (at 64-bits) and currency (at 128-bits). _duration is\n // also known to be non-zero (see the require() statement in\n // _addAuction())\n if (_secondsPassed >= _duration) {\n // We've reached the end of the dynamic pricing portion\n // of the auction, just return the end price.\n return _endingPrice;\n } else {\n // Starting price can be higher than ending price (and often is!), so\n // this delta can be negative.\n int256 totalPriceChange = int256(_endingPrice) - int256(_startingPrice);\n\n // This multiplication can't overflow, _secondsPassed will easily fit within\n // 64-bits, and totalPriceChange will easily fit within 128-bits, their product\n // will always fit within 256-bits.\n int256 currentPriceChange = totalPriceChange * int256(_secondsPassed) / int256(_duration);\n\n // currentPriceChange can be negative, but if so, will have a magnitude\n // less that _startingPrice. Thus, this result will always end up positive.\n int256 currentPrice = int256(_startingPrice) + currentPriceChange;\n\n return uint256(currentPrice);\n }\n }\n\n /// @dev Computes owner's cut of a sale.\n /// @param _price - Sale price of NFT.\n function _computeCut(uint256 _price) internal view returns (uint256) {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our entry functions carefully cap the maximum values for\n // currency (at 128-bits), and ownerCut <= 10000 (see the require()\n // statement in the ClockAuction constructor). The result of this\n // function is always guaranteed to be <= _price.\n return _price * ownerCut / 10000;\n }\n\n}\n\n\n\n\n\n\n\n/**\n * @title KittiesPausable\n * @dev Base contract which allows children to implement an emergency stop mechanism.\n */\ncontract KittiesPausable is KittiesOwnable {\n event Pause();\n event Unpause();\n\n bool public paused = false;\n\n\n /**\n\t * @dev modifier to allow actions only when the contract IS paused\n\t */\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /**\n\t * @dev modifier to allow actions only when the contract IS NOT paused\n\t */\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /**\n\t * @dev called by the owner to pause, triggers stopped state\n\t */\n function pause() onlyOwner whenNotPaused returns (bool) {\n paused = true;\n Pause();\n return true;\n }\n\n /**\n\t * @dev called by the owner to unpause, returns to normal state\n\t */\n function unpause() onlyOwner whenPaused returns (bool) {\n paused = false;\n Unpause();\n return true;\n }\n}\n\n\n/// @title Clock auction for non-fungible tokens.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuction is KittiesPausable, ClockAuctionBase {\n\n /// @dev The ERC-165 interface signature for ERC-721.\n /// Ref: https://github.com/ethereum/EIPs/issues/165\n /// Ref: https://github.com/ethereum/EIPs/issues/721\n bytes4 constant InterfaceSignature_ERC721 = bytes4(0x9a20483d);\n\n /// @dev Constructor creates a reference to the NFT ownership contract\n /// and verifies the owner cut is in the valid range.\n /// @param _nftAddress - address of a deployed contract implementing\n /// the Nonfungible Interface.\n /// @param _cut - percent cut the owner takes on each auction, must be\n /// between 0-10,000.\n function ClockAuction(address _nftAddress, uint256 _cut) public {\n require(_cut <= 10000);\n ownerCut = _cut;\n\n KittiesERC721 candidateContract = KittiesERC721(_nftAddress);\n require(candidateContract.supportsInterface(InterfaceSignature_ERC721));\n nonFungibleContract = candidateContract;\n }\n\n /// @dev Remove all Ether from the contract, which is the owner's cuts\n /// as well as any Ether sent directly to the contract address.\n /// Always transfers to the NFT contract, but can be called either by\n /// the owner or the NFT contract.\n function withdrawBalance() external {\n address nftAddress = address(nonFungibleContract);\n\n require(\n msg.sender == owner ||\n msg.sender == nftAddress\n );\n // We are using this boolean method to make sure that even if one fails it will still work\n bool res = nftAddress.send(this.balance);\n }\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of time to move between starting\n /// price and ending price (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n whenNotPaused\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(_owns(msg.sender, _tokenId));\n _escrow(msg.sender, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Bids on an open auction, completing the auction and transferring\n /// ownership of the NFT if enough Ether is supplied.\n /// @param _tokenId - ID of token to bid on.\n function bid(uint256 _tokenId)\n external\n payable\n whenNotPaused\n {\n // _bid will throw if the bid or funds transfer fails\n _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n }\n\n /// @dev Cancels an auction that hasn't been won yet.\n /// Returns the NFT to original owner.\n /// @notice This is a state-modifying function that can\n /// be called while the contract is paused.\n /// @param _tokenId - ID of token on auction\n function cancelAuction(uint256 _tokenId)\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n address seller = auction.seller;\n require(msg.sender == seller);\n _cancelAuction(_tokenId, seller);\n }\n\n /// @dev Cancels an auction when the contract is paused.\n /// Only the owner may do this, and NFTs are returned to\n /// the seller. This should only be used in emergencies.\n /// @param _tokenId - ID of the NFT on auction to cancel.\n function cancelAuctionWhenPaused(uint256 _tokenId)\n whenPaused\n onlyOwner\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n _cancelAuction(_tokenId, auction.seller);\n }\n\n /// @dev Returns auction info for an NFT on auction.\n /// @param _tokenId - ID of NFT on auction.\n function getAuction(uint256 _tokenId)\n external\n view\n returns\n (\n address seller,\n uint256 startingPrice,\n uint256 endingPrice,\n uint256 duration,\n uint256 startedAt\n ) {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return (\n auction.seller,\n auction.startingPrice,\n auction.endingPrice,\n auction.duration,\n auction.startedAt\n );\n }\n\n /// @dev Returns the current price of an auction.\n /// @param _tokenId - ID of the token price we are checking.\n function getCurrentPrice(uint256 _tokenId)\n external\n view\n returns (uint256)\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return _currentPrice(auction);\n }\n\n}\n\n\n/// @title Reverse auction modified for siring\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SiringClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSiringAuctionAddress() call.\n bool public isSiringClockAuction = true;\n\n // Delegate constructor\n function SiringClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction. Since this function is wrapped,\n /// require sender to be KittyCore contract.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Places a bid for siring. Requires the sender\n /// is the KittyCore contract because all bid methods\n /// should be wrapped. Also returns the kitty to the\n /// seller rather than the winner.\n function bid(uint256 _tokenId)\n external\n payable\n {\n require(msg.sender == address(nonFungibleContract));\n address seller = tokenIdToAuction[_tokenId].seller;\n // _bid checks that token ID is valid and will throw if bid fails\n _bid(_tokenId, msg.value);\n // We transfer the kitty back to the seller, the winner will get\n // the offspring\n _transfer(seller, _tokenId);\n }\n\n}\n\n\n\n\n\n/// @title Clock auction modified for sale of kitties\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SaleClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSaleAuctionAddress() call.\n bool public isSaleClockAuction = true;\n\n // Tracks last 5 sale price of gen0 kitty sales\n uint256 public gen0SaleCount;\n uint256[5] public lastGen0SalePrices;\n\n // Delegate constructor\n function SaleClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Updates lastSalePrice if seller is the nft contract\n /// Otherwise, works the same as default bid method.\n function bid(uint256 _tokenId)\n external\n payable\n {\n // _bid verifies token ID size\n address seller = tokenIdToAuction[_tokenId].seller;\n uint256 price = _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n\n // If not a gen0 auction, exit\n if (seller == address(nonFungibleContract)) {\n // Track gen0 sale prices\n lastGen0SalePrices[gen0SaleCount % 5] = price;\n gen0SaleCount++;\n }\n }\n\n function averageGen0SalePrice() external view returns (uint256) {\n uint256 sum = 0;\n for (uint256 i = 0; i < 5; i++) {\n sum += lastGen0SalePrices[i];\n }\n return sum / 5;\n }\n\n}\n\n\n/// @title Handles creating auctions for sale and siring of kitties.\n/// This wrapper of ReverseAuction exists only so that users can create\n/// auctions with only one transaction.\ncontract KittyAuction is KittyBreeding {\n\n // @notice The auction contract variables are defined in KittyBase to allow\n // us to refer to them in KittyOwnership to prevent accidental transfers.\n // `saleAuction` refers to the auction for gen0 and p2p sale of kitties.\n // `siringAuction` refers to the auction for siring rights of kitties.\n\n /// @dev Sets the reference to the sale auction.\n /// @param _address - Address of sale contract.\n function setSaleAuctionAddress(address _address) external onlyCEO {\n SaleClockAuction candidateContract = SaleClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSaleClockAuction());\n\n // Set the new contract address\n saleAuction = candidateContract;\n }\n\n /// @dev Sets the reference to the siring auction.\n /// @param _address - Address of siring contract.\n function setSiringAuctionAddress(address _address) external onlyCEO {\n SiringClockAuction candidateContract = SiringClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSiringClockAuction());\n\n // Set the new contract address\n siringAuction = candidateContract;\n }\n\n /// @dev Put a kitty up for auction.\n /// Does some ownership trickery to create auctions in one tx.\n function createSaleAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n // Ensure the kitty is not pregnant to prevent the auction\n // contract accidentally receiving ownership of the child.\n // NOTE: the kitty IS allowed to be in a cooldown.\n require(!isPregnant(_kittyId));\n _approve(_kittyId, saleAuction);\n // Sale auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n saleAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Put a kitty up for auction to be sire.\n /// Performs checks to ensure the kitty can be sired, then\n /// delegates to reverse auction.\n function createSiringAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n require(isReadyToBreed(_kittyId));\n _approve(_kittyId, siringAuction);\n // Siring auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n siringAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Completes a siring auction by bidding.\n /// Immediately breeds the winning matron with the sire on auction.\n /// @param _sireId - ID of the sire on auction.\n /// @param _matronId - ID of the matron owned by the bidder.\n function bidOnSiringAuction(\n uint256 _sireId,\n uint256 _matronId\n )\n external\n payable\n whenNotPaused\n {\n // Auction contract checks input sizes\n require(_owns(msg.sender, _matronId));\n require(isReadyToBreed(_matronId));\n require(_canBreedWithViaAuction(_matronId, _sireId));\n\n // Define the current price of the auction.\n uint256 currentPrice = siringAuction.getCurrentPrice(_sireId);\n require(msg.value >= currentPrice + autoBirthFee);\n\n // Siring auction will throw if the bid fails.\n siringAuction.bid.value(msg.value - autoBirthFee)(_sireId);\n _breedWith(uint32(_matronId), uint32(_sireId));\n }\n\n /// @dev Transfers the balance of the sale auction contract\n /// to the KittyCore contract. We use two-step withdrawal to\n /// prevent two transfer calls in the auction bid function.\n function withdrawAuctionBalances() external onlyCLevel {\n saleAuction.withdrawBalance();\n siringAuction.withdrawBalance();\n }\n}\n\n\n/// @title all functions related to creating kittens\ncontract KittyMinting is KittyAuction {\n\n // Limits the number of cats the contract owner can ever create.\n uint256 public constant PROMO_CREATION_LIMIT = 5000;\n uint256 public constant GEN0_CREATION_LIMIT = 45000;\n\n // Constants for gen0 auctions.\n uint256 public constant GEN0_STARTING_PRICE = 10 finney;\n uint256 public constant GEN0_AUCTION_DURATION = 1 days;\n\n // Counts the number of cats the contract owner has created.\n uint256 public promoCreatedCount;\n uint256 public gen0CreatedCount;\n\n /// @dev we can create promo kittens, up to a limit. Only callable by COO\n /// @param _genes the encoded genes of the kitten to be created, any value is accepted\n /// @param _owner the future owner of the created kittens. Default to contract COO\n function createPromoKitty(uint256 _genes, address _owner) external onlyCOO {\n address kittyOwner = _owner;\n if (kittyOwner == address(0)) {\n kittyOwner = cooAddress;\n }\n require(promoCreatedCount < PROMO_CREATION_LIMIT);\n\n promoCreatedCount++;\n _createKitty(0, 0, 0, _genes, kittyOwner);\n }\n\n /// @dev Creates a new gen0 kitty with the given genes and\n /// creates an auction for it.\n function createGen0Auction(uint256 _genes) external onlyCOO {\n require(gen0CreatedCount < GEN0_CREATION_LIMIT);\n\n uint256 kittyId = _createKitty(0, 0, 0, _genes, address(this));\n _approve(kittyId, saleAuction);\n\n saleAuction.createAuction(\n kittyId,\n _computeNextGen0Price(),\n 0,\n GEN0_AUCTION_DURATION,\n address(this)\n );\n\n gen0CreatedCount++;\n }\n\n /// @dev Computes the next gen0 auction starting price, given\n /// the average of the past 5 prices + 50%.\n function _computeNextGen0Price() internal view returns (uint256) {\n uint256 avePrice = saleAuction.averageGen0SalePrice();\n\n // Sanity check to ensure we don't overflow arithmetic\n require(avePrice == uint256(uint128(avePrice)));\n\n uint256 nextPrice = avePrice + (avePrice / 2);\n\n // We never auction for less than starting price\n if (nextPrice < GEN0_STARTING_PRICE) {\n nextPrice = GEN0_STARTING_PRICE;\n }\n\n return nextPrice;\n }\n}\n\n\n/// @title CryptoKitties: Collectible, breedable, and oh-so-adorable cats on the Ethereum blockchain.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev The main CryptoKitties contract, keeps track of kittens so they don't wander around and get lost.\ncontract KittyCore is KittyMinting {\n\n // This is the main CryptoKitties contract. In order to keep our code seperated into logical sections,\n // we've broken it up in two ways. First, we have several seperately-instantiated sibling contracts\n // that handle auctions and our super-top-secret genetic combination algorithm. The auctions are\n // seperate since their logic is somewhat complex and there's always a risk of subtle bugs. By keeping\n // them in their own contracts, we can upgrade them without disrupting the main contract that tracks\n // kitty ownership. The genetic combination algorithm is kept seperate so we can open-source all of\n // the rest of our code without making it _too_ easy for folks to figure out how the genetics work.\n // Don't worry, I'm sure someone will reverse engineer it soon enough!\n //\n // Secondly, we break the core contract into multiple files using inheritence, one for each major\n // facet of functionality of CK. This allows us to keep related code bundled together while still\n // avoiding a single giant file with everything in it. The breakdown is as follows:\n //\n // - KittyBase: This is where we define the most fundamental code shared throughout the core\n // functionality. This includes our main data storage, constants and data types, plus\n // internal functions for managing these items.\n //\n // - KittyAccessControl: This contract manages the various addresses and constraints for operations\n // that can be executed only by specific roles. Namely CEO, CFO and COO.\n //\n // - KittyOwnership: This provides the methods required for basic non-fungible token\n // transactions, following the draft ERC-721 spec (https://github.com/ethereum/EIPs/issues/721).\n //\n // - KittyBreeding: This file contains the methods necessary to breed cats together, including\n // keeping track of siring offers, and relies on an external genetic combination contract.\n //\n // - KittyAuctions: Here we have the public methods for auctioning or bidding on cats or siring\n // services. The actual auction functionality is handled in two sibling contracts (one\n // for sales and one for siring), while auction creation and bidding is mostly mediated\n // through this facet of the core contract.\n //\n // - KittyMinting: This final facet contains the functionality we use for creating new gen0 cats.\n // We can make up to 5000 \"promo\" cats that can be given away (especially important when\n // the community is new), and all others can only be created and then immediately put up\n // for auction via an algorithmically determined starting price. Regardless of how they\n // are created, there is a hard limit of 50k gen0 cats. After that, it's all up to the\n // community to breed, breed, breed!\n\n // Set in case the core contract is broken and an upgrade is required\n address public newContractAddress;\n\n /// @notice Creates the main CryptoKitties smart contract instance.\n function KittyCore() public {\n // Starts paused.\n paused = true;\n\n // the creator of the contract is the initial CEO\n ceoAddress = msg.sender;\n\n // the creator of the contract is also the initial COO\n cooAddress = msg.sender;\n\n // start with the mythical kitten 0 - so we don't have generation-0 parent issues\n _createKitty(0, 0, 0, uint256(-1), address(0));\n }\n\n /// @dev Used to mark the smart contract as upgraded, in case there is a serious\n /// breaking bug. This method does nothing but keep track of the new contract and\n /// emit a message indicating that the new address is set. It's up to clients of this\n /// contract to update to the new contract address in that case. (This contract will\n /// be paused indefinitely if such an upgrade takes place.)\n /// @param _v2Address new address\n function setNewAddress(address _v2Address) external onlyCEO whenPaused {\n // See README.md for updgrade plan\n newContractAddress = _v2Address;\n ContractUpgrade(_v2Address);\n }\n\n /// @notice No tipping!\n /// @dev Reject all Ether from being sent here, unless it's from one of the\n /// two auction contracts. (Hopefully, we can prevent user accidents.)\n function() external payable {\n require(\n msg.sender == address(saleAuction) ||\n msg.sender == address(siringAuction)\n );\n }\n\n /// @notice Returns all the relevant information about a specific kitty.\n /// @param _id The ID of the kitty of interest.\n function getKitty(uint256 _id)\n external\n view\n returns (\n bool isGestating,\n bool isReady,\n uint256 cooldownIndex,\n uint256 nextActionAt,\n uint256 siringWithId,\n uint256 birthTime,\n uint256 matronId,\n uint256 sireId,\n uint256 generation,\n uint256 genes\n ) {\n Kitty storage kit = kitties[_id];\n\n // if this variable is 0 then it's not gestating\n isGestating = (kit.siringWithId != 0);\n isReady = (kit.cooldownEndBlock <= block.number);\n cooldownIndex = uint256(kit.cooldownIndex);\n nextActionAt = uint256(kit.cooldownEndBlock);\n siringWithId = uint256(kit.siringWithId);\n birthTime = uint256(kit.birthTime);\n matronId = uint256(kit.matronId);\n sireId = uint256(kit.sireId);\n generation = uint256(kit.generation);\n genes = kit.genes;\n }\n\n /// @dev Override unpause so it requires all external contract addresses\n /// to be set before contract can be unpaused. Also, we can't have\n /// newContractAddress set either, because then the contract was upgraded.\n /// @notice This is public rather than external so we can call super.unpause\n /// without using an expensive CALL.\n function unpause() public onlyCEO whenPaused {\n require(saleAuction != address(0));\n require(siringAuction != address(0));\n require(geneScience != address(0));\n require(newContractAddress == address(0));\n\n // Actually unpause the contract.\n super.unpause();\n }\n\n // @dev Allows the CFO to capture the balance available to the contract.\n function withdrawBalance() external onlyCFO {\n uint256 balance = this.balance;\n // Subtract all the currently pregnant kittens we have, plus 1 of margin.\n uint256 subtractFees = (pregnantKitties + 1) * autoBirthFee;\n\n if (balance > subtractFees) {\n cfoAddress.send(balance - subtractFees);\n }\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "exportedSymbols": { "ClockAuction": [ 8872 @@ -51683,5 +51683,5 @@ }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:47.655Z" + "updatedAt": "2018-10-09T17:45:35.863Z" } \ No newline at end of file diff --git a/artifacts/json/IncompatibleTermsContract.json b/artifacts/json/IncompatibleTermsContract.json index 891f195f..1fbdc41a 100644 --- a/artifacts/json/IncompatibleTermsContract.json +++ b/artifacts/json/IncompatibleTermsContract.json @@ -121,15 +121,15 @@ "type": "function" } ], - "bytecode": "0x6060604052341561000f57600080fd5b6102938061001e6000396000f30060606040526004361061006d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a896a1146100725780632762dd8c146100ad5780635f0280ba146100e8578063977a5e641461018d57806399114d84146101eb575b600080fd5b341561007d57600080fd5b61009760048080356000191690602001909190505061022f565b6040518082815260200191505060405180910390f35b34156100b857600080fd5b6100d2600480803560001916906020019091905050610239565b6040518082815260200191505060405180910390f35b34156100f357600080fd5b61017360048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610243565b604051808215151515815260200191505060405180910390f35b341561019857600080fd5b6101d160048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610251565b604051808215151515815260200191505060405180910390f35b34156101f657600080fd5b61021960048080356000191690602001909190803590602001909190505061025c565b6040518082815260200191505060405180910390f35b6000809050919050565b6000809050919050565b600080905095945050505050565b600080905092915050565b6000809050929150505600a165627a7a72305820f828956284b3469c869d4f46dddc071c3a378bca4d3d6aca9ec5e60ab8b00d0d0029", - "deployedBytecode": "0x60606040526004361061006d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a896a1146100725780632762dd8c146100ad5780635f0280ba146100e8578063977a5e641461018d57806399114d84146101eb575b600080fd5b341561007d57600080fd5b61009760048080356000191690602001909190505061022f565b6040518082815260200191505060405180910390f35b34156100b857600080fd5b6100d2600480803560001916906020019091905050610239565b6040518082815260200191505060405180910390f35b34156100f357600080fd5b61017360048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610243565b604051808215151515815260200191505060405180910390f35b341561019857600080fd5b6101d160048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610251565b604051808215151515815260200191505060405180910390f35b34156101f657600080fd5b61021960048080356000191690602001909190803590602001909190505061025c565b6040518082815260200191505060405180910390f35b6000809050919050565b6000809050919050565b600080905095945050505050565b600080905092915050565b6000809050929150505600a165627a7a72305820f828956284b3469c869d4f46dddc071c3a378bca4d3d6aca9ec5e60ab8b00d0d0029", + "bytecode": "0x6060604052341561000f57600080fd5b6102938061001e6000396000f30060606040526004361061006d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a896a1146100725780632762dd8c146100ad5780635f0280ba146100e8578063977a5e641461018d57806399114d84146101eb575b600080fd5b341561007d57600080fd5b61009760048080356000191690602001909190505061022f565b6040518082815260200191505060405180910390f35b34156100b857600080fd5b6100d2600480803560001916906020019091905050610239565b6040518082815260200191505060405180910390f35b34156100f357600080fd5b61017360048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610243565b604051808215151515815260200191505060405180910390f35b341561019857600080fd5b6101d160048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610251565b604051808215151515815260200191505060405180910390f35b34156101f657600080fd5b61021960048080356000191690602001909190803590602001909190505061025c565b6040518082815260200191505060405180910390f35b6000809050919050565b6000809050919050565b600080905095945050505050565b600080905092915050565b6000809050929150505600a165627a7a72305820c4bfd6f0bbdb820edb18acbc4375ad54a62a711c6e72e7da475dcf237dcdec3d0029", + "deployedBytecode": "0x60606040526004361061006d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a896a1146100725780632762dd8c146100ad5780635f0280ba146100e8578063977a5e641461018d57806399114d84146101eb575b600080fd5b341561007d57600080fd5b61009760048080356000191690602001909190505061022f565b6040518082815260200191505060405180910390f35b34156100b857600080fd5b6100d2600480803560001916906020019091905050610239565b6040518082815260200191505060405180910390f35b34156100f357600080fd5b61017360048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610243565b604051808215151515815260200191505060405180910390f35b341561019857600080fd5b6101d160048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610251565b604051808215151515815260200191505060405180910390f35b34156101f657600080fd5b61021960048080356000191690602001909190803590602001909190505061025c565b6040518082815260200191505060405180910390f35b6000809050919050565b6000809050919050565b600080905095945050505050565b600080905092915050565b6000809050929150505600a165627a7a72305820c4bfd6f0bbdb820edb18acbc4375ad54a62a711c6e72e7da475dcf237dcdec3d0029", "sourceMap": "867:3132:33:-;;;;;;;;;;;;;;;;;", "deployedSourceMap": "867:3132:33:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3726:144;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3876:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2377:258;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1500:166;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3244:201;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3726:144;3822:17;3862:1;3855:8;;3726:144;;;:::o;3876:121::-;3962:4;3989:1;3982:8;;3876:121;;;:::o;2377:258::-;2587:13;2623:5;2616:12;;2377:258;;;;;;;:::o;1500:166::-;1618:13;1654:5;1647:12;;1500:166;;;;:::o;3244:201::-;3386:28;3437:1;3430:8;;3244:201;;;;:::o", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\nimport \"../../TermsContract.sol\";\n\n\n/**\n * Contract created for testing purposes that will consistently reject\n * debt order fills that are mapped to it by returning `false` for\n * `registerTermStart`\n *\n * Author: Nadav Hollander Github: nadavhollander\n */\ncontract IncompatibleTermsContract is TermsContract {\n /// When called, the registerTermStart function registers the fact that\n /// the debt agreement has begun. Given that the SimpleInterestTermsContract\n /// doesn't rely on taking any sorts of actions when the loan term begins,\n /// we simply validate DebtKernel is the transaction sender, and return\n /// `true` if the debt agreement is associated with this terms contract.\n /// @param agreementId bytes32. The agreement id (issuance hash) of the debt agreement to which this pertains.\n /// @return _success bool. Acknowledgment of whether\n function registerTermStart(\n bytes32 agreementId,\n address debtor\n )\n public\n returns (bool _success)\n {\n return false;\n }\n\n /// When called, the registerRepayment function records the debtor's\n /// repayment, as well as any auxiliary metadata needed by the contract\n /// to determine ex post facto the value repaid (e.g. current USD\n /// exchange rate)\n /// @param agreementId bytes32. The agreement id (issuance hash) of the debt agreement to which this pertains.\n /// @param payer address. The address of the payer.\n /// @param beneficiary address. The address of the payment's beneficiary.\n /// @param unitsOfRepayment uint. The units-of-value repaid in the transaction.\n /// @param tokenAddress address. The address of the token with which the repayment transaction was executed.\n function registerRepayment(\n bytes32 agreementId,\n address payer,\n address beneficiary,\n uint256 unitsOfRepayment,\n address tokenAddress\n )\n public\n returns (bool _success)\n {\n return false;\n }\n\n /// Returns the cumulative units-of-value expected to be repaid given a block's timestamp.\n /// Note this is not a constant function -- this value can vary on basis of any number of\n /// conditions (e.g. interest rates can be renegotiated if repayments are delinquent).\n /// @param agreementId bytes32. The agreement id (issuance hash) of the debt agreement to which this pertains.\n /// @param timestamp uint. The timestamp for which repayment expectation is being queried.\n /// @return uint256 The cumulative units-of-value expected to be repaid given a block's timestamp.\n function getExpectedRepaymentValue(\n bytes32 agreementId,\n uint256 timestamp\n )\n public\n view\n returns (uint _expectedRepaymentValue)\n {\n return 0;\n }\n\n /// Returns the cumulative units-of-value repaid to date.\n /// @param agreementId bytes32. The agreement id (issuance hash) of the debt agreement to which this pertains.\n /// @return uint256 The cumulative units-of-value repaid by the specified block timestamp.\n function getValueRepaidToDate(bytes32 agreementId)\n public\n view\n returns (uint _valueRepaid)\n {\n return 0;\n }\n\n function getTermEndTimestamp(\n bytes32 _agreementId\n ) public view returns (uint)\n {\n return 0;\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/terms_contracts/IncompatibleTermsContract.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/terms_contracts/IncompatibleTermsContract.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/terms_contracts/IncompatibleTermsContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/terms_contracts/IncompatibleTermsContract.sol", "exportedSymbols": { "IncompatibleTermsContract": [ 12585 @@ -152,7 +152,7 @@ { "attributes": { "SourceUnit": 4758, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/TermsContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/TermsContract.sol", "file": "../../TermsContract.sol", "scope": 12586, "symbolAliases": [ @@ -987,7 +987,7 @@ "42": { "events": {}, "links": {}, - "address": "0x265f2abbf5a568df8ed31644204b011eac0c1886" + "address": "0xc8d55fd3717f8c3f8d31456504ab84b11b80520e" }, "70": { "events": {}, @@ -996,5 +996,5 @@ } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:13:36.849Z" + "updatedAt": "2018-10-09T17:50:25.365Z" } \ No newline at end of file diff --git a/artifacts/json/KittiesERC721.json b/artifacts/json/KittiesERC721.json index d60e343a..ad481d13 100644 --- a/artifacts/json/KittiesERC721.json +++ b/artifacts/json/KittiesERC721.json @@ -180,10 +180,10 @@ "sourceMap": "", "deployedSourceMap": "", "source": "pragma solidity 0.4.18;\n\n/**\n The following contract code, titled KittyCore, was written by Cryptokitties and published\n and retrieved from https://etherscan.io/address/0x06012c8cf97bead5deae237070f9587f8e7a266d#code.\n\n It is included in the current project for test purposes, to ensure that our collateralizer can\n handle ERC721 tokens created by the KittyCore contract.\n*/\n\n/**\n * @title KittiesOwnable\n * @dev The KittiesOwnable contract has an owner address, and provides basic authorization control\n * functions, this simplifies the implementation of \"user permissions\".\n */\ncontract KittiesOwnable {\n address public owner;\n\n\n /**\n\t * @dev The KittiesOwnable constructor sets the original `owner` of the contract to the sender\n\t * account.\n\t */\n function KittiesOwnable() {\n owner = msg.sender;\n }\n\n\n /**\n\t * @dev Throws if called by any account other than the owner.\n\t */\n modifier onlyOwner() {\n require(msg.sender == owner);\n _;\n }\n\n\n /**\n\t * @dev Allows the current owner to transfer control of the contract to a newOwner.\n\t * @param newOwner The address to transfer ownership to.\n\t */\n function transferOwnership(address newOwner) onlyOwner {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n\n}\n\n\n\n/// @title Interface for contracts conforming to ERC-721: Non-Fungible Tokens\n/// @author Dieter Shirley (https://github.com/dete)\ncontract KittiesERC721 {\n // Required methods\n function totalSupply() public view returns (uint256 total);\n function balanceOf(address _owner) public view returns (uint256 balance);\n function ownerOf(uint256 _tokenId) external view returns (address owner);\n function approve(address _to, uint256 _tokenId) external;\n function transfer(address _to, uint256 _tokenId) external;\n function transferFrom(address _from, address _to, uint256 _tokenId) external;\n\n // Events\n event Transfer(address from, address to, uint256 tokenId);\n event Approval(address owner, address approved, uint256 tokenId);\n\n // Optional\n // function name() public view returns (string name);\n // function symbol() public view returns (string symbol);\n // function tokensOfOwner(address _owner) external view returns (uint256[] tokenIds);\n // function tokenMetadata(uint256 _tokenId, string _preferredTransport) public view returns (string infoUrl);\n\n // ERC-165 Compatibility (https://github.com/ethereum/EIPs/issues/165)\n function supportsInterface(bytes4 _interfaceID) external view returns (bool);\n}\n\n\n// // Auction wrapper functions\n\n\n// Auction wrapper functions\n\n\n\n\n\n\n\n/// @title SEKRETOOOO\ncontract GeneScienceInterface {\n /// @dev simply a boolean to indicate this is the contract we expect to be\n function isGeneScience() public pure returns (bool);\n\n /// @dev given genes of kitten 1 & 2, return a genetic combination - may have a random factor\n /// @param genes1 genes of mom\n /// @param genes2 genes of sire\n /// @return the genes that are supposed to be passed down the child\n function mixGenes(uint256 genes1, uint256 genes2, uint256 targetBlock) public returns (uint256);\n}\n\n\n\n\n\n\n\n/// @title A facet of KittyCore that manages special access privileges.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyAccessControl {\n // This facet controls access control for CryptoKitties. There are four roles managed here:\n //\n // - The CEO: The CEO can reassign other roles and change the addresses of our dependent smart\n // contracts. It is also the only role that can unpause the smart contract. It is initially\n // set to the address that created the smart contract in the KittyCore constructor.\n //\n // - The CFO: The CFO can withdraw funds from KittyCore and its auction contracts.\n //\n // - The COO: The COO can release gen0 kitties to auction, and mint promo cats.\n //\n // It should be noted that these roles are distinct without overlap in their access abilities, the\n // abilities listed for each role above are exhaustive. In particular, while the CEO can assign any\n // address to any role, the CEO address itself doesn't have the ability to act in those roles. This\n // restriction is intentional so that we aren't tempted to use the CEO address frequently out of\n // convenience. The less we use an address, the less likely it is that we somehow compromise the\n // account.\n\n /// @dev Emited when contract is upgraded - See README.md for updgrade plan\n event ContractUpgrade(address newContract);\n\n // The addresses of the accounts (or contracts) that can execute actions within each roles.\n address public ceoAddress;\n address public cfoAddress;\n address public cooAddress;\n\n // @dev Keeps track whether the contract is paused. When that is true, most actions are blocked\n bool public paused = false;\n\n /// @dev Access modifier for CEO-only functionality\n modifier onlyCEO() {\n require(msg.sender == ceoAddress);\n _;\n }\n\n /// @dev Access modifier for CFO-only functionality\n modifier onlyCFO() {\n require(msg.sender == cfoAddress);\n _;\n }\n\n /// @dev Access modifier for COO-only functionality\n modifier onlyCOO() {\n require(msg.sender == cooAddress);\n _;\n }\n\n modifier onlyCLevel() {\n require(\n msg.sender == cooAddress ||\n msg.sender == ceoAddress ||\n msg.sender == cfoAddress\n );\n _;\n }\n\n /// @dev Assigns a new address to act as the CEO. Only available to the current CEO.\n /// @param _newCEO The address of the new CEO\n function setCEO(address _newCEO) external onlyCEO {\n require(_newCEO != address(0));\n\n ceoAddress = _newCEO;\n }\n\n /// @dev Assigns a new address to act as the CFO. Only available to the current CEO.\n /// @param _newCFO The address of the new CFO\n function setCFO(address _newCFO) external onlyCEO {\n require(_newCFO != address(0));\n\n cfoAddress = _newCFO;\n }\n\n /// @dev Assigns a new address to act as the COO. Only available to the current CEO.\n /// @param _newCOO The address of the new COO\n function setCOO(address _newCOO) external onlyCEO {\n require(_newCOO != address(0));\n\n cooAddress = _newCOO;\n }\n\n /*** KittiesPausable functionality adapted from OpenZeppelin ***/\n\n /// @dev Modifier to allow actions only when the contract IS NOT paused\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /// @dev Modifier to allow actions only when the contract IS paused\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /// @dev Called by any \"C-level\" role to pause the contract. Used only when\n /// a bug or exploit is detected and we need to limit damage.\n function pause() external onlyCLevel whenNotPaused {\n paused = true;\n }\n\n /// @dev Unpauses the smart contract. Can only be called by the CEO, since\n /// one reason we may pause the contract is when CFO or COO accounts are\n /// compromised.\n /// @notice This is public rather than external so it can be called by\n /// derived contracts.\n function unpause() public onlyCEO whenPaused {\n // can't unpause if contract was upgraded\n paused = false;\n }\n}\n\n\n\n\n/// @title Base contract for CryptoKitties. Holds all common structs, events and base variables.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBase is KittyAccessControl {\n /*** EVENTS ***/\n\n /// @dev The Birth event is fired whenever a new kitten comes into existence. This obviously\n /// includes any time a cat is created through the giveBirth method, but it is also called\n /// when a new gen0 cat is created.\n event Birth(address owner, uint256 kittyId, uint256 matronId, uint256 sireId, uint256 genes);\n\n /// @dev Transfer event as defined in current draft of ERC721. Emitted every time a kitten\n /// ownership is assigned, including births.\n event Transfer(address from, address to, uint256 tokenId);\n\n /*** DATA TYPES ***/\n\n /// @dev The main Kitty struct. Every cat in CryptoKitties is represented by a copy\n /// of this structure, so great care was taken to ensure that it fits neatly into\n /// exactly two 256-bit words. Note that the order of the members in this structure\n /// is important because of the byte-packing rules used by Ethereum.\n /// Ref: http://solidity.readthedocs.io/en/develop/miscellaneous.html\n struct Kitty {\n // The Kitty's genetic code is packed into these 256-bits, the format is\n // sooper-sekret! A cat's genes never change.\n uint256 genes;\n\n // The timestamp from the block when this cat came into existence.\n uint64 birthTime;\n\n // The minimum timestamp after which this cat can engage in breeding\n // activities again. This same timestamp is used for the pregnancy\n // timer (for matrons) as well as the siring cooldown.\n uint64 cooldownEndBlock;\n\n // The ID of the parents of this kitty, set to 0 for gen0 cats.\n // Note that using 32-bit unsigned integers limits us to a \"mere\"\n // 4 billion cats. This number might seem small until you realize\n // that Ethereum currently has a limit of about 500 million\n // transactions per year! So, this definitely won't be a problem\n // for several years (even as Ethereum learns to scale).\n uint32 matronId;\n uint32 sireId;\n\n // Set to the ID of the sire cat for matrons that are pregnant,\n // zero otherwise. A non-zero value here is how we know a cat\n // is pregnant. Used to retrieve the genetic material for the new\n // kitten when the birth transpires.\n uint32 siringWithId;\n\n // Set to the index in the cooldown array (see below) that represents\n // the current cooldown duration for this Kitty. This starts at zero\n // for gen0 cats, and is initialized to floor(generation/2) for others.\n // Incremented by one for each successful breeding action, regardless\n // of whether this cat is acting as matron or sire.\n uint16 cooldownIndex;\n\n // The \"generation number\" of this cat. Cats minted by the CK contract\n // for sale are called \"gen0\" and have a generation number of 0. The\n // generation number of all other cats is the larger of the two generation\n // numbers of their parents, plus one.\n // (i.e. max(matron.generation, sire.generation) + 1)\n uint16 generation;\n }\n\n /*** CONSTANTS ***/\n\n /// @dev A lookup table indicating the cooldown duration after any successful\n /// breeding action, called \"pregnancy time\" for matrons and \"siring cooldown\"\n /// for sires. Designed such that the cooldown roughly doubles each time a cat\n /// is bred, encouraging owners not to just keep breeding the same cat over\n /// and over again. Caps out at one week (a cat can breed an unbounded number\n /// of times, and the maximum cooldown is always seven days).\n uint32[14] public cooldowns = [\n uint32(1 minutes),\n uint32(2 minutes),\n uint32(5 minutes),\n uint32(10 minutes),\n uint32(30 minutes),\n uint32(1 hours),\n uint32(2 hours),\n uint32(4 hours),\n uint32(8 hours),\n uint32(16 hours),\n uint32(1 days),\n uint32(2 days),\n uint32(4 days),\n uint32(7 days)\n ];\n\n // An approximation of currently how many seconds are in between blocks.\n uint256 public secondsPerBlock = 15;\n\n /*** STORAGE ***/\n\n /// @dev An array containing the Kitty struct for all Kitties in existence. The ID\n /// of each cat is actually an index into this array. Note that ID 0 is a negacat,\n /// the unKitty, the mythical beast that is the parent of all gen0 cats. A bizarre\n /// creature that is both matron and sire... to itself! Has an invalid genetic code.\n /// In other words, cat ID 0 is invalid... ;-)\n Kitty[] kitties;\n\n /// @dev A mapping from cat IDs to the address that owns them. All cats have\n /// some valid owner address, even gen0 cats are created with a non-zero owner.\n mapping (uint256 => address) public kittyIndexToOwner;\n\n // @dev A mapping from owner address to count of tokens that address owns.\n // Used internally inside balanceOf() to resolve ownership count.\n mapping (address => uint256) ownershipTokenCount;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to call\n /// transferFrom(). Each Kitty can only have one approved address for transfer\n /// at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public kittyIndexToApproved;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to use\n /// this Kitty for siring via breedWith(). Each Kitty can only have one approved\n /// address for siring at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public sireAllowedToAddress;\n\n /// @dev The address of the ClockAuction contract that handles sales of Kitties. This\n /// same contract handles both peer-to-peer sales as well as the gen0 sales which are\n /// initiated every 15 minutes.\n SaleClockAuction public saleAuction;\n\n /// @dev The address of a custom ClockAuction subclassed contract that handles siring\n /// auctions. Needs to be separate from saleAuction because the actions taken on success\n /// after a sales and siring auction are quite different.\n SiringClockAuction public siringAuction;\n\n /// @dev Assigns ownership of a specific Kitty to an address.\n function _transfer(address _from, address _to, uint256 _tokenId) internal {\n // Since the number of kittens is capped to 2^32 we can't overflow this\n ownershipTokenCount[_to]++;\n // transfer ownership\n kittyIndexToOwner[_tokenId] = _to;\n // When creating new kittens _from is 0x0, but we can't account that address.\n if (_from != address(0)) {\n ownershipTokenCount[_from]--;\n // once the kitten is transferred also clear sire allowances\n delete sireAllowedToAddress[_tokenId];\n // clear any previously approved ownership exchange\n delete kittyIndexToApproved[_tokenId];\n }\n // Emit the transfer event.\n Transfer(_from, _to, _tokenId);\n }\n\n /// @dev An internal method that creates a new kitty and stores it. This\n /// method doesn't do any checking and should only be called when the\n /// input data is known to be valid. Will generate both a Birth event\n /// and a Transfer event.\n /// @param _matronId The kitty ID of the matron of this cat (zero for gen0)\n /// @param _sireId The kitty ID of the sire of this cat (zero for gen0)\n /// @param _generation The generation number of this cat, must be computed by caller.\n /// @param _genes The kitty's genetic code.\n /// @param _owner The inital owner of this cat, must be non-zero (except for the unKitty, ID 0)\n function _createKitty(\n uint256 _matronId,\n uint256 _sireId,\n uint256 _generation,\n uint256 _genes,\n address _owner\n )\n internal\n returns (uint)\n {\n // These requires are not strictly necessary, our calling code should make\n // sure that these conditions are never broken. However! _createKitty() is already\n // an expensive call (for storage), and it doesn't hurt to be especially careful\n // to ensure our data structures are always valid.\n require(_matronId == uint256(uint32(_matronId)));\n require(_sireId == uint256(uint32(_sireId)));\n require(_generation == uint256(uint16(_generation)));\n\n // New kitty starts with the same cooldown as parent gen/2\n uint16 cooldownIndex = uint16(_generation / 2);\n if (cooldownIndex > 13) {\n cooldownIndex = 13;\n }\n\n Kitty memory _kitty = Kitty({\n genes: _genes,\n birthTime: uint64(now),\n cooldownEndBlock: 0,\n matronId: uint32(_matronId),\n sireId: uint32(_sireId),\n siringWithId: 0,\n cooldownIndex: cooldownIndex,\n generation: uint16(_generation)\n });\n uint256 newKittenId = kitties.push(_kitty) - 1;\n\n // It's probably never going to happen, 4 billion cats is A LOT, but\n // let's just be 100% sure we never let this happen.\n require(newKittenId == uint256(uint32(newKittenId)));\n\n // emit the birth event\n Birth(\n _owner,\n newKittenId,\n uint256(_kitty.matronId),\n uint256(_kitty.sireId),\n _kitty.genes\n );\n\n // This will assign ownership, and also emit the Transfer event as\n // per ERC721 draft\n _transfer(0, _owner, newKittenId);\n\n return newKittenId;\n }\n\n // Any C-level can fix how many seconds per blocks are currently observed.\n function setSecondsPerBlock(uint256 secs) external onlyCLevel {\n require(secs < cooldowns[0]);\n secondsPerBlock = secs;\n }\n}\n\n\n\n\n\n/// @title The external contract that is responsible for generating metadata for the kitties,\n/// it has one function that will return the data as bytes.\ncontract KittiesERC721Metadata {\n /// @dev Given a token Id, returns a byte array that is supposed to be converted into string.\n function getMetadata(uint256 _tokenId, string) public view returns (bytes32[4] buffer, uint256 count) {\n if (_tokenId == 1) {\n buffer[0] = \"Hello World! :D\";\n count = 15;\n } else if (_tokenId == 2) {\n buffer[0] = \"I would definitely choose a medi\";\n buffer[1] = \"um length string.\";\n count = 49;\n } else if (_tokenId == 3) {\n buffer[0] = \"Lorem ipsum dolor sit amet, mi e\";\n buffer[1] = \"st accumsan dapibus augue lorem,\";\n buffer[2] = \" tristique vestibulum id, libero\";\n buffer[3] = \" suscipit varius sapien aliquam.\";\n count = 128;\n }\n }\n}\n\n\n/// @title The facet of the CryptoKitties core contract that manages ownership, ERC-721 (draft) compliant.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev Ref: https://github.com/ethereum/EIPs/issues/721\n/// See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyOwnership is KittyBase, KittiesERC721 {\n\n /// @notice Name and symbol of the non fungible token, as defined in ERC721.\n string public constant name = \"CryptoKitties\";\n string public constant symbol = \"CK\";\n\n // The contract that will return kitty metadata\n KittiesERC721Metadata public erc721Metadata;\n\n bytes4 constant InterfaceSignature_ERC165 =\n bytes4(keccak256('supportsInterface(bytes4)'));\n\n bytes4 constant InterfaceSignature_ERC721 =\n bytes4(keccak256('name()')) ^\n bytes4(keccak256('symbol()')) ^\n bytes4(keccak256('totalSupply()')) ^\n bytes4(keccak256('balanceOf(address)')) ^\n bytes4(keccak256('ownerOf(uint256)')) ^\n bytes4(keccak256('approve(address,uint256)')) ^\n bytes4(keccak256('transfer(address,uint256)')) ^\n bytes4(keccak256('transferFrom(address,address,uint256)')) ^\n bytes4(keccak256('tokensOfOwner(address)')) ^\n bytes4(keccak256('tokenMetadata(uint256,string)'));\n\n /// @notice Introspection interface as per ERC-165 (https://github.com/ethereum/EIPs/issues/165).\n /// Returns true for any standardized interfaces implemented by this contract. We implement\n /// ERC-165 (obviously!) and ERC-721.\n function supportsInterface(bytes4 _interfaceID) external view returns (bool)\n {\n // DEBUG ONLY\n //require((InterfaceSignature_ERC165 == 0x01ffc9a7) && (InterfaceSignature_ERC721 == 0x9a20483d));\n\n return ((_interfaceID == InterfaceSignature_ERC165) || (_interfaceID == InterfaceSignature_ERC721));\n }\n\n /// @dev Set the address of the sibling contract that tracks metadata.\n /// CEO only.\n function setMetadataAddress(address _contractAddress) public onlyCEO {\n erc721Metadata = KittiesERC721Metadata(_contractAddress);\n }\n\n // Internal utility functions: These functions all assume that their input arguments\n // are valid. We leave it to public methods to sanitize their inputs and follow\n // the required logic.\n\n /// @dev Checks if a given address is the current owner of a particular Kitty.\n /// @param _claimant the address we are validating against.\n /// @param _tokenId kitten id, only valid when > 0\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToOwner[_tokenId] == _claimant;\n }\n\n /// @dev Checks if a given address currently has transferApproval for a particular Kitty.\n /// @param _claimant the address we are confirming kitten is approved for.\n /// @param _tokenId kitten id, only valid when > 0\n function _approvedFor(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToApproved[_tokenId] == _claimant;\n }\n\n /// @dev Marks an address as being approved for transferFrom(), overwriting any previous\n /// approval. Setting _approved to address(0) clears all transfer approval.\n /// NOTE: _approve() does NOT send the Approval event. This is intentional because\n /// _approve() and transferFrom() are used together for putting Kitties on auction, and\n /// there is no value in spamming the log with Approval events in that case.\n function _approve(uint256 _tokenId, address _approved) internal {\n kittyIndexToApproved[_tokenId] = _approved;\n }\n\n /// @notice Returns the number of Kitties owned by a specific address.\n /// @param _owner The owner address to check.\n /// @dev Required for ERC-721 compliance\n function balanceOf(address _owner) public view returns (uint256 count) {\n return ownershipTokenCount[_owner];\n }\n\n /// @notice Transfers a Kitty to another address. If transferring to a smart\n /// contract be VERY CAREFUL to ensure that it is aware of ERC-721 (or\n /// CryptoKitties specifically) or your Kitty may be lost forever. Seriously.\n /// @param _to The address of the recipient, can be a user or contract.\n /// @param _tokenId The ID of the Kitty to transfer.\n /// @dev Required for ERC-721 compliance.\n function transfer(\n address _to,\n uint256 _tokenId\n )\n external\n whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Disallow transfers to the auction contracts to prevent accidental\n // misuse. Auction contracts should only take ownership of kitties\n // through the allow + transferFrom flow.\n require(_to != address(saleAuction));\n require(_to != address(siringAuction));\n\n // You can only send your own cat.\n require(_owns(msg.sender, _tokenId));\n\n // Reassign ownership, clear pending approvals, emit Transfer event.\n _transfer(msg.sender, _to, _tokenId);\n }\n\n /// @notice Grant another address the right to transfer a specific Kitty via\n /// transferFrom(). This is the preferred flow for transfering NFTs to contracts.\n /// @param _to The address to be granted transfer approval. Pass address(0) to\n /// clear all approvals.\n /// @param _tokenId The ID of the Kitty that can be transferred if this call succeeds.\n /// @dev Required for ERC-721 compliance.\n function approve(\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Only an owner can grant transfer approval.\n require(_owns(msg.sender, _tokenId));\n\n // Register the approval (replacing any previous approval).\n _approve(_tokenId, _to);\n\n // Emit approval event.\n Approval(msg.sender, _to, _tokenId);\n }\n\n /// @notice Transfer a Kitty owned by another address, for which the calling address\n /// has previously been granted transfer approval by the owner.\n /// @param _from The address that owns the Kitty to be transfered.\n /// @param _to The address that should take ownership of the Kitty. Can be any address,\n /// including the caller.\n /// @param _tokenId The ID of the Kitty to be transferred.\n /// @dev Required for ERC-721 compliance.\n function transferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Check for approval and valid ownership\n require(_approvedFor(msg.sender, _tokenId));\n require(_owns(_from, _tokenId));\n\n // Reassign ownership (also clears pending approvals and emits Transfer event).\n _transfer(_from, _to, _tokenId);\n }\n\n /// @notice Returns the total number of Kitties currently in existence.\n /// @dev Required for ERC-721 compliance.\n function totalSupply() public view returns (uint) {\n return kitties.length - 1;\n }\n\n /// @notice Returns the address currently assigned ownership of a given Kitty.\n /// @dev Required for ERC-721 compliance.\n function ownerOf(uint256 _tokenId)\n external\n view\n returns (address owner)\n {\n owner = kittyIndexToOwner[_tokenId];\n\n require(owner != address(0));\n }\n\n /// @notice Returns a list of all Kitty IDs assigned to an address.\n /// @param _owner The owner whose Kitties we are interested in.\n /// @dev This method MUST NEVER be called by smart contract code. First, it's fairly\n /// expensive (it walks the entire Kitty array looking for cats belonging to owner),\n /// but it also returns a dynamic array, which is only supported for web3 calls, and\n /// not contract-to-contract calls.\n function tokensOfOwner(address _owner) external view returns(uint256[] ownerTokens) {\n uint256 tokenCount = balanceOf(_owner);\n\n if (tokenCount == 0) {\n // Return an empty array\n return new uint256[](0);\n } else {\n uint256[] memory result = new uint256[](tokenCount);\n uint256 totalCats = totalSupply();\n uint256 resultIndex = 0;\n\n // We count on the fact that all cats have IDs starting at 1 and increasing\n // sequentially up to the totalCat count.\n uint256 catId;\n\n for (catId = 1; catId <= totalCats; catId++) {\n if (kittyIndexToOwner[catId] == _owner) {\n result[resultIndex] = catId;\n resultIndex++;\n }\n }\n\n return result;\n }\n }\n\n /// @dev Adapted from memcpy() by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _memcpy(uint _dest, uint _src, uint _len) private view {\n // Copy word-length chunks while possible\n for(; _len >= 32; _len -= 32) {\n assembly {\n mstore(_dest, mload(_src))\n }\n _dest += 32;\n _src += 32;\n }\n\n // Copy remaining bytes\n uint256 mask = 256 ** (32 - _len) - 1;\n assembly {\n let srcpart := and(mload(_src), not(mask))\n let destpart := and(mload(_dest), mask)\n mstore(_dest, or(destpart, srcpart))\n }\n }\n\n /// @dev Adapted from toString(slice) by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _toString(bytes32[4] _rawBytes, uint256 _stringLength) private view returns (string) {\n var outputString = new string(_stringLength);\n uint256 outputPtr;\n uint256 bytesPtr;\n\n assembly {\n outputPtr := add(outputString, 32)\n bytesPtr := _rawBytes\n }\n\n _memcpy(outputPtr, bytesPtr, _stringLength);\n\n return outputString;\n }\n\n /// @notice Returns a URI pointing to a metadata package for this token conforming to\n /// ERC-721 (https://github.com/ethereum/EIPs/issues/721)\n /// @param _tokenId The ID number of the Kitty whose metadata should be returned.\n function tokenMetadata(uint256 _tokenId, string _preferredTransport) external view returns (string infoUrl) {\n require(erc721Metadata != address(0));\n bytes32[4] memory buffer;\n uint256 count;\n (buffer, count) = erc721Metadata.getMetadata(_tokenId, _preferredTransport);\n\n return _toString(buffer, count);\n }\n}\n\n\n\n/// @title A facet of KittyCore that manages Kitty siring, gestation, and birth.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBreeding is KittyOwnership {\n\n /// @dev The Pregnant event is fired when two cats successfully breed and the pregnancy\n /// timer begins for the matron.\n event Pregnant(address owner, uint256 matronId, uint256 sireId, uint256 cooldownEndBlock);\n\n /// @notice The minimum payment required to use breedWithAuto(). This fee goes towards\n /// the gas cost paid by whatever calls giveBirth(), and can be dynamically updated by\n /// the COO role as the gas price changes.\n uint256 public autoBirthFee = 2 finney;\n\n // Keeps track of number of pregnant kitties.\n uint256 public pregnantKitties;\n\n /// @dev The address of the sibling contract that is used to implement the sooper-sekret\n /// genetic combination algorithm.\n GeneScienceInterface public geneScience;\n\n /// @dev Update the address of the genetic contract, can only be called by the CEO.\n /// @param _address An address of a GeneScience contract instance to be used from this point forward.\n function setGeneScienceAddress(address _address) external onlyCEO {\n GeneScienceInterface candidateContract = GeneScienceInterface(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isGeneScience());\n\n // Set the new contract address\n geneScience = candidateContract;\n }\n\n /// @dev Checks that a given kitten is able to breed. Requires that the\n /// current cooldown is finished (for sires) and also checks that there is\n /// no pending pregnancy.\n function _isReadyToBreed(Kitty _kit) internal view returns (bool) {\n // In addition to checking the cooldownEndBlock, we also need to check to see if\n // the cat has a pending birth; there can be some period of time between the end\n // of the pregnacy timer and the birth event.\n return (_kit.siringWithId == 0) && (_kit.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @dev Check if a sire has authorized breeding with this matron. True if both sire\n /// and matron have the same owner, or if the sire has given siring permission to\n /// the matron's owner (via approveSiring()).\n function _isSiringPermitted(uint256 _sireId, uint256 _matronId) internal view returns (bool) {\n address matronOwner = kittyIndexToOwner[_matronId];\n address sireOwner = kittyIndexToOwner[_sireId];\n\n // Siring is okay if they have same owner, or if the matron's owner was given\n // permission to breed with this sire.\n return (matronOwner == sireOwner || sireAllowedToAddress[_sireId] == matronOwner);\n }\n\n /// @dev Set the cooldownEndTime for the given Kitty, based on its current cooldownIndex.\n /// Also increments the cooldownIndex (unless it has hit the cap).\n /// @param _kitten A reference to the Kitty in storage which needs its timer started.\n function _triggerCooldown(Kitty storage _kitten) internal {\n // Compute an estimation of the cooldown time in blocks (based on current cooldownIndex).\n _kitten.cooldownEndBlock = uint64((cooldowns[_kitten.cooldownIndex]/secondsPerBlock) + block.number);\n\n // Increment the breeding count, clamping it at 13, which is the length of the\n // cooldowns array. We could check the array size dynamically, but hard-coding\n // this as a constant saves gas. Yay, Solidity!\n if (_kitten.cooldownIndex < 13) {\n _kitten.cooldownIndex += 1;\n }\n }\n\n /// @notice Grants approval to another user to sire with one of your Kitties.\n /// @param _addr The address that will be able to sire with your Kitty. Set to\n /// address(0) to clear all siring approvals for this Kitty.\n /// @param _sireId A Kitty that you own that _addr will now be able to sire with.\n function approveSiring(address _addr, uint256 _sireId)\n external\n whenNotPaused\n {\n require(_owns(msg.sender, _sireId));\n sireAllowedToAddress[_sireId] = _addr;\n }\n\n /// @dev Updates the minimum payment required for calling giveBirthAuto(). Can only\n /// be called by the COO address. (This fee is used to offset the gas cost incurred\n /// by the autobirth daemon).\n function setAutoBirthFee(uint256 val) external onlyCOO {\n autoBirthFee = val;\n }\n\n /// @dev Checks to see if a given Kitty is pregnant and (if so) if the gestation\n /// period has passed.\n function _isReadyToGiveBirth(Kitty _matron) private view returns (bool) {\n return (_matron.siringWithId != 0) && (_matron.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @notice Checks that a given kitten is able to breed (i.e. it is not pregnant or\n /// in the middle of a siring cooldown).\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isReadyToBreed(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n Kitty storage kit = kitties[_kittyId];\n return _isReadyToBreed(kit);\n }\n\n /// @dev Checks whether a kitty is currently pregnant.\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isPregnant(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n // A kitty is pregnant if and only if this field is set\n return kitties[_kittyId].siringWithId != 0;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair. DOES NOT\n /// check ownership permissions (that is up to the caller).\n /// @param _matron A reference to the Kitty struct of the potential matron.\n /// @param _matronId The matron's ID.\n /// @param _sire A reference to the Kitty struct of the potential sire.\n /// @param _sireId The sire's ID\n function _isValidMatingPair(\n Kitty storage _matron,\n uint256 _matronId,\n Kitty storage _sire,\n uint256 _sireId\n )\n private\n view\n returns(bool)\n {\n // A Kitty can't breed with itself!\n if (_matronId == _sireId) {\n return false;\n }\n\n // Kitties can't breed with their parents.\n if (_matron.matronId == _sireId || _matron.sireId == _sireId) {\n return false;\n }\n if (_sire.matronId == _matronId || _sire.sireId == _matronId) {\n return false;\n }\n\n // We can short circuit the sibling check (below) if either cat is\n // gen zero (has a matron ID of zero).\n if (_sire.matronId == 0 || _matron.matronId == 0) {\n return true;\n }\n\n // Kitties can't breed with full or half siblings.\n if (_sire.matronId == _matron.matronId || _sire.matronId == _matron.sireId) {\n return false;\n }\n if (_sire.sireId == _matron.matronId || _sire.sireId == _matron.sireId) {\n return false;\n }\n\n // Everything seems cool! Let's get DTF.\n return true;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair for\n /// breeding via auction (i.e. skips ownership and siring approval checks).\n function _canBreedWithViaAuction(uint256 _matronId, uint256 _sireId)\n internal\n view\n returns (bool)\n {\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId);\n }\n\n /// @notice Checks to see if two cats can breed together, including checks for\n /// ownership and siring approvals. Does NOT check that both cats are ready for\n /// breeding (i.e. breedWith could still fail until the cooldowns are finished).\n /// TODO: Shouldn't this check pregnancy and cooldowns?!?\n /// @param _matronId The ID of the proposed matron.\n /// @param _sireId The ID of the proposed sire.\n function canBreedWith(uint256 _matronId, uint256 _sireId)\n external\n view\n returns(bool)\n {\n require(_matronId > 0);\n require(_sireId > 0);\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId) &&\n _isSiringPermitted(_sireId, _matronId);\n }\n\n /// @dev Internal utility function to initiate breeding, assumes that all breeding\n /// requirements have been checked.\n function _breedWith(uint256 _matronId, uint256 _sireId) internal {\n // Grab a reference to the Kitties from storage.\n Kitty storage sire = kitties[_sireId];\n Kitty storage matron = kitties[_matronId];\n\n // Mark the matron as pregnant, keeping track of who the sire is.\n matron.siringWithId = uint32(_sireId);\n\n // Trigger the cooldown for both parents.\n _triggerCooldown(sire);\n _triggerCooldown(matron);\n\n // Clear siring permission for both parents. This may not be strictly necessary\n // but it's likely to avoid confusion!\n delete sireAllowedToAddress[_matronId];\n delete sireAllowedToAddress[_sireId];\n\n // Every time a kitty gets pregnant, counter is incremented.\n pregnantKitties++;\n\n // Emit the pregnancy event.\n Pregnant(kittyIndexToOwner[_matronId], _matronId, _sireId, matron.cooldownEndBlock);\n }\n\n /// @notice Breed a Kitty you own (as matron) with a sire that you own, or for which you\n /// have previously been given Siring approval. Will either make your cat pregnant, or will\n /// fail entirely. Requires a pre-payment of the fee given out to the first caller of giveBirth()\n /// @param _matronId The ID of the Kitty acting as matron (will end up pregnant if successful)\n /// @param _sireId The ID of the Kitty acting as sire (will begin its siring cooldown if successful)\n function breedWithAuto(uint256 _matronId, uint256 _sireId)\n external\n payable\n whenNotPaused\n {\n // Checks for payment.\n require(msg.value >= autoBirthFee);\n\n // Caller must own the matron.\n require(_owns(msg.sender, _matronId));\n\n // Neither sire nor matron are allowed to be on auction during a normal\n // breeding operation, but we don't need to check that explicitly.\n // For matron: The caller of this function can't be the owner of the matron\n // because the owner of a Kitty on auction is the auction house, and the\n // auction house will never call breedWith().\n // For sire: Similarly, a sire on auction will be owned by the auction house\n // and the act of transferring ownership will have cleared any oustanding\n // siring approval.\n // Thus we don't need to spend gas explicitly checking to see if either cat\n // is on auction.\n\n // Check that matron and sire are both owned by caller, or that the sire\n // has given siring permission to caller (i.e. matron's owner).\n // Will fail for _sireId = 0\n require(_isSiringPermitted(_sireId, _matronId));\n\n // Grab a reference to the potential matron\n Kitty storage matron = kitties[_matronId];\n\n // Make sure matron isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(matron));\n\n // Grab a reference to the potential sire\n Kitty storage sire = kitties[_sireId];\n\n // Make sure sire isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(sire));\n\n // Test that these cats are a valid mating pair.\n require(_isValidMatingPair(\n matron,\n _matronId,\n sire,\n _sireId\n ));\n\n // All checks passed, kitty gets pregnant!\n _breedWith(_matronId, _sireId);\n }\n\n /// @notice Have a pregnant Kitty give birth!\n /// @param _matronId A Kitty ready to give birth.\n /// @return The Kitty ID of the new kitten.\n /// @dev Looks at a given Kitty and, if pregnant and if the gestation period has passed,\n /// combines the genes of the two parents to create a new kitten. The new Kitty is assigned\n /// to the current owner of the matron. Upon successful completion, both the matron and the\n /// new kitten will be ready to breed again. Note that anyone can call this function (if they\n /// are willing to pay the gas!), but the new kitten always goes to the mother's owner.\n function giveBirth(uint256 _matronId)\n external\n whenNotPaused\n returns(uint256)\n {\n // Grab a reference to the matron in storage.\n Kitty storage matron = kitties[_matronId];\n\n // Check that the matron is a valid cat.\n require(matron.birthTime != 0);\n\n // Check that the matron is pregnant, and that its time has come!\n require(_isReadyToGiveBirth(matron));\n\n // Grab a reference to the sire in storage.\n uint256 sireId = matron.siringWithId;\n Kitty storage sire = kitties[sireId];\n\n // Determine the higher generation number of the two parents\n uint16 parentGen = matron.generation;\n if (sire.generation > matron.generation) {\n parentGen = sire.generation;\n }\n\n // Call the sooper-sekret gene mixing operation.\n uint256 childGenes = geneScience.mixGenes(matron.genes, sire.genes, matron.cooldownEndBlock - 1);\n\n // Make the new kitten!\n address owner = kittyIndexToOwner[_matronId];\n uint256 kittenId = _createKitty(_matronId, matron.siringWithId, parentGen + 1, childGenes, owner);\n\n // Clear the reference to sire from the matron (REQUIRED! Having siringWithId\n // set is what marks a matron as being pregnant.)\n delete matron.siringWithId;\n\n // Every time a kitty gives birth counter is decremented.\n pregnantKitties--;\n\n // Send the balance fee to the person who made birth happen.\n msg.sender.send(autoBirthFee);\n\n // return the new kitten's ID\n return kittenId;\n }\n}\n\n\n\n\n\n\n\n\n\n\n/// @title Auction Core\n/// @dev Contains models, variables, and internal methods for the auction.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuctionBase {\n\n // Represents an auction on an NFT\n struct Auction {\n // Current owner of NFT\n address seller;\n // Price (in wei) at beginning of auction\n uint128 startingPrice;\n // Price (in wei) at end of auction\n uint128 endingPrice;\n // Duration (in seconds) of auction\n uint64 duration;\n // Time when auction started\n // NOTE: 0 if this auction has been concluded\n uint64 startedAt;\n }\n\n // Reference to contract tracking NFT ownership\n KittiesERC721 public nonFungibleContract;\n\n // Cut owner takes on each auction, measured in basis points (1/100 of a percent).\n // Values 0-10,000 map to 0%-100%\n uint256 public ownerCut;\n\n // Map from token ID to their corresponding auction.\n mapping (uint256 => Auction) tokenIdToAuction;\n\n event AuctionCreated(uint256 tokenId, uint256 startingPrice, uint256 endingPrice, uint256 duration);\n event AuctionSuccessful(uint256 tokenId, uint256 totalPrice, address winner);\n event AuctionCancelled(uint256 tokenId);\n\n /// @dev Returns true if the claimant owns the token.\n /// @param _claimant - Address claiming to own the token.\n /// @param _tokenId - ID of token whose ownership to verify.\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return (nonFungibleContract.ownerOf(_tokenId) == _claimant);\n }\n\n /// @dev Escrows the NFT, assigning ownership to this contract.\n /// Throws if the escrow fails.\n /// @param _owner - Current owner address of token to escrow.\n /// @param _tokenId - ID of token whose approval to verify.\n function _escrow(address _owner, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transferFrom(_owner, this, _tokenId);\n }\n\n /// @dev Transfers an NFT owned by this contract to another address.\n /// Returns true if the transfer succeeds.\n /// @param _receiver - Address to transfer NFT to.\n /// @param _tokenId - ID of token to transfer.\n function _transfer(address _receiver, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transfer(_receiver, _tokenId);\n }\n\n /// @dev Adds an auction to the list of open auctions. Also fires the\n /// AuctionCreated event.\n /// @param _tokenId The ID of the token to be put on auction.\n /// @param _auction Auction to add.\n function _addAuction(uint256 _tokenId, Auction _auction) internal {\n // Require that all auctions have a duration of\n // at least one minute. (Keeps our math from getting hairy!)\n require(_auction.duration >= 1 minutes);\n\n tokenIdToAuction[_tokenId] = _auction;\n\n AuctionCreated(\n uint256(_tokenId),\n uint256(_auction.startingPrice),\n uint256(_auction.endingPrice),\n uint256(_auction.duration)\n );\n }\n\n /// @dev Cancels an auction unconditionally.\n function _cancelAuction(uint256 _tokenId, address _seller) internal {\n _removeAuction(_tokenId);\n _transfer(_seller, _tokenId);\n AuctionCancelled(_tokenId);\n }\n\n /// @dev Computes the price and transfers winnings.\n /// Does NOT transfer ownership of token.\n function _bid(uint256 _tokenId, uint256 _bidAmount)\n internal\n returns (uint256)\n {\n // Get a reference to the auction struct\n Auction storage auction = tokenIdToAuction[_tokenId];\n\n // Explicitly check that this auction is currently live.\n // (Because of how Ethereum mappings work, we can't just count\n // on the lookup above failing. An invalid _tokenId will just\n // return an auction object that is all zeros.)\n require(_isOnAuction(auction));\n\n // Check that the bid is greater than or equal to the current price\n uint256 price = _currentPrice(auction);\n require(_bidAmount >= price);\n\n // Grab a reference to the seller before the auction struct\n // gets deleted.\n address seller = auction.seller;\n\n // The bid is good! Remove the auction before sending the fees\n // to the sender so we can't have a reentrancy attack.\n _removeAuction(_tokenId);\n\n // Transfer proceeds to seller (if there are any!)\n if (price > 0) {\n // Calculate the auctioneer's cut.\n // (NOTE: _computeCut() is guaranteed to return a\n // value <= price, so this subtraction can't go negative.)\n uint256 auctioneerCut = _computeCut(price);\n uint256 sellerProceeds = price - auctioneerCut;\n\n // NOTE: Doing a transfer() in the middle of a complex\n // method like this is generally discouraged because of\n // reentrancy attacks and DoS attacks if the seller is\n // a contract with an invalid fallback function. We explicitly\n // guard against reentrancy attacks by removing the auction\n // before calling transfer(), and the only thing the seller\n // can DoS is the sale of their own asset! (And if it's an\n // accident, they can call cancelAuction(). )\n seller.transfer(sellerProceeds);\n }\n\n // Calculate any excess funds included with the bid. If the excess\n // is anything worth worrying about, transfer it back to bidder.\n // NOTE: We checked above that the bid amount is greater than or\n // equal to the price so this cannot underflow.\n uint256 bidExcess = _bidAmount - price;\n\n // Return the funds. Similar to the previous transfer, this is\n // not susceptible to a re-entry attack because the auction is\n // removed before any transfers occur.\n msg.sender.transfer(bidExcess);\n\n // Tell the world!\n AuctionSuccessful(_tokenId, price, msg.sender);\n\n return price;\n }\n\n /// @dev Removes an auction from the list of open auctions.\n /// @param _tokenId - ID of NFT on auction.\n function _removeAuction(uint256 _tokenId) internal {\n delete tokenIdToAuction[_tokenId];\n }\n\n /// @dev Returns true if the NFT is on auction.\n /// @param _auction - Auction to check.\n function _isOnAuction(Auction storage _auction) internal view returns (bool) {\n return (_auction.startedAt > 0);\n }\n\n /// @dev Returns current price of an NFT on auction. Broken into two\n /// functions (this one, that computes the duration from the auction\n /// structure, and the other that does the price computation) so we\n /// can easily test that the price computation works correctly.\n function _currentPrice(Auction storage _auction)\n internal\n view\n returns (uint256)\n {\n uint256 secondsPassed = 0;\n\n // A bit of insurance against negative values (or wraparound).\n // Probably not necessary (since Ethereum guarnatees that the\n // now variable doesn't ever go backwards).\n if (now > _auction.startedAt) {\n secondsPassed = now - _auction.startedAt;\n }\n\n return _computeCurrentPrice(\n _auction.startingPrice,\n _auction.endingPrice,\n _auction.duration,\n secondsPassed\n );\n }\n\n /// @dev Computes the current price of an auction. Factored out\n /// from _currentPrice so we can run extensive unit tests.\n /// When testing, make this function public and turn on\n /// `Current price computation` test suite.\n function _computeCurrentPrice(\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n uint256 _secondsPassed\n )\n internal\n pure\n returns (uint256)\n {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our public functions carefully cap the maximum values for\n // time (at 64-bits) and currency (at 128-bits). _duration is\n // also known to be non-zero (see the require() statement in\n // _addAuction())\n if (_secondsPassed >= _duration) {\n // We've reached the end of the dynamic pricing portion\n // of the auction, just return the end price.\n return _endingPrice;\n } else {\n // Starting price can be higher than ending price (and often is!), so\n // this delta can be negative.\n int256 totalPriceChange = int256(_endingPrice) - int256(_startingPrice);\n\n // This multiplication can't overflow, _secondsPassed will easily fit within\n // 64-bits, and totalPriceChange will easily fit within 128-bits, their product\n // will always fit within 256-bits.\n int256 currentPriceChange = totalPriceChange * int256(_secondsPassed) / int256(_duration);\n\n // currentPriceChange can be negative, but if so, will have a magnitude\n // less that _startingPrice. Thus, this result will always end up positive.\n int256 currentPrice = int256(_startingPrice) + currentPriceChange;\n\n return uint256(currentPrice);\n }\n }\n\n /// @dev Computes owner's cut of a sale.\n /// @param _price - Sale price of NFT.\n function _computeCut(uint256 _price) internal view returns (uint256) {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our entry functions carefully cap the maximum values for\n // currency (at 128-bits), and ownerCut <= 10000 (see the require()\n // statement in the ClockAuction constructor). The result of this\n // function is always guaranteed to be <= _price.\n return _price * ownerCut / 10000;\n }\n\n}\n\n\n\n\n\n\n\n/**\n * @title KittiesPausable\n * @dev Base contract which allows children to implement an emergency stop mechanism.\n */\ncontract KittiesPausable is KittiesOwnable {\n event Pause();\n event Unpause();\n\n bool public paused = false;\n\n\n /**\n\t * @dev modifier to allow actions only when the contract IS paused\n\t */\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /**\n\t * @dev modifier to allow actions only when the contract IS NOT paused\n\t */\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /**\n\t * @dev called by the owner to pause, triggers stopped state\n\t */\n function pause() onlyOwner whenNotPaused returns (bool) {\n paused = true;\n Pause();\n return true;\n }\n\n /**\n\t * @dev called by the owner to unpause, returns to normal state\n\t */\n function unpause() onlyOwner whenPaused returns (bool) {\n paused = false;\n Unpause();\n return true;\n }\n}\n\n\n/// @title Clock auction for non-fungible tokens.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuction is KittiesPausable, ClockAuctionBase {\n\n /// @dev The ERC-165 interface signature for ERC-721.\n /// Ref: https://github.com/ethereum/EIPs/issues/165\n /// Ref: https://github.com/ethereum/EIPs/issues/721\n bytes4 constant InterfaceSignature_ERC721 = bytes4(0x9a20483d);\n\n /// @dev Constructor creates a reference to the NFT ownership contract\n /// and verifies the owner cut is in the valid range.\n /// @param _nftAddress - address of a deployed contract implementing\n /// the Nonfungible Interface.\n /// @param _cut - percent cut the owner takes on each auction, must be\n /// between 0-10,000.\n function ClockAuction(address _nftAddress, uint256 _cut) public {\n require(_cut <= 10000);\n ownerCut = _cut;\n\n KittiesERC721 candidateContract = KittiesERC721(_nftAddress);\n require(candidateContract.supportsInterface(InterfaceSignature_ERC721));\n nonFungibleContract = candidateContract;\n }\n\n /// @dev Remove all Ether from the contract, which is the owner's cuts\n /// as well as any Ether sent directly to the contract address.\n /// Always transfers to the NFT contract, but can be called either by\n /// the owner or the NFT contract.\n function withdrawBalance() external {\n address nftAddress = address(nonFungibleContract);\n\n require(\n msg.sender == owner ||\n msg.sender == nftAddress\n );\n // We are using this boolean method to make sure that even if one fails it will still work\n bool res = nftAddress.send(this.balance);\n }\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of time to move between starting\n /// price and ending price (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n whenNotPaused\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(_owns(msg.sender, _tokenId));\n _escrow(msg.sender, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Bids on an open auction, completing the auction and transferring\n /// ownership of the NFT if enough Ether is supplied.\n /// @param _tokenId - ID of token to bid on.\n function bid(uint256 _tokenId)\n external\n payable\n whenNotPaused\n {\n // _bid will throw if the bid or funds transfer fails\n _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n }\n\n /// @dev Cancels an auction that hasn't been won yet.\n /// Returns the NFT to original owner.\n /// @notice This is a state-modifying function that can\n /// be called while the contract is paused.\n /// @param _tokenId - ID of token on auction\n function cancelAuction(uint256 _tokenId)\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n address seller = auction.seller;\n require(msg.sender == seller);\n _cancelAuction(_tokenId, seller);\n }\n\n /// @dev Cancels an auction when the contract is paused.\n /// Only the owner may do this, and NFTs are returned to\n /// the seller. This should only be used in emergencies.\n /// @param _tokenId - ID of the NFT on auction to cancel.\n function cancelAuctionWhenPaused(uint256 _tokenId)\n whenPaused\n onlyOwner\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n _cancelAuction(_tokenId, auction.seller);\n }\n\n /// @dev Returns auction info for an NFT on auction.\n /// @param _tokenId - ID of NFT on auction.\n function getAuction(uint256 _tokenId)\n external\n view\n returns\n (\n address seller,\n uint256 startingPrice,\n uint256 endingPrice,\n uint256 duration,\n uint256 startedAt\n ) {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return (\n auction.seller,\n auction.startingPrice,\n auction.endingPrice,\n auction.duration,\n auction.startedAt\n );\n }\n\n /// @dev Returns the current price of an auction.\n /// @param _tokenId - ID of the token price we are checking.\n function getCurrentPrice(uint256 _tokenId)\n external\n view\n returns (uint256)\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return _currentPrice(auction);\n }\n\n}\n\n\n/// @title Reverse auction modified for siring\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SiringClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSiringAuctionAddress() call.\n bool public isSiringClockAuction = true;\n\n // Delegate constructor\n function SiringClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction. Since this function is wrapped,\n /// require sender to be KittyCore contract.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Places a bid for siring. Requires the sender\n /// is the KittyCore contract because all bid methods\n /// should be wrapped. Also returns the kitty to the\n /// seller rather than the winner.\n function bid(uint256 _tokenId)\n external\n payable\n {\n require(msg.sender == address(nonFungibleContract));\n address seller = tokenIdToAuction[_tokenId].seller;\n // _bid checks that token ID is valid and will throw if bid fails\n _bid(_tokenId, msg.value);\n // We transfer the kitty back to the seller, the winner will get\n // the offspring\n _transfer(seller, _tokenId);\n }\n\n}\n\n\n\n\n\n/// @title Clock auction modified for sale of kitties\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SaleClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSaleAuctionAddress() call.\n bool public isSaleClockAuction = true;\n\n // Tracks last 5 sale price of gen0 kitty sales\n uint256 public gen0SaleCount;\n uint256[5] public lastGen0SalePrices;\n\n // Delegate constructor\n function SaleClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Updates lastSalePrice if seller is the nft contract\n /// Otherwise, works the same as default bid method.\n function bid(uint256 _tokenId)\n external\n payable\n {\n // _bid verifies token ID size\n address seller = tokenIdToAuction[_tokenId].seller;\n uint256 price = _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n\n // If not a gen0 auction, exit\n if (seller == address(nonFungibleContract)) {\n // Track gen0 sale prices\n lastGen0SalePrices[gen0SaleCount % 5] = price;\n gen0SaleCount++;\n }\n }\n\n function averageGen0SalePrice() external view returns (uint256) {\n uint256 sum = 0;\n for (uint256 i = 0; i < 5; i++) {\n sum += lastGen0SalePrices[i];\n }\n return sum / 5;\n }\n\n}\n\n\n/// @title Handles creating auctions for sale and siring of kitties.\n/// This wrapper of ReverseAuction exists only so that users can create\n/// auctions with only one transaction.\ncontract KittyAuction is KittyBreeding {\n\n // @notice The auction contract variables are defined in KittyBase to allow\n // us to refer to them in KittyOwnership to prevent accidental transfers.\n // `saleAuction` refers to the auction for gen0 and p2p sale of kitties.\n // `siringAuction` refers to the auction for siring rights of kitties.\n\n /// @dev Sets the reference to the sale auction.\n /// @param _address - Address of sale contract.\n function setSaleAuctionAddress(address _address) external onlyCEO {\n SaleClockAuction candidateContract = SaleClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSaleClockAuction());\n\n // Set the new contract address\n saleAuction = candidateContract;\n }\n\n /// @dev Sets the reference to the siring auction.\n /// @param _address - Address of siring contract.\n function setSiringAuctionAddress(address _address) external onlyCEO {\n SiringClockAuction candidateContract = SiringClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSiringClockAuction());\n\n // Set the new contract address\n siringAuction = candidateContract;\n }\n\n /// @dev Put a kitty up for auction.\n /// Does some ownership trickery to create auctions in one tx.\n function createSaleAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n // Ensure the kitty is not pregnant to prevent the auction\n // contract accidentally receiving ownership of the child.\n // NOTE: the kitty IS allowed to be in a cooldown.\n require(!isPregnant(_kittyId));\n _approve(_kittyId, saleAuction);\n // Sale auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n saleAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Put a kitty up for auction to be sire.\n /// Performs checks to ensure the kitty can be sired, then\n /// delegates to reverse auction.\n function createSiringAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n require(isReadyToBreed(_kittyId));\n _approve(_kittyId, siringAuction);\n // Siring auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n siringAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Completes a siring auction by bidding.\n /// Immediately breeds the winning matron with the sire on auction.\n /// @param _sireId - ID of the sire on auction.\n /// @param _matronId - ID of the matron owned by the bidder.\n function bidOnSiringAuction(\n uint256 _sireId,\n uint256 _matronId\n )\n external\n payable\n whenNotPaused\n {\n // Auction contract checks input sizes\n require(_owns(msg.sender, _matronId));\n require(isReadyToBreed(_matronId));\n require(_canBreedWithViaAuction(_matronId, _sireId));\n\n // Define the current price of the auction.\n uint256 currentPrice = siringAuction.getCurrentPrice(_sireId);\n require(msg.value >= currentPrice + autoBirthFee);\n\n // Siring auction will throw if the bid fails.\n siringAuction.bid.value(msg.value - autoBirthFee)(_sireId);\n _breedWith(uint32(_matronId), uint32(_sireId));\n }\n\n /// @dev Transfers the balance of the sale auction contract\n /// to the KittyCore contract. We use two-step withdrawal to\n /// prevent two transfer calls in the auction bid function.\n function withdrawAuctionBalances() external onlyCLevel {\n saleAuction.withdrawBalance();\n siringAuction.withdrawBalance();\n }\n}\n\n\n/// @title all functions related to creating kittens\ncontract KittyMinting is KittyAuction {\n\n // Limits the number of cats the contract owner can ever create.\n uint256 public constant PROMO_CREATION_LIMIT = 5000;\n uint256 public constant GEN0_CREATION_LIMIT = 45000;\n\n // Constants for gen0 auctions.\n uint256 public constant GEN0_STARTING_PRICE = 10 finney;\n uint256 public constant GEN0_AUCTION_DURATION = 1 days;\n\n // Counts the number of cats the contract owner has created.\n uint256 public promoCreatedCount;\n uint256 public gen0CreatedCount;\n\n /// @dev we can create promo kittens, up to a limit. Only callable by COO\n /// @param _genes the encoded genes of the kitten to be created, any value is accepted\n /// @param _owner the future owner of the created kittens. Default to contract COO\n function createPromoKitty(uint256 _genes, address _owner) external onlyCOO {\n address kittyOwner = _owner;\n if (kittyOwner == address(0)) {\n kittyOwner = cooAddress;\n }\n require(promoCreatedCount < PROMO_CREATION_LIMIT);\n\n promoCreatedCount++;\n _createKitty(0, 0, 0, _genes, kittyOwner);\n }\n\n /// @dev Creates a new gen0 kitty with the given genes and\n /// creates an auction for it.\n function createGen0Auction(uint256 _genes) external onlyCOO {\n require(gen0CreatedCount < GEN0_CREATION_LIMIT);\n\n uint256 kittyId = _createKitty(0, 0, 0, _genes, address(this));\n _approve(kittyId, saleAuction);\n\n saleAuction.createAuction(\n kittyId,\n _computeNextGen0Price(),\n 0,\n GEN0_AUCTION_DURATION,\n address(this)\n );\n\n gen0CreatedCount++;\n }\n\n /// @dev Computes the next gen0 auction starting price, given\n /// the average of the past 5 prices + 50%.\n function _computeNextGen0Price() internal view returns (uint256) {\n uint256 avePrice = saleAuction.averageGen0SalePrice();\n\n // Sanity check to ensure we don't overflow arithmetic\n require(avePrice == uint256(uint128(avePrice)));\n\n uint256 nextPrice = avePrice + (avePrice / 2);\n\n // We never auction for less than starting price\n if (nextPrice < GEN0_STARTING_PRICE) {\n nextPrice = GEN0_STARTING_PRICE;\n }\n\n return nextPrice;\n }\n}\n\n\n/// @title CryptoKitties: Collectible, breedable, and oh-so-adorable cats on the Ethereum blockchain.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev The main CryptoKitties contract, keeps track of kittens so they don't wander around and get lost.\ncontract KittyCore is KittyMinting {\n\n // This is the main CryptoKitties contract. In order to keep our code seperated into logical sections,\n // we've broken it up in two ways. First, we have several seperately-instantiated sibling contracts\n // that handle auctions and our super-top-secret genetic combination algorithm. The auctions are\n // seperate since their logic is somewhat complex and there's always a risk of subtle bugs. By keeping\n // them in their own contracts, we can upgrade them without disrupting the main contract that tracks\n // kitty ownership. The genetic combination algorithm is kept seperate so we can open-source all of\n // the rest of our code without making it _too_ easy for folks to figure out how the genetics work.\n // Don't worry, I'm sure someone will reverse engineer it soon enough!\n //\n // Secondly, we break the core contract into multiple files using inheritence, one for each major\n // facet of functionality of CK. This allows us to keep related code bundled together while still\n // avoiding a single giant file with everything in it. The breakdown is as follows:\n //\n // - KittyBase: This is where we define the most fundamental code shared throughout the core\n // functionality. This includes our main data storage, constants and data types, plus\n // internal functions for managing these items.\n //\n // - KittyAccessControl: This contract manages the various addresses and constraints for operations\n // that can be executed only by specific roles. Namely CEO, CFO and COO.\n //\n // - KittyOwnership: This provides the methods required for basic non-fungible token\n // transactions, following the draft ERC-721 spec (https://github.com/ethereum/EIPs/issues/721).\n //\n // - KittyBreeding: This file contains the methods necessary to breed cats together, including\n // keeping track of siring offers, and relies on an external genetic combination contract.\n //\n // - KittyAuctions: Here we have the public methods for auctioning or bidding on cats or siring\n // services. The actual auction functionality is handled in two sibling contracts (one\n // for sales and one for siring), while auction creation and bidding is mostly mediated\n // through this facet of the core contract.\n //\n // - KittyMinting: This final facet contains the functionality we use for creating new gen0 cats.\n // We can make up to 5000 \"promo\" cats that can be given away (especially important when\n // the community is new), and all others can only be created and then immediately put up\n // for auction via an algorithmically determined starting price. Regardless of how they\n // are created, there is a hard limit of 50k gen0 cats. After that, it's all up to the\n // community to breed, breed, breed!\n\n // Set in case the core contract is broken and an upgrade is required\n address public newContractAddress;\n\n /// @notice Creates the main CryptoKitties smart contract instance.\n function KittyCore() public {\n // Starts paused.\n paused = true;\n\n // the creator of the contract is the initial CEO\n ceoAddress = msg.sender;\n\n // the creator of the contract is also the initial COO\n cooAddress = msg.sender;\n\n // start with the mythical kitten 0 - so we don't have generation-0 parent issues\n _createKitty(0, 0, 0, uint256(-1), address(0));\n }\n\n /// @dev Used to mark the smart contract as upgraded, in case there is a serious\n /// breaking bug. This method does nothing but keep track of the new contract and\n /// emit a message indicating that the new address is set. It's up to clients of this\n /// contract to update to the new contract address in that case. (This contract will\n /// be paused indefinitely if such an upgrade takes place.)\n /// @param _v2Address new address\n function setNewAddress(address _v2Address) external onlyCEO whenPaused {\n // See README.md for updgrade plan\n newContractAddress = _v2Address;\n ContractUpgrade(_v2Address);\n }\n\n /// @notice No tipping!\n /// @dev Reject all Ether from being sent here, unless it's from one of the\n /// two auction contracts. (Hopefully, we can prevent user accidents.)\n function() external payable {\n require(\n msg.sender == address(saleAuction) ||\n msg.sender == address(siringAuction)\n );\n }\n\n /// @notice Returns all the relevant information about a specific kitty.\n /// @param _id The ID of the kitty of interest.\n function getKitty(uint256 _id)\n external\n view\n returns (\n bool isGestating,\n bool isReady,\n uint256 cooldownIndex,\n uint256 nextActionAt,\n uint256 siringWithId,\n uint256 birthTime,\n uint256 matronId,\n uint256 sireId,\n uint256 generation,\n uint256 genes\n ) {\n Kitty storage kit = kitties[_id];\n\n // if this variable is 0 then it's not gestating\n isGestating = (kit.siringWithId != 0);\n isReady = (kit.cooldownEndBlock <= block.number);\n cooldownIndex = uint256(kit.cooldownIndex);\n nextActionAt = uint256(kit.cooldownEndBlock);\n siringWithId = uint256(kit.siringWithId);\n birthTime = uint256(kit.birthTime);\n matronId = uint256(kit.matronId);\n sireId = uint256(kit.sireId);\n generation = uint256(kit.generation);\n genes = kit.genes;\n }\n\n /// @dev Override unpause so it requires all external contract addresses\n /// to be set before contract can be unpaused. Also, we can't have\n /// newContractAddress set either, because then the contract was upgraded.\n /// @notice This is public rather than external so we can call super.unpause\n /// without using an expensive CALL.\n function unpause() public onlyCEO whenPaused {\n require(saleAuction != address(0));\n require(siringAuction != address(0));\n require(geneScience != address(0));\n require(newContractAddress == address(0));\n\n // Actually unpause the contract.\n super.unpause();\n }\n\n // @dev Allows the CFO to capture the balance available to the contract.\n function withdrawBalance() external onlyCFO {\n uint256 balance = this.balance;\n // Subtract all the currently pregnant kittens we have, plus 1 of margin.\n uint256 subtractFees = (pregnantKitties + 1) * autoBirthFee;\n\n if (balance > subtractFees) {\n cfoAddress.send(balance - subtractFees);\n }\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "exportedSymbols": { "ClockAuction": [ 8872 @@ -51815,5 +51815,5 @@ }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:47.673Z" + "updatedAt": "2018-10-09T17:45:35.810Z" } \ No newline at end of file diff --git a/artifacts/json/KittiesERC721Metadata.json b/artifacts/json/KittiesERC721Metadata.json index 6ebde0bd..acbf98b5 100644 --- a/artifacts/json/KittiesERC721Metadata.json +++ b/artifacts/json/KittiesERC721Metadata.json @@ -29,15 +29,15 @@ "type": "function" } ], - "bytecode": "0x6060604052341561000f57600080fd5b6103608061001e6000396000f300606060405260043610610041576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063cb4799f214610046575b600080fd5b341561005157600080fd5b6100aa600480803590602001909190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506100ef565b6040518083600460200280838360005b838110156100d55780820151818401526020810190506100ba565b505050509050018281526020019250505060405180910390f35b6100f7610309565b6000600184141561014e577f48656c6c6f20576f726c6421203a44000000000000000000000000000000000082600060048110151561013257fe5b60200201906000191690816000191681525050600f9050610302565b60028414156101e6577f4920776f756c6420646566696e6974656c792063686f6f73652061206d65646982600060048110151561018757fe5b602002019060001916908160001916815250507f756d206c656e67746820737472696e672e0000000000000000000000000000008260016004811015156101ca57fe5b6020020190600019169081600019168152505060319050610301565b6003841415610300577f4c6f72656d20697073756d20646f6c6f722073697420616d65742c206d69206582600060048110151561021f57fe5b602002019060001916908160001916815250507f737420616363756d73616e2064617069627573206175677565206c6f72656d2c82600160048110151561026257fe5b602002019060001916908160001916815250507f2074726973746971756520766573746962756c756d2069642c206c696265726f8260026004811015156102a557fe5b602002019060001916908160001916815250507f207375736369706974207661726975732073617069656e20616c697175616d2e8260036004811015156102e857fe5b60200201906000191690816000191681525050608090505b5b5b9250929050565b6080604051908101604052806004905b600080191681526020019060019003908161031957905050905600a165627a7a72305820dddf8ed6fe53e11ab9b2c72f45dbd93d34908d1647b58cc50edbe79c0ea621b40029", - "deployedBytecode": "0x606060405260043610610041576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063cb4799f214610046575b600080fd5b341561005157600080fd5b6100aa600480803590602001909190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506100ef565b6040518083600460200280838360005b838110156100d55780820151818401526020810190506100ba565b505050509050018281526020019250505060405180910390f35b6100f7610309565b6000600184141561014e577f48656c6c6f20576f726c6421203a44000000000000000000000000000000000082600060048110151561013257fe5b60200201906000191690816000191681525050600f9050610302565b60028414156101e6577f4920776f756c6420646566696e6974656c792063686f6f73652061206d65646982600060048110151561018757fe5b602002019060001916908160001916815250507f756d206c656e67746820737472696e672e0000000000000000000000000000008260016004811015156101ca57fe5b6020020190600019169081600019168152505060319050610301565b6003841415610300577f4c6f72656d20697073756d20646f6c6f722073697420616d65742c206d69206582600060048110151561021f57fe5b602002019060001916908160001916815250507f737420616363756d73616e2064617069627573206175677565206c6f72656d2c82600160048110151561026257fe5b602002019060001916908160001916815250507f2074726973746971756520766573746962756c756d2069642c206c696265726f8260026004811015156102a557fe5b602002019060001916908160001916815250507f207375736369706974207661726975732073617069656e20616c697175616d2e8260036004811015156102e857fe5b60200201906000191690816000191681525050608090505b5b5b9250929050565b6080604051908101604052806004905b600080191681526020019060019003908161031957905050905600a165627a7a72305820dddf8ed6fe53e11ab9b2c72f45dbd93d34908d1647b58cc50edbe79c0ea621b40029", + "bytecode": "0x6060604052341561000f57600080fd5b6103608061001e6000396000f300606060405260043610610041576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063cb4799f214610046575b600080fd5b341561005157600080fd5b6100aa600480803590602001909190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506100ef565b6040518083600460200280838360005b838110156100d55780820151818401526020810190506100ba565b505050509050018281526020019250505060405180910390f35b6100f7610309565b6000600184141561014e577f48656c6c6f20576f726c6421203a44000000000000000000000000000000000082600060048110151561013257fe5b60200201906000191690816000191681525050600f9050610302565b60028414156101e6577f4920776f756c6420646566696e6974656c792063686f6f73652061206d65646982600060048110151561018757fe5b602002019060001916908160001916815250507f756d206c656e67746820737472696e672e0000000000000000000000000000008260016004811015156101ca57fe5b6020020190600019169081600019168152505060319050610301565b6003841415610300577f4c6f72656d20697073756d20646f6c6f722073697420616d65742c206d69206582600060048110151561021f57fe5b602002019060001916908160001916815250507f737420616363756d73616e2064617069627573206175677565206c6f72656d2c82600160048110151561026257fe5b602002019060001916908160001916815250507f2074726973746971756520766573746962756c756d2069642c206c696265726f8260026004811015156102a557fe5b602002019060001916908160001916815250507f207375736369706974207661726975732073617069656e20616c697175616d2e8260036004811015156102e857fe5b60200201906000191690816000191681525050608090505b5b5b9250929050565b6080604051908101604052806004905b600080191681526020019060019003908161031957905050905600a165627a7a72305820bc59ec36d20a6658ad00ee23b5f774dfb934ac90ad57218913d64600cd332b480029", + "deployedBytecode": "0x606060405260043610610041576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063cb4799f214610046575b600080fd5b341561005157600080fd5b6100aa600480803590602001909190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506100ef565b6040518083600460200280838360005b838110156100d55780820151818401526020810190506100ba565b505050509050018281526020019250505060405180910390f35b6100f7610309565b6000600184141561014e577f48656c6c6f20576f726c6421203a44000000000000000000000000000000000082600060048110151561013257fe5b60200201906000191690816000191681525050600f9050610302565b60028414156101e6577f4920776f756c6420646566696e6974656c792063686f6f73652061206d65646982600060048110151561018757fe5b602002019060001916908160001916815250507f756d206c656e67746820737472696e672e0000000000000000000000000000008260016004811015156101ca57fe5b6020020190600019169081600019168152505060319050610301565b6003841415610300577f4c6f72656d20697073756d20646f6c6f722073697420616d65742c206d69206582600060048110151561021f57fe5b602002019060001916908160001916815250507f737420616363756d73616e2064617069627573206175677565206c6f72656d2c82600160048110151561026257fe5b602002019060001916908160001916815250507f2074726973746971756520766573746962756c756d2069642c206c696265726f8260026004811015156102a557fe5b602002019060001916908160001916815250507f207375736369706974207661726975732073617069656e20616c697175616d2e8260036004811015156102e857fe5b60200201906000191690816000191681525050608090505b5b5b9250929050565b6080604051908101604052806004905b600080191681526020019060019003908161031957905050905600a165627a7a72305820bc59ec36d20a6658ad00ee23b5f774dfb934ac90ad57218913d64600cd332b480029", "sourceMap": "17644:818:18:-;;;;;;;;;;;;;;;;;", "deployedSourceMap": "17644:818:18:-;;;;;;;;;;;;;;;;;;;;;;;;17779:681;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;17779:681:18;17847:17;;:::i;:::-;17866:13;17907:1;17895:8;:13;17891:563;;;17924:29;:6;17931:1;17924:9;;;;;;;;;;;;:29;;;;;;;;;;;;;17975:2;17967:10;;17891:563;;;18010:1;17998:8;:13;17994:460;;;18027:46;:6;18034:1;18027:9;;;;;;;;;;;;:46;;;;;;;;;;;;;18087:31;:6;18094:1;18087:9;;;;;;;;;;;;:31;;;;;;;;;;;;;18140:2;18132:10;;17994:460;;;18175:1;18163:8;:13;18159:295;;;18192:46;:6;18199:1;18192:9;;;;;;;;;;;;:46;;;;;;;;;;;;;18252;:6;18259:1;18252:9;;;;;;;;;;;;:46;;;;;;;;;;;;;18312;:6;18319:1;18312:9;;;;;;;;;;;;:46;;;;;;;;;;;;;18372;:6;18379:1;18372:9;;;;;;;;;;;;:46;;;;;;;;;;;;;18440:3;18432:11;;18159:295;17994:460;17891:563;17779:681;;;;;:::o;17644:818::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", "source": "pragma solidity 0.4.18;\n\n/**\n The following contract code, titled KittyCore, was written by Cryptokitties and published\n and retrieved from https://etherscan.io/address/0x06012c8cf97bead5deae237070f9587f8e7a266d#code.\n\n It is included in the current project for test purposes, to ensure that our collateralizer can\n handle ERC721 tokens created by the KittyCore contract.\n*/\n\n/**\n * @title KittiesOwnable\n * @dev The KittiesOwnable contract has an owner address, and provides basic authorization control\n * functions, this simplifies the implementation of \"user permissions\".\n */\ncontract KittiesOwnable {\n address public owner;\n\n\n /**\n\t * @dev The KittiesOwnable constructor sets the original `owner` of the contract to the sender\n\t * account.\n\t */\n function KittiesOwnable() {\n owner = msg.sender;\n }\n\n\n /**\n\t * @dev Throws if called by any account other than the owner.\n\t */\n modifier onlyOwner() {\n require(msg.sender == owner);\n _;\n }\n\n\n /**\n\t * @dev Allows the current owner to transfer control of the contract to a newOwner.\n\t * @param newOwner The address to transfer ownership to.\n\t */\n function transferOwnership(address newOwner) onlyOwner {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n\n}\n\n\n\n/// @title Interface for contracts conforming to ERC-721: Non-Fungible Tokens\n/// @author Dieter Shirley (https://github.com/dete)\ncontract KittiesERC721 {\n // Required methods\n function totalSupply() public view returns (uint256 total);\n function balanceOf(address _owner) public view returns (uint256 balance);\n function ownerOf(uint256 _tokenId) external view returns (address owner);\n function approve(address _to, uint256 _tokenId) external;\n function transfer(address _to, uint256 _tokenId) external;\n function transferFrom(address _from, address _to, uint256 _tokenId) external;\n\n // Events\n event Transfer(address from, address to, uint256 tokenId);\n event Approval(address owner, address approved, uint256 tokenId);\n\n // Optional\n // function name() public view returns (string name);\n // function symbol() public view returns (string symbol);\n // function tokensOfOwner(address _owner) external view returns (uint256[] tokenIds);\n // function tokenMetadata(uint256 _tokenId, string _preferredTransport) public view returns (string infoUrl);\n\n // ERC-165 Compatibility (https://github.com/ethereum/EIPs/issues/165)\n function supportsInterface(bytes4 _interfaceID) external view returns (bool);\n}\n\n\n// // Auction wrapper functions\n\n\n// Auction wrapper functions\n\n\n\n\n\n\n\n/// @title SEKRETOOOO\ncontract GeneScienceInterface {\n /// @dev simply a boolean to indicate this is the contract we expect to be\n function isGeneScience() public pure returns (bool);\n\n /// @dev given genes of kitten 1 & 2, return a genetic combination - may have a random factor\n /// @param genes1 genes of mom\n /// @param genes2 genes of sire\n /// @return the genes that are supposed to be passed down the child\n function mixGenes(uint256 genes1, uint256 genes2, uint256 targetBlock) public returns (uint256);\n}\n\n\n\n\n\n\n\n/// @title A facet of KittyCore that manages special access privileges.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyAccessControl {\n // This facet controls access control for CryptoKitties. There are four roles managed here:\n //\n // - The CEO: The CEO can reassign other roles and change the addresses of our dependent smart\n // contracts. It is also the only role that can unpause the smart contract. It is initially\n // set to the address that created the smart contract in the KittyCore constructor.\n //\n // - The CFO: The CFO can withdraw funds from KittyCore and its auction contracts.\n //\n // - The COO: The COO can release gen0 kitties to auction, and mint promo cats.\n //\n // It should be noted that these roles are distinct without overlap in their access abilities, the\n // abilities listed for each role above are exhaustive. In particular, while the CEO can assign any\n // address to any role, the CEO address itself doesn't have the ability to act in those roles. This\n // restriction is intentional so that we aren't tempted to use the CEO address frequently out of\n // convenience. The less we use an address, the less likely it is that we somehow compromise the\n // account.\n\n /// @dev Emited when contract is upgraded - See README.md for updgrade plan\n event ContractUpgrade(address newContract);\n\n // The addresses of the accounts (or contracts) that can execute actions within each roles.\n address public ceoAddress;\n address public cfoAddress;\n address public cooAddress;\n\n // @dev Keeps track whether the contract is paused. When that is true, most actions are blocked\n bool public paused = false;\n\n /// @dev Access modifier for CEO-only functionality\n modifier onlyCEO() {\n require(msg.sender == ceoAddress);\n _;\n }\n\n /// @dev Access modifier for CFO-only functionality\n modifier onlyCFO() {\n require(msg.sender == cfoAddress);\n _;\n }\n\n /// @dev Access modifier for COO-only functionality\n modifier onlyCOO() {\n require(msg.sender == cooAddress);\n _;\n }\n\n modifier onlyCLevel() {\n require(\n msg.sender == cooAddress ||\n msg.sender == ceoAddress ||\n msg.sender == cfoAddress\n );\n _;\n }\n\n /// @dev Assigns a new address to act as the CEO. Only available to the current CEO.\n /// @param _newCEO The address of the new CEO\n function setCEO(address _newCEO) external onlyCEO {\n require(_newCEO != address(0));\n\n ceoAddress = _newCEO;\n }\n\n /// @dev Assigns a new address to act as the CFO. Only available to the current CEO.\n /// @param _newCFO The address of the new CFO\n function setCFO(address _newCFO) external onlyCEO {\n require(_newCFO != address(0));\n\n cfoAddress = _newCFO;\n }\n\n /// @dev Assigns a new address to act as the COO. Only available to the current CEO.\n /// @param _newCOO The address of the new COO\n function setCOO(address _newCOO) external onlyCEO {\n require(_newCOO != address(0));\n\n cooAddress = _newCOO;\n }\n\n /*** KittiesPausable functionality adapted from OpenZeppelin ***/\n\n /// @dev Modifier to allow actions only when the contract IS NOT paused\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /// @dev Modifier to allow actions only when the contract IS paused\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /// @dev Called by any \"C-level\" role to pause the contract. Used only when\n /// a bug or exploit is detected and we need to limit damage.\n function pause() external onlyCLevel whenNotPaused {\n paused = true;\n }\n\n /// @dev Unpauses the smart contract. Can only be called by the CEO, since\n /// one reason we may pause the contract is when CFO or COO accounts are\n /// compromised.\n /// @notice This is public rather than external so it can be called by\n /// derived contracts.\n function unpause() public onlyCEO whenPaused {\n // can't unpause if contract was upgraded\n paused = false;\n }\n}\n\n\n\n\n/// @title Base contract for CryptoKitties. Holds all common structs, events and base variables.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBase is KittyAccessControl {\n /*** EVENTS ***/\n\n /// @dev The Birth event is fired whenever a new kitten comes into existence. This obviously\n /// includes any time a cat is created through the giveBirth method, but it is also called\n /// when a new gen0 cat is created.\n event Birth(address owner, uint256 kittyId, uint256 matronId, uint256 sireId, uint256 genes);\n\n /// @dev Transfer event as defined in current draft of ERC721. Emitted every time a kitten\n /// ownership is assigned, including births.\n event Transfer(address from, address to, uint256 tokenId);\n\n /*** DATA TYPES ***/\n\n /// @dev The main Kitty struct. Every cat in CryptoKitties is represented by a copy\n /// of this structure, so great care was taken to ensure that it fits neatly into\n /// exactly two 256-bit words. Note that the order of the members in this structure\n /// is important because of the byte-packing rules used by Ethereum.\n /// Ref: http://solidity.readthedocs.io/en/develop/miscellaneous.html\n struct Kitty {\n // The Kitty's genetic code is packed into these 256-bits, the format is\n // sooper-sekret! A cat's genes never change.\n uint256 genes;\n\n // The timestamp from the block when this cat came into existence.\n uint64 birthTime;\n\n // The minimum timestamp after which this cat can engage in breeding\n // activities again. This same timestamp is used for the pregnancy\n // timer (for matrons) as well as the siring cooldown.\n uint64 cooldownEndBlock;\n\n // The ID of the parents of this kitty, set to 0 for gen0 cats.\n // Note that using 32-bit unsigned integers limits us to a \"mere\"\n // 4 billion cats. This number might seem small until you realize\n // that Ethereum currently has a limit of about 500 million\n // transactions per year! So, this definitely won't be a problem\n // for several years (even as Ethereum learns to scale).\n uint32 matronId;\n uint32 sireId;\n\n // Set to the ID of the sire cat for matrons that are pregnant,\n // zero otherwise. A non-zero value here is how we know a cat\n // is pregnant. Used to retrieve the genetic material for the new\n // kitten when the birth transpires.\n uint32 siringWithId;\n\n // Set to the index in the cooldown array (see below) that represents\n // the current cooldown duration for this Kitty. This starts at zero\n // for gen0 cats, and is initialized to floor(generation/2) for others.\n // Incremented by one for each successful breeding action, regardless\n // of whether this cat is acting as matron or sire.\n uint16 cooldownIndex;\n\n // The \"generation number\" of this cat. Cats minted by the CK contract\n // for sale are called \"gen0\" and have a generation number of 0. The\n // generation number of all other cats is the larger of the two generation\n // numbers of their parents, plus one.\n // (i.e. max(matron.generation, sire.generation) + 1)\n uint16 generation;\n }\n\n /*** CONSTANTS ***/\n\n /// @dev A lookup table indicating the cooldown duration after any successful\n /// breeding action, called \"pregnancy time\" for matrons and \"siring cooldown\"\n /// for sires. Designed such that the cooldown roughly doubles each time a cat\n /// is bred, encouraging owners not to just keep breeding the same cat over\n /// and over again. Caps out at one week (a cat can breed an unbounded number\n /// of times, and the maximum cooldown is always seven days).\n uint32[14] public cooldowns = [\n uint32(1 minutes),\n uint32(2 minutes),\n uint32(5 minutes),\n uint32(10 minutes),\n uint32(30 minutes),\n uint32(1 hours),\n uint32(2 hours),\n uint32(4 hours),\n uint32(8 hours),\n uint32(16 hours),\n uint32(1 days),\n uint32(2 days),\n uint32(4 days),\n uint32(7 days)\n ];\n\n // An approximation of currently how many seconds are in between blocks.\n uint256 public secondsPerBlock = 15;\n\n /*** STORAGE ***/\n\n /// @dev An array containing the Kitty struct for all Kitties in existence. The ID\n /// of each cat is actually an index into this array. Note that ID 0 is a negacat,\n /// the unKitty, the mythical beast that is the parent of all gen0 cats. A bizarre\n /// creature that is both matron and sire... to itself! Has an invalid genetic code.\n /// In other words, cat ID 0 is invalid... ;-)\n Kitty[] kitties;\n\n /// @dev A mapping from cat IDs to the address that owns them. All cats have\n /// some valid owner address, even gen0 cats are created with a non-zero owner.\n mapping (uint256 => address) public kittyIndexToOwner;\n\n // @dev A mapping from owner address to count of tokens that address owns.\n // Used internally inside balanceOf() to resolve ownership count.\n mapping (address => uint256) ownershipTokenCount;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to call\n /// transferFrom(). Each Kitty can only have one approved address for transfer\n /// at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public kittyIndexToApproved;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to use\n /// this Kitty for siring via breedWith(). Each Kitty can only have one approved\n /// address for siring at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public sireAllowedToAddress;\n\n /// @dev The address of the ClockAuction contract that handles sales of Kitties. This\n /// same contract handles both peer-to-peer sales as well as the gen0 sales which are\n /// initiated every 15 minutes.\n SaleClockAuction public saleAuction;\n\n /// @dev The address of a custom ClockAuction subclassed contract that handles siring\n /// auctions. Needs to be separate from saleAuction because the actions taken on success\n /// after a sales and siring auction are quite different.\n SiringClockAuction public siringAuction;\n\n /// @dev Assigns ownership of a specific Kitty to an address.\n function _transfer(address _from, address _to, uint256 _tokenId) internal {\n // Since the number of kittens is capped to 2^32 we can't overflow this\n ownershipTokenCount[_to]++;\n // transfer ownership\n kittyIndexToOwner[_tokenId] = _to;\n // When creating new kittens _from is 0x0, but we can't account that address.\n if (_from != address(0)) {\n ownershipTokenCount[_from]--;\n // once the kitten is transferred also clear sire allowances\n delete sireAllowedToAddress[_tokenId];\n // clear any previously approved ownership exchange\n delete kittyIndexToApproved[_tokenId];\n }\n // Emit the transfer event.\n Transfer(_from, _to, _tokenId);\n }\n\n /// @dev An internal method that creates a new kitty and stores it. This\n /// method doesn't do any checking and should only be called when the\n /// input data is known to be valid. Will generate both a Birth event\n /// and a Transfer event.\n /// @param _matronId The kitty ID of the matron of this cat (zero for gen0)\n /// @param _sireId The kitty ID of the sire of this cat (zero for gen0)\n /// @param _generation The generation number of this cat, must be computed by caller.\n /// @param _genes The kitty's genetic code.\n /// @param _owner The inital owner of this cat, must be non-zero (except for the unKitty, ID 0)\n function _createKitty(\n uint256 _matronId,\n uint256 _sireId,\n uint256 _generation,\n uint256 _genes,\n address _owner\n )\n internal\n returns (uint)\n {\n // These requires are not strictly necessary, our calling code should make\n // sure that these conditions are never broken. However! _createKitty() is already\n // an expensive call (for storage), and it doesn't hurt to be especially careful\n // to ensure our data structures are always valid.\n require(_matronId == uint256(uint32(_matronId)));\n require(_sireId == uint256(uint32(_sireId)));\n require(_generation == uint256(uint16(_generation)));\n\n // New kitty starts with the same cooldown as parent gen/2\n uint16 cooldownIndex = uint16(_generation / 2);\n if (cooldownIndex > 13) {\n cooldownIndex = 13;\n }\n\n Kitty memory _kitty = Kitty({\n genes: _genes,\n birthTime: uint64(now),\n cooldownEndBlock: 0,\n matronId: uint32(_matronId),\n sireId: uint32(_sireId),\n siringWithId: 0,\n cooldownIndex: cooldownIndex,\n generation: uint16(_generation)\n });\n uint256 newKittenId = kitties.push(_kitty) - 1;\n\n // It's probably never going to happen, 4 billion cats is A LOT, but\n // let's just be 100% sure we never let this happen.\n require(newKittenId == uint256(uint32(newKittenId)));\n\n // emit the birth event\n Birth(\n _owner,\n newKittenId,\n uint256(_kitty.matronId),\n uint256(_kitty.sireId),\n _kitty.genes\n );\n\n // This will assign ownership, and also emit the Transfer event as\n // per ERC721 draft\n _transfer(0, _owner, newKittenId);\n\n return newKittenId;\n }\n\n // Any C-level can fix how many seconds per blocks are currently observed.\n function setSecondsPerBlock(uint256 secs) external onlyCLevel {\n require(secs < cooldowns[0]);\n secondsPerBlock = secs;\n }\n}\n\n\n\n\n\n/// @title The external contract that is responsible for generating metadata for the kitties,\n/// it has one function that will return the data as bytes.\ncontract KittiesERC721Metadata {\n /// @dev Given a token Id, returns a byte array that is supposed to be converted into string.\n function getMetadata(uint256 _tokenId, string) public view returns (bytes32[4] buffer, uint256 count) {\n if (_tokenId == 1) {\n buffer[0] = \"Hello World! :D\";\n count = 15;\n } else if (_tokenId == 2) {\n buffer[0] = \"I would definitely choose a medi\";\n buffer[1] = \"um length string.\";\n count = 49;\n } else if (_tokenId == 3) {\n buffer[0] = \"Lorem ipsum dolor sit amet, mi e\";\n buffer[1] = \"st accumsan dapibus augue lorem,\";\n buffer[2] = \" tristique vestibulum id, libero\";\n buffer[3] = \" suscipit varius sapien aliquam.\";\n count = 128;\n }\n }\n}\n\n\n/// @title The facet of the CryptoKitties core contract that manages ownership, ERC-721 (draft) compliant.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev Ref: https://github.com/ethereum/EIPs/issues/721\n/// See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyOwnership is KittyBase, KittiesERC721 {\n\n /// @notice Name and symbol of the non fungible token, as defined in ERC721.\n string public constant name = \"CryptoKitties\";\n string public constant symbol = \"CK\";\n\n // The contract that will return kitty metadata\n KittiesERC721Metadata public erc721Metadata;\n\n bytes4 constant InterfaceSignature_ERC165 =\n bytes4(keccak256('supportsInterface(bytes4)'));\n\n bytes4 constant InterfaceSignature_ERC721 =\n bytes4(keccak256('name()')) ^\n bytes4(keccak256('symbol()')) ^\n bytes4(keccak256('totalSupply()')) ^\n bytes4(keccak256('balanceOf(address)')) ^\n bytes4(keccak256('ownerOf(uint256)')) ^\n bytes4(keccak256('approve(address,uint256)')) ^\n bytes4(keccak256('transfer(address,uint256)')) ^\n bytes4(keccak256('transferFrom(address,address,uint256)')) ^\n bytes4(keccak256('tokensOfOwner(address)')) ^\n bytes4(keccak256('tokenMetadata(uint256,string)'));\n\n /// @notice Introspection interface as per ERC-165 (https://github.com/ethereum/EIPs/issues/165).\n /// Returns true for any standardized interfaces implemented by this contract. We implement\n /// ERC-165 (obviously!) and ERC-721.\n function supportsInterface(bytes4 _interfaceID) external view returns (bool)\n {\n // DEBUG ONLY\n //require((InterfaceSignature_ERC165 == 0x01ffc9a7) && (InterfaceSignature_ERC721 == 0x9a20483d));\n\n return ((_interfaceID == InterfaceSignature_ERC165) || (_interfaceID == InterfaceSignature_ERC721));\n }\n\n /// @dev Set the address of the sibling contract that tracks metadata.\n /// CEO only.\n function setMetadataAddress(address _contractAddress) public onlyCEO {\n erc721Metadata = KittiesERC721Metadata(_contractAddress);\n }\n\n // Internal utility functions: These functions all assume that their input arguments\n // are valid. We leave it to public methods to sanitize their inputs and follow\n // the required logic.\n\n /// @dev Checks if a given address is the current owner of a particular Kitty.\n /// @param _claimant the address we are validating against.\n /// @param _tokenId kitten id, only valid when > 0\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToOwner[_tokenId] == _claimant;\n }\n\n /// @dev Checks if a given address currently has transferApproval for a particular Kitty.\n /// @param _claimant the address we are confirming kitten is approved for.\n /// @param _tokenId kitten id, only valid when > 0\n function _approvedFor(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToApproved[_tokenId] == _claimant;\n }\n\n /// @dev Marks an address as being approved for transferFrom(), overwriting any previous\n /// approval. Setting _approved to address(0) clears all transfer approval.\n /// NOTE: _approve() does NOT send the Approval event. This is intentional because\n /// _approve() and transferFrom() are used together for putting Kitties on auction, and\n /// there is no value in spamming the log with Approval events in that case.\n function _approve(uint256 _tokenId, address _approved) internal {\n kittyIndexToApproved[_tokenId] = _approved;\n }\n\n /// @notice Returns the number of Kitties owned by a specific address.\n /// @param _owner The owner address to check.\n /// @dev Required for ERC-721 compliance\n function balanceOf(address _owner) public view returns (uint256 count) {\n return ownershipTokenCount[_owner];\n }\n\n /// @notice Transfers a Kitty to another address. If transferring to a smart\n /// contract be VERY CAREFUL to ensure that it is aware of ERC-721 (or\n /// CryptoKitties specifically) or your Kitty may be lost forever. Seriously.\n /// @param _to The address of the recipient, can be a user or contract.\n /// @param _tokenId The ID of the Kitty to transfer.\n /// @dev Required for ERC-721 compliance.\n function transfer(\n address _to,\n uint256 _tokenId\n )\n external\n whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Disallow transfers to the auction contracts to prevent accidental\n // misuse. Auction contracts should only take ownership of kitties\n // through the allow + transferFrom flow.\n require(_to != address(saleAuction));\n require(_to != address(siringAuction));\n\n // You can only send your own cat.\n require(_owns(msg.sender, _tokenId));\n\n // Reassign ownership, clear pending approvals, emit Transfer event.\n _transfer(msg.sender, _to, _tokenId);\n }\n\n /// @notice Grant another address the right to transfer a specific Kitty via\n /// transferFrom(). This is the preferred flow for transfering NFTs to contracts.\n /// @param _to The address to be granted transfer approval. Pass address(0) to\n /// clear all approvals.\n /// @param _tokenId The ID of the Kitty that can be transferred if this call succeeds.\n /// @dev Required for ERC-721 compliance.\n function approve(\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Only an owner can grant transfer approval.\n require(_owns(msg.sender, _tokenId));\n\n // Register the approval (replacing any previous approval).\n _approve(_tokenId, _to);\n\n // Emit approval event.\n Approval(msg.sender, _to, _tokenId);\n }\n\n /// @notice Transfer a Kitty owned by another address, for which the calling address\n /// has previously been granted transfer approval by the owner.\n /// @param _from The address that owns the Kitty to be transfered.\n /// @param _to The address that should take ownership of the Kitty. Can be any address,\n /// including the caller.\n /// @param _tokenId The ID of the Kitty to be transferred.\n /// @dev Required for ERC-721 compliance.\n function transferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Check for approval and valid ownership\n require(_approvedFor(msg.sender, _tokenId));\n require(_owns(_from, _tokenId));\n\n // Reassign ownership (also clears pending approvals and emits Transfer event).\n _transfer(_from, _to, _tokenId);\n }\n\n /// @notice Returns the total number of Kitties currently in existence.\n /// @dev Required for ERC-721 compliance.\n function totalSupply() public view returns (uint) {\n return kitties.length - 1;\n }\n\n /// @notice Returns the address currently assigned ownership of a given Kitty.\n /// @dev Required for ERC-721 compliance.\n function ownerOf(uint256 _tokenId)\n external\n view\n returns (address owner)\n {\n owner = kittyIndexToOwner[_tokenId];\n\n require(owner != address(0));\n }\n\n /// @notice Returns a list of all Kitty IDs assigned to an address.\n /// @param _owner The owner whose Kitties we are interested in.\n /// @dev This method MUST NEVER be called by smart contract code. First, it's fairly\n /// expensive (it walks the entire Kitty array looking for cats belonging to owner),\n /// but it also returns a dynamic array, which is only supported for web3 calls, and\n /// not contract-to-contract calls.\n function tokensOfOwner(address _owner) external view returns(uint256[] ownerTokens) {\n uint256 tokenCount = balanceOf(_owner);\n\n if (tokenCount == 0) {\n // Return an empty array\n return new uint256[](0);\n } else {\n uint256[] memory result = new uint256[](tokenCount);\n uint256 totalCats = totalSupply();\n uint256 resultIndex = 0;\n\n // We count on the fact that all cats have IDs starting at 1 and increasing\n // sequentially up to the totalCat count.\n uint256 catId;\n\n for (catId = 1; catId <= totalCats; catId++) {\n if (kittyIndexToOwner[catId] == _owner) {\n result[resultIndex] = catId;\n resultIndex++;\n }\n }\n\n return result;\n }\n }\n\n /// @dev Adapted from memcpy() by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _memcpy(uint _dest, uint _src, uint _len) private view {\n // Copy word-length chunks while possible\n for(; _len >= 32; _len -= 32) {\n assembly {\n mstore(_dest, mload(_src))\n }\n _dest += 32;\n _src += 32;\n }\n\n // Copy remaining bytes\n uint256 mask = 256 ** (32 - _len) - 1;\n assembly {\n let srcpart := and(mload(_src), not(mask))\n let destpart := and(mload(_dest), mask)\n mstore(_dest, or(destpart, srcpart))\n }\n }\n\n /// @dev Adapted from toString(slice) by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _toString(bytes32[4] _rawBytes, uint256 _stringLength) private view returns (string) {\n var outputString = new string(_stringLength);\n uint256 outputPtr;\n uint256 bytesPtr;\n\n assembly {\n outputPtr := add(outputString, 32)\n bytesPtr := _rawBytes\n }\n\n _memcpy(outputPtr, bytesPtr, _stringLength);\n\n return outputString;\n }\n\n /// @notice Returns a URI pointing to a metadata package for this token conforming to\n /// ERC-721 (https://github.com/ethereum/EIPs/issues/721)\n /// @param _tokenId The ID number of the Kitty whose metadata should be returned.\n function tokenMetadata(uint256 _tokenId, string _preferredTransport) external view returns (string infoUrl) {\n require(erc721Metadata != address(0));\n bytes32[4] memory buffer;\n uint256 count;\n (buffer, count) = erc721Metadata.getMetadata(_tokenId, _preferredTransport);\n\n return _toString(buffer, count);\n }\n}\n\n\n\n/// @title A facet of KittyCore that manages Kitty siring, gestation, and birth.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBreeding is KittyOwnership {\n\n /// @dev The Pregnant event is fired when two cats successfully breed and the pregnancy\n /// timer begins for the matron.\n event Pregnant(address owner, uint256 matronId, uint256 sireId, uint256 cooldownEndBlock);\n\n /// @notice The minimum payment required to use breedWithAuto(). This fee goes towards\n /// the gas cost paid by whatever calls giveBirth(), and can be dynamically updated by\n /// the COO role as the gas price changes.\n uint256 public autoBirthFee = 2 finney;\n\n // Keeps track of number of pregnant kitties.\n uint256 public pregnantKitties;\n\n /// @dev The address of the sibling contract that is used to implement the sooper-sekret\n /// genetic combination algorithm.\n GeneScienceInterface public geneScience;\n\n /// @dev Update the address of the genetic contract, can only be called by the CEO.\n /// @param _address An address of a GeneScience contract instance to be used from this point forward.\n function setGeneScienceAddress(address _address) external onlyCEO {\n GeneScienceInterface candidateContract = GeneScienceInterface(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isGeneScience());\n\n // Set the new contract address\n geneScience = candidateContract;\n }\n\n /// @dev Checks that a given kitten is able to breed. Requires that the\n /// current cooldown is finished (for sires) and also checks that there is\n /// no pending pregnancy.\n function _isReadyToBreed(Kitty _kit) internal view returns (bool) {\n // In addition to checking the cooldownEndBlock, we also need to check to see if\n // the cat has a pending birth; there can be some period of time between the end\n // of the pregnacy timer and the birth event.\n return (_kit.siringWithId == 0) && (_kit.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @dev Check if a sire has authorized breeding with this matron. True if both sire\n /// and matron have the same owner, or if the sire has given siring permission to\n /// the matron's owner (via approveSiring()).\n function _isSiringPermitted(uint256 _sireId, uint256 _matronId) internal view returns (bool) {\n address matronOwner = kittyIndexToOwner[_matronId];\n address sireOwner = kittyIndexToOwner[_sireId];\n\n // Siring is okay if they have same owner, or if the matron's owner was given\n // permission to breed with this sire.\n return (matronOwner == sireOwner || sireAllowedToAddress[_sireId] == matronOwner);\n }\n\n /// @dev Set the cooldownEndTime for the given Kitty, based on its current cooldownIndex.\n /// Also increments the cooldownIndex (unless it has hit the cap).\n /// @param _kitten A reference to the Kitty in storage which needs its timer started.\n function _triggerCooldown(Kitty storage _kitten) internal {\n // Compute an estimation of the cooldown time in blocks (based on current cooldownIndex).\n _kitten.cooldownEndBlock = uint64((cooldowns[_kitten.cooldownIndex]/secondsPerBlock) + block.number);\n\n // Increment the breeding count, clamping it at 13, which is the length of the\n // cooldowns array. We could check the array size dynamically, but hard-coding\n // this as a constant saves gas. Yay, Solidity!\n if (_kitten.cooldownIndex < 13) {\n _kitten.cooldownIndex += 1;\n }\n }\n\n /// @notice Grants approval to another user to sire with one of your Kitties.\n /// @param _addr The address that will be able to sire with your Kitty. Set to\n /// address(0) to clear all siring approvals for this Kitty.\n /// @param _sireId A Kitty that you own that _addr will now be able to sire with.\n function approveSiring(address _addr, uint256 _sireId)\n external\n whenNotPaused\n {\n require(_owns(msg.sender, _sireId));\n sireAllowedToAddress[_sireId] = _addr;\n }\n\n /// @dev Updates the minimum payment required for calling giveBirthAuto(). Can only\n /// be called by the COO address. (This fee is used to offset the gas cost incurred\n /// by the autobirth daemon).\n function setAutoBirthFee(uint256 val) external onlyCOO {\n autoBirthFee = val;\n }\n\n /// @dev Checks to see if a given Kitty is pregnant and (if so) if the gestation\n /// period has passed.\n function _isReadyToGiveBirth(Kitty _matron) private view returns (bool) {\n return (_matron.siringWithId != 0) && (_matron.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @notice Checks that a given kitten is able to breed (i.e. it is not pregnant or\n /// in the middle of a siring cooldown).\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isReadyToBreed(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n Kitty storage kit = kitties[_kittyId];\n return _isReadyToBreed(kit);\n }\n\n /// @dev Checks whether a kitty is currently pregnant.\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isPregnant(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n // A kitty is pregnant if and only if this field is set\n return kitties[_kittyId].siringWithId != 0;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair. DOES NOT\n /// check ownership permissions (that is up to the caller).\n /// @param _matron A reference to the Kitty struct of the potential matron.\n /// @param _matronId The matron's ID.\n /// @param _sire A reference to the Kitty struct of the potential sire.\n /// @param _sireId The sire's ID\n function _isValidMatingPair(\n Kitty storage _matron,\n uint256 _matronId,\n Kitty storage _sire,\n uint256 _sireId\n )\n private\n view\n returns(bool)\n {\n // A Kitty can't breed with itself!\n if (_matronId == _sireId) {\n return false;\n }\n\n // Kitties can't breed with their parents.\n if (_matron.matronId == _sireId || _matron.sireId == _sireId) {\n return false;\n }\n if (_sire.matronId == _matronId || _sire.sireId == _matronId) {\n return false;\n }\n\n // We can short circuit the sibling check (below) if either cat is\n // gen zero (has a matron ID of zero).\n if (_sire.matronId == 0 || _matron.matronId == 0) {\n return true;\n }\n\n // Kitties can't breed with full or half siblings.\n if (_sire.matronId == _matron.matronId || _sire.matronId == _matron.sireId) {\n return false;\n }\n if (_sire.sireId == _matron.matronId || _sire.sireId == _matron.sireId) {\n return false;\n }\n\n // Everything seems cool! Let's get DTF.\n return true;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair for\n /// breeding via auction (i.e. skips ownership and siring approval checks).\n function _canBreedWithViaAuction(uint256 _matronId, uint256 _sireId)\n internal\n view\n returns (bool)\n {\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId);\n }\n\n /// @notice Checks to see if two cats can breed together, including checks for\n /// ownership and siring approvals. Does NOT check that both cats are ready for\n /// breeding (i.e. breedWith could still fail until the cooldowns are finished).\n /// TODO: Shouldn't this check pregnancy and cooldowns?!?\n /// @param _matronId The ID of the proposed matron.\n /// @param _sireId The ID of the proposed sire.\n function canBreedWith(uint256 _matronId, uint256 _sireId)\n external\n view\n returns(bool)\n {\n require(_matronId > 0);\n require(_sireId > 0);\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId) &&\n _isSiringPermitted(_sireId, _matronId);\n }\n\n /// @dev Internal utility function to initiate breeding, assumes that all breeding\n /// requirements have been checked.\n function _breedWith(uint256 _matronId, uint256 _sireId) internal {\n // Grab a reference to the Kitties from storage.\n Kitty storage sire = kitties[_sireId];\n Kitty storage matron = kitties[_matronId];\n\n // Mark the matron as pregnant, keeping track of who the sire is.\n matron.siringWithId = uint32(_sireId);\n\n // Trigger the cooldown for both parents.\n _triggerCooldown(sire);\n _triggerCooldown(matron);\n\n // Clear siring permission for both parents. This may not be strictly necessary\n // but it's likely to avoid confusion!\n delete sireAllowedToAddress[_matronId];\n delete sireAllowedToAddress[_sireId];\n\n // Every time a kitty gets pregnant, counter is incremented.\n pregnantKitties++;\n\n // Emit the pregnancy event.\n Pregnant(kittyIndexToOwner[_matronId], _matronId, _sireId, matron.cooldownEndBlock);\n }\n\n /// @notice Breed a Kitty you own (as matron) with a sire that you own, or for which you\n /// have previously been given Siring approval. Will either make your cat pregnant, or will\n /// fail entirely. Requires a pre-payment of the fee given out to the first caller of giveBirth()\n /// @param _matronId The ID of the Kitty acting as matron (will end up pregnant if successful)\n /// @param _sireId The ID of the Kitty acting as sire (will begin its siring cooldown if successful)\n function breedWithAuto(uint256 _matronId, uint256 _sireId)\n external\n payable\n whenNotPaused\n {\n // Checks for payment.\n require(msg.value >= autoBirthFee);\n\n // Caller must own the matron.\n require(_owns(msg.sender, _matronId));\n\n // Neither sire nor matron are allowed to be on auction during a normal\n // breeding operation, but we don't need to check that explicitly.\n // For matron: The caller of this function can't be the owner of the matron\n // because the owner of a Kitty on auction is the auction house, and the\n // auction house will never call breedWith().\n // For sire: Similarly, a sire on auction will be owned by the auction house\n // and the act of transferring ownership will have cleared any oustanding\n // siring approval.\n // Thus we don't need to spend gas explicitly checking to see if either cat\n // is on auction.\n\n // Check that matron and sire are both owned by caller, or that the sire\n // has given siring permission to caller (i.e. matron's owner).\n // Will fail for _sireId = 0\n require(_isSiringPermitted(_sireId, _matronId));\n\n // Grab a reference to the potential matron\n Kitty storage matron = kitties[_matronId];\n\n // Make sure matron isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(matron));\n\n // Grab a reference to the potential sire\n Kitty storage sire = kitties[_sireId];\n\n // Make sure sire isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(sire));\n\n // Test that these cats are a valid mating pair.\n require(_isValidMatingPair(\n matron,\n _matronId,\n sire,\n _sireId\n ));\n\n // All checks passed, kitty gets pregnant!\n _breedWith(_matronId, _sireId);\n }\n\n /// @notice Have a pregnant Kitty give birth!\n /// @param _matronId A Kitty ready to give birth.\n /// @return The Kitty ID of the new kitten.\n /// @dev Looks at a given Kitty and, if pregnant and if the gestation period has passed,\n /// combines the genes of the two parents to create a new kitten. The new Kitty is assigned\n /// to the current owner of the matron. Upon successful completion, both the matron and the\n /// new kitten will be ready to breed again. Note that anyone can call this function (if they\n /// are willing to pay the gas!), but the new kitten always goes to the mother's owner.\n function giveBirth(uint256 _matronId)\n external\n whenNotPaused\n returns(uint256)\n {\n // Grab a reference to the matron in storage.\n Kitty storage matron = kitties[_matronId];\n\n // Check that the matron is a valid cat.\n require(matron.birthTime != 0);\n\n // Check that the matron is pregnant, and that its time has come!\n require(_isReadyToGiveBirth(matron));\n\n // Grab a reference to the sire in storage.\n uint256 sireId = matron.siringWithId;\n Kitty storage sire = kitties[sireId];\n\n // Determine the higher generation number of the two parents\n uint16 parentGen = matron.generation;\n if (sire.generation > matron.generation) {\n parentGen = sire.generation;\n }\n\n // Call the sooper-sekret gene mixing operation.\n uint256 childGenes = geneScience.mixGenes(matron.genes, sire.genes, matron.cooldownEndBlock - 1);\n\n // Make the new kitten!\n address owner = kittyIndexToOwner[_matronId];\n uint256 kittenId = _createKitty(_matronId, matron.siringWithId, parentGen + 1, childGenes, owner);\n\n // Clear the reference to sire from the matron (REQUIRED! Having siringWithId\n // set is what marks a matron as being pregnant.)\n delete matron.siringWithId;\n\n // Every time a kitty gives birth counter is decremented.\n pregnantKitties--;\n\n // Send the balance fee to the person who made birth happen.\n msg.sender.send(autoBirthFee);\n\n // return the new kitten's ID\n return kittenId;\n }\n}\n\n\n\n\n\n\n\n\n\n\n/// @title Auction Core\n/// @dev Contains models, variables, and internal methods for the auction.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuctionBase {\n\n // Represents an auction on an NFT\n struct Auction {\n // Current owner of NFT\n address seller;\n // Price (in wei) at beginning of auction\n uint128 startingPrice;\n // Price (in wei) at end of auction\n uint128 endingPrice;\n // Duration (in seconds) of auction\n uint64 duration;\n // Time when auction started\n // NOTE: 0 if this auction has been concluded\n uint64 startedAt;\n }\n\n // Reference to contract tracking NFT ownership\n KittiesERC721 public nonFungibleContract;\n\n // Cut owner takes on each auction, measured in basis points (1/100 of a percent).\n // Values 0-10,000 map to 0%-100%\n uint256 public ownerCut;\n\n // Map from token ID to their corresponding auction.\n mapping (uint256 => Auction) tokenIdToAuction;\n\n event AuctionCreated(uint256 tokenId, uint256 startingPrice, uint256 endingPrice, uint256 duration);\n event AuctionSuccessful(uint256 tokenId, uint256 totalPrice, address winner);\n event AuctionCancelled(uint256 tokenId);\n\n /// @dev Returns true if the claimant owns the token.\n /// @param _claimant - Address claiming to own the token.\n /// @param _tokenId - ID of token whose ownership to verify.\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return (nonFungibleContract.ownerOf(_tokenId) == _claimant);\n }\n\n /// @dev Escrows the NFT, assigning ownership to this contract.\n /// Throws if the escrow fails.\n /// @param _owner - Current owner address of token to escrow.\n /// @param _tokenId - ID of token whose approval to verify.\n function _escrow(address _owner, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transferFrom(_owner, this, _tokenId);\n }\n\n /// @dev Transfers an NFT owned by this contract to another address.\n /// Returns true if the transfer succeeds.\n /// @param _receiver - Address to transfer NFT to.\n /// @param _tokenId - ID of token to transfer.\n function _transfer(address _receiver, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transfer(_receiver, _tokenId);\n }\n\n /// @dev Adds an auction to the list of open auctions. Also fires the\n /// AuctionCreated event.\n /// @param _tokenId The ID of the token to be put on auction.\n /// @param _auction Auction to add.\n function _addAuction(uint256 _tokenId, Auction _auction) internal {\n // Require that all auctions have a duration of\n // at least one minute. (Keeps our math from getting hairy!)\n require(_auction.duration >= 1 minutes);\n\n tokenIdToAuction[_tokenId] = _auction;\n\n AuctionCreated(\n uint256(_tokenId),\n uint256(_auction.startingPrice),\n uint256(_auction.endingPrice),\n uint256(_auction.duration)\n );\n }\n\n /// @dev Cancels an auction unconditionally.\n function _cancelAuction(uint256 _tokenId, address _seller) internal {\n _removeAuction(_tokenId);\n _transfer(_seller, _tokenId);\n AuctionCancelled(_tokenId);\n }\n\n /// @dev Computes the price and transfers winnings.\n /// Does NOT transfer ownership of token.\n function _bid(uint256 _tokenId, uint256 _bidAmount)\n internal\n returns (uint256)\n {\n // Get a reference to the auction struct\n Auction storage auction = tokenIdToAuction[_tokenId];\n\n // Explicitly check that this auction is currently live.\n // (Because of how Ethereum mappings work, we can't just count\n // on the lookup above failing. An invalid _tokenId will just\n // return an auction object that is all zeros.)\n require(_isOnAuction(auction));\n\n // Check that the bid is greater than or equal to the current price\n uint256 price = _currentPrice(auction);\n require(_bidAmount >= price);\n\n // Grab a reference to the seller before the auction struct\n // gets deleted.\n address seller = auction.seller;\n\n // The bid is good! Remove the auction before sending the fees\n // to the sender so we can't have a reentrancy attack.\n _removeAuction(_tokenId);\n\n // Transfer proceeds to seller (if there are any!)\n if (price > 0) {\n // Calculate the auctioneer's cut.\n // (NOTE: _computeCut() is guaranteed to return a\n // value <= price, so this subtraction can't go negative.)\n uint256 auctioneerCut = _computeCut(price);\n uint256 sellerProceeds = price - auctioneerCut;\n\n // NOTE: Doing a transfer() in the middle of a complex\n // method like this is generally discouraged because of\n // reentrancy attacks and DoS attacks if the seller is\n // a contract with an invalid fallback function. We explicitly\n // guard against reentrancy attacks by removing the auction\n // before calling transfer(), and the only thing the seller\n // can DoS is the sale of their own asset! (And if it's an\n // accident, they can call cancelAuction(). )\n seller.transfer(sellerProceeds);\n }\n\n // Calculate any excess funds included with the bid. If the excess\n // is anything worth worrying about, transfer it back to bidder.\n // NOTE: We checked above that the bid amount is greater than or\n // equal to the price so this cannot underflow.\n uint256 bidExcess = _bidAmount - price;\n\n // Return the funds. Similar to the previous transfer, this is\n // not susceptible to a re-entry attack because the auction is\n // removed before any transfers occur.\n msg.sender.transfer(bidExcess);\n\n // Tell the world!\n AuctionSuccessful(_tokenId, price, msg.sender);\n\n return price;\n }\n\n /// @dev Removes an auction from the list of open auctions.\n /// @param _tokenId - ID of NFT on auction.\n function _removeAuction(uint256 _tokenId) internal {\n delete tokenIdToAuction[_tokenId];\n }\n\n /// @dev Returns true if the NFT is on auction.\n /// @param _auction - Auction to check.\n function _isOnAuction(Auction storage _auction) internal view returns (bool) {\n return (_auction.startedAt > 0);\n }\n\n /// @dev Returns current price of an NFT on auction. Broken into two\n /// functions (this one, that computes the duration from the auction\n /// structure, and the other that does the price computation) so we\n /// can easily test that the price computation works correctly.\n function _currentPrice(Auction storage _auction)\n internal\n view\n returns (uint256)\n {\n uint256 secondsPassed = 0;\n\n // A bit of insurance against negative values (or wraparound).\n // Probably not necessary (since Ethereum guarnatees that the\n // now variable doesn't ever go backwards).\n if (now > _auction.startedAt) {\n secondsPassed = now - _auction.startedAt;\n }\n\n return _computeCurrentPrice(\n _auction.startingPrice,\n _auction.endingPrice,\n _auction.duration,\n secondsPassed\n );\n }\n\n /// @dev Computes the current price of an auction. Factored out\n /// from _currentPrice so we can run extensive unit tests.\n /// When testing, make this function public and turn on\n /// `Current price computation` test suite.\n function _computeCurrentPrice(\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n uint256 _secondsPassed\n )\n internal\n pure\n returns (uint256)\n {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our public functions carefully cap the maximum values for\n // time (at 64-bits) and currency (at 128-bits). _duration is\n // also known to be non-zero (see the require() statement in\n // _addAuction())\n if (_secondsPassed >= _duration) {\n // We've reached the end of the dynamic pricing portion\n // of the auction, just return the end price.\n return _endingPrice;\n } else {\n // Starting price can be higher than ending price (and often is!), so\n // this delta can be negative.\n int256 totalPriceChange = int256(_endingPrice) - int256(_startingPrice);\n\n // This multiplication can't overflow, _secondsPassed will easily fit within\n // 64-bits, and totalPriceChange will easily fit within 128-bits, their product\n // will always fit within 256-bits.\n int256 currentPriceChange = totalPriceChange * int256(_secondsPassed) / int256(_duration);\n\n // currentPriceChange can be negative, but if so, will have a magnitude\n // less that _startingPrice. Thus, this result will always end up positive.\n int256 currentPrice = int256(_startingPrice) + currentPriceChange;\n\n return uint256(currentPrice);\n }\n }\n\n /// @dev Computes owner's cut of a sale.\n /// @param _price - Sale price of NFT.\n function _computeCut(uint256 _price) internal view returns (uint256) {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our entry functions carefully cap the maximum values for\n // currency (at 128-bits), and ownerCut <= 10000 (see the require()\n // statement in the ClockAuction constructor). The result of this\n // function is always guaranteed to be <= _price.\n return _price * ownerCut / 10000;\n }\n\n}\n\n\n\n\n\n\n\n/**\n * @title KittiesPausable\n * @dev Base contract which allows children to implement an emergency stop mechanism.\n */\ncontract KittiesPausable is KittiesOwnable {\n event Pause();\n event Unpause();\n\n bool public paused = false;\n\n\n /**\n\t * @dev modifier to allow actions only when the contract IS paused\n\t */\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /**\n\t * @dev modifier to allow actions only when the contract IS NOT paused\n\t */\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /**\n\t * @dev called by the owner to pause, triggers stopped state\n\t */\n function pause() onlyOwner whenNotPaused returns (bool) {\n paused = true;\n Pause();\n return true;\n }\n\n /**\n\t * @dev called by the owner to unpause, returns to normal state\n\t */\n function unpause() onlyOwner whenPaused returns (bool) {\n paused = false;\n Unpause();\n return true;\n }\n}\n\n\n/// @title Clock auction for non-fungible tokens.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuction is KittiesPausable, ClockAuctionBase {\n\n /// @dev The ERC-165 interface signature for ERC-721.\n /// Ref: https://github.com/ethereum/EIPs/issues/165\n /// Ref: https://github.com/ethereum/EIPs/issues/721\n bytes4 constant InterfaceSignature_ERC721 = bytes4(0x9a20483d);\n\n /// @dev Constructor creates a reference to the NFT ownership contract\n /// and verifies the owner cut is in the valid range.\n /// @param _nftAddress - address of a deployed contract implementing\n /// the Nonfungible Interface.\n /// @param _cut - percent cut the owner takes on each auction, must be\n /// between 0-10,000.\n function ClockAuction(address _nftAddress, uint256 _cut) public {\n require(_cut <= 10000);\n ownerCut = _cut;\n\n KittiesERC721 candidateContract = KittiesERC721(_nftAddress);\n require(candidateContract.supportsInterface(InterfaceSignature_ERC721));\n nonFungibleContract = candidateContract;\n }\n\n /// @dev Remove all Ether from the contract, which is the owner's cuts\n /// as well as any Ether sent directly to the contract address.\n /// Always transfers to the NFT contract, but can be called either by\n /// the owner or the NFT contract.\n function withdrawBalance() external {\n address nftAddress = address(nonFungibleContract);\n\n require(\n msg.sender == owner ||\n msg.sender == nftAddress\n );\n // We are using this boolean method to make sure that even if one fails it will still work\n bool res = nftAddress.send(this.balance);\n }\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of time to move between starting\n /// price and ending price (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n whenNotPaused\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(_owns(msg.sender, _tokenId));\n _escrow(msg.sender, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Bids on an open auction, completing the auction and transferring\n /// ownership of the NFT if enough Ether is supplied.\n /// @param _tokenId - ID of token to bid on.\n function bid(uint256 _tokenId)\n external\n payable\n whenNotPaused\n {\n // _bid will throw if the bid or funds transfer fails\n _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n }\n\n /// @dev Cancels an auction that hasn't been won yet.\n /// Returns the NFT to original owner.\n /// @notice This is a state-modifying function that can\n /// be called while the contract is paused.\n /// @param _tokenId - ID of token on auction\n function cancelAuction(uint256 _tokenId)\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n address seller = auction.seller;\n require(msg.sender == seller);\n _cancelAuction(_tokenId, seller);\n }\n\n /// @dev Cancels an auction when the contract is paused.\n /// Only the owner may do this, and NFTs are returned to\n /// the seller. This should only be used in emergencies.\n /// @param _tokenId - ID of the NFT on auction to cancel.\n function cancelAuctionWhenPaused(uint256 _tokenId)\n whenPaused\n onlyOwner\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n _cancelAuction(_tokenId, auction.seller);\n }\n\n /// @dev Returns auction info for an NFT on auction.\n /// @param _tokenId - ID of NFT on auction.\n function getAuction(uint256 _tokenId)\n external\n view\n returns\n (\n address seller,\n uint256 startingPrice,\n uint256 endingPrice,\n uint256 duration,\n uint256 startedAt\n ) {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return (\n auction.seller,\n auction.startingPrice,\n auction.endingPrice,\n auction.duration,\n auction.startedAt\n );\n }\n\n /// @dev Returns the current price of an auction.\n /// @param _tokenId - ID of the token price we are checking.\n function getCurrentPrice(uint256 _tokenId)\n external\n view\n returns (uint256)\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return _currentPrice(auction);\n }\n\n}\n\n\n/// @title Reverse auction modified for siring\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SiringClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSiringAuctionAddress() call.\n bool public isSiringClockAuction = true;\n\n // Delegate constructor\n function SiringClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction. Since this function is wrapped,\n /// require sender to be KittyCore contract.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Places a bid for siring. Requires the sender\n /// is the KittyCore contract because all bid methods\n /// should be wrapped. Also returns the kitty to the\n /// seller rather than the winner.\n function bid(uint256 _tokenId)\n external\n payable\n {\n require(msg.sender == address(nonFungibleContract));\n address seller = tokenIdToAuction[_tokenId].seller;\n // _bid checks that token ID is valid and will throw if bid fails\n _bid(_tokenId, msg.value);\n // We transfer the kitty back to the seller, the winner will get\n // the offspring\n _transfer(seller, _tokenId);\n }\n\n}\n\n\n\n\n\n/// @title Clock auction modified for sale of kitties\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SaleClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSaleAuctionAddress() call.\n bool public isSaleClockAuction = true;\n\n // Tracks last 5 sale price of gen0 kitty sales\n uint256 public gen0SaleCount;\n uint256[5] public lastGen0SalePrices;\n\n // Delegate constructor\n function SaleClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Updates lastSalePrice if seller is the nft contract\n /// Otherwise, works the same as default bid method.\n function bid(uint256 _tokenId)\n external\n payable\n {\n // _bid verifies token ID size\n address seller = tokenIdToAuction[_tokenId].seller;\n uint256 price = _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n\n // If not a gen0 auction, exit\n if (seller == address(nonFungibleContract)) {\n // Track gen0 sale prices\n lastGen0SalePrices[gen0SaleCount % 5] = price;\n gen0SaleCount++;\n }\n }\n\n function averageGen0SalePrice() external view returns (uint256) {\n uint256 sum = 0;\n for (uint256 i = 0; i < 5; i++) {\n sum += lastGen0SalePrices[i];\n }\n return sum / 5;\n }\n\n}\n\n\n/// @title Handles creating auctions for sale and siring of kitties.\n/// This wrapper of ReverseAuction exists only so that users can create\n/// auctions with only one transaction.\ncontract KittyAuction is KittyBreeding {\n\n // @notice The auction contract variables are defined in KittyBase to allow\n // us to refer to them in KittyOwnership to prevent accidental transfers.\n // `saleAuction` refers to the auction for gen0 and p2p sale of kitties.\n // `siringAuction` refers to the auction for siring rights of kitties.\n\n /// @dev Sets the reference to the sale auction.\n /// @param _address - Address of sale contract.\n function setSaleAuctionAddress(address _address) external onlyCEO {\n SaleClockAuction candidateContract = SaleClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSaleClockAuction());\n\n // Set the new contract address\n saleAuction = candidateContract;\n }\n\n /// @dev Sets the reference to the siring auction.\n /// @param _address - Address of siring contract.\n function setSiringAuctionAddress(address _address) external onlyCEO {\n SiringClockAuction candidateContract = SiringClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSiringClockAuction());\n\n // Set the new contract address\n siringAuction = candidateContract;\n }\n\n /// @dev Put a kitty up for auction.\n /// Does some ownership trickery to create auctions in one tx.\n function createSaleAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n // Ensure the kitty is not pregnant to prevent the auction\n // contract accidentally receiving ownership of the child.\n // NOTE: the kitty IS allowed to be in a cooldown.\n require(!isPregnant(_kittyId));\n _approve(_kittyId, saleAuction);\n // Sale auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n saleAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Put a kitty up for auction to be sire.\n /// Performs checks to ensure the kitty can be sired, then\n /// delegates to reverse auction.\n function createSiringAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n require(isReadyToBreed(_kittyId));\n _approve(_kittyId, siringAuction);\n // Siring auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n siringAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Completes a siring auction by bidding.\n /// Immediately breeds the winning matron with the sire on auction.\n /// @param _sireId - ID of the sire on auction.\n /// @param _matronId - ID of the matron owned by the bidder.\n function bidOnSiringAuction(\n uint256 _sireId,\n uint256 _matronId\n )\n external\n payable\n whenNotPaused\n {\n // Auction contract checks input sizes\n require(_owns(msg.sender, _matronId));\n require(isReadyToBreed(_matronId));\n require(_canBreedWithViaAuction(_matronId, _sireId));\n\n // Define the current price of the auction.\n uint256 currentPrice = siringAuction.getCurrentPrice(_sireId);\n require(msg.value >= currentPrice + autoBirthFee);\n\n // Siring auction will throw if the bid fails.\n siringAuction.bid.value(msg.value - autoBirthFee)(_sireId);\n _breedWith(uint32(_matronId), uint32(_sireId));\n }\n\n /// @dev Transfers the balance of the sale auction contract\n /// to the KittyCore contract. We use two-step withdrawal to\n /// prevent two transfer calls in the auction bid function.\n function withdrawAuctionBalances() external onlyCLevel {\n saleAuction.withdrawBalance();\n siringAuction.withdrawBalance();\n }\n}\n\n\n/// @title all functions related to creating kittens\ncontract KittyMinting is KittyAuction {\n\n // Limits the number of cats the contract owner can ever create.\n uint256 public constant PROMO_CREATION_LIMIT = 5000;\n uint256 public constant GEN0_CREATION_LIMIT = 45000;\n\n // Constants for gen0 auctions.\n uint256 public constant GEN0_STARTING_PRICE = 10 finney;\n uint256 public constant GEN0_AUCTION_DURATION = 1 days;\n\n // Counts the number of cats the contract owner has created.\n uint256 public promoCreatedCount;\n uint256 public gen0CreatedCount;\n\n /// @dev we can create promo kittens, up to a limit. Only callable by COO\n /// @param _genes the encoded genes of the kitten to be created, any value is accepted\n /// @param _owner the future owner of the created kittens. Default to contract COO\n function createPromoKitty(uint256 _genes, address _owner) external onlyCOO {\n address kittyOwner = _owner;\n if (kittyOwner == address(0)) {\n kittyOwner = cooAddress;\n }\n require(promoCreatedCount < PROMO_CREATION_LIMIT);\n\n promoCreatedCount++;\n _createKitty(0, 0, 0, _genes, kittyOwner);\n }\n\n /// @dev Creates a new gen0 kitty with the given genes and\n /// creates an auction for it.\n function createGen0Auction(uint256 _genes) external onlyCOO {\n require(gen0CreatedCount < GEN0_CREATION_LIMIT);\n\n uint256 kittyId = _createKitty(0, 0, 0, _genes, address(this));\n _approve(kittyId, saleAuction);\n\n saleAuction.createAuction(\n kittyId,\n _computeNextGen0Price(),\n 0,\n GEN0_AUCTION_DURATION,\n address(this)\n );\n\n gen0CreatedCount++;\n }\n\n /// @dev Computes the next gen0 auction starting price, given\n /// the average of the past 5 prices + 50%.\n function _computeNextGen0Price() internal view returns (uint256) {\n uint256 avePrice = saleAuction.averageGen0SalePrice();\n\n // Sanity check to ensure we don't overflow arithmetic\n require(avePrice == uint256(uint128(avePrice)));\n\n uint256 nextPrice = avePrice + (avePrice / 2);\n\n // We never auction for less than starting price\n if (nextPrice < GEN0_STARTING_PRICE) {\n nextPrice = GEN0_STARTING_PRICE;\n }\n\n return nextPrice;\n }\n}\n\n\n/// @title CryptoKitties: Collectible, breedable, and oh-so-adorable cats on the Ethereum blockchain.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev The main CryptoKitties contract, keeps track of kittens so they don't wander around and get lost.\ncontract KittyCore is KittyMinting {\n\n // This is the main CryptoKitties contract. In order to keep our code seperated into logical sections,\n // we've broken it up in two ways. First, we have several seperately-instantiated sibling contracts\n // that handle auctions and our super-top-secret genetic combination algorithm. The auctions are\n // seperate since their logic is somewhat complex and there's always a risk of subtle bugs. By keeping\n // them in their own contracts, we can upgrade them without disrupting the main contract that tracks\n // kitty ownership. The genetic combination algorithm is kept seperate so we can open-source all of\n // the rest of our code without making it _too_ easy for folks to figure out how the genetics work.\n // Don't worry, I'm sure someone will reverse engineer it soon enough!\n //\n // Secondly, we break the core contract into multiple files using inheritence, one for each major\n // facet of functionality of CK. This allows us to keep related code bundled together while still\n // avoiding a single giant file with everything in it. The breakdown is as follows:\n //\n // - KittyBase: This is where we define the most fundamental code shared throughout the core\n // functionality. This includes our main data storage, constants and data types, plus\n // internal functions for managing these items.\n //\n // - KittyAccessControl: This contract manages the various addresses and constraints for operations\n // that can be executed only by specific roles. Namely CEO, CFO and COO.\n //\n // - KittyOwnership: This provides the methods required for basic non-fungible token\n // transactions, following the draft ERC-721 spec (https://github.com/ethereum/EIPs/issues/721).\n //\n // - KittyBreeding: This file contains the methods necessary to breed cats together, including\n // keeping track of siring offers, and relies on an external genetic combination contract.\n //\n // - KittyAuctions: Here we have the public methods for auctioning or bidding on cats or siring\n // services. The actual auction functionality is handled in two sibling contracts (one\n // for sales and one for siring), while auction creation and bidding is mostly mediated\n // through this facet of the core contract.\n //\n // - KittyMinting: This final facet contains the functionality we use for creating new gen0 cats.\n // We can make up to 5000 \"promo\" cats that can be given away (especially important when\n // the community is new), and all others can only be created and then immediately put up\n // for auction via an algorithmically determined starting price. Regardless of how they\n // are created, there is a hard limit of 50k gen0 cats. After that, it's all up to the\n // community to breed, breed, breed!\n\n // Set in case the core contract is broken and an upgrade is required\n address public newContractAddress;\n\n /// @notice Creates the main CryptoKitties smart contract instance.\n function KittyCore() public {\n // Starts paused.\n paused = true;\n\n // the creator of the contract is the initial CEO\n ceoAddress = msg.sender;\n\n // the creator of the contract is also the initial COO\n cooAddress = msg.sender;\n\n // start with the mythical kitten 0 - so we don't have generation-0 parent issues\n _createKitty(0, 0, 0, uint256(-1), address(0));\n }\n\n /// @dev Used to mark the smart contract as upgraded, in case there is a serious\n /// breaking bug. This method does nothing but keep track of the new contract and\n /// emit a message indicating that the new address is set. It's up to clients of this\n /// contract to update to the new contract address in that case. (This contract will\n /// be paused indefinitely if such an upgrade takes place.)\n /// @param _v2Address new address\n function setNewAddress(address _v2Address) external onlyCEO whenPaused {\n // See README.md for updgrade plan\n newContractAddress = _v2Address;\n ContractUpgrade(_v2Address);\n }\n\n /// @notice No tipping!\n /// @dev Reject all Ether from being sent here, unless it's from one of the\n /// two auction contracts. (Hopefully, we can prevent user accidents.)\n function() external payable {\n require(\n msg.sender == address(saleAuction) ||\n msg.sender == address(siringAuction)\n );\n }\n\n /// @notice Returns all the relevant information about a specific kitty.\n /// @param _id The ID of the kitty of interest.\n function getKitty(uint256 _id)\n external\n view\n returns (\n bool isGestating,\n bool isReady,\n uint256 cooldownIndex,\n uint256 nextActionAt,\n uint256 siringWithId,\n uint256 birthTime,\n uint256 matronId,\n uint256 sireId,\n uint256 generation,\n uint256 genes\n ) {\n Kitty storage kit = kitties[_id];\n\n // if this variable is 0 then it's not gestating\n isGestating = (kit.siringWithId != 0);\n isReady = (kit.cooldownEndBlock <= block.number);\n cooldownIndex = uint256(kit.cooldownIndex);\n nextActionAt = uint256(kit.cooldownEndBlock);\n siringWithId = uint256(kit.siringWithId);\n birthTime = uint256(kit.birthTime);\n matronId = uint256(kit.matronId);\n sireId = uint256(kit.sireId);\n generation = uint256(kit.generation);\n genes = kit.genes;\n }\n\n /// @dev Override unpause so it requires all external contract addresses\n /// to be set before contract can be unpaused. Also, we can't have\n /// newContractAddress set either, because then the contract was upgraded.\n /// @notice This is public rather than external so we can call super.unpause\n /// without using an expensive CALL.\n function unpause() public onlyCEO whenPaused {\n require(saleAuction != address(0));\n require(siringAuction != address(0));\n require(geneScience != address(0));\n require(newContractAddress == address(0));\n\n // Actually unpause the contract.\n super.unpause();\n }\n\n // @dev Allows the CFO to capture the balance available to the contract.\n function withdrawBalance() external onlyCFO {\n uint256 balance = this.balance;\n // Subtract all the currently pregnant kittens we have, plus 1 of margin.\n uint256 subtractFees = (pregnantKitties + 1) * autoBirthFee;\n\n if (balance > subtractFees) {\n cfoAddress.send(balance - subtractFees);\n }\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "exportedSymbols": { "ClockAuction": [ 8872 @@ -51669,5 +51669,5 @@ }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:47.695Z" + "updatedAt": "2018-10-09T17:45:35.886Z" } \ No newline at end of file diff --git a/artifacts/json/KittiesOwnable.json b/artifacts/json/KittiesOwnable.json index d054c948..3300bcf8 100644 --- a/artifacts/json/KittiesOwnable.json +++ b/artifacts/json/KittiesOwnable.json @@ -36,15 +36,15 @@ "type": "constructor" } ], - "bytecode": "0x6060604052341561000f57600080fd5b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506102058061005e6000396000f30060606040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680638da5cb5b14610051578063f2fde38b146100a6575b600080fd5b341561005c57600080fd5b6100646100df565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156100b157600080fd5b6100dd600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610104565b005b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561015f57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415156101d657806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b505600a165627a7a72305820b7aaec9b7148933242d27d2fc9438b2318201185fa79b1b64cd154ffac1a99a60029", - "deployedBytecode": "0x60606040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680638da5cb5b14610051578063f2fde38b146100a6575b600080fd5b341561005c57600080fd5b6100646100df565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156100b157600080fd5b6100dd600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610104565b005b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561015f57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415156101d657806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b505600a165627a7a72305820b7aaec9b7148933242d27d2fc9438b2318201185fa79b1b64cd154ffac1a99a60029", + "bytecode": "0x6060604052341561000f57600080fd5b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506102058061005e6000396000f30060606040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680638da5cb5b14610051578063f2fde38b146100a6575b600080fd5b341561005c57600080fd5b6100646100df565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156100b157600080fd5b6100dd600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610104565b005b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561015f57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415156101d657806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b505600a165627a7a723058205364a5ab5f9a71a281afb6f4128bfab57ef25dbb0ddad4bea69f35d10e6dc2d40029", + "deployedBytecode": "0x60606040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680638da5cb5b14610051578063f2fde38b146100a6575b600080fd5b341561005c57600080fd5b6100646100df565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156100b157600080fd5b6100dd600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610104565b005b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561015f57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415156101d657806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b505600a165627a7a723058205364a5ab5f9a71a281afb6f4128bfab57ef25dbb0ddad4bea69f35d10e6dc2d40029", "sourceMap": "592:707:18:-;;;772:61;;;;;;;;816:10;808:5;;:18;;;;;;;;;;;;;;;;;;592:707;;;;;;", "deployedSourceMap": "592:707:18:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;622:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1156:140;;;;;;;;;;;;;;;;;;;;;;;;;;;;622:20;;;;;;;;;;;;;:::o;1156:140::-;969:5;;;;;;;;;;;955:19;;:10;:19;;;947:28;;;;;;;;1245:1;1225:22;;:8;:22;;;;1221:69;;;1271:8;1263:5;;:16;;;;;;;;;;;;;;;;;;1221:69;1156:140;:::o", "source": "pragma solidity 0.4.18;\n\n/**\n The following contract code, titled KittyCore, was written by Cryptokitties and published\n and retrieved from https://etherscan.io/address/0x06012c8cf97bead5deae237070f9587f8e7a266d#code.\n\n It is included in the current project for test purposes, to ensure that our collateralizer can\n handle ERC721 tokens created by the KittyCore contract.\n*/\n\n/**\n * @title KittiesOwnable\n * @dev The KittiesOwnable contract has an owner address, and provides basic authorization control\n * functions, this simplifies the implementation of \"user permissions\".\n */\ncontract KittiesOwnable {\n address public owner;\n\n\n /**\n\t * @dev The KittiesOwnable constructor sets the original `owner` of the contract to the sender\n\t * account.\n\t */\n function KittiesOwnable() {\n owner = msg.sender;\n }\n\n\n /**\n\t * @dev Throws if called by any account other than the owner.\n\t */\n modifier onlyOwner() {\n require(msg.sender == owner);\n _;\n }\n\n\n /**\n\t * @dev Allows the current owner to transfer control of the contract to a newOwner.\n\t * @param newOwner The address to transfer ownership to.\n\t */\n function transferOwnership(address newOwner) onlyOwner {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n\n}\n\n\n\n/// @title Interface for contracts conforming to ERC-721: Non-Fungible Tokens\n/// @author Dieter Shirley (https://github.com/dete)\ncontract KittiesERC721 {\n // Required methods\n function totalSupply() public view returns (uint256 total);\n function balanceOf(address _owner) public view returns (uint256 balance);\n function ownerOf(uint256 _tokenId) external view returns (address owner);\n function approve(address _to, uint256 _tokenId) external;\n function transfer(address _to, uint256 _tokenId) external;\n function transferFrom(address _from, address _to, uint256 _tokenId) external;\n\n // Events\n event Transfer(address from, address to, uint256 tokenId);\n event Approval(address owner, address approved, uint256 tokenId);\n\n // Optional\n // function name() public view returns (string name);\n // function symbol() public view returns (string symbol);\n // function tokensOfOwner(address _owner) external view returns (uint256[] tokenIds);\n // function tokenMetadata(uint256 _tokenId, string _preferredTransport) public view returns (string infoUrl);\n\n // ERC-165 Compatibility (https://github.com/ethereum/EIPs/issues/165)\n function supportsInterface(bytes4 _interfaceID) external view returns (bool);\n}\n\n\n// // Auction wrapper functions\n\n\n// Auction wrapper functions\n\n\n\n\n\n\n\n/// @title SEKRETOOOO\ncontract GeneScienceInterface {\n /// @dev simply a boolean to indicate this is the contract we expect to be\n function isGeneScience() public pure returns (bool);\n\n /// @dev given genes of kitten 1 & 2, return a genetic combination - may have a random factor\n /// @param genes1 genes of mom\n /// @param genes2 genes of sire\n /// @return the genes that are supposed to be passed down the child\n function mixGenes(uint256 genes1, uint256 genes2, uint256 targetBlock) public returns (uint256);\n}\n\n\n\n\n\n\n\n/// @title A facet of KittyCore that manages special access privileges.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyAccessControl {\n // This facet controls access control for CryptoKitties. There are four roles managed here:\n //\n // - The CEO: The CEO can reassign other roles and change the addresses of our dependent smart\n // contracts. It is also the only role that can unpause the smart contract. It is initially\n // set to the address that created the smart contract in the KittyCore constructor.\n //\n // - The CFO: The CFO can withdraw funds from KittyCore and its auction contracts.\n //\n // - The COO: The COO can release gen0 kitties to auction, and mint promo cats.\n //\n // It should be noted that these roles are distinct without overlap in their access abilities, the\n // abilities listed for each role above are exhaustive. In particular, while the CEO can assign any\n // address to any role, the CEO address itself doesn't have the ability to act in those roles. This\n // restriction is intentional so that we aren't tempted to use the CEO address frequently out of\n // convenience. The less we use an address, the less likely it is that we somehow compromise the\n // account.\n\n /// @dev Emited when contract is upgraded - See README.md for updgrade plan\n event ContractUpgrade(address newContract);\n\n // The addresses of the accounts (or contracts) that can execute actions within each roles.\n address public ceoAddress;\n address public cfoAddress;\n address public cooAddress;\n\n // @dev Keeps track whether the contract is paused. When that is true, most actions are blocked\n bool public paused = false;\n\n /// @dev Access modifier for CEO-only functionality\n modifier onlyCEO() {\n require(msg.sender == ceoAddress);\n _;\n }\n\n /// @dev Access modifier for CFO-only functionality\n modifier onlyCFO() {\n require(msg.sender == cfoAddress);\n _;\n }\n\n /// @dev Access modifier for COO-only functionality\n modifier onlyCOO() {\n require(msg.sender == cooAddress);\n _;\n }\n\n modifier onlyCLevel() {\n require(\n msg.sender == cooAddress ||\n msg.sender == ceoAddress ||\n msg.sender == cfoAddress\n );\n _;\n }\n\n /// @dev Assigns a new address to act as the CEO. Only available to the current CEO.\n /// @param _newCEO The address of the new CEO\n function setCEO(address _newCEO) external onlyCEO {\n require(_newCEO != address(0));\n\n ceoAddress = _newCEO;\n }\n\n /// @dev Assigns a new address to act as the CFO. Only available to the current CEO.\n /// @param _newCFO The address of the new CFO\n function setCFO(address _newCFO) external onlyCEO {\n require(_newCFO != address(0));\n\n cfoAddress = _newCFO;\n }\n\n /// @dev Assigns a new address to act as the COO. Only available to the current CEO.\n /// @param _newCOO The address of the new COO\n function setCOO(address _newCOO) external onlyCEO {\n require(_newCOO != address(0));\n\n cooAddress = _newCOO;\n }\n\n /*** KittiesPausable functionality adapted from OpenZeppelin ***/\n\n /// @dev Modifier to allow actions only when the contract IS NOT paused\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /// @dev Modifier to allow actions only when the contract IS paused\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /// @dev Called by any \"C-level\" role to pause the contract. Used only when\n /// a bug or exploit is detected and we need to limit damage.\n function pause() external onlyCLevel whenNotPaused {\n paused = true;\n }\n\n /// @dev Unpauses the smart contract. Can only be called by the CEO, since\n /// one reason we may pause the contract is when CFO or COO accounts are\n /// compromised.\n /// @notice This is public rather than external so it can be called by\n /// derived contracts.\n function unpause() public onlyCEO whenPaused {\n // can't unpause if contract was upgraded\n paused = false;\n }\n}\n\n\n\n\n/// @title Base contract for CryptoKitties. Holds all common structs, events and base variables.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBase is KittyAccessControl {\n /*** EVENTS ***/\n\n /// @dev The Birth event is fired whenever a new kitten comes into existence. This obviously\n /// includes any time a cat is created through the giveBirth method, but it is also called\n /// when a new gen0 cat is created.\n event Birth(address owner, uint256 kittyId, uint256 matronId, uint256 sireId, uint256 genes);\n\n /// @dev Transfer event as defined in current draft of ERC721. Emitted every time a kitten\n /// ownership is assigned, including births.\n event Transfer(address from, address to, uint256 tokenId);\n\n /*** DATA TYPES ***/\n\n /// @dev The main Kitty struct. Every cat in CryptoKitties is represented by a copy\n /// of this structure, so great care was taken to ensure that it fits neatly into\n /// exactly two 256-bit words. Note that the order of the members in this structure\n /// is important because of the byte-packing rules used by Ethereum.\n /// Ref: http://solidity.readthedocs.io/en/develop/miscellaneous.html\n struct Kitty {\n // The Kitty's genetic code is packed into these 256-bits, the format is\n // sooper-sekret! A cat's genes never change.\n uint256 genes;\n\n // The timestamp from the block when this cat came into existence.\n uint64 birthTime;\n\n // The minimum timestamp after which this cat can engage in breeding\n // activities again. This same timestamp is used for the pregnancy\n // timer (for matrons) as well as the siring cooldown.\n uint64 cooldownEndBlock;\n\n // The ID of the parents of this kitty, set to 0 for gen0 cats.\n // Note that using 32-bit unsigned integers limits us to a \"mere\"\n // 4 billion cats. This number might seem small until you realize\n // that Ethereum currently has a limit of about 500 million\n // transactions per year! So, this definitely won't be a problem\n // for several years (even as Ethereum learns to scale).\n uint32 matronId;\n uint32 sireId;\n\n // Set to the ID of the sire cat for matrons that are pregnant,\n // zero otherwise. A non-zero value here is how we know a cat\n // is pregnant. Used to retrieve the genetic material for the new\n // kitten when the birth transpires.\n uint32 siringWithId;\n\n // Set to the index in the cooldown array (see below) that represents\n // the current cooldown duration for this Kitty. This starts at zero\n // for gen0 cats, and is initialized to floor(generation/2) for others.\n // Incremented by one for each successful breeding action, regardless\n // of whether this cat is acting as matron or sire.\n uint16 cooldownIndex;\n\n // The \"generation number\" of this cat. Cats minted by the CK contract\n // for sale are called \"gen0\" and have a generation number of 0. The\n // generation number of all other cats is the larger of the two generation\n // numbers of their parents, plus one.\n // (i.e. max(matron.generation, sire.generation) + 1)\n uint16 generation;\n }\n\n /*** CONSTANTS ***/\n\n /// @dev A lookup table indicating the cooldown duration after any successful\n /// breeding action, called \"pregnancy time\" for matrons and \"siring cooldown\"\n /// for sires. Designed such that the cooldown roughly doubles each time a cat\n /// is bred, encouraging owners not to just keep breeding the same cat over\n /// and over again. Caps out at one week (a cat can breed an unbounded number\n /// of times, and the maximum cooldown is always seven days).\n uint32[14] public cooldowns = [\n uint32(1 minutes),\n uint32(2 minutes),\n uint32(5 minutes),\n uint32(10 minutes),\n uint32(30 minutes),\n uint32(1 hours),\n uint32(2 hours),\n uint32(4 hours),\n uint32(8 hours),\n uint32(16 hours),\n uint32(1 days),\n uint32(2 days),\n uint32(4 days),\n uint32(7 days)\n ];\n\n // An approximation of currently how many seconds are in between blocks.\n uint256 public secondsPerBlock = 15;\n\n /*** STORAGE ***/\n\n /// @dev An array containing the Kitty struct for all Kitties in existence. The ID\n /// of each cat is actually an index into this array. Note that ID 0 is a negacat,\n /// the unKitty, the mythical beast that is the parent of all gen0 cats. A bizarre\n /// creature that is both matron and sire... to itself! Has an invalid genetic code.\n /// In other words, cat ID 0 is invalid... ;-)\n Kitty[] kitties;\n\n /// @dev A mapping from cat IDs to the address that owns them. All cats have\n /// some valid owner address, even gen0 cats are created with a non-zero owner.\n mapping (uint256 => address) public kittyIndexToOwner;\n\n // @dev A mapping from owner address to count of tokens that address owns.\n // Used internally inside balanceOf() to resolve ownership count.\n mapping (address => uint256) ownershipTokenCount;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to call\n /// transferFrom(). Each Kitty can only have one approved address for transfer\n /// at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public kittyIndexToApproved;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to use\n /// this Kitty for siring via breedWith(). Each Kitty can only have one approved\n /// address for siring at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public sireAllowedToAddress;\n\n /// @dev The address of the ClockAuction contract that handles sales of Kitties. This\n /// same contract handles both peer-to-peer sales as well as the gen0 sales which are\n /// initiated every 15 minutes.\n SaleClockAuction public saleAuction;\n\n /// @dev The address of a custom ClockAuction subclassed contract that handles siring\n /// auctions. Needs to be separate from saleAuction because the actions taken on success\n /// after a sales and siring auction are quite different.\n SiringClockAuction public siringAuction;\n\n /// @dev Assigns ownership of a specific Kitty to an address.\n function _transfer(address _from, address _to, uint256 _tokenId) internal {\n // Since the number of kittens is capped to 2^32 we can't overflow this\n ownershipTokenCount[_to]++;\n // transfer ownership\n kittyIndexToOwner[_tokenId] = _to;\n // When creating new kittens _from is 0x0, but we can't account that address.\n if (_from != address(0)) {\n ownershipTokenCount[_from]--;\n // once the kitten is transferred also clear sire allowances\n delete sireAllowedToAddress[_tokenId];\n // clear any previously approved ownership exchange\n delete kittyIndexToApproved[_tokenId];\n }\n // Emit the transfer event.\n Transfer(_from, _to, _tokenId);\n }\n\n /// @dev An internal method that creates a new kitty and stores it. This\n /// method doesn't do any checking and should only be called when the\n /// input data is known to be valid. Will generate both a Birth event\n /// and a Transfer event.\n /// @param _matronId The kitty ID of the matron of this cat (zero for gen0)\n /// @param _sireId The kitty ID of the sire of this cat (zero for gen0)\n /// @param _generation The generation number of this cat, must be computed by caller.\n /// @param _genes The kitty's genetic code.\n /// @param _owner The inital owner of this cat, must be non-zero (except for the unKitty, ID 0)\n function _createKitty(\n uint256 _matronId,\n uint256 _sireId,\n uint256 _generation,\n uint256 _genes,\n address _owner\n )\n internal\n returns (uint)\n {\n // These requires are not strictly necessary, our calling code should make\n // sure that these conditions are never broken. However! _createKitty() is already\n // an expensive call (for storage), and it doesn't hurt to be especially careful\n // to ensure our data structures are always valid.\n require(_matronId == uint256(uint32(_matronId)));\n require(_sireId == uint256(uint32(_sireId)));\n require(_generation == uint256(uint16(_generation)));\n\n // New kitty starts with the same cooldown as parent gen/2\n uint16 cooldownIndex = uint16(_generation / 2);\n if (cooldownIndex > 13) {\n cooldownIndex = 13;\n }\n\n Kitty memory _kitty = Kitty({\n genes: _genes,\n birthTime: uint64(now),\n cooldownEndBlock: 0,\n matronId: uint32(_matronId),\n sireId: uint32(_sireId),\n siringWithId: 0,\n cooldownIndex: cooldownIndex,\n generation: uint16(_generation)\n });\n uint256 newKittenId = kitties.push(_kitty) - 1;\n\n // It's probably never going to happen, 4 billion cats is A LOT, but\n // let's just be 100% sure we never let this happen.\n require(newKittenId == uint256(uint32(newKittenId)));\n\n // emit the birth event\n Birth(\n _owner,\n newKittenId,\n uint256(_kitty.matronId),\n uint256(_kitty.sireId),\n _kitty.genes\n );\n\n // This will assign ownership, and also emit the Transfer event as\n // per ERC721 draft\n _transfer(0, _owner, newKittenId);\n\n return newKittenId;\n }\n\n // Any C-level can fix how many seconds per blocks are currently observed.\n function setSecondsPerBlock(uint256 secs) external onlyCLevel {\n require(secs < cooldowns[0]);\n secondsPerBlock = secs;\n }\n}\n\n\n\n\n\n/// @title The external contract that is responsible for generating metadata for the kitties,\n/// it has one function that will return the data as bytes.\ncontract KittiesERC721Metadata {\n /// @dev Given a token Id, returns a byte array that is supposed to be converted into string.\n function getMetadata(uint256 _tokenId, string) public view returns (bytes32[4] buffer, uint256 count) {\n if (_tokenId == 1) {\n buffer[0] = \"Hello World! :D\";\n count = 15;\n } else if (_tokenId == 2) {\n buffer[0] = \"I would definitely choose a medi\";\n buffer[1] = \"um length string.\";\n count = 49;\n } else if (_tokenId == 3) {\n buffer[0] = \"Lorem ipsum dolor sit amet, mi e\";\n buffer[1] = \"st accumsan dapibus augue lorem,\";\n buffer[2] = \" tristique vestibulum id, libero\";\n buffer[3] = \" suscipit varius sapien aliquam.\";\n count = 128;\n }\n }\n}\n\n\n/// @title The facet of the CryptoKitties core contract that manages ownership, ERC-721 (draft) compliant.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev Ref: https://github.com/ethereum/EIPs/issues/721\n/// See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyOwnership is KittyBase, KittiesERC721 {\n\n /// @notice Name and symbol of the non fungible token, as defined in ERC721.\n string public constant name = \"CryptoKitties\";\n string public constant symbol = \"CK\";\n\n // The contract that will return kitty metadata\n KittiesERC721Metadata public erc721Metadata;\n\n bytes4 constant InterfaceSignature_ERC165 =\n bytes4(keccak256('supportsInterface(bytes4)'));\n\n bytes4 constant InterfaceSignature_ERC721 =\n bytes4(keccak256('name()')) ^\n bytes4(keccak256('symbol()')) ^\n bytes4(keccak256('totalSupply()')) ^\n bytes4(keccak256('balanceOf(address)')) ^\n bytes4(keccak256('ownerOf(uint256)')) ^\n bytes4(keccak256('approve(address,uint256)')) ^\n bytes4(keccak256('transfer(address,uint256)')) ^\n bytes4(keccak256('transferFrom(address,address,uint256)')) ^\n bytes4(keccak256('tokensOfOwner(address)')) ^\n bytes4(keccak256('tokenMetadata(uint256,string)'));\n\n /// @notice Introspection interface as per ERC-165 (https://github.com/ethereum/EIPs/issues/165).\n /// Returns true for any standardized interfaces implemented by this contract. We implement\n /// ERC-165 (obviously!) and ERC-721.\n function supportsInterface(bytes4 _interfaceID) external view returns (bool)\n {\n // DEBUG ONLY\n //require((InterfaceSignature_ERC165 == 0x01ffc9a7) && (InterfaceSignature_ERC721 == 0x9a20483d));\n\n return ((_interfaceID == InterfaceSignature_ERC165) || (_interfaceID == InterfaceSignature_ERC721));\n }\n\n /// @dev Set the address of the sibling contract that tracks metadata.\n /// CEO only.\n function setMetadataAddress(address _contractAddress) public onlyCEO {\n erc721Metadata = KittiesERC721Metadata(_contractAddress);\n }\n\n // Internal utility functions: These functions all assume that their input arguments\n // are valid. We leave it to public methods to sanitize their inputs and follow\n // the required logic.\n\n /// @dev Checks if a given address is the current owner of a particular Kitty.\n /// @param _claimant the address we are validating against.\n /// @param _tokenId kitten id, only valid when > 0\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToOwner[_tokenId] == _claimant;\n }\n\n /// @dev Checks if a given address currently has transferApproval for a particular Kitty.\n /// @param _claimant the address we are confirming kitten is approved for.\n /// @param _tokenId kitten id, only valid when > 0\n function _approvedFor(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToApproved[_tokenId] == _claimant;\n }\n\n /// @dev Marks an address as being approved for transferFrom(), overwriting any previous\n /// approval. Setting _approved to address(0) clears all transfer approval.\n /// NOTE: _approve() does NOT send the Approval event. This is intentional because\n /// _approve() and transferFrom() are used together for putting Kitties on auction, and\n /// there is no value in spamming the log with Approval events in that case.\n function _approve(uint256 _tokenId, address _approved) internal {\n kittyIndexToApproved[_tokenId] = _approved;\n }\n\n /// @notice Returns the number of Kitties owned by a specific address.\n /// @param _owner The owner address to check.\n /// @dev Required for ERC-721 compliance\n function balanceOf(address _owner) public view returns (uint256 count) {\n return ownershipTokenCount[_owner];\n }\n\n /// @notice Transfers a Kitty to another address. If transferring to a smart\n /// contract be VERY CAREFUL to ensure that it is aware of ERC-721 (or\n /// CryptoKitties specifically) or your Kitty may be lost forever. Seriously.\n /// @param _to The address of the recipient, can be a user or contract.\n /// @param _tokenId The ID of the Kitty to transfer.\n /// @dev Required for ERC-721 compliance.\n function transfer(\n address _to,\n uint256 _tokenId\n )\n external\n whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Disallow transfers to the auction contracts to prevent accidental\n // misuse. Auction contracts should only take ownership of kitties\n // through the allow + transferFrom flow.\n require(_to != address(saleAuction));\n require(_to != address(siringAuction));\n\n // You can only send your own cat.\n require(_owns(msg.sender, _tokenId));\n\n // Reassign ownership, clear pending approvals, emit Transfer event.\n _transfer(msg.sender, _to, _tokenId);\n }\n\n /// @notice Grant another address the right to transfer a specific Kitty via\n /// transferFrom(). This is the preferred flow for transfering NFTs to contracts.\n /// @param _to The address to be granted transfer approval. Pass address(0) to\n /// clear all approvals.\n /// @param _tokenId The ID of the Kitty that can be transferred if this call succeeds.\n /// @dev Required for ERC-721 compliance.\n function approve(\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Only an owner can grant transfer approval.\n require(_owns(msg.sender, _tokenId));\n\n // Register the approval (replacing any previous approval).\n _approve(_tokenId, _to);\n\n // Emit approval event.\n Approval(msg.sender, _to, _tokenId);\n }\n\n /// @notice Transfer a Kitty owned by another address, for which the calling address\n /// has previously been granted transfer approval by the owner.\n /// @param _from The address that owns the Kitty to be transfered.\n /// @param _to The address that should take ownership of the Kitty. Can be any address,\n /// including the caller.\n /// @param _tokenId The ID of the Kitty to be transferred.\n /// @dev Required for ERC-721 compliance.\n function transferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Check for approval and valid ownership\n require(_approvedFor(msg.sender, _tokenId));\n require(_owns(_from, _tokenId));\n\n // Reassign ownership (also clears pending approvals and emits Transfer event).\n _transfer(_from, _to, _tokenId);\n }\n\n /// @notice Returns the total number of Kitties currently in existence.\n /// @dev Required for ERC-721 compliance.\n function totalSupply() public view returns (uint) {\n return kitties.length - 1;\n }\n\n /// @notice Returns the address currently assigned ownership of a given Kitty.\n /// @dev Required for ERC-721 compliance.\n function ownerOf(uint256 _tokenId)\n external\n view\n returns (address owner)\n {\n owner = kittyIndexToOwner[_tokenId];\n\n require(owner != address(0));\n }\n\n /// @notice Returns a list of all Kitty IDs assigned to an address.\n /// @param _owner The owner whose Kitties we are interested in.\n /// @dev This method MUST NEVER be called by smart contract code. First, it's fairly\n /// expensive (it walks the entire Kitty array looking for cats belonging to owner),\n /// but it also returns a dynamic array, which is only supported for web3 calls, and\n /// not contract-to-contract calls.\n function tokensOfOwner(address _owner) external view returns(uint256[] ownerTokens) {\n uint256 tokenCount = balanceOf(_owner);\n\n if (tokenCount == 0) {\n // Return an empty array\n return new uint256[](0);\n } else {\n uint256[] memory result = new uint256[](tokenCount);\n uint256 totalCats = totalSupply();\n uint256 resultIndex = 0;\n\n // We count on the fact that all cats have IDs starting at 1 and increasing\n // sequentially up to the totalCat count.\n uint256 catId;\n\n for (catId = 1; catId <= totalCats; catId++) {\n if (kittyIndexToOwner[catId] == _owner) {\n result[resultIndex] = catId;\n resultIndex++;\n }\n }\n\n return result;\n }\n }\n\n /// @dev Adapted from memcpy() by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _memcpy(uint _dest, uint _src, uint _len) private view {\n // Copy word-length chunks while possible\n for(; _len >= 32; _len -= 32) {\n assembly {\n mstore(_dest, mload(_src))\n }\n _dest += 32;\n _src += 32;\n }\n\n // Copy remaining bytes\n uint256 mask = 256 ** (32 - _len) - 1;\n assembly {\n let srcpart := and(mload(_src), not(mask))\n let destpart := and(mload(_dest), mask)\n mstore(_dest, or(destpart, srcpart))\n }\n }\n\n /// @dev Adapted from toString(slice) by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _toString(bytes32[4] _rawBytes, uint256 _stringLength) private view returns (string) {\n var outputString = new string(_stringLength);\n uint256 outputPtr;\n uint256 bytesPtr;\n\n assembly {\n outputPtr := add(outputString, 32)\n bytesPtr := _rawBytes\n }\n\n _memcpy(outputPtr, bytesPtr, _stringLength);\n\n return outputString;\n }\n\n /// @notice Returns a URI pointing to a metadata package for this token conforming to\n /// ERC-721 (https://github.com/ethereum/EIPs/issues/721)\n /// @param _tokenId The ID number of the Kitty whose metadata should be returned.\n function tokenMetadata(uint256 _tokenId, string _preferredTransport) external view returns (string infoUrl) {\n require(erc721Metadata != address(0));\n bytes32[4] memory buffer;\n uint256 count;\n (buffer, count) = erc721Metadata.getMetadata(_tokenId, _preferredTransport);\n\n return _toString(buffer, count);\n }\n}\n\n\n\n/// @title A facet of KittyCore that manages Kitty siring, gestation, and birth.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBreeding is KittyOwnership {\n\n /// @dev The Pregnant event is fired when two cats successfully breed and the pregnancy\n /// timer begins for the matron.\n event Pregnant(address owner, uint256 matronId, uint256 sireId, uint256 cooldownEndBlock);\n\n /// @notice The minimum payment required to use breedWithAuto(). This fee goes towards\n /// the gas cost paid by whatever calls giveBirth(), and can be dynamically updated by\n /// the COO role as the gas price changes.\n uint256 public autoBirthFee = 2 finney;\n\n // Keeps track of number of pregnant kitties.\n uint256 public pregnantKitties;\n\n /// @dev The address of the sibling contract that is used to implement the sooper-sekret\n /// genetic combination algorithm.\n GeneScienceInterface public geneScience;\n\n /// @dev Update the address of the genetic contract, can only be called by the CEO.\n /// @param _address An address of a GeneScience contract instance to be used from this point forward.\n function setGeneScienceAddress(address _address) external onlyCEO {\n GeneScienceInterface candidateContract = GeneScienceInterface(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isGeneScience());\n\n // Set the new contract address\n geneScience = candidateContract;\n }\n\n /// @dev Checks that a given kitten is able to breed. Requires that the\n /// current cooldown is finished (for sires) and also checks that there is\n /// no pending pregnancy.\n function _isReadyToBreed(Kitty _kit) internal view returns (bool) {\n // In addition to checking the cooldownEndBlock, we also need to check to see if\n // the cat has a pending birth; there can be some period of time between the end\n // of the pregnacy timer and the birth event.\n return (_kit.siringWithId == 0) && (_kit.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @dev Check if a sire has authorized breeding with this matron. True if both sire\n /// and matron have the same owner, or if the sire has given siring permission to\n /// the matron's owner (via approveSiring()).\n function _isSiringPermitted(uint256 _sireId, uint256 _matronId) internal view returns (bool) {\n address matronOwner = kittyIndexToOwner[_matronId];\n address sireOwner = kittyIndexToOwner[_sireId];\n\n // Siring is okay if they have same owner, or if the matron's owner was given\n // permission to breed with this sire.\n return (matronOwner == sireOwner || sireAllowedToAddress[_sireId] == matronOwner);\n }\n\n /// @dev Set the cooldownEndTime for the given Kitty, based on its current cooldownIndex.\n /// Also increments the cooldownIndex (unless it has hit the cap).\n /// @param _kitten A reference to the Kitty in storage which needs its timer started.\n function _triggerCooldown(Kitty storage _kitten) internal {\n // Compute an estimation of the cooldown time in blocks (based on current cooldownIndex).\n _kitten.cooldownEndBlock = uint64((cooldowns[_kitten.cooldownIndex]/secondsPerBlock) + block.number);\n\n // Increment the breeding count, clamping it at 13, which is the length of the\n // cooldowns array. We could check the array size dynamically, but hard-coding\n // this as a constant saves gas. Yay, Solidity!\n if (_kitten.cooldownIndex < 13) {\n _kitten.cooldownIndex += 1;\n }\n }\n\n /// @notice Grants approval to another user to sire with one of your Kitties.\n /// @param _addr The address that will be able to sire with your Kitty. Set to\n /// address(0) to clear all siring approvals for this Kitty.\n /// @param _sireId A Kitty that you own that _addr will now be able to sire with.\n function approveSiring(address _addr, uint256 _sireId)\n external\n whenNotPaused\n {\n require(_owns(msg.sender, _sireId));\n sireAllowedToAddress[_sireId] = _addr;\n }\n\n /// @dev Updates the minimum payment required for calling giveBirthAuto(). Can only\n /// be called by the COO address. (This fee is used to offset the gas cost incurred\n /// by the autobirth daemon).\n function setAutoBirthFee(uint256 val) external onlyCOO {\n autoBirthFee = val;\n }\n\n /// @dev Checks to see if a given Kitty is pregnant and (if so) if the gestation\n /// period has passed.\n function _isReadyToGiveBirth(Kitty _matron) private view returns (bool) {\n return (_matron.siringWithId != 0) && (_matron.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @notice Checks that a given kitten is able to breed (i.e. it is not pregnant or\n /// in the middle of a siring cooldown).\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isReadyToBreed(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n Kitty storage kit = kitties[_kittyId];\n return _isReadyToBreed(kit);\n }\n\n /// @dev Checks whether a kitty is currently pregnant.\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isPregnant(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n // A kitty is pregnant if and only if this field is set\n return kitties[_kittyId].siringWithId != 0;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair. DOES NOT\n /// check ownership permissions (that is up to the caller).\n /// @param _matron A reference to the Kitty struct of the potential matron.\n /// @param _matronId The matron's ID.\n /// @param _sire A reference to the Kitty struct of the potential sire.\n /// @param _sireId The sire's ID\n function _isValidMatingPair(\n Kitty storage _matron,\n uint256 _matronId,\n Kitty storage _sire,\n uint256 _sireId\n )\n private\n view\n returns(bool)\n {\n // A Kitty can't breed with itself!\n if (_matronId == _sireId) {\n return false;\n }\n\n // Kitties can't breed with their parents.\n if (_matron.matronId == _sireId || _matron.sireId == _sireId) {\n return false;\n }\n if (_sire.matronId == _matronId || _sire.sireId == _matronId) {\n return false;\n }\n\n // We can short circuit the sibling check (below) if either cat is\n // gen zero (has a matron ID of zero).\n if (_sire.matronId == 0 || _matron.matronId == 0) {\n return true;\n }\n\n // Kitties can't breed with full or half siblings.\n if (_sire.matronId == _matron.matronId || _sire.matronId == _matron.sireId) {\n return false;\n }\n if (_sire.sireId == _matron.matronId || _sire.sireId == _matron.sireId) {\n return false;\n }\n\n // Everything seems cool! Let's get DTF.\n return true;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair for\n /// breeding via auction (i.e. skips ownership and siring approval checks).\n function _canBreedWithViaAuction(uint256 _matronId, uint256 _sireId)\n internal\n view\n returns (bool)\n {\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId);\n }\n\n /// @notice Checks to see if two cats can breed together, including checks for\n /// ownership and siring approvals. Does NOT check that both cats are ready for\n /// breeding (i.e. breedWith could still fail until the cooldowns are finished).\n /// TODO: Shouldn't this check pregnancy and cooldowns?!?\n /// @param _matronId The ID of the proposed matron.\n /// @param _sireId The ID of the proposed sire.\n function canBreedWith(uint256 _matronId, uint256 _sireId)\n external\n view\n returns(bool)\n {\n require(_matronId > 0);\n require(_sireId > 0);\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId) &&\n _isSiringPermitted(_sireId, _matronId);\n }\n\n /// @dev Internal utility function to initiate breeding, assumes that all breeding\n /// requirements have been checked.\n function _breedWith(uint256 _matronId, uint256 _sireId) internal {\n // Grab a reference to the Kitties from storage.\n Kitty storage sire = kitties[_sireId];\n Kitty storage matron = kitties[_matronId];\n\n // Mark the matron as pregnant, keeping track of who the sire is.\n matron.siringWithId = uint32(_sireId);\n\n // Trigger the cooldown for both parents.\n _triggerCooldown(sire);\n _triggerCooldown(matron);\n\n // Clear siring permission for both parents. This may not be strictly necessary\n // but it's likely to avoid confusion!\n delete sireAllowedToAddress[_matronId];\n delete sireAllowedToAddress[_sireId];\n\n // Every time a kitty gets pregnant, counter is incremented.\n pregnantKitties++;\n\n // Emit the pregnancy event.\n Pregnant(kittyIndexToOwner[_matronId], _matronId, _sireId, matron.cooldownEndBlock);\n }\n\n /// @notice Breed a Kitty you own (as matron) with a sire that you own, or for which you\n /// have previously been given Siring approval. Will either make your cat pregnant, or will\n /// fail entirely. Requires a pre-payment of the fee given out to the first caller of giveBirth()\n /// @param _matronId The ID of the Kitty acting as matron (will end up pregnant if successful)\n /// @param _sireId The ID of the Kitty acting as sire (will begin its siring cooldown if successful)\n function breedWithAuto(uint256 _matronId, uint256 _sireId)\n external\n payable\n whenNotPaused\n {\n // Checks for payment.\n require(msg.value >= autoBirthFee);\n\n // Caller must own the matron.\n require(_owns(msg.sender, _matronId));\n\n // Neither sire nor matron are allowed to be on auction during a normal\n // breeding operation, but we don't need to check that explicitly.\n // For matron: The caller of this function can't be the owner of the matron\n // because the owner of a Kitty on auction is the auction house, and the\n // auction house will never call breedWith().\n // For sire: Similarly, a sire on auction will be owned by the auction house\n // and the act of transferring ownership will have cleared any oustanding\n // siring approval.\n // Thus we don't need to spend gas explicitly checking to see if either cat\n // is on auction.\n\n // Check that matron and sire are both owned by caller, or that the sire\n // has given siring permission to caller (i.e. matron's owner).\n // Will fail for _sireId = 0\n require(_isSiringPermitted(_sireId, _matronId));\n\n // Grab a reference to the potential matron\n Kitty storage matron = kitties[_matronId];\n\n // Make sure matron isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(matron));\n\n // Grab a reference to the potential sire\n Kitty storage sire = kitties[_sireId];\n\n // Make sure sire isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(sire));\n\n // Test that these cats are a valid mating pair.\n require(_isValidMatingPair(\n matron,\n _matronId,\n sire,\n _sireId\n ));\n\n // All checks passed, kitty gets pregnant!\n _breedWith(_matronId, _sireId);\n }\n\n /// @notice Have a pregnant Kitty give birth!\n /// @param _matronId A Kitty ready to give birth.\n /// @return The Kitty ID of the new kitten.\n /// @dev Looks at a given Kitty and, if pregnant and if the gestation period has passed,\n /// combines the genes of the two parents to create a new kitten. The new Kitty is assigned\n /// to the current owner of the matron. Upon successful completion, both the matron and the\n /// new kitten will be ready to breed again. Note that anyone can call this function (if they\n /// are willing to pay the gas!), but the new kitten always goes to the mother's owner.\n function giveBirth(uint256 _matronId)\n external\n whenNotPaused\n returns(uint256)\n {\n // Grab a reference to the matron in storage.\n Kitty storage matron = kitties[_matronId];\n\n // Check that the matron is a valid cat.\n require(matron.birthTime != 0);\n\n // Check that the matron is pregnant, and that its time has come!\n require(_isReadyToGiveBirth(matron));\n\n // Grab a reference to the sire in storage.\n uint256 sireId = matron.siringWithId;\n Kitty storage sire = kitties[sireId];\n\n // Determine the higher generation number of the two parents\n uint16 parentGen = matron.generation;\n if (sire.generation > matron.generation) {\n parentGen = sire.generation;\n }\n\n // Call the sooper-sekret gene mixing operation.\n uint256 childGenes = geneScience.mixGenes(matron.genes, sire.genes, matron.cooldownEndBlock - 1);\n\n // Make the new kitten!\n address owner = kittyIndexToOwner[_matronId];\n uint256 kittenId = _createKitty(_matronId, matron.siringWithId, parentGen + 1, childGenes, owner);\n\n // Clear the reference to sire from the matron (REQUIRED! Having siringWithId\n // set is what marks a matron as being pregnant.)\n delete matron.siringWithId;\n\n // Every time a kitty gives birth counter is decremented.\n pregnantKitties--;\n\n // Send the balance fee to the person who made birth happen.\n msg.sender.send(autoBirthFee);\n\n // return the new kitten's ID\n return kittenId;\n }\n}\n\n\n\n\n\n\n\n\n\n\n/// @title Auction Core\n/// @dev Contains models, variables, and internal methods for the auction.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuctionBase {\n\n // Represents an auction on an NFT\n struct Auction {\n // Current owner of NFT\n address seller;\n // Price (in wei) at beginning of auction\n uint128 startingPrice;\n // Price (in wei) at end of auction\n uint128 endingPrice;\n // Duration (in seconds) of auction\n uint64 duration;\n // Time when auction started\n // NOTE: 0 if this auction has been concluded\n uint64 startedAt;\n }\n\n // Reference to contract tracking NFT ownership\n KittiesERC721 public nonFungibleContract;\n\n // Cut owner takes on each auction, measured in basis points (1/100 of a percent).\n // Values 0-10,000 map to 0%-100%\n uint256 public ownerCut;\n\n // Map from token ID to their corresponding auction.\n mapping (uint256 => Auction) tokenIdToAuction;\n\n event AuctionCreated(uint256 tokenId, uint256 startingPrice, uint256 endingPrice, uint256 duration);\n event AuctionSuccessful(uint256 tokenId, uint256 totalPrice, address winner);\n event AuctionCancelled(uint256 tokenId);\n\n /// @dev Returns true if the claimant owns the token.\n /// @param _claimant - Address claiming to own the token.\n /// @param _tokenId - ID of token whose ownership to verify.\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return (nonFungibleContract.ownerOf(_tokenId) == _claimant);\n }\n\n /// @dev Escrows the NFT, assigning ownership to this contract.\n /// Throws if the escrow fails.\n /// @param _owner - Current owner address of token to escrow.\n /// @param _tokenId - ID of token whose approval to verify.\n function _escrow(address _owner, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transferFrom(_owner, this, _tokenId);\n }\n\n /// @dev Transfers an NFT owned by this contract to another address.\n /// Returns true if the transfer succeeds.\n /// @param _receiver - Address to transfer NFT to.\n /// @param _tokenId - ID of token to transfer.\n function _transfer(address _receiver, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transfer(_receiver, _tokenId);\n }\n\n /// @dev Adds an auction to the list of open auctions. Also fires the\n /// AuctionCreated event.\n /// @param _tokenId The ID of the token to be put on auction.\n /// @param _auction Auction to add.\n function _addAuction(uint256 _tokenId, Auction _auction) internal {\n // Require that all auctions have a duration of\n // at least one minute. (Keeps our math from getting hairy!)\n require(_auction.duration >= 1 minutes);\n\n tokenIdToAuction[_tokenId] = _auction;\n\n AuctionCreated(\n uint256(_tokenId),\n uint256(_auction.startingPrice),\n uint256(_auction.endingPrice),\n uint256(_auction.duration)\n );\n }\n\n /// @dev Cancels an auction unconditionally.\n function _cancelAuction(uint256 _tokenId, address _seller) internal {\n _removeAuction(_tokenId);\n _transfer(_seller, _tokenId);\n AuctionCancelled(_tokenId);\n }\n\n /// @dev Computes the price and transfers winnings.\n /// Does NOT transfer ownership of token.\n function _bid(uint256 _tokenId, uint256 _bidAmount)\n internal\n returns (uint256)\n {\n // Get a reference to the auction struct\n Auction storage auction = tokenIdToAuction[_tokenId];\n\n // Explicitly check that this auction is currently live.\n // (Because of how Ethereum mappings work, we can't just count\n // on the lookup above failing. An invalid _tokenId will just\n // return an auction object that is all zeros.)\n require(_isOnAuction(auction));\n\n // Check that the bid is greater than or equal to the current price\n uint256 price = _currentPrice(auction);\n require(_bidAmount >= price);\n\n // Grab a reference to the seller before the auction struct\n // gets deleted.\n address seller = auction.seller;\n\n // The bid is good! Remove the auction before sending the fees\n // to the sender so we can't have a reentrancy attack.\n _removeAuction(_tokenId);\n\n // Transfer proceeds to seller (if there are any!)\n if (price > 0) {\n // Calculate the auctioneer's cut.\n // (NOTE: _computeCut() is guaranteed to return a\n // value <= price, so this subtraction can't go negative.)\n uint256 auctioneerCut = _computeCut(price);\n uint256 sellerProceeds = price - auctioneerCut;\n\n // NOTE: Doing a transfer() in the middle of a complex\n // method like this is generally discouraged because of\n // reentrancy attacks and DoS attacks if the seller is\n // a contract with an invalid fallback function. We explicitly\n // guard against reentrancy attacks by removing the auction\n // before calling transfer(), and the only thing the seller\n // can DoS is the sale of their own asset! (And if it's an\n // accident, they can call cancelAuction(). )\n seller.transfer(sellerProceeds);\n }\n\n // Calculate any excess funds included with the bid. If the excess\n // is anything worth worrying about, transfer it back to bidder.\n // NOTE: We checked above that the bid amount is greater than or\n // equal to the price so this cannot underflow.\n uint256 bidExcess = _bidAmount - price;\n\n // Return the funds. Similar to the previous transfer, this is\n // not susceptible to a re-entry attack because the auction is\n // removed before any transfers occur.\n msg.sender.transfer(bidExcess);\n\n // Tell the world!\n AuctionSuccessful(_tokenId, price, msg.sender);\n\n return price;\n }\n\n /// @dev Removes an auction from the list of open auctions.\n /// @param _tokenId - ID of NFT on auction.\n function _removeAuction(uint256 _tokenId) internal {\n delete tokenIdToAuction[_tokenId];\n }\n\n /// @dev Returns true if the NFT is on auction.\n /// @param _auction - Auction to check.\n function _isOnAuction(Auction storage _auction) internal view returns (bool) {\n return (_auction.startedAt > 0);\n }\n\n /// @dev Returns current price of an NFT on auction. Broken into two\n /// functions (this one, that computes the duration from the auction\n /// structure, and the other that does the price computation) so we\n /// can easily test that the price computation works correctly.\n function _currentPrice(Auction storage _auction)\n internal\n view\n returns (uint256)\n {\n uint256 secondsPassed = 0;\n\n // A bit of insurance against negative values (or wraparound).\n // Probably not necessary (since Ethereum guarnatees that the\n // now variable doesn't ever go backwards).\n if (now > _auction.startedAt) {\n secondsPassed = now - _auction.startedAt;\n }\n\n return _computeCurrentPrice(\n _auction.startingPrice,\n _auction.endingPrice,\n _auction.duration,\n secondsPassed\n );\n }\n\n /// @dev Computes the current price of an auction. Factored out\n /// from _currentPrice so we can run extensive unit tests.\n /// When testing, make this function public and turn on\n /// `Current price computation` test suite.\n function _computeCurrentPrice(\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n uint256 _secondsPassed\n )\n internal\n pure\n returns (uint256)\n {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our public functions carefully cap the maximum values for\n // time (at 64-bits) and currency (at 128-bits). _duration is\n // also known to be non-zero (see the require() statement in\n // _addAuction())\n if (_secondsPassed >= _duration) {\n // We've reached the end of the dynamic pricing portion\n // of the auction, just return the end price.\n return _endingPrice;\n } else {\n // Starting price can be higher than ending price (and often is!), so\n // this delta can be negative.\n int256 totalPriceChange = int256(_endingPrice) - int256(_startingPrice);\n\n // This multiplication can't overflow, _secondsPassed will easily fit within\n // 64-bits, and totalPriceChange will easily fit within 128-bits, their product\n // will always fit within 256-bits.\n int256 currentPriceChange = totalPriceChange * int256(_secondsPassed) / int256(_duration);\n\n // currentPriceChange can be negative, but if so, will have a magnitude\n // less that _startingPrice. Thus, this result will always end up positive.\n int256 currentPrice = int256(_startingPrice) + currentPriceChange;\n\n return uint256(currentPrice);\n }\n }\n\n /// @dev Computes owner's cut of a sale.\n /// @param _price - Sale price of NFT.\n function _computeCut(uint256 _price) internal view returns (uint256) {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our entry functions carefully cap the maximum values for\n // currency (at 128-bits), and ownerCut <= 10000 (see the require()\n // statement in the ClockAuction constructor). The result of this\n // function is always guaranteed to be <= _price.\n return _price * ownerCut / 10000;\n }\n\n}\n\n\n\n\n\n\n\n/**\n * @title KittiesPausable\n * @dev Base contract which allows children to implement an emergency stop mechanism.\n */\ncontract KittiesPausable is KittiesOwnable {\n event Pause();\n event Unpause();\n\n bool public paused = false;\n\n\n /**\n\t * @dev modifier to allow actions only when the contract IS paused\n\t */\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /**\n\t * @dev modifier to allow actions only when the contract IS NOT paused\n\t */\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /**\n\t * @dev called by the owner to pause, triggers stopped state\n\t */\n function pause() onlyOwner whenNotPaused returns (bool) {\n paused = true;\n Pause();\n return true;\n }\n\n /**\n\t * @dev called by the owner to unpause, returns to normal state\n\t */\n function unpause() onlyOwner whenPaused returns (bool) {\n paused = false;\n Unpause();\n return true;\n }\n}\n\n\n/// @title Clock auction for non-fungible tokens.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuction is KittiesPausable, ClockAuctionBase {\n\n /// @dev The ERC-165 interface signature for ERC-721.\n /// Ref: https://github.com/ethereum/EIPs/issues/165\n /// Ref: https://github.com/ethereum/EIPs/issues/721\n bytes4 constant InterfaceSignature_ERC721 = bytes4(0x9a20483d);\n\n /// @dev Constructor creates a reference to the NFT ownership contract\n /// and verifies the owner cut is in the valid range.\n /// @param _nftAddress - address of a deployed contract implementing\n /// the Nonfungible Interface.\n /// @param _cut - percent cut the owner takes on each auction, must be\n /// between 0-10,000.\n function ClockAuction(address _nftAddress, uint256 _cut) public {\n require(_cut <= 10000);\n ownerCut = _cut;\n\n KittiesERC721 candidateContract = KittiesERC721(_nftAddress);\n require(candidateContract.supportsInterface(InterfaceSignature_ERC721));\n nonFungibleContract = candidateContract;\n }\n\n /// @dev Remove all Ether from the contract, which is the owner's cuts\n /// as well as any Ether sent directly to the contract address.\n /// Always transfers to the NFT contract, but can be called either by\n /// the owner or the NFT contract.\n function withdrawBalance() external {\n address nftAddress = address(nonFungibleContract);\n\n require(\n msg.sender == owner ||\n msg.sender == nftAddress\n );\n // We are using this boolean method to make sure that even if one fails it will still work\n bool res = nftAddress.send(this.balance);\n }\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of time to move between starting\n /// price and ending price (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n whenNotPaused\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(_owns(msg.sender, _tokenId));\n _escrow(msg.sender, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Bids on an open auction, completing the auction and transferring\n /// ownership of the NFT if enough Ether is supplied.\n /// @param _tokenId - ID of token to bid on.\n function bid(uint256 _tokenId)\n external\n payable\n whenNotPaused\n {\n // _bid will throw if the bid or funds transfer fails\n _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n }\n\n /// @dev Cancels an auction that hasn't been won yet.\n /// Returns the NFT to original owner.\n /// @notice This is a state-modifying function that can\n /// be called while the contract is paused.\n /// @param _tokenId - ID of token on auction\n function cancelAuction(uint256 _tokenId)\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n address seller = auction.seller;\n require(msg.sender == seller);\n _cancelAuction(_tokenId, seller);\n }\n\n /// @dev Cancels an auction when the contract is paused.\n /// Only the owner may do this, and NFTs are returned to\n /// the seller. This should only be used in emergencies.\n /// @param _tokenId - ID of the NFT on auction to cancel.\n function cancelAuctionWhenPaused(uint256 _tokenId)\n whenPaused\n onlyOwner\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n _cancelAuction(_tokenId, auction.seller);\n }\n\n /// @dev Returns auction info for an NFT on auction.\n /// @param _tokenId - ID of NFT on auction.\n function getAuction(uint256 _tokenId)\n external\n view\n returns\n (\n address seller,\n uint256 startingPrice,\n uint256 endingPrice,\n uint256 duration,\n uint256 startedAt\n ) {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return (\n auction.seller,\n auction.startingPrice,\n auction.endingPrice,\n auction.duration,\n auction.startedAt\n );\n }\n\n /// @dev Returns the current price of an auction.\n /// @param _tokenId - ID of the token price we are checking.\n function getCurrentPrice(uint256 _tokenId)\n external\n view\n returns (uint256)\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return _currentPrice(auction);\n }\n\n}\n\n\n/// @title Reverse auction modified for siring\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SiringClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSiringAuctionAddress() call.\n bool public isSiringClockAuction = true;\n\n // Delegate constructor\n function SiringClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction. Since this function is wrapped,\n /// require sender to be KittyCore contract.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Places a bid for siring. Requires the sender\n /// is the KittyCore contract because all bid methods\n /// should be wrapped. Also returns the kitty to the\n /// seller rather than the winner.\n function bid(uint256 _tokenId)\n external\n payable\n {\n require(msg.sender == address(nonFungibleContract));\n address seller = tokenIdToAuction[_tokenId].seller;\n // _bid checks that token ID is valid and will throw if bid fails\n _bid(_tokenId, msg.value);\n // We transfer the kitty back to the seller, the winner will get\n // the offspring\n _transfer(seller, _tokenId);\n }\n\n}\n\n\n\n\n\n/// @title Clock auction modified for sale of kitties\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SaleClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSaleAuctionAddress() call.\n bool public isSaleClockAuction = true;\n\n // Tracks last 5 sale price of gen0 kitty sales\n uint256 public gen0SaleCount;\n uint256[5] public lastGen0SalePrices;\n\n // Delegate constructor\n function SaleClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Updates lastSalePrice if seller is the nft contract\n /// Otherwise, works the same as default bid method.\n function bid(uint256 _tokenId)\n external\n payable\n {\n // _bid verifies token ID size\n address seller = tokenIdToAuction[_tokenId].seller;\n uint256 price = _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n\n // If not a gen0 auction, exit\n if (seller == address(nonFungibleContract)) {\n // Track gen0 sale prices\n lastGen0SalePrices[gen0SaleCount % 5] = price;\n gen0SaleCount++;\n }\n }\n\n function averageGen0SalePrice() external view returns (uint256) {\n uint256 sum = 0;\n for (uint256 i = 0; i < 5; i++) {\n sum += lastGen0SalePrices[i];\n }\n return sum / 5;\n }\n\n}\n\n\n/// @title Handles creating auctions for sale and siring of kitties.\n/// This wrapper of ReverseAuction exists only so that users can create\n/// auctions with only one transaction.\ncontract KittyAuction is KittyBreeding {\n\n // @notice The auction contract variables are defined in KittyBase to allow\n // us to refer to them in KittyOwnership to prevent accidental transfers.\n // `saleAuction` refers to the auction for gen0 and p2p sale of kitties.\n // `siringAuction` refers to the auction for siring rights of kitties.\n\n /// @dev Sets the reference to the sale auction.\n /// @param _address - Address of sale contract.\n function setSaleAuctionAddress(address _address) external onlyCEO {\n SaleClockAuction candidateContract = SaleClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSaleClockAuction());\n\n // Set the new contract address\n saleAuction = candidateContract;\n }\n\n /// @dev Sets the reference to the siring auction.\n /// @param _address - Address of siring contract.\n function setSiringAuctionAddress(address _address) external onlyCEO {\n SiringClockAuction candidateContract = SiringClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSiringClockAuction());\n\n // Set the new contract address\n siringAuction = candidateContract;\n }\n\n /// @dev Put a kitty up for auction.\n /// Does some ownership trickery to create auctions in one tx.\n function createSaleAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n // Ensure the kitty is not pregnant to prevent the auction\n // contract accidentally receiving ownership of the child.\n // NOTE: the kitty IS allowed to be in a cooldown.\n require(!isPregnant(_kittyId));\n _approve(_kittyId, saleAuction);\n // Sale auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n saleAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Put a kitty up for auction to be sire.\n /// Performs checks to ensure the kitty can be sired, then\n /// delegates to reverse auction.\n function createSiringAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n require(isReadyToBreed(_kittyId));\n _approve(_kittyId, siringAuction);\n // Siring auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n siringAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Completes a siring auction by bidding.\n /// Immediately breeds the winning matron with the sire on auction.\n /// @param _sireId - ID of the sire on auction.\n /// @param _matronId - ID of the matron owned by the bidder.\n function bidOnSiringAuction(\n uint256 _sireId,\n uint256 _matronId\n )\n external\n payable\n whenNotPaused\n {\n // Auction contract checks input sizes\n require(_owns(msg.sender, _matronId));\n require(isReadyToBreed(_matronId));\n require(_canBreedWithViaAuction(_matronId, _sireId));\n\n // Define the current price of the auction.\n uint256 currentPrice = siringAuction.getCurrentPrice(_sireId);\n require(msg.value >= currentPrice + autoBirthFee);\n\n // Siring auction will throw if the bid fails.\n siringAuction.bid.value(msg.value - autoBirthFee)(_sireId);\n _breedWith(uint32(_matronId), uint32(_sireId));\n }\n\n /// @dev Transfers the balance of the sale auction contract\n /// to the KittyCore contract. We use two-step withdrawal to\n /// prevent two transfer calls in the auction bid function.\n function withdrawAuctionBalances() external onlyCLevel {\n saleAuction.withdrawBalance();\n siringAuction.withdrawBalance();\n }\n}\n\n\n/// @title all functions related to creating kittens\ncontract KittyMinting is KittyAuction {\n\n // Limits the number of cats the contract owner can ever create.\n uint256 public constant PROMO_CREATION_LIMIT = 5000;\n uint256 public constant GEN0_CREATION_LIMIT = 45000;\n\n // Constants for gen0 auctions.\n uint256 public constant GEN0_STARTING_PRICE = 10 finney;\n uint256 public constant GEN0_AUCTION_DURATION = 1 days;\n\n // Counts the number of cats the contract owner has created.\n uint256 public promoCreatedCount;\n uint256 public gen0CreatedCount;\n\n /// @dev we can create promo kittens, up to a limit. Only callable by COO\n /// @param _genes the encoded genes of the kitten to be created, any value is accepted\n /// @param _owner the future owner of the created kittens. Default to contract COO\n function createPromoKitty(uint256 _genes, address _owner) external onlyCOO {\n address kittyOwner = _owner;\n if (kittyOwner == address(0)) {\n kittyOwner = cooAddress;\n }\n require(promoCreatedCount < PROMO_CREATION_LIMIT);\n\n promoCreatedCount++;\n _createKitty(0, 0, 0, _genes, kittyOwner);\n }\n\n /// @dev Creates a new gen0 kitty with the given genes and\n /// creates an auction for it.\n function createGen0Auction(uint256 _genes) external onlyCOO {\n require(gen0CreatedCount < GEN0_CREATION_LIMIT);\n\n uint256 kittyId = _createKitty(0, 0, 0, _genes, address(this));\n _approve(kittyId, saleAuction);\n\n saleAuction.createAuction(\n kittyId,\n _computeNextGen0Price(),\n 0,\n GEN0_AUCTION_DURATION,\n address(this)\n );\n\n gen0CreatedCount++;\n }\n\n /// @dev Computes the next gen0 auction starting price, given\n /// the average of the past 5 prices + 50%.\n function _computeNextGen0Price() internal view returns (uint256) {\n uint256 avePrice = saleAuction.averageGen0SalePrice();\n\n // Sanity check to ensure we don't overflow arithmetic\n require(avePrice == uint256(uint128(avePrice)));\n\n uint256 nextPrice = avePrice + (avePrice / 2);\n\n // We never auction for less than starting price\n if (nextPrice < GEN0_STARTING_PRICE) {\n nextPrice = GEN0_STARTING_PRICE;\n }\n\n return nextPrice;\n }\n}\n\n\n/// @title CryptoKitties: Collectible, breedable, and oh-so-adorable cats on the Ethereum blockchain.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev The main CryptoKitties contract, keeps track of kittens so they don't wander around and get lost.\ncontract KittyCore is KittyMinting {\n\n // This is the main CryptoKitties contract. In order to keep our code seperated into logical sections,\n // we've broken it up in two ways. First, we have several seperately-instantiated sibling contracts\n // that handle auctions and our super-top-secret genetic combination algorithm. The auctions are\n // seperate since their logic is somewhat complex and there's always a risk of subtle bugs. By keeping\n // them in their own contracts, we can upgrade them without disrupting the main contract that tracks\n // kitty ownership. The genetic combination algorithm is kept seperate so we can open-source all of\n // the rest of our code without making it _too_ easy for folks to figure out how the genetics work.\n // Don't worry, I'm sure someone will reverse engineer it soon enough!\n //\n // Secondly, we break the core contract into multiple files using inheritence, one for each major\n // facet of functionality of CK. This allows us to keep related code bundled together while still\n // avoiding a single giant file with everything in it. The breakdown is as follows:\n //\n // - KittyBase: This is where we define the most fundamental code shared throughout the core\n // functionality. This includes our main data storage, constants and data types, plus\n // internal functions for managing these items.\n //\n // - KittyAccessControl: This contract manages the various addresses and constraints for operations\n // that can be executed only by specific roles. Namely CEO, CFO and COO.\n //\n // - KittyOwnership: This provides the methods required for basic non-fungible token\n // transactions, following the draft ERC-721 spec (https://github.com/ethereum/EIPs/issues/721).\n //\n // - KittyBreeding: This file contains the methods necessary to breed cats together, including\n // keeping track of siring offers, and relies on an external genetic combination contract.\n //\n // - KittyAuctions: Here we have the public methods for auctioning or bidding on cats or siring\n // services. The actual auction functionality is handled in two sibling contracts (one\n // for sales and one for siring), while auction creation and bidding is mostly mediated\n // through this facet of the core contract.\n //\n // - KittyMinting: This final facet contains the functionality we use for creating new gen0 cats.\n // We can make up to 5000 \"promo\" cats that can be given away (especially important when\n // the community is new), and all others can only be created and then immediately put up\n // for auction via an algorithmically determined starting price. Regardless of how they\n // are created, there is a hard limit of 50k gen0 cats. After that, it's all up to the\n // community to breed, breed, breed!\n\n // Set in case the core contract is broken and an upgrade is required\n address public newContractAddress;\n\n /// @notice Creates the main CryptoKitties smart contract instance.\n function KittyCore() public {\n // Starts paused.\n paused = true;\n\n // the creator of the contract is the initial CEO\n ceoAddress = msg.sender;\n\n // the creator of the contract is also the initial COO\n cooAddress = msg.sender;\n\n // start with the mythical kitten 0 - so we don't have generation-0 parent issues\n _createKitty(0, 0, 0, uint256(-1), address(0));\n }\n\n /// @dev Used to mark the smart contract as upgraded, in case there is a serious\n /// breaking bug. This method does nothing but keep track of the new contract and\n /// emit a message indicating that the new address is set. It's up to clients of this\n /// contract to update to the new contract address in that case. (This contract will\n /// be paused indefinitely if such an upgrade takes place.)\n /// @param _v2Address new address\n function setNewAddress(address _v2Address) external onlyCEO whenPaused {\n // See README.md for updgrade plan\n newContractAddress = _v2Address;\n ContractUpgrade(_v2Address);\n }\n\n /// @notice No tipping!\n /// @dev Reject all Ether from being sent here, unless it's from one of the\n /// two auction contracts. (Hopefully, we can prevent user accidents.)\n function() external payable {\n require(\n msg.sender == address(saleAuction) ||\n msg.sender == address(siringAuction)\n );\n }\n\n /// @notice Returns all the relevant information about a specific kitty.\n /// @param _id The ID of the kitty of interest.\n function getKitty(uint256 _id)\n external\n view\n returns (\n bool isGestating,\n bool isReady,\n uint256 cooldownIndex,\n uint256 nextActionAt,\n uint256 siringWithId,\n uint256 birthTime,\n uint256 matronId,\n uint256 sireId,\n uint256 generation,\n uint256 genes\n ) {\n Kitty storage kit = kitties[_id];\n\n // if this variable is 0 then it's not gestating\n isGestating = (kit.siringWithId != 0);\n isReady = (kit.cooldownEndBlock <= block.number);\n cooldownIndex = uint256(kit.cooldownIndex);\n nextActionAt = uint256(kit.cooldownEndBlock);\n siringWithId = uint256(kit.siringWithId);\n birthTime = uint256(kit.birthTime);\n matronId = uint256(kit.matronId);\n sireId = uint256(kit.sireId);\n generation = uint256(kit.generation);\n genes = kit.genes;\n }\n\n /// @dev Override unpause so it requires all external contract addresses\n /// to be set before contract can be unpaused. Also, we can't have\n /// newContractAddress set either, because then the contract was upgraded.\n /// @notice This is public rather than external so we can call super.unpause\n /// without using an expensive CALL.\n function unpause() public onlyCEO whenPaused {\n require(saleAuction != address(0));\n require(siringAuction != address(0));\n require(geneScience != address(0));\n require(newContractAddress == address(0));\n\n // Actually unpause the contract.\n super.unpause();\n }\n\n // @dev Allows the CFO to capture the balance available to the contract.\n function withdrawBalance() external onlyCFO {\n uint256 balance = this.balance;\n // Subtract all the currently pregnant kittens we have, plus 1 of margin.\n uint256 subtractFees = (pregnantKitties + 1) * autoBirthFee;\n\n if (balance > subtractFees) {\n cfoAddress.send(balance - subtractFees);\n }\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "exportedSymbols": { "ClockAuction": [ 8872 @@ -51676,5 +51676,5 @@ }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:47.713Z" + "updatedAt": "2018-10-09T17:45:35.914Z" } \ No newline at end of file diff --git a/artifacts/json/KittiesPausable.json b/artifacts/json/KittiesPausable.json index 5a7aca41..086cc89c 100644 --- a/artifacts/json/KittiesPausable.json +++ b/artifacts/json/KittiesPausable.json @@ -84,15 +84,15 @@ "type": "event" } ], - "bytecode": "0x606060405260008060146101000a81548160ff021916908315150217905550336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061044c8061006d6000396000f30060606040526004361061006d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633f4ba83a146100725780635c975abb1461009f5780638456cb59146100cc5780638da5cb5b146100f9578063f2fde38b1461014e575b600080fd5b341561007d57600080fd5b610085610187565b604051808215151515815260200191505060405180910390f35b34156100aa57600080fd5b6100b261024c565b604051808215151515815260200191505060405180910390f35b34156100d757600080fd5b6100df61025f565b604051808215151515815260200191505060405180910390f35b341561010457600080fd5b61010c610326565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015957600080fd5b610185600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061034b565b005b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156101e457600080fd5b600060149054906101000a900460ff1615156101ff57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a16001905090565b600060149054906101000a900460ff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156102bc57600080fd5b600060149054906101000a900460ff161515156102d857600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a16001905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156103a657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151561041d57806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b505600a165627a7a7230582046ab6fc7e5b9e3f407d7d5b604857b777ba6b904b5b0f26a81e15fa9ae3eb1f30029", - "deployedBytecode": "0x60606040526004361061006d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633f4ba83a146100725780635c975abb1461009f5780638456cb59146100cc5780638da5cb5b146100f9578063f2fde38b1461014e575b600080fd5b341561007d57600080fd5b610085610187565b604051808215151515815260200191505060405180910390f35b34156100aa57600080fd5b6100b261024c565b604051808215151515815260200191505060405180910390f35b34156100d757600080fd5b6100df61025f565b604051808215151515815260200191505060405180910390f35b341561010457600080fd5b61010c610326565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015957600080fd5b610185600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061034b565b005b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156101e457600080fd5b600060149054906101000a900460ff1615156101ff57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a16001905090565b600060149054906101000a900460ff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156102bc57600080fd5b600060149054906101000a900460ff161515156102d857600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a16001905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156103a657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151561041d57806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b505600a165627a7a7230582046ab6fc7e5b9e3f407d7d5b604857b777ba6b904b5b0f26a81e15fa9ae3eb1f30029", + "bytecode": "0x606060405260008060146101000a81548160ff021916908315150217905550336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061044c8061006d6000396000f30060606040526004361061006d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633f4ba83a146100725780635c975abb1461009f5780638456cb59146100cc5780638da5cb5b146100f9578063f2fde38b1461014e575b600080fd5b341561007d57600080fd5b610085610187565b604051808215151515815260200191505060405180910390f35b34156100aa57600080fd5b6100b261024c565b604051808215151515815260200191505060405180910390f35b34156100d757600080fd5b6100df61025f565b604051808215151515815260200191505060405180910390f35b341561010457600080fd5b61010c610326565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015957600080fd5b610185600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061034b565b005b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156101e457600080fd5b600060149054906101000a900460ff1615156101ff57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a16001905090565b600060149054906101000a900460ff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156102bc57600080fd5b600060149054906101000a900460ff161515156102d857600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a16001905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156103a657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151561041d57806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b505600a165627a7a72305820f4c030f7379f25b99c5ecbd6253876097b12a003055fcdb0ff6b56687c12baaf0029", + "deployedBytecode": "0x60606040526004361061006d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633f4ba83a146100725780635c975abb1461009f5780638456cb59146100cc5780638da5cb5b146100f9578063f2fde38b1461014e575b600080fd5b341561007d57600080fd5b610085610187565b604051808215151515815260200191505060405180910390f35b34156100aa57600080fd5b6100b261024c565b604051808215151515815260200191505060405180910390f35b34156100d757600080fd5b6100df61025f565b604051808215151515815260200191505060405180910390f35b341561010457600080fd5b61010c610326565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015957600080fd5b610185600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061034b565b005b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156101e457600080fd5b600060149054906101000a900460ff1615156101ff57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a16001905090565b600060149054906101000a900460ff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156102bc57600080fd5b600060149054906101000a900460ff161515156102d857600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a16001905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156103a657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151561041d57806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b505600a165627a7a72305820f4c030f7379f25b99c5ecbd6253876097b12a003055fcdb0ff6b56687c12baaf0029", "sourceMap": "54226:845:18:-;;;54337:5;54316:26;;;;;;;;;;;;;;;;;;;;816:10;808:5;;:18;;;;;;;;;;;;;;;;;;54226:845;;;;;;", "deployedSourceMap": "54226:845:18:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54943:126;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54316:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54735:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;622:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1156:140;;;;;;;;;;;;;;;;;;;;;;;;;;;;54943:126;54992:4;969:5;;;;;;;;;;;955:19;;:10;:19;;;947:28;;;;;;;;54629:6;;;;;;;;;;;54621:15;;;;;;;;55017:5;55008:6;;:14;;;;;;;;;;;;;;;;;;55032:9;;;;;;;;;;55058:4;55051:11;;54943:126;:::o;54316:26::-;;;;;;;;;;;;;:::o;54735:124::-;54785:4;969:5;;;;;;;;;;;955:19;;:10;:19;;;947:28;;;;;;;;54475:6;;;;;;;;;;;54474:7;54466:16;;;;;;;;54810:4;54801:6;;:13;;;;;;;;;;;;;;;;;;54824:7;;;;;;;;;;54848:4;54841:11;;54735:124;:::o;622:20::-;;;;;;;;;;;;;:::o;1156:140::-;969:5;;;;;;;;;;;955:19;;:10;:19;;;947:28;;;;;;;;1245:1;1225:22;;:8;:22;;;;1221:69;;;1271:8;1263:5;;:16;;;;;;;;;;;;;;;;;;1221:69;1156:140;:::o", "source": "pragma solidity 0.4.18;\n\n/**\n The following contract code, titled KittyCore, was written by Cryptokitties and published\n and retrieved from https://etherscan.io/address/0x06012c8cf97bead5deae237070f9587f8e7a266d#code.\n\n It is included in the current project for test purposes, to ensure that our collateralizer can\n handle ERC721 tokens created by the KittyCore contract.\n*/\n\n/**\n * @title KittiesOwnable\n * @dev The KittiesOwnable contract has an owner address, and provides basic authorization control\n * functions, this simplifies the implementation of \"user permissions\".\n */\ncontract KittiesOwnable {\n address public owner;\n\n\n /**\n\t * @dev The KittiesOwnable constructor sets the original `owner` of the contract to the sender\n\t * account.\n\t */\n function KittiesOwnable() {\n owner = msg.sender;\n }\n\n\n /**\n\t * @dev Throws if called by any account other than the owner.\n\t */\n modifier onlyOwner() {\n require(msg.sender == owner);\n _;\n }\n\n\n /**\n\t * @dev Allows the current owner to transfer control of the contract to a newOwner.\n\t * @param newOwner The address to transfer ownership to.\n\t */\n function transferOwnership(address newOwner) onlyOwner {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n\n}\n\n\n\n/// @title Interface for contracts conforming to ERC-721: Non-Fungible Tokens\n/// @author Dieter Shirley (https://github.com/dete)\ncontract KittiesERC721 {\n // Required methods\n function totalSupply() public view returns (uint256 total);\n function balanceOf(address _owner) public view returns (uint256 balance);\n function ownerOf(uint256 _tokenId) external view returns (address owner);\n function approve(address _to, uint256 _tokenId) external;\n function transfer(address _to, uint256 _tokenId) external;\n function transferFrom(address _from, address _to, uint256 _tokenId) external;\n\n // Events\n event Transfer(address from, address to, uint256 tokenId);\n event Approval(address owner, address approved, uint256 tokenId);\n\n // Optional\n // function name() public view returns (string name);\n // function symbol() public view returns (string symbol);\n // function tokensOfOwner(address _owner) external view returns (uint256[] tokenIds);\n // function tokenMetadata(uint256 _tokenId, string _preferredTransport) public view returns (string infoUrl);\n\n // ERC-165 Compatibility (https://github.com/ethereum/EIPs/issues/165)\n function supportsInterface(bytes4 _interfaceID) external view returns (bool);\n}\n\n\n// // Auction wrapper functions\n\n\n// Auction wrapper functions\n\n\n\n\n\n\n\n/// @title SEKRETOOOO\ncontract GeneScienceInterface {\n /// @dev simply a boolean to indicate this is the contract we expect to be\n function isGeneScience() public pure returns (bool);\n\n /// @dev given genes of kitten 1 & 2, return a genetic combination - may have a random factor\n /// @param genes1 genes of mom\n /// @param genes2 genes of sire\n /// @return the genes that are supposed to be passed down the child\n function mixGenes(uint256 genes1, uint256 genes2, uint256 targetBlock) public returns (uint256);\n}\n\n\n\n\n\n\n\n/// @title A facet of KittyCore that manages special access privileges.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyAccessControl {\n // This facet controls access control for CryptoKitties. There are four roles managed here:\n //\n // - The CEO: The CEO can reassign other roles and change the addresses of our dependent smart\n // contracts. It is also the only role that can unpause the smart contract. It is initially\n // set to the address that created the smart contract in the KittyCore constructor.\n //\n // - The CFO: The CFO can withdraw funds from KittyCore and its auction contracts.\n //\n // - The COO: The COO can release gen0 kitties to auction, and mint promo cats.\n //\n // It should be noted that these roles are distinct without overlap in their access abilities, the\n // abilities listed for each role above are exhaustive. In particular, while the CEO can assign any\n // address to any role, the CEO address itself doesn't have the ability to act in those roles. This\n // restriction is intentional so that we aren't tempted to use the CEO address frequently out of\n // convenience. The less we use an address, the less likely it is that we somehow compromise the\n // account.\n\n /// @dev Emited when contract is upgraded - See README.md for updgrade plan\n event ContractUpgrade(address newContract);\n\n // The addresses of the accounts (or contracts) that can execute actions within each roles.\n address public ceoAddress;\n address public cfoAddress;\n address public cooAddress;\n\n // @dev Keeps track whether the contract is paused. When that is true, most actions are blocked\n bool public paused = false;\n\n /// @dev Access modifier for CEO-only functionality\n modifier onlyCEO() {\n require(msg.sender == ceoAddress);\n _;\n }\n\n /// @dev Access modifier for CFO-only functionality\n modifier onlyCFO() {\n require(msg.sender == cfoAddress);\n _;\n }\n\n /// @dev Access modifier for COO-only functionality\n modifier onlyCOO() {\n require(msg.sender == cooAddress);\n _;\n }\n\n modifier onlyCLevel() {\n require(\n msg.sender == cooAddress ||\n msg.sender == ceoAddress ||\n msg.sender == cfoAddress\n );\n _;\n }\n\n /// @dev Assigns a new address to act as the CEO. Only available to the current CEO.\n /// @param _newCEO The address of the new CEO\n function setCEO(address _newCEO) external onlyCEO {\n require(_newCEO != address(0));\n\n ceoAddress = _newCEO;\n }\n\n /// @dev Assigns a new address to act as the CFO. Only available to the current CEO.\n /// @param _newCFO The address of the new CFO\n function setCFO(address _newCFO) external onlyCEO {\n require(_newCFO != address(0));\n\n cfoAddress = _newCFO;\n }\n\n /// @dev Assigns a new address to act as the COO. Only available to the current CEO.\n /// @param _newCOO The address of the new COO\n function setCOO(address _newCOO) external onlyCEO {\n require(_newCOO != address(0));\n\n cooAddress = _newCOO;\n }\n\n /*** KittiesPausable functionality adapted from OpenZeppelin ***/\n\n /// @dev Modifier to allow actions only when the contract IS NOT paused\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /// @dev Modifier to allow actions only when the contract IS paused\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /// @dev Called by any \"C-level\" role to pause the contract. Used only when\n /// a bug or exploit is detected and we need to limit damage.\n function pause() external onlyCLevel whenNotPaused {\n paused = true;\n }\n\n /// @dev Unpauses the smart contract. Can only be called by the CEO, since\n /// one reason we may pause the contract is when CFO or COO accounts are\n /// compromised.\n /// @notice This is public rather than external so it can be called by\n /// derived contracts.\n function unpause() public onlyCEO whenPaused {\n // can't unpause if contract was upgraded\n paused = false;\n }\n}\n\n\n\n\n/// @title Base contract for CryptoKitties. Holds all common structs, events and base variables.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBase is KittyAccessControl {\n /*** EVENTS ***/\n\n /// @dev The Birth event is fired whenever a new kitten comes into existence. This obviously\n /// includes any time a cat is created through the giveBirth method, but it is also called\n /// when a new gen0 cat is created.\n event Birth(address owner, uint256 kittyId, uint256 matronId, uint256 sireId, uint256 genes);\n\n /// @dev Transfer event as defined in current draft of ERC721. Emitted every time a kitten\n /// ownership is assigned, including births.\n event Transfer(address from, address to, uint256 tokenId);\n\n /*** DATA TYPES ***/\n\n /// @dev The main Kitty struct. Every cat in CryptoKitties is represented by a copy\n /// of this structure, so great care was taken to ensure that it fits neatly into\n /// exactly two 256-bit words. Note that the order of the members in this structure\n /// is important because of the byte-packing rules used by Ethereum.\n /// Ref: http://solidity.readthedocs.io/en/develop/miscellaneous.html\n struct Kitty {\n // The Kitty's genetic code is packed into these 256-bits, the format is\n // sooper-sekret! A cat's genes never change.\n uint256 genes;\n\n // The timestamp from the block when this cat came into existence.\n uint64 birthTime;\n\n // The minimum timestamp after which this cat can engage in breeding\n // activities again. This same timestamp is used for the pregnancy\n // timer (for matrons) as well as the siring cooldown.\n uint64 cooldownEndBlock;\n\n // The ID of the parents of this kitty, set to 0 for gen0 cats.\n // Note that using 32-bit unsigned integers limits us to a \"mere\"\n // 4 billion cats. This number might seem small until you realize\n // that Ethereum currently has a limit of about 500 million\n // transactions per year! So, this definitely won't be a problem\n // for several years (even as Ethereum learns to scale).\n uint32 matronId;\n uint32 sireId;\n\n // Set to the ID of the sire cat for matrons that are pregnant,\n // zero otherwise. A non-zero value here is how we know a cat\n // is pregnant. Used to retrieve the genetic material for the new\n // kitten when the birth transpires.\n uint32 siringWithId;\n\n // Set to the index in the cooldown array (see below) that represents\n // the current cooldown duration for this Kitty. This starts at zero\n // for gen0 cats, and is initialized to floor(generation/2) for others.\n // Incremented by one for each successful breeding action, regardless\n // of whether this cat is acting as matron or sire.\n uint16 cooldownIndex;\n\n // The \"generation number\" of this cat. Cats minted by the CK contract\n // for sale are called \"gen0\" and have a generation number of 0. The\n // generation number of all other cats is the larger of the two generation\n // numbers of their parents, plus one.\n // (i.e. max(matron.generation, sire.generation) + 1)\n uint16 generation;\n }\n\n /*** CONSTANTS ***/\n\n /// @dev A lookup table indicating the cooldown duration after any successful\n /// breeding action, called \"pregnancy time\" for matrons and \"siring cooldown\"\n /// for sires. Designed such that the cooldown roughly doubles each time a cat\n /// is bred, encouraging owners not to just keep breeding the same cat over\n /// and over again. Caps out at one week (a cat can breed an unbounded number\n /// of times, and the maximum cooldown is always seven days).\n uint32[14] public cooldowns = [\n uint32(1 minutes),\n uint32(2 minutes),\n uint32(5 minutes),\n uint32(10 minutes),\n uint32(30 minutes),\n uint32(1 hours),\n uint32(2 hours),\n uint32(4 hours),\n uint32(8 hours),\n uint32(16 hours),\n uint32(1 days),\n uint32(2 days),\n uint32(4 days),\n uint32(7 days)\n ];\n\n // An approximation of currently how many seconds are in between blocks.\n uint256 public secondsPerBlock = 15;\n\n /*** STORAGE ***/\n\n /// @dev An array containing the Kitty struct for all Kitties in existence. The ID\n /// of each cat is actually an index into this array. Note that ID 0 is a negacat,\n /// the unKitty, the mythical beast that is the parent of all gen0 cats. A bizarre\n /// creature that is both matron and sire... to itself! Has an invalid genetic code.\n /// In other words, cat ID 0 is invalid... ;-)\n Kitty[] kitties;\n\n /// @dev A mapping from cat IDs to the address that owns them. All cats have\n /// some valid owner address, even gen0 cats are created with a non-zero owner.\n mapping (uint256 => address) public kittyIndexToOwner;\n\n // @dev A mapping from owner address to count of tokens that address owns.\n // Used internally inside balanceOf() to resolve ownership count.\n mapping (address => uint256) ownershipTokenCount;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to call\n /// transferFrom(). Each Kitty can only have one approved address for transfer\n /// at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public kittyIndexToApproved;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to use\n /// this Kitty for siring via breedWith(). Each Kitty can only have one approved\n /// address for siring at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public sireAllowedToAddress;\n\n /// @dev The address of the ClockAuction contract that handles sales of Kitties. This\n /// same contract handles both peer-to-peer sales as well as the gen0 sales which are\n /// initiated every 15 minutes.\n SaleClockAuction public saleAuction;\n\n /// @dev The address of a custom ClockAuction subclassed contract that handles siring\n /// auctions. Needs to be separate from saleAuction because the actions taken on success\n /// after a sales and siring auction are quite different.\n SiringClockAuction public siringAuction;\n\n /// @dev Assigns ownership of a specific Kitty to an address.\n function _transfer(address _from, address _to, uint256 _tokenId) internal {\n // Since the number of kittens is capped to 2^32 we can't overflow this\n ownershipTokenCount[_to]++;\n // transfer ownership\n kittyIndexToOwner[_tokenId] = _to;\n // When creating new kittens _from is 0x0, but we can't account that address.\n if (_from != address(0)) {\n ownershipTokenCount[_from]--;\n // once the kitten is transferred also clear sire allowances\n delete sireAllowedToAddress[_tokenId];\n // clear any previously approved ownership exchange\n delete kittyIndexToApproved[_tokenId];\n }\n // Emit the transfer event.\n Transfer(_from, _to, _tokenId);\n }\n\n /// @dev An internal method that creates a new kitty and stores it. This\n /// method doesn't do any checking and should only be called when the\n /// input data is known to be valid. Will generate both a Birth event\n /// and a Transfer event.\n /// @param _matronId The kitty ID of the matron of this cat (zero for gen0)\n /// @param _sireId The kitty ID of the sire of this cat (zero for gen0)\n /// @param _generation The generation number of this cat, must be computed by caller.\n /// @param _genes The kitty's genetic code.\n /// @param _owner The inital owner of this cat, must be non-zero (except for the unKitty, ID 0)\n function _createKitty(\n uint256 _matronId,\n uint256 _sireId,\n uint256 _generation,\n uint256 _genes,\n address _owner\n )\n internal\n returns (uint)\n {\n // These requires are not strictly necessary, our calling code should make\n // sure that these conditions are never broken. However! _createKitty() is already\n // an expensive call (for storage), and it doesn't hurt to be especially careful\n // to ensure our data structures are always valid.\n require(_matronId == uint256(uint32(_matronId)));\n require(_sireId == uint256(uint32(_sireId)));\n require(_generation == uint256(uint16(_generation)));\n\n // New kitty starts with the same cooldown as parent gen/2\n uint16 cooldownIndex = uint16(_generation / 2);\n if (cooldownIndex > 13) {\n cooldownIndex = 13;\n }\n\n Kitty memory _kitty = Kitty({\n genes: _genes,\n birthTime: uint64(now),\n cooldownEndBlock: 0,\n matronId: uint32(_matronId),\n sireId: uint32(_sireId),\n siringWithId: 0,\n cooldownIndex: cooldownIndex,\n generation: uint16(_generation)\n });\n uint256 newKittenId = kitties.push(_kitty) - 1;\n\n // It's probably never going to happen, 4 billion cats is A LOT, but\n // let's just be 100% sure we never let this happen.\n require(newKittenId == uint256(uint32(newKittenId)));\n\n // emit the birth event\n Birth(\n _owner,\n newKittenId,\n uint256(_kitty.matronId),\n uint256(_kitty.sireId),\n _kitty.genes\n );\n\n // This will assign ownership, and also emit the Transfer event as\n // per ERC721 draft\n _transfer(0, _owner, newKittenId);\n\n return newKittenId;\n }\n\n // Any C-level can fix how many seconds per blocks are currently observed.\n function setSecondsPerBlock(uint256 secs) external onlyCLevel {\n require(secs < cooldowns[0]);\n secondsPerBlock = secs;\n }\n}\n\n\n\n\n\n/// @title The external contract that is responsible for generating metadata for the kitties,\n/// it has one function that will return the data as bytes.\ncontract KittiesERC721Metadata {\n /// @dev Given a token Id, returns a byte array that is supposed to be converted into string.\n function getMetadata(uint256 _tokenId, string) public view returns (bytes32[4] buffer, uint256 count) {\n if (_tokenId == 1) {\n buffer[0] = \"Hello World! :D\";\n count = 15;\n } else if (_tokenId == 2) {\n buffer[0] = \"I would definitely choose a medi\";\n buffer[1] = \"um length string.\";\n count = 49;\n } else if (_tokenId == 3) {\n buffer[0] = \"Lorem ipsum dolor sit amet, mi e\";\n buffer[1] = \"st accumsan dapibus augue lorem,\";\n buffer[2] = \" tristique vestibulum id, libero\";\n buffer[3] = \" suscipit varius sapien aliquam.\";\n count = 128;\n }\n }\n}\n\n\n/// @title The facet of the CryptoKitties core contract that manages ownership, ERC-721 (draft) compliant.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev Ref: https://github.com/ethereum/EIPs/issues/721\n/// See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyOwnership is KittyBase, KittiesERC721 {\n\n /// @notice Name and symbol of the non fungible token, as defined in ERC721.\n string public constant name = \"CryptoKitties\";\n string public constant symbol = \"CK\";\n\n // The contract that will return kitty metadata\n KittiesERC721Metadata public erc721Metadata;\n\n bytes4 constant InterfaceSignature_ERC165 =\n bytes4(keccak256('supportsInterface(bytes4)'));\n\n bytes4 constant InterfaceSignature_ERC721 =\n bytes4(keccak256('name()')) ^\n bytes4(keccak256('symbol()')) ^\n bytes4(keccak256('totalSupply()')) ^\n bytes4(keccak256('balanceOf(address)')) ^\n bytes4(keccak256('ownerOf(uint256)')) ^\n bytes4(keccak256('approve(address,uint256)')) ^\n bytes4(keccak256('transfer(address,uint256)')) ^\n bytes4(keccak256('transferFrom(address,address,uint256)')) ^\n bytes4(keccak256('tokensOfOwner(address)')) ^\n bytes4(keccak256('tokenMetadata(uint256,string)'));\n\n /// @notice Introspection interface as per ERC-165 (https://github.com/ethereum/EIPs/issues/165).\n /// Returns true for any standardized interfaces implemented by this contract. We implement\n /// ERC-165 (obviously!) and ERC-721.\n function supportsInterface(bytes4 _interfaceID) external view returns (bool)\n {\n // DEBUG ONLY\n //require((InterfaceSignature_ERC165 == 0x01ffc9a7) && (InterfaceSignature_ERC721 == 0x9a20483d));\n\n return ((_interfaceID == InterfaceSignature_ERC165) || (_interfaceID == InterfaceSignature_ERC721));\n }\n\n /// @dev Set the address of the sibling contract that tracks metadata.\n /// CEO only.\n function setMetadataAddress(address _contractAddress) public onlyCEO {\n erc721Metadata = KittiesERC721Metadata(_contractAddress);\n }\n\n // Internal utility functions: These functions all assume that their input arguments\n // are valid. We leave it to public methods to sanitize their inputs and follow\n // the required logic.\n\n /// @dev Checks if a given address is the current owner of a particular Kitty.\n /// @param _claimant the address we are validating against.\n /// @param _tokenId kitten id, only valid when > 0\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToOwner[_tokenId] == _claimant;\n }\n\n /// @dev Checks if a given address currently has transferApproval for a particular Kitty.\n /// @param _claimant the address we are confirming kitten is approved for.\n /// @param _tokenId kitten id, only valid when > 0\n function _approvedFor(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToApproved[_tokenId] == _claimant;\n }\n\n /// @dev Marks an address as being approved for transferFrom(), overwriting any previous\n /// approval. Setting _approved to address(0) clears all transfer approval.\n /// NOTE: _approve() does NOT send the Approval event. This is intentional because\n /// _approve() and transferFrom() are used together for putting Kitties on auction, and\n /// there is no value in spamming the log with Approval events in that case.\n function _approve(uint256 _tokenId, address _approved) internal {\n kittyIndexToApproved[_tokenId] = _approved;\n }\n\n /// @notice Returns the number of Kitties owned by a specific address.\n /// @param _owner The owner address to check.\n /// @dev Required for ERC-721 compliance\n function balanceOf(address _owner) public view returns (uint256 count) {\n return ownershipTokenCount[_owner];\n }\n\n /// @notice Transfers a Kitty to another address. If transferring to a smart\n /// contract be VERY CAREFUL to ensure that it is aware of ERC-721 (or\n /// CryptoKitties specifically) or your Kitty may be lost forever. Seriously.\n /// @param _to The address of the recipient, can be a user or contract.\n /// @param _tokenId The ID of the Kitty to transfer.\n /// @dev Required for ERC-721 compliance.\n function transfer(\n address _to,\n uint256 _tokenId\n )\n external\n whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Disallow transfers to the auction contracts to prevent accidental\n // misuse. Auction contracts should only take ownership of kitties\n // through the allow + transferFrom flow.\n require(_to != address(saleAuction));\n require(_to != address(siringAuction));\n\n // You can only send your own cat.\n require(_owns(msg.sender, _tokenId));\n\n // Reassign ownership, clear pending approvals, emit Transfer event.\n _transfer(msg.sender, _to, _tokenId);\n }\n\n /// @notice Grant another address the right to transfer a specific Kitty via\n /// transferFrom(). This is the preferred flow for transfering NFTs to contracts.\n /// @param _to The address to be granted transfer approval. Pass address(0) to\n /// clear all approvals.\n /// @param _tokenId The ID of the Kitty that can be transferred if this call succeeds.\n /// @dev Required for ERC-721 compliance.\n function approve(\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Only an owner can grant transfer approval.\n require(_owns(msg.sender, _tokenId));\n\n // Register the approval (replacing any previous approval).\n _approve(_tokenId, _to);\n\n // Emit approval event.\n Approval(msg.sender, _to, _tokenId);\n }\n\n /// @notice Transfer a Kitty owned by another address, for which the calling address\n /// has previously been granted transfer approval by the owner.\n /// @param _from The address that owns the Kitty to be transfered.\n /// @param _to The address that should take ownership of the Kitty. Can be any address,\n /// including the caller.\n /// @param _tokenId The ID of the Kitty to be transferred.\n /// @dev Required for ERC-721 compliance.\n function transferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Check for approval and valid ownership\n require(_approvedFor(msg.sender, _tokenId));\n require(_owns(_from, _tokenId));\n\n // Reassign ownership (also clears pending approvals and emits Transfer event).\n _transfer(_from, _to, _tokenId);\n }\n\n /// @notice Returns the total number of Kitties currently in existence.\n /// @dev Required for ERC-721 compliance.\n function totalSupply() public view returns (uint) {\n return kitties.length - 1;\n }\n\n /// @notice Returns the address currently assigned ownership of a given Kitty.\n /// @dev Required for ERC-721 compliance.\n function ownerOf(uint256 _tokenId)\n external\n view\n returns (address owner)\n {\n owner = kittyIndexToOwner[_tokenId];\n\n require(owner != address(0));\n }\n\n /// @notice Returns a list of all Kitty IDs assigned to an address.\n /// @param _owner The owner whose Kitties we are interested in.\n /// @dev This method MUST NEVER be called by smart contract code. First, it's fairly\n /// expensive (it walks the entire Kitty array looking for cats belonging to owner),\n /// but it also returns a dynamic array, which is only supported for web3 calls, and\n /// not contract-to-contract calls.\n function tokensOfOwner(address _owner) external view returns(uint256[] ownerTokens) {\n uint256 tokenCount = balanceOf(_owner);\n\n if (tokenCount == 0) {\n // Return an empty array\n return new uint256[](0);\n } else {\n uint256[] memory result = new uint256[](tokenCount);\n uint256 totalCats = totalSupply();\n uint256 resultIndex = 0;\n\n // We count on the fact that all cats have IDs starting at 1 and increasing\n // sequentially up to the totalCat count.\n uint256 catId;\n\n for (catId = 1; catId <= totalCats; catId++) {\n if (kittyIndexToOwner[catId] == _owner) {\n result[resultIndex] = catId;\n resultIndex++;\n }\n }\n\n return result;\n }\n }\n\n /// @dev Adapted from memcpy() by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _memcpy(uint _dest, uint _src, uint _len) private view {\n // Copy word-length chunks while possible\n for(; _len >= 32; _len -= 32) {\n assembly {\n mstore(_dest, mload(_src))\n }\n _dest += 32;\n _src += 32;\n }\n\n // Copy remaining bytes\n uint256 mask = 256 ** (32 - _len) - 1;\n assembly {\n let srcpart := and(mload(_src), not(mask))\n let destpart := and(mload(_dest), mask)\n mstore(_dest, or(destpart, srcpart))\n }\n }\n\n /// @dev Adapted from toString(slice) by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _toString(bytes32[4] _rawBytes, uint256 _stringLength) private view returns (string) {\n var outputString = new string(_stringLength);\n uint256 outputPtr;\n uint256 bytesPtr;\n\n assembly {\n outputPtr := add(outputString, 32)\n bytesPtr := _rawBytes\n }\n\n _memcpy(outputPtr, bytesPtr, _stringLength);\n\n return outputString;\n }\n\n /// @notice Returns a URI pointing to a metadata package for this token conforming to\n /// ERC-721 (https://github.com/ethereum/EIPs/issues/721)\n /// @param _tokenId The ID number of the Kitty whose metadata should be returned.\n function tokenMetadata(uint256 _tokenId, string _preferredTransport) external view returns (string infoUrl) {\n require(erc721Metadata != address(0));\n bytes32[4] memory buffer;\n uint256 count;\n (buffer, count) = erc721Metadata.getMetadata(_tokenId, _preferredTransport);\n\n return _toString(buffer, count);\n }\n}\n\n\n\n/// @title A facet of KittyCore that manages Kitty siring, gestation, and birth.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBreeding is KittyOwnership {\n\n /// @dev The Pregnant event is fired when two cats successfully breed and the pregnancy\n /// timer begins for the matron.\n event Pregnant(address owner, uint256 matronId, uint256 sireId, uint256 cooldownEndBlock);\n\n /// @notice The minimum payment required to use breedWithAuto(). This fee goes towards\n /// the gas cost paid by whatever calls giveBirth(), and can be dynamically updated by\n /// the COO role as the gas price changes.\n uint256 public autoBirthFee = 2 finney;\n\n // Keeps track of number of pregnant kitties.\n uint256 public pregnantKitties;\n\n /// @dev The address of the sibling contract that is used to implement the sooper-sekret\n /// genetic combination algorithm.\n GeneScienceInterface public geneScience;\n\n /// @dev Update the address of the genetic contract, can only be called by the CEO.\n /// @param _address An address of a GeneScience contract instance to be used from this point forward.\n function setGeneScienceAddress(address _address) external onlyCEO {\n GeneScienceInterface candidateContract = GeneScienceInterface(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isGeneScience());\n\n // Set the new contract address\n geneScience = candidateContract;\n }\n\n /// @dev Checks that a given kitten is able to breed. Requires that the\n /// current cooldown is finished (for sires) and also checks that there is\n /// no pending pregnancy.\n function _isReadyToBreed(Kitty _kit) internal view returns (bool) {\n // In addition to checking the cooldownEndBlock, we also need to check to see if\n // the cat has a pending birth; there can be some period of time between the end\n // of the pregnacy timer and the birth event.\n return (_kit.siringWithId == 0) && (_kit.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @dev Check if a sire has authorized breeding with this matron. True if both sire\n /// and matron have the same owner, or if the sire has given siring permission to\n /// the matron's owner (via approveSiring()).\n function _isSiringPermitted(uint256 _sireId, uint256 _matronId) internal view returns (bool) {\n address matronOwner = kittyIndexToOwner[_matronId];\n address sireOwner = kittyIndexToOwner[_sireId];\n\n // Siring is okay if they have same owner, or if the matron's owner was given\n // permission to breed with this sire.\n return (matronOwner == sireOwner || sireAllowedToAddress[_sireId] == matronOwner);\n }\n\n /// @dev Set the cooldownEndTime for the given Kitty, based on its current cooldownIndex.\n /// Also increments the cooldownIndex (unless it has hit the cap).\n /// @param _kitten A reference to the Kitty in storage which needs its timer started.\n function _triggerCooldown(Kitty storage _kitten) internal {\n // Compute an estimation of the cooldown time in blocks (based on current cooldownIndex).\n _kitten.cooldownEndBlock = uint64((cooldowns[_kitten.cooldownIndex]/secondsPerBlock) + block.number);\n\n // Increment the breeding count, clamping it at 13, which is the length of the\n // cooldowns array. We could check the array size dynamically, but hard-coding\n // this as a constant saves gas. Yay, Solidity!\n if (_kitten.cooldownIndex < 13) {\n _kitten.cooldownIndex += 1;\n }\n }\n\n /// @notice Grants approval to another user to sire with one of your Kitties.\n /// @param _addr The address that will be able to sire with your Kitty. Set to\n /// address(0) to clear all siring approvals for this Kitty.\n /// @param _sireId A Kitty that you own that _addr will now be able to sire with.\n function approveSiring(address _addr, uint256 _sireId)\n external\n whenNotPaused\n {\n require(_owns(msg.sender, _sireId));\n sireAllowedToAddress[_sireId] = _addr;\n }\n\n /// @dev Updates the minimum payment required for calling giveBirthAuto(). Can only\n /// be called by the COO address. (This fee is used to offset the gas cost incurred\n /// by the autobirth daemon).\n function setAutoBirthFee(uint256 val) external onlyCOO {\n autoBirthFee = val;\n }\n\n /// @dev Checks to see if a given Kitty is pregnant and (if so) if the gestation\n /// period has passed.\n function _isReadyToGiveBirth(Kitty _matron) private view returns (bool) {\n return (_matron.siringWithId != 0) && (_matron.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @notice Checks that a given kitten is able to breed (i.e. it is not pregnant or\n /// in the middle of a siring cooldown).\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isReadyToBreed(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n Kitty storage kit = kitties[_kittyId];\n return _isReadyToBreed(kit);\n }\n\n /// @dev Checks whether a kitty is currently pregnant.\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isPregnant(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n // A kitty is pregnant if and only if this field is set\n return kitties[_kittyId].siringWithId != 0;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair. DOES NOT\n /// check ownership permissions (that is up to the caller).\n /// @param _matron A reference to the Kitty struct of the potential matron.\n /// @param _matronId The matron's ID.\n /// @param _sire A reference to the Kitty struct of the potential sire.\n /// @param _sireId The sire's ID\n function _isValidMatingPair(\n Kitty storage _matron,\n uint256 _matronId,\n Kitty storage _sire,\n uint256 _sireId\n )\n private\n view\n returns(bool)\n {\n // A Kitty can't breed with itself!\n if (_matronId == _sireId) {\n return false;\n }\n\n // Kitties can't breed with their parents.\n if (_matron.matronId == _sireId || _matron.sireId == _sireId) {\n return false;\n }\n if (_sire.matronId == _matronId || _sire.sireId == _matronId) {\n return false;\n }\n\n // We can short circuit the sibling check (below) if either cat is\n // gen zero (has a matron ID of zero).\n if (_sire.matronId == 0 || _matron.matronId == 0) {\n return true;\n }\n\n // Kitties can't breed with full or half siblings.\n if (_sire.matronId == _matron.matronId || _sire.matronId == _matron.sireId) {\n return false;\n }\n if (_sire.sireId == _matron.matronId || _sire.sireId == _matron.sireId) {\n return false;\n }\n\n // Everything seems cool! Let's get DTF.\n return true;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair for\n /// breeding via auction (i.e. skips ownership and siring approval checks).\n function _canBreedWithViaAuction(uint256 _matronId, uint256 _sireId)\n internal\n view\n returns (bool)\n {\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId);\n }\n\n /// @notice Checks to see if two cats can breed together, including checks for\n /// ownership and siring approvals. Does NOT check that both cats are ready for\n /// breeding (i.e. breedWith could still fail until the cooldowns are finished).\n /// TODO: Shouldn't this check pregnancy and cooldowns?!?\n /// @param _matronId The ID of the proposed matron.\n /// @param _sireId The ID of the proposed sire.\n function canBreedWith(uint256 _matronId, uint256 _sireId)\n external\n view\n returns(bool)\n {\n require(_matronId > 0);\n require(_sireId > 0);\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId) &&\n _isSiringPermitted(_sireId, _matronId);\n }\n\n /// @dev Internal utility function to initiate breeding, assumes that all breeding\n /// requirements have been checked.\n function _breedWith(uint256 _matronId, uint256 _sireId) internal {\n // Grab a reference to the Kitties from storage.\n Kitty storage sire = kitties[_sireId];\n Kitty storage matron = kitties[_matronId];\n\n // Mark the matron as pregnant, keeping track of who the sire is.\n matron.siringWithId = uint32(_sireId);\n\n // Trigger the cooldown for both parents.\n _triggerCooldown(sire);\n _triggerCooldown(matron);\n\n // Clear siring permission for both parents. This may not be strictly necessary\n // but it's likely to avoid confusion!\n delete sireAllowedToAddress[_matronId];\n delete sireAllowedToAddress[_sireId];\n\n // Every time a kitty gets pregnant, counter is incremented.\n pregnantKitties++;\n\n // Emit the pregnancy event.\n Pregnant(kittyIndexToOwner[_matronId], _matronId, _sireId, matron.cooldownEndBlock);\n }\n\n /// @notice Breed a Kitty you own (as matron) with a sire that you own, or for which you\n /// have previously been given Siring approval. Will either make your cat pregnant, or will\n /// fail entirely. Requires a pre-payment of the fee given out to the first caller of giveBirth()\n /// @param _matronId The ID of the Kitty acting as matron (will end up pregnant if successful)\n /// @param _sireId The ID of the Kitty acting as sire (will begin its siring cooldown if successful)\n function breedWithAuto(uint256 _matronId, uint256 _sireId)\n external\n payable\n whenNotPaused\n {\n // Checks for payment.\n require(msg.value >= autoBirthFee);\n\n // Caller must own the matron.\n require(_owns(msg.sender, _matronId));\n\n // Neither sire nor matron are allowed to be on auction during a normal\n // breeding operation, but we don't need to check that explicitly.\n // For matron: The caller of this function can't be the owner of the matron\n // because the owner of a Kitty on auction is the auction house, and the\n // auction house will never call breedWith().\n // For sire: Similarly, a sire on auction will be owned by the auction house\n // and the act of transferring ownership will have cleared any oustanding\n // siring approval.\n // Thus we don't need to spend gas explicitly checking to see if either cat\n // is on auction.\n\n // Check that matron and sire are both owned by caller, or that the sire\n // has given siring permission to caller (i.e. matron's owner).\n // Will fail for _sireId = 0\n require(_isSiringPermitted(_sireId, _matronId));\n\n // Grab a reference to the potential matron\n Kitty storage matron = kitties[_matronId];\n\n // Make sure matron isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(matron));\n\n // Grab a reference to the potential sire\n Kitty storage sire = kitties[_sireId];\n\n // Make sure sire isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(sire));\n\n // Test that these cats are a valid mating pair.\n require(_isValidMatingPair(\n matron,\n _matronId,\n sire,\n _sireId\n ));\n\n // All checks passed, kitty gets pregnant!\n _breedWith(_matronId, _sireId);\n }\n\n /// @notice Have a pregnant Kitty give birth!\n /// @param _matronId A Kitty ready to give birth.\n /// @return The Kitty ID of the new kitten.\n /// @dev Looks at a given Kitty and, if pregnant and if the gestation period has passed,\n /// combines the genes of the two parents to create a new kitten. The new Kitty is assigned\n /// to the current owner of the matron. Upon successful completion, both the matron and the\n /// new kitten will be ready to breed again. Note that anyone can call this function (if they\n /// are willing to pay the gas!), but the new kitten always goes to the mother's owner.\n function giveBirth(uint256 _matronId)\n external\n whenNotPaused\n returns(uint256)\n {\n // Grab a reference to the matron in storage.\n Kitty storage matron = kitties[_matronId];\n\n // Check that the matron is a valid cat.\n require(matron.birthTime != 0);\n\n // Check that the matron is pregnant, and that its time has come!\n require(_isReadyToGiveBirth(matron));\n\n // Grab a reference to the sire in storage.\n uint256 sireId = matron.siringWithId;\n Kitty storage sire = kitties[sireId];\n\n // Determine the higher generation number of the two parents\n uint16 parentGen = matron.generation;\n if (sire.generation > matron.generation) {\n parentGen = sire.generation;\n }\n\n // Call the sooper-sekret gene mixing operation.\n uint256 childGenes = geneScience.mixGenes(matron.genes, sire.genes, matron.cooldownEndBlock - 1);\n\n // Make the new kitten!\n address owner = kittyIndexToOwner[_matronId];\n uint256 kittenId = _createKitty(_matronId, matron.siringWithId, parentGen + 1, childGenes, owner);\n\n // Clear the reference to sire from the matron (REQUIRED! Having siringWithId\n // set is what marks a matron as being pregnant.)\n delete matron.siringWithId;\n\n // Every time a kitty gives birth counter is decremented.\n pregnantKitties--;\n\n // Send the balance fee to the person who made birth happen.\n msg.sender.send(autoBirthFee);\n\n // return the new kitten's ID\n return kittenId;\n }\n}\n\n\n\n\n\n\n\n\n\n\n/// @title Auction Core\n/// @dev Contains models, variables, and internal methods for the auction.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuctionBase {\n\n // Represents an auction on an NFT\n struct Auction {\n // Current owner of NFT\n address seller;\n // Price (in wei) at beginning of auction\n uint128 startingPrice;\n // Price (in wei) at end of auction\n uint128 endingPrice;\n // Duration (in seconds) of auction\n uint64 duration;\n // Time when auction started\n // NOTE: 0 if this auction has been concluded\n uint64 startedAt;\n }\n\n // Reference to contract tracking NFT ownership\n KittiesERC721 public nonFungibleContract;\n\n // Cut owner takes on each auction, measured in basis points (1/100 of a percent).\n // Values 0-10,000 map to 0%-100%\n uint256 public ownerCut;\n\n // Map from token ID to their corresponding auction.\n mapping (uint256 => Auction) tokenIdToAuction;\n\n event AuctionCreated(uint256 tokenId, uint256 startingPrice, uint256 endingPrice, uint256 duration);\n event AuctionSuccessful(uint256 tokenId, uint256 totalPrice, address winner);\n event AuctionCancelled(uint256 tokenId);\n\n /// @dev Returns true if the claimant owns the token.\n /// @param _claimant - Address claiming to own the token.\n /// @param _tokenId - ID of token whose ownership to verify.\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return (nonFungibleContract.ownerOf(_tokenId) == _claimant);\n }\n\n /// @dev Escrows the NFT, assigning ownership to this contract.\n /// Throws if the escrow fails.\n /// @param _owner - Current owner address of token to escrow.\n /// @param _tokenId - ID of token whose approval to verify.\n function _escrow(address _owner, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transferFrom(_owner, this, _tokenId);\n }\n\n /// @dev Transfers an NFT owned by this contract to another address.\n /// Returns true if the transfer succeeds.\n /// @param _receiver - Address to transfer NFT to.\n /// @param _tokenId - ID of token to transfer.\n function _transfer(address _receiver, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transfer(_receiver, _tokenId);\n }\n\n /// @dev Adds an auction to the list of open auctions. Also fires the\n /// AuctionCreated event.\n /// @param _tokenId The ID of the token to be put on auction.\n /// @param _auction Auction to add.\n function _addAuction(uint256 _tokenId, Auction _auction) internal {\n // Require that all auctions have a duration of\n // at least one minute. (Keeps our math from getting hairy!)\n require(_auction.duration >= 1 minutes);\n\n tokenIdToAuction[_tokenId] = _auction;\n\n AuctionCreated(\n uint256(_tokenId),\n uint256(_auction.startingPrice),\n uint256(_auction.endingPrice),\n uint256(_auction.duration)\n );\n }\n\n /// @dev Cancels an auction unconditionally.\n function _cancelAuction(uint256 _tokenId, address _seller) internal {\n _removeAuction(_tokenId);\n _transfer(_seller, _tokenId);\n AuctionCancelled(_tokenId);\n }\n\n /// @dev Computes the price and transfers winnings.\n /// Does NOT transfer ownership of token.\n function _bid(uint256 _tokenId, uint256 _bidAmount)\n internal\n returns (uint256)\n {\n // Get a reference to the auction struct\n Auction storage auction = tokenIdToAuction[_tokenId];\n\n // Explicitly check that this auction is currently live.\n // (Because of how Ethereum mappings work, we can't just count\n // on the lookup above failing. An invalid _tokenId will just\n // return an auction object that is all zeros.)\n require(_isOnAuction(auction));\n\n // Check that the bid is greater than or equal to the current price\n uint256 price = _currentPrice(auction);\n require(_bidAmount >= price);\n\n // Grab a reference to the seller before the auction struct\n // gets deleted.\n address seller = auction.seller;\n\n // The bid is good! Remove the auction before sending the fees\n // to the sender so we can't have a reentrancy attack.\n _removeAuction(_tokenId);\n\n // Transfer proceeds to seller (if there are any!)\n if (price > 0) {\n // Calculate the auctioneer's cut.\n // (NOTE: _computeCut() is guaranteed to return a\n // value <= price, so this subtraction can't go negative.)\n uint256 auctioneerCut = _computeCut(price);\n uint256 sellerProceeds = price - auctioneerCut;\n\n // NOTE: Doing a transfer() in the middle of a complex\n // method like this is generally discouraged because of\n // reentrancy attacks and DoS attacks if the seller is\n // a contract with an invalid fallback function. We explicitly\n // guard against reentrancy attacks by removing the auction\n // before calling transfer(), and the only thing the seller\n // can DoS is the sale of their own asset! (And if it's an\n // accident, they can call cancelAuction(). )\n seller.transfer(sellerProceeds);\n }\n\n // Calculate any excess funds included with the bid. If the excess\n // is anything worth worrying about, transfer it back to bidder.\n // NOTE: We checked above that the bid amount is greater than or\n // equal to the price so this cannot underflow.\n uint256 bidExcess = _bidAmount - price;\n\n // Return the funds. Similar to the previous transfer, this is\n // not susceptible to a re-entry attack because the auction is\n // removed before any transfers occur.\n msg.sender.transfer(bidExcess);\n\n // Tell the world!\n AuctionSuccessful(_tokenId, price, msg.sender);\n\n return price;\n }\n\n /// @dev Removes an auction from the list of open auctions.\n /// @param _tokenId - ID of NFT on auction.\n function _removeAuction(uint256 _tokenId) internal {\n delete tokenIdToAuction[_tokenId];\n }\n\n /// @dev Returns true if the NFT is on auction.\n /// @param _auction - Auction to check.\n function _isOnAuction(Auction storage _auction) internal view returns (bool) {\n return (_auction.startedAt > 0);\n }\n\n /// @dev Returns current price of an NFT on auction. Broken into two\n /// functions (this one, that computes the duration from the auction\n /// structure, and the other that does the price computation) so we\n /// can easily test that the price computation works correctly.\n function _currentPrice(Auction storage _auction)\n internal\n view\n returns (uint256)\n {\n uint256 secondsPassed = 0;\n\n // A bit of insurance against negative values (or wraparound).\n // Probably not necessary (since Ethereum guarnatees that the\n // now variable doesn't ever go backwards).\n if (now > _auction.startedAt) {\n secondsPassed = now - _auction.startedAt;\n }\n\n return _computeCurrentPrice(\n _auction.startingPrice,\n _auction.endingPrice,\n _auction.duration,\n secondsPassed\n );\n }\n\n /// @dev Computes the current price of an auction. Factored out\n /// from _currentPrice so we can run extensive unit tests.\n /// When testing, make this function public and turn on\n /// `Current price computation` test suite.\n function _computeCurrentPrice(\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n uint256 _secondsPassed\n )\n internal\n pure\n returns (uint256)\n {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our public functions carefully cap the maximum values for\n // time (at 64-bits) and currency (at 128-bits). _duration is\n // also known to be non-zero (see the require() statement in\n // _addAuction())\n if (_secondsPassed >= _duration) {\n // We've reached the end of the dynamic pricing portion\n // of the auction, just return the end price.\n return _endingPrice;\n } else {\n // Starting price can be higher than ending price (and often is!), so\n // this delta can be negative.\n int256 totalPriceChange = int256(_endingPrice) - int256(_startingPrice);\n\n // This multiplication can't overflow, _secondsPassed will easily fit within\n // 64-bits, and totalPriceChange will easily fit within 128-bits, their product\n // will always fit within 256-bits.\n int256 currentPriceChange = totalPriceChange * int256(_secondsPassed) / int256(_duration);\n\n // currentPriceChange can be negative, but if so, will have a magnitude\n // less that _startingPrice. Thus, this result will always end up positive.\n int256 currentPrice = int256(_startingPrice) + currentPriceChange;\n\n return uint256(currentPrice);\n }\n }\n\n /// @dev Computes owner's cut of a sale.\n /// @param _price - Sale price of NFT.\n function _computeCut(uint256 _price) internal view returns (uint256) {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our entry functions carefully cap the maximum values for\n // currency (at 128-bits), and ownerCut <= 10000 (see the require()\n // statement in the ClockAuction constructor). The result of this\n // function is always guaranteed to be <= _price.\n return _price * ownerCut / 10000;\n }\n\n}\n\n\n\n\n\n\n\n/**\n * @title KittiesPausable\n * @dev Base contract which allows children to implement an emergency stop mechanism.\n */\ncontract KittiesPausable is KittiesOwnable {\n event Pause();\n event Unpause();\n\n bool public paused = false;\n\n\n /**\n\t * @dev modifier to allow actions only when the contract IS paused\n\t */\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /**\n\t * @dev modifier to allow actions only when the contract IS NOT paused\n\t */\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /**\n\t * @dev called by the owner to pause, triggers stopped state\n\t */\n function pause() onlyOwner whenNotPaused returns (bool) {\n paused = true;\n Pause();\n return true;\n }\n\n /**\n\t * @dev called by the owner to unpause, returns to normal state\n\t */\n function unpause() onlyOwner whenPaused returns (bool) {\n paused = false;\n Unpause();\n return true;\n }\n}\n\n\n/// @title Clock auction for non-fungible tokens.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuction is KittiesPausable, ClockAuctionBase {\n\n /// @dev The ERC-165 interface signature for ERC-721.\n /// Ref: https://github.com/ethereum/EIPs/issues/165\n /// Ref: https://github.com/ethereum/EIPs/issues/721\n bytes4 constant InterfaceSignature_ERC721 = bytes4(0x9a20483d);\n\n /// @dev Constructor creates a reference to the NFT ownership contract\n /// and verifies the owner cut is in the valid range.\n /// @param _nftAddress - address of a deployed contract implementing\n /// the Nonfungible Interface.\n /// @param _cut - percent cut the owner takes on each auction, must be\n /// between 0-10,000.\n function ClockAuction(address _nftAddress, uint256 _cut) public {\n require(_cut <= 10000);\n ownerCut = _cut;\n\n KittiesERC721 candidateContract = KittiesERC721(_nftAddress);\n require(candidateContract.supportsInterface(InterfaceSignature_ERC721));\n nonFungibleContract = candidateContract;\n }\n\n /// @dev Remove all Ether from the contract, which is the owner's cuts\n /// as well as any Ether sent directly to the contract address.\n /// Always transfers to the NFT contract, but can be called either by\n /// the owner or the NFT contract.\n function withdrawBalance() external {\n address nftAddress = address(nonFungibleContract);\n\n require(\n msg.sender == owner ||\n msg.sender == nftAddress\n );\n // We are using this boolean method to make sure that even if one fails it will still work\n bool res = nftAddress.send(this.balance);\n }\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of time to move between starting\n /// price and ending price (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n whenNotPaused\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(_owns(msg.sender, _tokenId));\n _escrow(msg.sender, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Bids on an open auction, completing the auction and transferring\n /// ownership of the NFT if enough Ether is supplied.\n /// @param _tokenId - ID of token to bid on.\n function bid(uint256 _tokenId)\n external\n payable\n whenNotPaused\n {\n // _bid will throw if the bid or funds transfer fails\n _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n }\n\n /// @dev Cancels an auction that hasn't been won yet.\n /// Returns the NFT to original owner.\n /// @notice This is a state-modifying function that can\n /// be called while the contract is paused.\n /// @param _tokenId - ID of token on auction\n function cancelAuction(uint256 _tokenId)\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n address seller = auction.seller;\n require(msg.sender == seller);\n _cancelAuction(_tokenId, seller);\n }\n\n /// @dev Cancels an auction when the contract is paused.\n /// Only the owner may do this, and NFTs are returned to\n /// the seller. This should only be used in emergencies.\n /// @param _tokenId - ID of the NFT on auction to cancel.\n function cancelAuctionWhenPaused(uint256 _tokenId)\n whenPaused\n onlyOwner\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n _cancelAuction(_tokenId, auction.seller);\n }\n\n /// @dev Returns auction info for an NFT on auction.\n /// @param _tokenId - ID of NFT on auction.\n function getAuction(uint256 _tokenId)\n external\n view\n returns\n (\n address seller,\n uint256 startingPrice,\n uint256 endingPrice,\n uint256 duration,\n uint256 startedAt\n ) {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return (\n auction.seller,\n auction.startingPrice,\n auction.endingPrice,\n auction.duration,\n auction.startedAt\n );\n }\n\n /// @dev Returns the current price of an auction.\n /// @param _tokenId - ID of the token price we are checking.\n function getCurrentPrice(uint256 _tokenId)\n external\n view\n returns (uint256)\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return _currentPrice(auction);\n }\n\n}\n\n\n/// @title Reverse auction modified for siring\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SiringClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSiringAuctionAddress() call.\n bool public isSiringClockAuction = true;\n\n // Delegate constructor\n function SiringClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction. Since this function is wrapped,\n /// require sender to be KittyCore contract.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Places a bid for siring. Requires the sender\n /// is the KittyCore contract because all bid methods\n /// should be wrapped. Also returns the kitty to the\n /// seller rather than the winner.\n function bid(uint256 _tokenId)\n external\n payable\n {\n require(msg.sender == address(nonFungibleContract));\n address seller = tokenIdToAuction[_tokenId].seller;\n // _bid checks that token ID is valid and will throw if bid fails\n _bid(_tokenId, msg.value);\n // We transfer the kitty back to the seller, the winner will get\n // the offspring\n _transfer(seller, _tokenId);\n }\n\n}\n\n\n\n\n\n/// @title Clock auction modified for sale of kitties\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SaleClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSaleAuctionAddress() call.\n bool public isSaleClockAuction = true;\n\n // Tracks last 5 sale price of gen0 kitty sales\n uint256 public gen0SaleCount;\n uint256[5] public lastGen0SalePrices;\n\n // Delegate constructor\n function SaleClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Updates lastSalePrice if seller is the nft contract\n /// Otherwise, works the same as default bid method.\n function bid(uint256 _tokenId)\n external\n payable\n {\n // _bid verifies token ID size\n address seller = tokenIdToAuction[_tokenId].seller;\n uint256 price = _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n\n // If not a gen0 auction, exit\n if (seller == address(nonFungibleContract)) {\n // Track gen0 sale prices\n lastGen0SalePrices[gen0SaleCount % 5] = price;\n gen0SaleCount++;\n }\n }\n\n function averageGen0SalePrice() external view returns (uint256) {\n uint256 sum = 0;\n for (uint256 i = 0; i < 5; i++) {\n sum += lastGen0SalePrices[i];\n }\n return sum / 5;\n }\n\n}\n\n\n/// @title Handles creating auctions for sale and siring of kitties.\n/// This wrapper of ReverseAuction exists only so that users can create\n/// auctions with only one transaction.\ncontract KittyAuction is KittyBreeding {\n\n // @notice The auction contract variables are defined in KittyBase to allow\n // us to refer to them in KittyOwnership to prevent accidental transfers.\n // `saleAuction` refers to the auction for gen0 and p2p sale of kitties.\n // `siringAuction` refers to the auction for siring rights of kitties.\n\n /// @dev Sets the reference to the sale auction.\n /// @param _address - Address of sale contract.\n function setSaleAuctionAddress(address _address) external onlyCEO {\n SaleClockAuction candidateContract = SaleClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSaleClockAuction());\n\n // Set the new contract address\n saleAuction = candidateContract;\n }\n\n /// @dev Sets the reference to the siring auction.\n /// @param _address - Address of siring contract.\n function setSiringAuctionAddress(address _address) external onlyCEO {\n SiringClockAuction candidateContract = SiringClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSiringClockAuction());\n\n // Set the new contract address\n siringAuction = candidateContract;\n }\n\n /// @dev Put a kitty up for auction.\n /// Does some ownership trickery to create auctions in one tx.\n function createSaleAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n // Ensure the kitty is not pregnant to prevent the auction\n // contract accidentally receiving ownership of the child.\n // NOTE: the kitty IS allowed to be in a cooldown.\n require(!isPregnant(_kittyId));\n _approve(_kittyId, saleAuction);\n // Sale auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n saleAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Put a kitty up for auction to be sire.\n /// Performs checks to ensure the kitty can be sired, then\n /// delegates to reverse auction.\n function createSiringAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n require(isReadyToBreed(_kittyId));\n _approve(_kittyId, siringAuction);\n // Siring auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n siringAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Completes a siring auction by bidding.\n /// Immediately breeds the winning matron with the sire on auction.\n /// @param _sireId - ID of the sire on auction.\n /// @param _matronId - ID of the matron owned by the bidder.\n function bidOnSiringAuction(\n uint256 _sireId,\n uint256 _matronId\n )\n external\n payable\n whenNotPaused\n {\n // Auction contract checks input sizes\n require(_owns(msg.sender, _matronId));\n require(isReadyToBreed(_matronId));\n require(_canBreedWithViaAuction(_matronId, _sireId));\n\n // Define the current price of the auction.\n uint256 currentPrice = siringAuction.getCurrentPrice(_sireId);\n require(msg.value >= currentPrice + autoBirthFee);\n\n // Siring auction will throw if the bid fails.\n siringAuction.bid.value(msg.value - autoBirthFee)(_sireId);\n _breedWith(uint32(_matronId), uint32(_sireId));\n }\n\n /// @dev Transfers the balance of the sale auction contract\n /// to the KittyCore contract. We use two-step withdrawal to\n /// prevent two transfer calls in the auction bid function.\n function withdrawAuctionBalances() external onlyCLevel {\n saleAuction.withdrawBalance();\n siringAuction.withdrawBalance();\n }\n}\n\n\n/// @title all functions related to creating kittens\ncontract KittyMinting is KittyAuction {\n\n // Limits the number of cats the contract owner can ever create.\n uint256 public constant PROMO_CREATION_LIMIT = 5000;\n uint256 public constant GEN0_CREATION_LIMIT = 45000;\n\n // Constants for gen0 auctions.\n uint256 public constant GEN0_STARTING_PRICE = 10 finney;\n uint256 public constant GEN0_AUCTION_DURATION = 1 days;\n\n // Counts the number of cats the contract owner has created.\n uint256 public promoCreatedCount;\n uint256 public gen0CreatedCount;\n\n /// @dev we can create promo kittens, up to a limit. Only callable by COO\n /// @param _genes the encoded genes of the kitten to be created, any value is accepted\n /// @param _owner the future owner of the created kittens. Default to contract COO\n function createPromoKitty(uint256 _genes, address _owner) external onlyCOO {\n address kittyOwner = _owner;\n if (kittyOwner == address(0)) {\n kittyOwner = cooAddress;\n }\n require(promoCreatedCount < PROMO_CREATION_LIMIT);\n\n promoCreatedCount++;\n _createKitty(0, 0, 0, _genes, kittyOwner);\n }\n\n /// @dev Creates a new gen0 kitty with the given genes and\n /// creates an auction for it.\n function createGen0Auction(uint256 _genes) external onlyCOO {\n require(gen0CreatedCount < GEN0_CREATION_LIMIT);\n\n uint256 kittyId = _createKitty(0, 0, 0, _genes, address(this));\n _approve(kittyId, saleAuction);\n\n saleAuction.createAuction(\n kittyId,\n _computeNextGen0Price(),\n 0,\n GEN0_AUCTION_DURATION,\n address(this)\n );\n\n gen0CreatedCount++;\n }\n\n /// @dev Computes the next gen0 auction starting price, given\n /// the average of the past 5 prices + 50%.\n function _computeNextGen0Price() internal view returns (uint256) {\n uint256 avePrice = saleAuction.averageGen0SalePrice();\n\n // Sanity check to ensure we don't overflow arithmetic\n require(avePrice == uint256(uint128(avePrice)));\n\n uint256 nextPrice = avePrice + (avePrice / 2);\n\n // We never auction for less than starting price\n if (nextPrice < GEN0_STARTING_PRICE) {\n nextPrice = GEN0_STARTING_PRICE;\n }\n\n return nextPrice;\n }\n}\n\n\n/// @title CryptoKitties: Collectible, breedable, and oh-so-adorable cats on the Ethereum blockchain.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev The main CryptoKitties contract, keeps track of kittens so they don't wander around and get lost.\ncontract KittyCore is KittyMinting {\n\n // This is the main CryptoKitties contract. In order to keep our code seperated into logical sections,\n // we've broken it up in two ways. First, we have several seperately-instantiated sibling contracts\n // that handle auctions and our super-top-secret genetic combination algorithm. The auctions are\n // seperate since their logic is somewhat complex and there's always a risk of subtle bugs. By keeping\n // them in their own contracts, we can upgrade them without disrupting the main contract that tracks\n // kitty ownership. The genetic combination algorithm is kept seperate so we can open-source all of\n // the rest of our code without making it _too_ easy for folks to figure out how the genetics work.\n // Don't worry, I'm sure someone will reverse engineer it soon enough!\n //\n // Secondly, we break the core contract into multiple files using inheritence, one for each major\n // facet of functionality of CK. This allows us to keep related code bundled together while still\n // avoiding a single giant file with everything in it. The breakdown is as follows:\n //\n // - KittyBase: This is where we define the most fundamental code shared throughout the core\n // functionality. This includes our main data storage, constants and data types, plus\n // internal functions for managing these items.\n //\n // - KittyAccessControl: This contract manages the various addresses and constraints for operations\n // that can be executed only by specific roles. Namely CEO, CFO and COO.\n //\n // - KittyOwnership: This provides the methods required for basic non-fungible token\n // transactions, following the draft ERC-721 spec (https://github.com/ethereum/EIPs/issues/721).\n //\n // - KittyBreeding: This file contains the methods necessary to breed cats together, including\n // keeping track of siring offers, and relies on an external genetic combination contract.\n //\n // - KittyAuctions: Here we have the public methods for auctioning or bidding on cats or siring\n // services. The actual auction functionality is handled in two sibling contracts (one\n // for sales and one for siring), while auction creation and bidding is mostly mediated\n // through this facet of the core contract.\n //\n // - KittyMinting: This final facet contains the functionality we use for creating new gen0 cats.\n // We can make up to 5000 \"promo\" cats that can be given away (especially important when\n // the community is new), and all others can only be created and then immediately put up\n // for auction via an algorithmically determined starting price. Regardless of how they\n // are created, there is a hard limit of 50k gen0 cats. After that, it's all up to the\n // community to breed, breed, breed!\n\n // Set in case the core contract is broken and an upgrade is required\n address public newContractAddress;\n\n /// @notice Creates the main CryptoKitties smart contract instance.\n function KittyCore() public {\n // Starts paused.\n paused = true;\n\n // the creator of the contract is the initial CEO\n ceoAddress = msg.sender;\n\n // the creator of the contract is also the initial COO\n cooAddress = msg.sender;\n\n // start with the mythical kitten 0 - so we don't have generation-0 parent issues\n _createKitty(0, 0, 0, uint256(-1), address(0));\n }\n\n /// @dev Used to mark the smart contract as upgraded, in case there is a serious\n /// breaking bug. This method does nothing but keep track of the new contract and\n /// emit a message indicating that the new address is set. It's up to clients of this\n /// contract to update to the new contract address in that case. (This contract will\n /// be paused indefinitely if such an upgrade takes place.)\n /// @param _v2Address new address\n function setNewAddress(address _v2Address) external onlyCEO whenPaused {\n // See README.md for updgrade plan\n newContractAddress = _v2Address;\n ContractUpgrade(_v2Address);\n }\n\n /// @notice No tipping!\n /// @dev Reject all Ether from being sent here, unless it's from one of the\n /// two auction contracts. (Hopefully, we can prevent user accidents.)\n function() external payable {\n require(\n msg.sender == address(saleAuction) ||\n msg.sender == address(siringAuction)\n );\n }\n\n /// @notice Returns all the relevant information about a specific kitty.\n /// @param _id The ID of the kitty of interest.\n function getKitty(uint256 _id)\n external\n view\n returns (\n bool isGestating,\n bool isReady,\n uint256 cooldownIndex,\n uint256 nextActionAt,\n uint256 siringWithId,\n uint256 birthTime,\n uint256 matronId,\n uint256 sireId,\n uint256 generation,\n uint256 genes\n ) {\n Kitty storage kit = kitties[_id];\n\n // if this variable is 0 then it's not gestating\n isGestating = (kit.siringWithId != 0);\n isReady = (kit.cooldownEndBlock <= block.number);\n cooldownIndex = uint256(kit.cooldownIndex);\n nextActionAt = uint256(kit.cooldownEndBlock);\n siringWithId = uint256(kit.siringWithId);\n birthTime = uint256(kit.birthTime);\n matronId = uint256(kit.matronId);\n sireId = uint256(kit.sireId);\n generation = uint256(kit.generation);\n genes = kit.genes;\n }\n\n /// @dev Override unpause so it requires all external contract addresses\n /// to be set before contract can be unpaused. Also, we can't have\n /// newContractAddress set either, because then the contract was upgraded.\n /// @notice This is public rather than external so we can call super.unpause\n /// without using an expensive CALL.\n function unpause() public onlyCEO whenPaused {\n require(saleAuction != address(0));\n require(siringAuction != address(0));\n require(geneScience != address(0));\n require(newContractAddress == address(0));\n\n // Actually unpause the contract.\n super.unpause();\n }\n\n // @dev Allows the CFO to capture the balance available to the contract.\n function withdrawBalance() external onlyCFO {\n uint256 balance = this.balance;\n // Subtract all the currently pregnant kittens we have, plus 1 of margin.\n uint256 subtractFees = (pregnantKitties + 1) * autoBirthFee;\n\n if (balance > subtractFees) {\n cfoAddress.send(balance - subtractFees);\n }\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "exportedSymbols": { "ClockAuction": [ 8872 @@ -51724,5 +51724,5 @@ }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:47.731Z" + "updatedAt": "2018-10-09T17:45:35.995Z" } \ No newline at end of file diff --git a/artifacts/json/KittyAccessControl.json b/artifacts/json/KittyAccessControl.json index c1342667..8fb69f5f 100644 --- a/artifacts/json/KittyAccessControl.json +++ b/artifacts/json/KittyAccessControl.json @@ -130,15 +130,15 @@ "type": "event" } ], - "bytecode": "0x60606040526000600260146101000a81548160ff021916908315150217905550341561002a57600080fd5b6107b6806100396000396000f300606060405260043610610099576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630519ce791461009e5780630a0f8168146100f357806327d7874c146101485780632ba73c15146101815780633f4ba83a146101ba5780634e0a3379146101cf5780635c975abb146102085780638456cb5914610235578063b047fb501461024a575b600080fd5b34156100a957600080fd5b6100b161029f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156100fe57600080fd5b6101066102c5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015357600080fd5b61017f600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506102ea565b005b341561018c57600080fd5b6101b8600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506103c4565b005b34156101c557600080fd5b6101cd61049f565b005b34156101da57600080fd5b610206600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610532565b005b341561021357600080fd5b61021b61060d565b604051808215151515815260200191505060405180910390f35b341561024057600080fd5b610248610620565b005b341561025557600080fd5b61025d610764565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561034557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561038157600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561041f57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561045b57600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156104fa57600080fd5b600260149054906101000a900460ff16151561051557600080fd5b6000600260146101000a81548160ff021916908315150217905550565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561058d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156105c957600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260149054906101000a900460ff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806106c857506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806107205750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561072b57600080fd5b600260149054906101000a900460ff1615151561074757600080fd5b6001600260146101000a81548160ff021916908315150217905550565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16815600a165627a7a72305820cd4133fc2e0889f8acb53d4100ca4f2479c52e9d83148866e1ffd448d30010210029", - "deployedBytecode": "0x606060405260043610610099576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630519ce791461009e5780630a0f8168146100f357806327d7874c146101485780632ba73c15146101815780633f4ba83a146101ba5780634e0a3379146101cf5780635c975abb146102085780638456cb5914610235578063b047fb501461024a575b600080fd5b34156100a957600080fd5b6100b161029f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156100fe57600080fd5b6101066102c5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015357600080fd5b61017f600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506102ea565b005b341561018c57600080fd5b6101b8600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506103c4565b005b34156101c557600080fd5b6101cd61049f565b005b34156101da57600080fd5b610206600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610532565b005b341561021357600080fd5b61021b61060d565b604051808215151515815260200191505060405180910390f35b341561024057600080fd5b610248610620565b005b341561025557600080fd5b61025d610764565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561034557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561038157600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561041f57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561045b57600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156104fa57600080fd5b600260149054906101000a900460ff16151561051557600080fd5b6000600260146101000a81548160ff021916908315150217905550565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561058d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156105c957600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260149054906101000a900460ff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806106c857506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806107205750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561072b57600080fd5b600260149054906101000a900460ff1615151561074757600080fd5b6001600260146101000a81548160ff021916908315150217905550565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16815600a165627a7a72305820cd4133fc2e0889f8acb53d4100ca4f2479c52e9d83148866e1ffd448d30010210029", + "bytecode": "0x60606040526000600260146101000a81548160ff021916908315150217905550341561002a57600080fd5b6107b6806100396000396000f300606060405260043610610099576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630519ce791461009e5780630a0f8168146100f357806327d7874c146101485780632ba73c15146101815780633f4ba83a146101ba5780634e0a3379146101cf5780635c975abb146102085780638456cb5914610235578063b047fb501461024a575b600080fd5b34156100a957600080fd5b6100b161029f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156100fe57600080fd5b6101066102c5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015357600080fd5b61017f600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506102ea565b005b341561018c57600080fd5b6101b8600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506103c4565b005b34156101c557600080fd5b6101cd61049f565b005b34156101da57600080fd5b610206600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610532565b005b341561021357600080fd5b61021b61060d565b604051808215151515815260200191505060405180910390f35b341561024057600080fd5b610248610620565b005b341561025557600080fd5b61025d610764565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561034557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561038157600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561041f57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561045b57600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156104fa57600080fd5b600260149054906101000a900460ff16151561051557600080fd5b6000600260146101000a81548160ff021916908315150217905550565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561058d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156105c957600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260149054906101000a900460ff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806106c857506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806107205750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561072b57600080fd5b600260149054906101000a900460ff1615151561074757600080fd5b6001600260146101000a81548160ff021916908315150217905550565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16815600a165627a7a72305820a078f20abeb0a31e679849f8b744548ecc45258ebe780cb120ef7af5de7874610029", + "deployedBytecode": "0x606060405260043610610099576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630519ce791461009e5780630a0f8168146100f357806327d7874c146101485780632ba73c15146101815780633f4ba83a146101ba5780634e0a3379146101cf5780635c975abb146102085780638456cb5914610235578063b047fb501461024a575b600080fd5b34156100a957600080fd5b6100b161029f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156100fe57600080fd5b6101066102c5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015357600080fd5b61017f600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506102ea565b005b341561018c57600080fd5b6101b8600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506103c4565b005b34156101c557600080fd5b6101cd61049f565b005b34156101da57600080fd5b610206600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610532565b005b341561021357600080fd5b61021b61060d565b604051808215151515815260200191505060405180910390f35b341561024057600080fd5b610248610620565b005b341561025557600080fd5b61025d610764565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561034557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561038157600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561041f57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561045b57600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156104fa57600080fd5b600260149054906101000a900460ff16151561051557600080fd5b6000600260146101000a81548160ff021916908315150217905550565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561058d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156105c957600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260149054906101000a900460ff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806106c857506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806107205750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561072b57600080fd5b600260149054906101000a900460ff1615151561074757600080fd5b6001600260146101000a81548160ff021916908315150217905550565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16815600a165627a7a72305820a078f20abeb0a31e679849f8b744548ecc45258ebe780cb120ef7af5de7874610029", "sourceMap": "3422:4065:18:-;;;5032:5;5011:26;;;;;;;;;;;;;;;;;;;;3422:4065;;;;;;;;;;;;;;", "deployedSourceMap": "3422:4065:18:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4848:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4817;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5800:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;6346;;;;;;;;;;;;;;;;;;;;;;;;;;;;7359:126;;;;;;;;;;;;;;6073:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;5011:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6990:81;;;;;;;;;;;;;;4879:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4848;;;;;;;;;;;;;:::o;4817:::-;;;;;;;;;;;;;:::o;5800:128::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;5887:1;5868:21;;:7;:21;;;;5860:30;;;;;;;;5914:7;5901:10;;:20;;;;;;;;;;;;;;;;;;5800:128;:::o;6346:::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;6433:1;6414:21;;:7;:21;;;;6406:30;;;;;;;;6460:7;6447:10;;:20;;;;;;;;;;;;;;;;;;6346:128;:::o;7359:126::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;6812:6;;;;;;;;;;;6804:15;;;;;;;;7473:5;7464:6;;:14;;;;;;;;;;;;;;;;;;7359:126::o;6073:128::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;6160:1;6141:21;;:7;:21;;;;6133:30;;;;;;;;6187:7;6174:10;;:20;;;;;;;;;;;;;;;;;;6073:128;:::o;5011:26::-;;;;;;;;;;;;;:::o;6990:81::-;5537:10;;;;;;;;;;;5523:24;;:10;:24;;;:64;;;;5577:10;;;;;;;;;;;5563:24;;:10;:24;;;5523:64;:104;;;;5617:10;;;;;;;;;;;5603:24;;:10;:24;;;5523:104;5502:135;;;;;;;;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;7060:4;7051:6;;:13;;;;;;;;;;;;;;;;;;6990:81::o;4879:25::-;;;;;;;;;;;;;:::o", "source": "pragma solidity 0.4.18;\n\n/**\n The following contract code, titled KittyCore, was written by Cryptokitties and published\n and retrieved from https://etherscan.io/address/0x06012c8cf97bead5deae237070f9587f8e7a266d#code.\n\n It is included in the current project for test purposes, to ensure that our collateralizer can\n handle ERC721 tokens created by the KittyCore contract.\n*/\n\n/**\n * @title KittiesOwnable\n * @dev The KittiesOwnable contract has an owner address, and provides basic authorization control\n * functions, this simplifies the implementation of \"user permissions\".\n */\ncontract KittiesOwnable {\n address public owner;\n\n\n /**\n\t * @dev The KittiesOwnable constructor sets the original `owner` of the contract to the sender\n\t * account.\n\t */\n function KittiesOwnable() {\n owner = msg.sender;\n }\n\n\n /**\n\t * @dev Throws if called by any account other than the owner.\n\t */\n modifier onlyOwner() {\n require(msg.sender == owner);\n _;\n }\n\n\n /**\n\t * @dev Allows the current owner to transfer control of the contract to a newOwner.\n\t * @param newOwner The address to transfer ownership to.\n\t */\n function transferOwnership(address newOwner) onlyOwner {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n\n}\n\n\n\n/// @title Interface for contracts conforming to ERC-721: Non-Fungible Tokens\n/// @author Dieter Shirley (https://github.com/dete)\ncontract KittiesERC721 {\n // Required methods\n function totalSupply() public view returns (uint256 total);\n function balanceOf(address _owner) public view returns (uint256 balance);\n function ownerOf(uint256 _tokenId) external view returns (address owner);\n function approve(address _to, uint256 _tokenId) external;\n function transfer(address _to, uint256 _tokenId) external;\n function transferFrom(address _from, address _to, uint256 _tokenId) external;\n\n // Events\n event Transfer(address from, address to, uint256 tokenId);\n event Approval(address owner, address approved, uint256 tokenId);\n\n // Optional\n // function name() public view returns (string name);\n // function symbol() public view returns (string symbol);\n // function tokensOfOwner(address _owner) external view returns (uint256[] tokenIds);\n // function tokenMetadata(uint256 _tokenId, string _preferredTransport) public view returns (string infoUrl);\n\n // ERC-165 Compatibility (https://github.com/ethereum/EIPs/issues/165)\n function supportsInterface(bytes4 _interfaceID) external view returns (bool);\n}\n\n\n// // Auction wrapper functions\n\n\n// Auction wrapper functions\n\n\n\n\n\n\n\n/// @title SEKRETOOOO\ncontract GeneScienceInterface {\n /// @dev simply a boolean to indicate this is the contract we expect to be\n function isGeneScience() public pure returns (bool);\n\n /// @dev given genes of kitten 1 & 2, return a genetic combination - may have a random factor\n /// @param genes1 genes of mom\n /// @param genes2 genes of sire\n /// @return the genes that are supposed to be passed down the child\n function mixGenes(uint256 genes1, uint256 genes2, uint256 targetBlock) public returns (uint256);\n}\n\n\n\n\n\n\n\n/// @title A facet of KittyCore that manages special access privileges.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyAccessControl {\n // This facet controls access control for CryptoKitties. There are four roles managed here:\n //\n // - The CEO: The CEO can reassign other roles and change the addresses of our dependent smart\n // contracts. It is also the only role that can unpause the smart contract. It is initially\n // set to the address that created the smart contract in the KittyCore constructor.\n //\n // - The CFO: The CFO can withdraw funds from KittyCore and its auction contracts.\n //\n // - The COO: The COO can release gen0 kitties to auction, and mint promo cats.\n //\n // It should be noted that these roles are distinct without overlap in their access abilities, the\n // abilities listed for each role above are exhaustive. In particular, while the CEO can assign any\n // address to any role, the CEO address itself doesn't have the ability to act in those roles. This\n // restriction is intentional so that we aren't tempted to use the CEO address frequently out of\n // convenience. The less we use an address, the less likely it is that we somehow compromise the\n // account.\n\n /// @dev Emited when contract is upgraded - See README.md for updgrade plan\n event ContractUpgrade(address newContract);\n\n // The addresses of the accounts (or contracts) that can execute actions within each roles.\n address public ceoAddress;\n address public cfoAddress;\n address public cooAddress;\n\n // @dev Keeps track whether the contract is paused. When that is true, most actions are blocked\n bool public paused = false;\n\n /// @dev Access modifier for CEO-only functionality\n modifier onlyCEO() {\n require(msg.sender == ceoAddress);\n _;\n }\n\n /// @dev Access modifier for CFO-only functionality\n modifier onlyCFO() {\n require(msg.sender == cfoAddress);\n _;\n }\n\n /// @dev Access modifier for COO-only functionality\n modifier onlyCOO() {\n require(msg.sender == cooAddress);\n _;\n }\n\n modifier onlyCLevel() {\n require(\n msg.sender == cooAddress ||\n msg.sender == ceoAddress ||\n msg.sender == cfoAddress\n );\n _;\n }\n\n /// @dev Assigns a new address to act as the CEO. Only available to the current CEO.\n /// @param _newCEO The address of the new CEO\n function setCEO(address _newCEO) external onlyCEO {\n require(_newCEO != address(0));\n\n ceoAddress = _newCEO;\n }\n\n /// @dev Assigns a new address to act as the CFO. Only available to the current CEO.\n /// @param _newCFO The address of the new CFO\n function setCFO(address _newCFO) external onlyCEO {\n require(_newCFO != address(0));\n\n cfoAddress = _newCFO;\n }\n\n /// @dev Assigns a new address to act as the COO. Only available to the current CEO.\n /// @param _newCOO The address of the new COO\n function setCOO(address _newCOO) external onlyCEO {\n require(_newCOO != address(0));\n\n cooAddress = _newCOO;\n }\n\n /*** KittiesPausable functionality adapted from OpenZeppelin ***/\n\n /// @dev Modifier to allow actions only when the contract IS NOT paused\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /// @dev Modifier to allow actions only when the contract IS paused\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /// @dev Called by any \"C-level\" role to pause the contract. Used only when\n /// a bug or exploit is detected and we need to limit damage.\n function pause() external onlyCLevel whenNotPaused {\n paused = true;\n }\n\n /// @dev Unpauses the smart contract. Can only be called by the CEO, since\n /// one reason we may pause the contract is when CFO or COO accounts are\n /// compromised.\n /// @notice This is public rather than external so it can be called by\n /// derived contracts.\n function unpause() public onlyCEO whenPaused {\n // can't unpause if contract was upgraded\n paused = false;\n }\n}\n\n\n\n\n/// @title Base contract for CryptoKitties. Holds all common structs, events and base variables.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBase is KittyAccessControl {\n /*** EVENTS ***/\n\n /// @dev The Birth event is fired whenever a new kitten comes into existence. This obviously\n /// includes any time a cat is created through the giveBirth method, but it is also called\n /// when a new gen0 cat is created.\n event Birth(address owner, uint256 kittyId, uint256 matronId, uint256 sireId, uint256 genes);\n\n /// @dev Transfer event as defined in current draft of ERC721. Emitted every time a kitten\n /// ownership is assigned, including births.\n event Transfer(address from, address to, uint256 tokenId);\n\n /*** DATA TYPES ***/\n\n /// @dev The main Kitty struct. Every cat in CryptoKitties is represented by a copy\n /// of this structure, so great care was taken to ensure that it fits neatly into\n /// exactly two 256-bit words. Note that the order of the members in this structure\n /// is important because of the byte-packing rules used by Ethereum.\n /// Ref: http://solidity.readthedocs.io/en/develop/miscellaneous.html\n struct Kitty {\n // The Kitty's genetic code is packed into these 256-bits, the format is\n // sooper-sekret! A cat's genes never change.\n uint256 genes;\n\n // The timestamp from the block when this cat came into existence.\n uint64 birthTime;\n\n // The minimum timestamp after which this cat can engage in breeding\n // activities again. This same timestamp is used for the pregnancy\n // timer (for matrons) as well as the siring cooldown.\n uint64 cooldownEndBlock;\n\n // The ID of the parents of this kitty, set to 0 for gen0 cats.\n // Note that using 32-bit unsigned integers limits us to a \"mere\"\n // 4 billion cats. This number might seem small until you realize\n // that Ethereum currently has a limit of about 500 million\n // transactions per year! So, this definitely won't be a problem\n // for several years (even as Ethereum learns to scale).\n uint32 matronId;\n uint32 sireId;\n\n // Set to the ID of the sire cat for matrons that are pregnant,\n // zero otherwise. A non-zero value here is how we know a cat\n // is pregnant. Used to retrieve the genetic material for the new\n // kitten when the birth transpires.\n uint32 siringWithId;\n\n // Set to the index in the cooldown array (see below) that represents\n // the current cooldown duration for this Kitty. This starts at zero\n // for gen0 cats, and is initialized to floor(generation/2) for others.\n // Incremented by one for each successful breeding action, regardless\n // of whether this cat is acting as matron or sire.\n uint16 cooldownIndex;\n\n // The \"generation number\" of this cat. Cats minted by the CK contract\n // for sale are called \"gen0\" and have a generation number of 0. The\n // generation number of all other cats is the larger of the two generation\n // numbers of their parents, plus one.\n // (i.e. max(matron.generation, sire.generation) + 1)\n uint16 generation;\n }\n\n /*** CONSTANTS ***/\n\n /// @dev A lookup table indicating the cooldown duration after any successful\n /// breeding action, called \"pregnancy time\" for matrons and \"siring cooldown\"\n /// for sires. Designed such that the cooldown roughly doubles each time a cat\n /// is bred, encouraging owners not to just keep breeding the same cat over\n /// and over again. Caps out at one week (a cat can breed an unbounded number\n /// of times, and the maximum cooldown is always seven days).\n uint32[14] public cooldowns = [\n uint32(1 minutes),\n uint32(2 minutes),\n uint32(5 minutes),\n uint32(10 minutes),\n uint32(30 minutes),\n uint32(1 hours),\n uint32(2 hours),\n uint32(4 hours),\n uint32(8 hours),\n uint32(16 hours),\n uint32(1 days),\n uint32(2 days),\n uint32(4 days),\n uint32(7 days)\n ];\n\n // An approximation of currently how many seconds are in between blocks.\n uint256 public secondsPerBlock = 15;\n\n /*** STORAGE ***/\n\n /// @dev An array containing the Kitty struct for all Kitties in existence. The ID\n /// of each cat is actually an index into this array. Note that ID 0 is a negacat,\n /// the unKitty, the mythical beast that is the parent of all gen0 cats. A bizarre\n /// creature that is both matron and sire... to itself! Has an invalid genetic code.\n /// In other words, cat ID 0 is invalid... ;-)\n Kitty[] kitties;\n\n /// @dev A mapping from cat IDs to the address that owns them. All cats have\n /// some valid owner address, even gen0 cats are created with a non-zero owner.\n mapping (uint256 => address) public kittyIndexToOwner;\n\n // @dev A mapping from owner address to count of tokens that address owns.\n // Used internally inside balanceOf() to resolve ownership count.\n mapping (address => uint256) ownershipTokenCount;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to call\n /// transferFrom(). Each Kitty can only have one approved address for transfer\n /// at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public kittyIndexToApproved;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to use\n /// this Kitty for siring via breedWith(). Each Kitty can only have one approved\n /// address for siring at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public sireAllowedToAddress;\n\n /// @dev The address of the ClockAuction contract that handles sales of Kitties. This\n /// same contract handles both peer-to-peer sales as well as the gen0 sales which are\n /// initiated every 15 minutes.\n SaleClockAuction public saleAuction;\n\n /// @dev The address of a custom ClockAuction subclassed contract that handles siring\n /// auctions. Needs to be separate from saleAuction because the actions taken on success\n /// after a sales and siring auction are quite different.\n SiringClockAuction public siringAuction;\n\n /// @dev Assigns ownership of a specific Kitty to an address.\n function _transfer(address _from, address _to, uint256 _tokenId) internal {\n // Since the number of kittens is capped to 2^32 we can't overflow this\n ownershipTokenCount[_to]++;\n // transfer ownership\n kittyIndexToOwner[_tokenId] = _to;\n // When creating new kittens _from is 0x0, but we can't account that address.\n if (_from != address(0)) {\n ownershipTokenCount[_from]--;\n // once the kitten is transferred also clear sire allowances\n delete sireAllowedToAddress[_tokenId];\n // clear any previously approved ownership exchange\n delete kittyIndexToApproved[_tokenId];\n }\n // Emit the transfer event.\n Transfer(_from, _to, _tokenId);\n }\n\n /// @dev An internal method that creates a new kitty and stores it. This\n /// method doesn't do any checking and should only be called when the\n /// input data is known to be valid. Will generate both a Birth event\n /// and a Transfer event.\n /// @param _matronId The kitty ID of the matron of this cat (zero for gen0)\n /// @param _sireId The kitty ID of the sire of this cat (zero for gen0)\n /// @param _generation The generation number of this cat, must be computed by caller.\n /// @param _genes The kitty's genetic code.\n /// @param _owner The inital owner of this cat, must be non-zero (except for the unKitty, ID 0)\n function _createKitty(\n uint256 _matronId,\n uint256 _sireId,\n uint256 _generation,\n uint256 _genes,\n address _owner\n )\n internal\n returns (uint)\n {\n // These requires are not strictly necessary, our calling code should make\n // sure that these conditions are never broken. However! _createKitty() is already\n // an expensive call (for storage), and it doesn't hurt to be especially careful\n // to ensure our data structures are always valid.\n require(_matronId == uint256(uint32(_matronId)));\n require(_sireId == uint256(uint32(_sireId)));\n require(_generation == uint256(uint16(_generation)));\n\n // New kitty starts with the same cooldown as parent gen/2\n uint16 cooldownIndex = uint16(_generation / 2);\n if (cooldownIndex > 13) {\n cooldownIndex = 13;\n }\n\n Kitty memory _kitty = Kitty({\n genes: _genes,\n birthTime: uint64(now),\n cooldownEndBlock: 0,\n matronId: uint32(_matronId),\n sireId: uint32(_sireId),\n siringWithId: 0,\n cooldownIndex: cooldownIndex,\n generation: uint16(_generation)\n });\n uint256 newKittenId = kitties.push(_kitty) - 1;\n\n // It's probably never going to happen, 4 billion cats is A LOT, but\n // let's just be 100% sure we never let this happen.\n require(newKittenId == uint256(uint32(newKittenId)));\n\n // emit the birth event\n Birth(\n _owner,\n newKittenId,\n uint256(_kitty.matronId),\n uint256(_kitty.sireId),\n _kitty.genes\n );\n\n // This will assign ownership, and also emit the Transfer event as\n // per ERC721 draft\n _transfer(0, _owner, newKittenId);\n\n return newKittenId;\n }\n\n // Any C-level can fix how many seconds per blocks are currently observed.\n function setSecondsPerBlock(uint256 secs) external onlyCLevel {\n require(secs < cooldowns[0]);\n secondsPerBlock = secs;\n }\n}\n\n\n\n\n\n/// @title The external contract that is responsible for generating metadata for the kitties,\n/// it has one function that will return the data as bytes.\ncontract KittiesERC721Metadata {\n /// @dev Given a token Id, returns a byte array that is supposed to be converted into string.\n function getMetadata(uint256 _tokenId, string) public view returns (bytes32[4] buffer, uint256 count) {\n if (_tokenId == 1) {\n buffer[0] = \"Hello World! :D\";\n count = 15;\n } else if (_tokenId == 2) {\n buffer[0] = \"I would definitely choose a medi\";\n buffer[1] = \"um length string.\";\n count = 49;\n } else if (_tokenId == 3) {\n buffer[0] = \"Lorem ipsum dolor sit amet, mi e\";\n buffer[1] = \"st accumsan dapibus augue lorem,\";\n buffer[2] = \" tristique vestibulum id, libero\";\n buffer[3] = \" suscipit varius sapien aliquam.\";\n count = 128;\n }\n }\n}\n\n\n/// @title The facet of the CryptoKitties core contract that manages ownership, ERC-721 (draft) compliant.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev Ref: https://github.com/ethereum/EIPs/issues/721\n/// See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyOwnership is KittyBase, KittiesERC721 {\n\n /// @notice Name and symbol of the non fungible token, as defined in ERC721.\n string public constant name = \"CryptoKitties\";\n string public constant symbol = \"CK\";\n\n // The contract that will return kitty metadata\n KittiesERC721Metadata public erc721Metadata;\n\n bytes4 constant InterfaceSignature_ERC165 =\n bytes4(keccak256('supportsInterface(bytes4)'));\n\n bytes4 constant InterfaceSignature_ERC721 =\n bytes4(keccak256('name()')) ^\n bytes4(keccak256('symbol()')) ^\n bytes4(keccak256('totalSupply()')) ^\n bytes4(keccak256('balanceOf(address)')) ^\n bytes4(keccak256('ownerOf(uint256)')) ^\n bytes4(keccak256('approve(address,uint256)')) ^\n bytes4(keccak256('transfer(address,uint256)')) ^\n bytes4(keccak256('transferFrom(address,address,uint256)')) ^\n bytes4(keccak256('tokensOfOwner(address)')) ^\n bytes4(keccak256('tokenMetadata(uint256,string)'));\n\n /// @notice Introspection interface as per ERC-165 (https://github.com/ethereum/EIPs/issues/165).\n /// Returns true for any standardized interfaces implemented by this contract. We implement\n /// ERC-165 (obviously!) and ERC-721.\n function supportsInterface(bytes4 _interfaceID) external view returns (bool)\n {\n // DEBUG ONLY\n //require((InterfaceSignature_ERC165 == 0x01ffc9a7) && (InterfaceSignature_ERC721 == 0x9a20483d));\n\n return ((_interfaceID == InterfaceSignature_ERC165) || (_interfaceID == InterfaceSignature_ERC721));\n }\n\n /// @dev Set the address of the sibling contract that tracks metadata.\n /// CEO only.\n function setMetadataAddress(address _contractAddress) public onlyCEO {\n erc721Metadata = KittiesERC721Metadata(_contractAddress);\n }\n\n // Internal utility functions: These functions all assume that their input arguments\n // are valid. We leave it to public methods to sanitize their inputs and follow\n // the required logic.\n\n /// @dev Checks if a given address is the current owner of a particular Kitty.\n /// @param _claimant the address we are validating against.\n /// @param _tokenId kitten id, only valid when > 0\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToOwner[_tokenId] == _claimant;\n }\n\n /// @dev Checks if a given address currently has transferApproval for a particular Kitty.\n /// @param _claimant the address we are confirming kitten is approved for.\n /// @param _tokenId kitten id, only valid when > 0\n function _approvedFor(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToApproved[_tokenId] == _claimant;\n }\n\n /// @dev Marks an address as being approved for transferFrom(), overwriting any previous\n /// approval. Setting _approved to address(0) clears all transfer approval.\n /// NOTE: _approve() does NOT send the Approval event. This is intentional because\n /// _approve() and transferFrom() are used together for putting Kitties on auction, and\n /// there is no value in spamming the log with Approval events in that case.\n function _approve(uint256 _tokenId, address _approved) internal {\n kittyIndexToApproved[_tokenId] = _approved;\n }\n\n /// @notice Returns the number of Kitties owned by a specific address.\n /// @param _owner The owner address to check.\n /// @dev Required for ERC-721 compliance\n function balanceOf(address _owner) public view returns (uint256 count) {\n return ownershipTokenCount[_owner];\n }\n\n /// @notice Transfers a Kitty to another address. If transferring to a smart\n /// contract be VERY CAREFUL to ensure that it is aware of ERC-721 (or\n /// CryptoKitties specifically) or your Kitty may be lost forever. Seriously.\n /// @param _to The address of the recipient, can be a user or contract.\n /// @param _tokenId The ID of the Kitty to transfer.\n /// @dev Required for ERC-721 compliance.\n function transfer(\n address _to,\n uint256 _tokenId\n )\n external\n whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Disallow transfers to the auction contracts to prevent accidental\n // misuse. Auction contracts should only take ownership of kitties\n // through the allow + transferFrom flow.\n require(_to != address(saleAuction));\n require(_to != address(siringAuction));\n\n // You can only send your own cat.\n require(_owns(msg.sender, _tokenId));\n\n // Reassign ownership, clear pending approvals, emit Transfer event.\n _transfer(msg.sender, _to, _tokenId);\n }\n\n /// @notice Grant another address the right to transfer a specific Kitty via\n /// transferFrom(). This is the preferred flow for transfering NFTs to contracts.\n /// @param _to The address to be granted transfer approval. Pass address(0) to\n /// clear all approvals.\n /// @param _tokenId The ID of the Kitty that can be transferred if this call succeeds.\n /// @dev Required for ERC-721 compliance.\n function approve(\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Only an owner can grant transfer approval.\n require(_owns(msg.sender, _tokenId));\n\n // Register the approval (replacing any previous approval).\n _approve(_tokenId, _to);\n\n // Emit approval event.\n Approval(msg.sender, _to, _tokenId);\n }\n\n /// @notice Transfer a Kitty owned by another address, for which the calling address\n /// has previously been granted transfer approval by the owner.\n /// @param _from The address that owns the Kitty to be transfered.\n /// @param _to The address that should take ownership of the Kitty. Can be any address,\n /// including the caller.\n /// @param _tokenId The ID of the Kitty to be transferred.\n /// @dev Required for ERC-721 compliance.\n function transferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Check for approval and valid ownership\n require(_approvedFor(msg.sender, _tokenId));\n require(_owns(_from, _tokenId));\n\n // Reassign ownership (also clears pending approvals and emits Transfer event).\n _transfer(_from, _to, _tokenId);\n }\n\n /// @notice Returns the total number of Kitties currently in existence.\n /// @dev Required for ERC-721 compliance.\n function totalSupply() public view returns (uint) {\n return kitties.length - 1;\n }\n\n /// @notice Returns the address currently assigned ownership of a given Kitty.\n /// @dev Required for ERC-721 compliance.\n function ownerOf(uint256 _tokenId)\n external\n view\n returns (address owner)\n {\n owner = kittyIndexToOwner[_tokenId];\n\n require(owner != address(0));\n }\n\n /// @notice Returns a list of all Kitty IDs assigned to an address.\n /// @param _owner The owner whose Kitties we are interested in.\n /// @dev This method MUST NEVER be called by smart contract code. First, it's fairly\n /// expensive (it walks the entire Kitty array looking for cats belonging to owner),\n /// but it also returns a dynamic array, which is only supported for web3 calls, and\n /// not contract-to-contract calls.\n function tokensOfOwner(address _owner) external view returns(uint256[] ownerTokens) {\n uint256 tokenCount = balanceOf(_owner);\n\n if (tokenCount == 0) {\n // Return an empty array\n return new uint256[](0);\n } else {\n uint256[] memory result = new uint256[](tokenCount);\n uint256 totalCats = totalSupply();\n uint256 resultIndex = 0;\n\n // We count on the fact that all cats have IDs starting at 1 and increasing\n // sequentially up to the totalCat count.\n uint256 catId;\n\n for (catId = 1; catId <= totalCats; catId++) {\n if (kittyIndexToOwner[catId] == _owner) {\n result[resultIndex] = catId;\n resultIndex++;\n }\n }\n\n return result;\n }\n }\n\n /// @dev Adapted from memcpy() by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _memcpy(uint _dest, uint _src, uint _len) private view {\n // Copy word-length chunks while possible\n for(; _len >= 32; _len -= 32) {\n assembly {\n mstore(_dest, mload(_src))\n }\n _dest += 32;\n _src += 32;\n }\n\n // Copy remaining bytes\n uint256 mask = 256 ** (32 - _len) - 1;\n assembly {\n let srcpart := and(mload(_src), not(mask))\n let destpart := and(mload(_dest), mask)\n mstore(_dest, or(destpart, srcpart))\n }\n }\n\n /// @dev Adapted from toString(slice) by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _toString(bytes32[4] _rawBytes, uint256 _stringLength) private view returns (string) {\n var outputString = new string(_stringLength);\n uint256 outputPtr;\n uint256 bytesPtr;\n\n assembly {\n outputPtr := add(outputString, 32)\n bytesPtr := _rawBytes\n }\n\n _memcpy(outputPtr, bytesPtr, _stringLength);\n\n return outputString;\n }\n\n /// @notice Returns a URI pointing to a metadata package for this token conforming to\n /// ERC-721 (https://github.com/ethereum/EIPs/issues/721)\n /// @param _tokenId The ID number of the Kitty whose metadata should be returned.\n function tokenMetadata(uint256 _tokenId, string _preferredTransport) external view returns (string infoUrl) {\n require(erc721Metadata != address(0));\n bytes32[4] memory buffer;\n uint256 count;\n (buffer, count) = erc721Metadata.getMetadata(_tokenId, _preferredTransport);\n\n return _toString(buffer, count);\n }\n}\n\n\n\n/// @title A facet of KittyCore that manages Kitty siring, gestation, and birth.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBreeding is KittyOwnership {\n\n /// @dev The Pregnant event is fired when two cats successfully breed and the pregnancy\n /// timer begins for the matron.\n event Pregnant(address owner, uint256 matronId, uint256 sireId, uint256 cooldownEndBlock);\n\n /// @notice The minimum payment required to use breedWithAuto(). This fee goes towards\n /// the gas cost paid by whatever calls giveBirth(), and can be dynamically updated by\n /// the COO role as the gas price changes.\n uint256 public autoBirthFee = 2 finney;\n\n // Keeps track of number of pregnant kitties.\n uint256 public pregnantKitties;\n\n /// @dev The address of the sibling contract that is used to implement the sooper-sekret\n /// genetic combination algorithm.\n GeneScienceInterface public geneScience;\n\n /// @dev Update the address of the genetic contract, can only be called by the CEO.\n /// @param _address An address of a GeneScience contract instance to be used from this point forward.\n function setGeneScienceAddress(address _address) external onlyCEO {\n GeneScienceInterface candidateContract = GeneScienceInterface(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isGeneScience());\n\n // Set the new contract address\n geneScience = candidateContract;\n }\n\n /// @dev Checks that a given kitten is able to breed. Requires that the\n /// current cooldown is finished (for sires) and also checks that there is\n /// no pending pregnancy.\n function _isReadyToBreed(Kitty _kit) internal view returns (bool) {\n // In addition to checking the cooldownEndBlock, we also need to check to see if\n // the cat has a pending birth; there can be some period of time between the end\n // of the pregnacy timer and the birth event.\n return (_kit.siringWithId == 0) && (_kit.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @dev Check if a sire has authorized breeding with this matron. True if both sire\n /// and matron have the same owner, or if the sire has given siring permission to\n /// the matron's owner (via approveSiring()).\n function _isSiringPermitted(uint256 _sireId, uint256 _matronId) internal view returns (bool) {\n address matronOwner = kittyIndexToOwner[_matronId];\n address sireOwner = kittyIndexToOwner[_sireId];\n\n // Siring is okay if they have same owner, or if the matron's owner was given\n // permission to breed with this sire.\n return (matronOwner == sireOwner || sireAllowedToAddress[_sireId] == matronOwner);\n }\n\n /// @dev Set the cooldownEndTime for the given Kitty, based on its current cooldownIndex.\n /// Also increments the cooldownIndex (unless it has hit the cap).\n /// @param _kitten A reference to the Kitty in storage which needs its timer started.\n function _triggerCooldown(Kitty storage _kitten) internal {\n // Compute an estimation of the cooldown time in blocks (based on current cooldownIndex).\n _kitten.cooldownEndBlock = uint64((cooldowns[_kitten.cooldownIndex]/secondsPerBlock) + block.number);\n\n // Increment the breeding count, clamping it at 13, which is the length of the\n // cooldowns array. We could check the array size dynamically, but hard-coding\n // this as a constant saves gas. Yay, Solidity!\n if (_kitten.cooldownIndex < 13) {\n _kitten.cooldownIndex += 1;\n }\n }\n\n /// @notice Grants approval to another user to sire with one of your Kitties.\n /// @param _addr The address that will be able to sire with your Kitty. Set to\n /// address(0) to clear all siring approvals for this Kitty.\n /// @param _sireId A Kitty that you own that _addr will now be able to sire with.\n function approveSiring(address _addr, uint256 _sireId)\n external\n whenNotPaused\n {\n require(_owns(msg.sender, _sireId));\n sireAllowedToAddress[_sireId] = _addr;\n }\n\n /// @dev Updates the minimum payment required for calling giveBirthAuto(). Can only\n /// be called by the COO address. (This fee is used to offset the gas cost incurred\n /// by the autobirth daemon).\n function setAutoBirthFee(uint256 val) external onlyCOO {\n autoBirthFee = val;\n }\n\n /// @dev Checks to see if a given Kitty is pregnant and (if so) if the gestation\n /// period has passed.\n function _isReadyToGiveBirth(Kitty _matron) private view returns (bool) {\n return (_matron.siringWithId != 0) && (_matron.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @notice Checks that a given kitten is able to breed (i.e. it is not pregnant or\n /// in the middle of a siring cooldown).\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isReadyToBreed(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n Kitty storage kit = kitties[_kittyId];\n return _isReadyToBreed(kit);\n }\n\n /// @dev Checks whether a kitty is currently pregnant.\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isPregnant(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n // A kitty is pregnant if and only if this field is set\n return kitties[_kittyId].siringWithId != 0;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair. DOES NOT\n /// check ownership permissions (that is up to the caller).\n /// @param _matron A reference to the Kitty struct of the potential matron.\n /// @param _matronId The matron's ID.\n /// @param _sire A reference to the Kitty struct of the potential sire.\n /// @param _sireId The sire's ID\n function _isValidMatingPair(\n Kitty storage _matron,\n uint256 _matronId,\n Kitty storage _sire,\n uint256 _sireId\n )\n private\n view\n returns(bool)\n {\n // A Kitty can't breed with itself!\n if (_matronId == _sireId) {\n return false;\n }\n\n // Kitties can't breed with their parents.\n if (_matron.matronId == _sireId || _matron.sireId == _sireId) {\n return false;\n }\n if (_sire.matronId == _matronId || _sire.sireId == _matronId) {\n return false;\n }\n\n // We can short circuit the sibling check (below) if either cat is\n // gen zero (has a matron ID of zero).\n if (_sire.matronId == 0 || _matron.matronId == 0) {\n return true;\n }\n\n // Kitties can't breed with full or half siblings.\n if (_sire.matronId == _matron.matronId || _sire.matronId == _matron.sireId) {\n return false;\n }\n if (_sire.sireId == _matron.matronId || _sire.sireId == _matron.sireId) {\n return false;\n }\n\n // Everything seems cool! Let's get DTF.\n return true;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair for\n /// breeding via auction (i.e. skips ownership and siring approval checks).\n function _canBreedWithViaAuction(uint256 _matronId, uint256 _sireId)\n internal\n view\n returns (bool)\n {\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId);\n }\n\n /// @notice Checks to see if two cats can breed together, including checks for\n /// ownership and siring approvals. Does NOT check that both cats are ready for\n /// breeding (i.e. breedWith could still fail until the cooldowns are finished).\n /// TODO: Shouldn't this check pregnancy and cooldowns?!?\n /// @param _matronId The ID of the proposed matron.\n /// @param _sireId The ID of the proposed sire.\n function canBreedWith(uint256 _matronId, uint256 _sireId)\n external\n view\n returns(bool)\n {\n require(_matronId > 0);\n require(_sireId > 0);\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId) &&\n _isSiringPermitted(_sireId, _matronId);\n }\n\n /// @dev Internal utility function to initiate breeding, assumes that all breeding\n /// requirements have been checked.\n function _breedWith(uint256 _matronId, uint256 _sireId) internal {\n // Grab a reference to the Kitties from storage.\n Kitty storage sire = kitties[_sireId];\n Kitty storage matron = kitties[_matronId];\n\n // Mark the matron as pregnant, keeping track of who the sire is.\n matron.siringWithId = uint32(_sireId);\n\n // Trigger the cooldown for both parents.\n _triggerCooldown(sire);\n _triggerCooldown(matron);\n\n // Clear siring permission for both parents. This may not be strictly necessary\n // but it's likely to avoid confusion!\n delete sireAllowedToAddress[_matronId];\n delete sireAllowedToAddress[_sireId];\n\n // Every time a kitty gets pregnant, counter is incremented.\n pregnantKitties++;\n\n // Emit the pregnancy event.\n Pregnant(kittyIndexToOwner[_matronId], _matronId, _sireId, matron.cooldownEndBlock);\n }\n\n /// @notice Breed a Kitty you own (as matron) with a sire that you own, or for which you\n /// have previously been given Siring approval. Will either make your cat pregnant, or will\n /// fail entirely. Requires a pre-payment of the fee given out to the first caller of giveBirth()\n /// @param _matronId The ID of the Kitty acting as matron (will end up pregnant if successful)\n /// @param _sireId The ID of the Kitty acting as sire (will begin its siring cooldown if successful)\n function breedWithAuto(uint256 _matronId, uint256 _sireId)\n external\n payable\n whenNotPaused\n {\n // Checks for payment.\n require(msg.value >= autoBirthFee);\n\n // Caller must own the matron.\n require(_owns(msg.sender, _matronId));\n\n // Neither sire nor matron are allowed to be on auction during a normal\n // breeding operation, but we don't need to check that explicitly.\n // For matron: The caller of this function can't be the owner of the matron\n // because the owner of a Kitty on auction is the auction house, and the\n // auction house will never call breedWith().\n // For sire: Similarly, a sire on auction will be owned by the auction house\n // and the act of transferring ownership will have cleared any oustanding\n // siring approval.\n // Thus we don't need to spend gas explicitly checking to see if either cat\n // is on auction.\n\n // Check that matron and sire are both owned by caller, or that the sire\n // has given siring permission to caller (i.e. matron's owner).\n // Will fail for _sireId = 0\n require(_isSiringPermitted(_sireId, _matronId));\n\n // Grab a reference to the potential matron\n Kitty storage matron = kitties[_matronId];\n\n // Make sure matron isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(matron));\n\n // Grab a reference to the potential sire\n Kitty storage sire = kitties[_sireId];\n\n // Make sure sire isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(sire));\n\n // Test that these cats are a valid mating pair.\n require(_isValidMatingPair(\n matron,\n _matronId,\n sire,\n _sireId\n ));\n\n // All checks passed, kitty gets pregnant!\n _breedWith(_matronId, _sireId);\n }\n\n /// @notice Have a pregnant Kitty give birth!\n /// @param _matronId A Kitty ready to give birth.\n /// @return The Kitty ID of the new kitten.\n /// @dev Looks at a given Kitty and, if pregnant and if the gestation period has passed,\n /// combines the genes of the two parents to create a new kitten. The new Kitty is assigned\n /// to the current owner of the matron. Upon successful completion, both the matron and the\n /// new kitten will be ready to breed again. Note that anyone can call this function (if they\n /// are willing to pay the gas!), but the new kitten always goes to the mother's owner.\n function giveBirth(uint256 _matronId)\n external\n whenNotPaused\n returns(uint256)\n {\n // Grab a reference to the matron in storage.\n Kitty storage matron = kitties[_matronId];\n\n // Check that the matron is a valid cat.\n require(matron.birthTime != 0);\n\n // Check that the matron is pregnant, and that its time has come!\n require(_isReadyToGiveBirth(matron));\n\n // Grab a reference to the sire in storage.\n uint256 sireId = matron.siringWithId;\n Kitty storage sire = kitties[sireId];\n\n // Determine the higher generation number of the two parents\n uint16 parentGen = matron.generation;\n if (sire.generation > matron.generation) {\n parentGen = sire.generation;\n }\n\n // Call the sooper-sekret gene mixing operation.\n uint256 childGenes = geneScience.mixGenes(matron.genes, sire.genes, matron.cooldownEndBlock - 1);\n\n // Make the new kitten!\n address owner = kittyIndexToOwner[_matronId];\n uint256 kittenId = _createKitty(_matronId, matron.siringWithId, parentGen + 1, childGenes, owner);\n\n // Clear the reference to sire from the matron (REQUIRED! Having siringWithId\n // set is what marks a matron as being pregnant.)\n delete matron.siringWithId;\n\n // Every time a kitty gives birth counter is decremented.\n pregnantKitties--;\n\n // Send the balance fee to the person who made birth happen.\n msg.sender.send(autoBirthFee);\n\n // return the new kitten's ID\n return kittenId;\n }\n}\n\n\n\n\n\n\n\n\n\n\n/// @title Auction Core\n/// @dev Contains models, variables, and internal methods for the auction.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuctionBase {\n\n // Represents an auction on an NFT\n struct Auction {\n // Current owner of NFT\n address seller;\n // Price (in wei) at beginning of auction\n uint128 startingPrice;\n // Price (in wei) at end of auction\n uint128 endingPrice;\n // Duration (in seconds) of auction\n uint64 duration;\n // Time when auction started\n // NOTE: 0 if this auction has been concluded\n uint64 startedAt;\n }\n\n // Reference to contract tracking NFT ownership\n KittiesERC721 public nonFungibleContract;\n\n // Cut owner takes on each auction, measured in basis points (1/100 of a percent).\n // Values 0-10,000 map to 0%-100%\n uint256 public ownerCut;\n\n // Map from token ID to their corresponding auction.\n mapping (uint256 => Auction) tokenIdToAuction;\n\n event AuctionCreated(uint256 tokenId, uint256 startingPrice, uint256 endingPrice, uint256 duration);\n event AuctionSuccessful(uint256 tokenId, uint256 totalPrice, address winner);\n event AuctionCancelled(uint256 tokenId);\n\n /// @dev Returns true if the claimant owns the token.\n /// @param _claimant - Address claiming to own the token.\n /// @param _tokenId - ID of token whose ownership to verify.\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return (nonFungibleContract.ownerOf(_tokenId) == _claimant);\n }\n\n /// @dev Escrows the NFT, assigning ownership to this contract.\n /// Throws if the escrow fails.\n /// @param _owner - Current owner address of token to escrow.\n /// @param _tokenId - ID of token whose approval to verify.\n function _escrow(address _owner, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transferFrom(_owner, this, _tokenId);\n }\n\n /// @dev Transfers an NFT owned by this contract to another address.\n /// Returns true if the transfer succeeds.\n /// @param _receiver - Address to transfer NFT to.\n /// @param _tokenId - ID of token to transfer.\n function _transfer(address _receiver, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transfer(_receiver, _tokenId);\n }\n\n /// @dev Adds an auction to the list of open auctions. Also fires the\n /// AuctionCreated event.\n /// @param _tokenId The ID of the token to be put on auction.\n /// @param _auction Auction to add.\n function _addAuction(uint256 _tokenId, Auction _auction) internal {\n // Require that all auctions have a duration of\n // at least one minute. (Keeps our math from getting hairy!)\n require(_auction.duration >= 1 minutes);\n\n tokenIdToAuction[_tokenId] = _auction;\n\n AuctionCreated(\n uint256(_tokenId),\n uint256(_auction.startingPrice),\n uint256(_auction.endingPrice),\n uint256(_auction.duration)\n );\n }\n\n /// @dev Cancels an auction unconditionally.\n function _cancelAuction(uint256 _tokenId, address _seller) internal {\n _removeAuction(_tokenId);\n _transfer(_seller, _tokenId);\n AuctionCancelled(_tokenId);\n }\n\n /// @dev Computes the price and transfers winnings.\n /// Does NOT transfer ownership of token.\n function _bid(uint256 _tokenId, uint256 _bidAmount)\n internal\n returns (uint256)\n {\n // Get a reference to the auction struct\n Auction storage auction = tokenIdToAuction[_tokenId];\n\n // Explicitly check that this auction is currently live.\n // (Because of how Ethereum mappings work, we can't just count\n // on the lookup above failing. An invalid _tokenId will just\n // return an auction object that is all zeros.)\n require(_isOnAuction(auction));\n\n // Check that the bid is greater than or equal to the current price\n uint256 price = _currentPrice(auction);\n require(_bidAmount >= price);\n\n // Grab a reference to the seller before the auction struct\n // gets deleted.\n address seller = auction.seller;\n\n // The bid is good! Remove the auction before sending the fees\n // to the sender so we can't have a reentrancy attack.\n _removeAuction(_tokenId);\n\n // Transfer proceeds to seller (if there are any!)\n if (price > 0) {\n // Calculate the auctioneer's cut.\n // (NOTE: _computeCut() is guaranteed to return a\n // value <= price, so this subtraction can't go negative.)\n uint256 auctioneerCut = _computeCut(price);\n uint256 sellerProceeds = price - auctioneerCut;\n\n // NOTE: Doing a transfer() in the middle of a complex\n // method like this is generally discouraged because of\n // reentrancy attacks and DoS attacks if the seller is\n // a contract with an invalid fallback function. We explicitly\n // guard against reentrancy attacks by removing the auction\n // before calling transfer(), and the only thing the seller\n // can DoS is the sale of their own asset! (And if it's an\n // accident, they can call cancelAuction(). )\n seller.transfer(sellerProceeds);\n }\n\n // Calculate any excess funds included with the bid. If the excess\n // is anything worth worrying about, transfer it back to bidder.\n // NOTE: We checked above that the bid amount is greater than or\n // equal to the price so this cannot underflow.\n uint256 bidExcess = _bidAmount - price;\n\n // Return the funds. Similar to the previous transfer, this is\n // not susceptible to a re-entry attack because the auction is\n // removed before any transfers occur.\n msg.sender.transfer(bidExcess);\n\n // Tell the world!\n AuctionSuccessful(_tokenId, price, msg.sender);\n\n return price;\n }\n\n /// @dev Removes an auction from the list of open auctions.\n /// @param _tokenId - ID of NFT on auction.\n function _removeAuction(uint256 _tokenId) internal {\n delete tokenIdToAuction[_tokenId];\n }\n\n /// @dev Returns true if the NFT is on auction.\n /// @param _auction - Auction to check.\n function _isOnAuction(Auction storage _auction) internal view returns (bool) {\n return (_auction.startedAt > 0);\n }\n\n /// @dev Returns current price of an NFT on auction. Broken into two\n /// functions (this one, that computes the duration from the auction\n /// structure, and the other that does the price computation) so we\n /// can easily test that the price computation works correctly.\n function _currentPrice(Auction storage _auction)\n internal\n view\n returns (uint256)\n {\n uint256 secondsPassed = 0;\n\n // A bit of insurance against negative values (or wraparound).\n // Probably not necessary (since Ethereum guarnatees that the\n // now variable doesn't ever go backwards).\n if (now > _auction.startedAt) {\n secondsPassed = now - _auction.startedAt;\n }\n\n return _computeCurrentPrice(\n _auction.startingPrice,\n _auction.endingPrice,\n _auction.duration,\n secondsPassed\n );\n }\n\n /// @dev Computes the current price of an auction. Factored out\n /// from _currentPrice so we can run extensive unit tests.\n /// When testing, make this function public and turn on\n /// `Current price computation` test suite.\n function _computeCurrentPrice(\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n uint256 _secondsPassed\n )\n internal\n pure\n returns (uint256)\n {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our public functions carefully cap the maximum values for\n // time (at 64-bits) and currency (at 128-bits). _duration is\n // also known to be non-zero (see the require() statement in\n // _addAuction())\n if (_secondsPassed >= _duration) {\n // We've reached the end of the dynamic pricing portion\n // of the auction, just return the end price.\n return _endingPrice;\n } else {\n // Starting price can be higher than ending price (and often is!), so\n // this delta can be negative.\n int256 totalPriceChange = int256(_endingPrice) - int256(_startingPrice);\n\n // This multiplication can't overflow, _secondsPassed will easily fit within\n // 64-bits, and totalPriceChange will easily fit within 128-bits, their product\n // will always fit within 256-bits.\n int256 currentPriceChange = totalPriceChange * int256(_secondsPassed) / int256(_duration);\n\n // currentPriceChange can be negative, but if so, will have a magnitude\n // less that _startingPrice. Thus, this result will always end up positive.\n int256 currentPrice = int256(_startingPrice) + currentPriceChange;\n\n return uint256(currentPrice);\n }\n }\n\n /// @dev Computes owner's cut of a sale.\n /// @param _price - Sale price of NFT.\n function _computeCut(uint256 _price) internal view returns (uint256) {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our entry functions carefully cap the maximum values for\n // currency (at 128-bits), and ownerCut <= 10000 (see the require()\n // statement in the ClockAuction constructor). The result of this\n // function is always guaranteed to be <= _price.\n return _price * ownerCut / 10000;\n }\n\n}\n\n\n\n\n\n\n\n/**\n * @title KittiesPausable\n * @dev Base contract which allows children to implement an emergency stop mechanism.\n */\ncontract KittiesPausable is KittiesOwnable {\n event Pause();\n event Unpause();\n\n bool public paused = false;\n\n\n /**\n\t * @dev modifier to allow actions only when the contract IS paused\n\t */\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /**\n\t * @dev modifier to allow actions only when the contract IS NOT paused\n\t */\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /**\n\t * @dev called by the owner to pause, triggers stopped state\n\t */\n function pause() onlyOwner whenNotPaused returns (bool) {\n paused = true;\n Pause();\n return true;\n }\n\n /**\n\t * @dev called by the owner to unpause, returns to normal state\n\t */\n function unpause() onlyOwner whenPaused returns (bool) {\n paused = false;\n Unpause();\n return true;\n }\n}\n\n\n/// @title Clock auction for non-fungible tokens.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuction is KittiesPausable, ClockAuctionBase {\n\n /// @dev The ERC-165 interface signature for ERC-721.\n /// Ref: https://github.com/ethereum/EIPs/issues/165\n /// Ref: https://github.com/ethereum/EIPs/issues/721\n bytes4 constant InterfaceSignature_ERC721 = bytes4(0x9a20483d);\n\n /// @dev Constructor creates a reference to the NFT ownership contract\n /// and verifies the owner cut is in the valid range.\n /// @param _nftAddress - address of a deployed contract implementing\n /// the Nonfungible Interface.\n /// @param _cut - percent cut the owner takes on each auction, must be\n /// between 0-10,000.\n function ClockAuction(address _nftAddress, uint256 _cut) public {\n require(_cut <= 10000);\n ownerCut = _cut;\n\n KittiesERC721 candidateContract = KittiesERC721(_nftAddress);\n require(candidateContract.supportsInterface(InterfaceSignature_ERC721));\n nonFungibleContract = candidateContract;\n }\n\n /// @dev Remove all Ether from the contract, which is the owner's cuts\n /// as well as any Ether sent directly to the contract address.\n /// Always transfers to the NFT contract, but can be called either by\n /// the owner or the NFT contract.\n function withdrawBalance() external {\n address nftAddress = address(nonFungibleContract);\n\n require(\n msg.sender == owner ||\n msg.sender == nftAddress\n );\n // We are using this boolean method to make sure that even if one fails it will still work\n bool res = nftAddress.send(this.balance);\n }\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of time to move between starting\n /// price and ending price (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n whenNotPaused\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(_owns(msg.sender, _tokenId));\n _escrow(msg.sender, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Bids on an open auction, completing the auction and transferring\n /// ownership of the NFT if enough Ether is supplied.\n /// @param _tokenId - ID of token to bid on.\n function bid(uint256 _tokenId)\n external\n payable\n whenNotPaused\n {\n // _bid will throw if the bid or funds transfer fails\n _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n }\n\n /// @dev Cancels an auction that hasn't been won yet.\n /// Returns the NFT to original owner.\n /// @notice This is a state-modifying function that can\n /// be called while the contract is paused.\n /// @param _tokenId - ID of token on auction\n function cancelAuction(uint256 _tokenId)\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n address seller = auction.seller;\n require(msg.sender == seller);\n _cancelAuction(_tokenId, seller);\n }\n\n /// @dev Cancels an auction when the contract is paused.\n /// Only the owner may do this, and NFTs are returned to\n /// the seller. This should only be used in emergencies.\n /// @param _tokenId - ID of the NFT on auction to cancel.\n function cancelAuctionWhenPaused(uint256 _tokenId)\n whenPaused\n onlyOwner\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n _cancelAuction(_tokenId, auction.seller);\n }\n\n /// @dev Returns auction info for an NFT on auction.\n /// @param _tokenId - ID of NFT on auction.\n function getAuction(uint256 _tokenId)\n external\n view\n returns\n (\n address seller,\n uint256 startingPrice,\n uint256 endingPrice,\n uint256 duration,\n uint256 startedAt\n ) {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return (\n auction.seller,\n auction.startingPrice,\n auction.endingPrice,\n auction.duration,\n auction.startedAt\n );\n }\n\n /// @dev Returns the current price of an auction.\n /// @param _tokenId - ID of the token price we are checking.\n function getCurrentPrice(uint256 _tokenId)\n external\n view\n returns (uint256)\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return _currentPrice(auction);\n }\n\n}\n\n\n/// @title Reverse auction modified for siring\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SiringClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSiringAuctionAddress() call.\n bool public isSiringClockAuction = true;\n\n // Delegate constructor\n function SiringClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction. Since this function is wrapped,\n /// require sender to be KittyCore contract.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Places a bid for siring. Requires the sender\n /// is the KittyCore contract because all bid methods\n /// should be wrapped. Also returns the kitty to the\n /// seller rather than the winner.\n function bid(uint256 _tokenId)\n external\n payable\n {\n require(msg.sender == address(nonFungibleContract));\n address seller = tokenIdToAuction[_tokenId].seller;\n // _bid checks that token ID is valid and will throw if bid fails\n _bid(_tokenId, msg.value);\n // We transfer the kitty back to the seller, the winner will get\n // the offspring\n _transfer(seller, _tokenId);\n }\n\n}\n\n\n\n\n\n/// @title Clock auction modified for sale of kitties\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SaleClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSaleAuctionAddress() call.\n bool public isSaleClockAuction = true;\n\n // Tracks last 5 sale price of gen0 kitty sales\n uint256 public gen0SaleCount;\n uint256[5] public lastGen0SalePrices;\n\n // Delegate constructor\n function SaleClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Updates lastSalePrice if seller is the nft contract\n /// Otherwise, works the same as default bid method.\n function bid(uint256 _tokenId)\n external\n payable\n {\n // _bid verifies token ID size\n address seller = tokenIdToAuction[_tokenId].seller;\n uint256 price = _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n\n // If not a gen0 auction, exit\n if (seller == address(nonFungibleContract)) {\n // Track gen0 sale prices\n lastGen0SalePrices[gen0SaleCount % 5] = price;\n gen0SaleCount++;\n }\n }\n\n function averageGen0SalePrice() external view returns (uint256) {\n uint256 sum = 0;\n for (uint256 i = 0; i < 5; i++) {\n sum += lastGen0SalePrices[i];\n }\n return sum / 5;\n }\n\n}\n\n\n/// @title Handles creating auctions for sale and siring of kitties.\n/// This wrapper of ReverseAuction exists only so that users can create\n/// auctions with only one transaction.\ncontract KittyAuction is KittyBreeding {\n\n // @notice The auction contract variables are defined in KittyBase to allow\n // us to refer to them in KittyOwnership to prevent accidental transfers.\n // `saleAuction` refers to the auction for gen0 and p2p sale of kitties.\n // `siringAuction` refers to the auction for siring rights of kitties.\n\n /// @dev Sets the reference to the sale auction.\n /// @param _address - Address of sale contract.\n function setSaleAuctionAddress(address _address) external onlyCEO {\n SaleClockAuction candidateContract = SaleClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSaleClockAuction());\n\n // Set the new contract address\n saleAuction = candidateContract;\n }\n\n /// @dev Sets the reference to the siring auction.\n /// @param _address - Address of siring contract.\n function setSiringAuctionAddress(address _address) external onlyCEO {\n SiringClockAuction candidateContract = SiringClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSiringClockAuction());\n\n // Set the new contract address\n siringAuction = candidateContract;\n }\n\n /// @dev Put a kitty up for auction.\n /// Does some ownership trickery to create auctions in one tx.\n function createSaleAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n // Ensure the kitty is not pregnant to prevent the auction\n // contract accidentally receiving ownership of the child.\n // NOTE: the kitty IS allowed to be in a cooldown.\n require(!isPregnant(_kittyId));\n _approve(_kittyId, saleAuction);\n // Sale auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n saleAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Put a kitty up for auction to be sire.\n /// Performs checks to ensure the kitty can be sired, then\n /// delegates to reverse auction.\n function createSiringAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n require(isReadyToBreed(_kittyId));\n _approve(_kittyId, siringAuction);\n // Siring auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n siringAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Completes a siring auction by bidding.\n /// Immediately breeds the winning matron with the sire on auction.\n /// @param _sireId - ID of the sire on auction.\n /// @param _matronId - ID of the matron owned by the bidder.\n function bidOnSiringAuction(\n uint256 _sireId,\n uint256 _matronId\n )\n external\n payable\n whenNotPaused\n {\n // Auction contract checks input sizes\n require(_owns(msg.sender, _matronId));\n require(isReadyToBreed(_matronId));\n require(_canBreedWithViaAuction(_matronId, _sireId));\n\n // Define the current price of the auction.\n uint256 currentPrice = siringAuction.getCurrentPrice(_sireId);\n require(msg.value >= currentPrice + autoBirthFee);\n\n // Siring auction will throw if the bid fails.\n siringAuction.bid.value(msg.value - autoBirthFee)(_sireId);\n _breedWith(uint32(_matronId), uint32(_sireId));\n }\n\n /// @dev Transfers the balance of the sale auction contract\n /// to the KittyCore contract. We use two-step withdrawal to\n /// prevent two transfer calls in the auction bid function.\n function withdrawAuctionBalances() external onlyCLevel {\n saleAuction.withdrawBalance();\n siringAuction.withdrawBalance();\n }\n}\n\n\n/// @title all functions related to creating kittens\ncontract KittyMinting is KittyAuction {\n\n // Limits the number of cats the contract owner can ever create.\n uint256 public constant PROMO_CREATION_LIMIT = 5000;\n uint256 public constant GEN0_CREATION_LIMIT = 45000;\n\n // Constants for gen0 auctions.\n uint256 public constant GEN0_STARTING_PRICE = 10 finney;\n uint256 public constant GEN0_AUCTION_DURATION = 1 days;\n\n // Counts the number of cats the contract owner has created.\n uint256 public promoCreatedCount;\n uint256 public gen0CreatedCount;\n\n /// @dev we can create promo kittens, up to a limit. Only callable by COO\n /// @param _genes the encoded genes of the kitten to be created, any value is accepted\n /// @param _owner the future owner of the created kittens. Default to contract COO\n function createPromoKitty(uint256 _genes, address _owner) external onlyCOO {\n address kittyOwner = _owner;\n if (kittyOwner == address(0)) {\n kittyOwner = cooAddress;\n }\n require(promoCreatedCount < PROMO_CREATION_LIMIT);\n\n promoCreatedCount++;\n _createKitty(0, 0, 0, _genes, kittyOwner);\n }\n\n /// @dev Creates a new gen0 kitty with the given genes and\n /// creates an auction for it.\n function createGen0Auction(uint256 _genes) external onlyCOO {\n require(gen0CreatedCount < GEN0_CREATION_LIMIT);\n\n uint256 kittyId = _createKitty(0, 0, 0, _genes, address(this));\n _approve(kittyId, saleAuction);\n\n saleAuction.createAuction(\n kittyId,\n _computeNextGen0Price(),\n 0,\n GEN0_AUCTION_DURATION,\n address(this)\n );\n\n gen0CreatedCount++;\n }\n\n /// @dev Computes the next gen0 auction starting price, given\n /// the average of the past 5 prices + 50%.\n function _computeNextGen0Price() internal view returns (uint256) {\n uint256 avePrice = saleAuction.averageGen0SalePrice();\n\n // Sanity check to ensure we don't overflow arithmetic\n require(avePrice == uint256(uint128(avePrice)));\n\n uint256 nextPrice = avePrice + (avePrice / 2);\n\n // We never auction for less than starting price\n if (nextPrice < GEN0_STARTING_PRICE) {\n nextPrice = GEN0_STARTING_PRICE;\n }\n\n return nextPrice;\n }\n}\n\n\n/// @title CryptoKitties: Collectible, breedable, and oh-so-adorable cats on the Ethereum blockchain.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev The main CryptoKitties contract, keeps track of kittens so they don't wander around and get lost.\ncontract KittyCore is KittyMinting {\n\n // This is the main CryptoKitties contract. In order to keep our code seperated into logical sections,\n // we've broken it up in two ways. First, we have several seperately-instantiated sibling contracts\n // that handle auctions and our super-top-secret genetic combination algorithm. The auctions are\n // seperate since their logic is somewhat complex and there's always a risk of subtle bugs. By keeping\n // them in their own contracts, we can upgrade them without disrupting the main contract that tracks\n // kitty ownership. The genetic combination algorithm is kept seperate so we can open-source all of\n // the rest of our code without making it _too_ easy for folks to figure out how the genetics work.\n // Don't worry, I'm sure someone will reverse engineer it soon enough!\n //\n // Secondly, we break the core contract into multiple files using inheritence, one for each major\n // facet of functionality of CK. This allows us to keep related code bundled together while still\n // avoiding a single giant file with everything in it. The breakdown is as follows:\n //\n // - KittyBase: This is where we define the most fundamental code shared throughout the core\n // functionality. This includes our main data storage, constants and data types, plus\n // internal functions for managing these items.\n //\n // - KittyAccessControl: This contract manages the various addresses and constraints for operations\n // that can be executed only by specific roles. Namely CEO, CFO and COO.\n //\n // - KittyOwnership: This provides the methods required for basic non-fungible token\n // transactions, following the draft ERC-721 spec (https://github.com/ethereum/EIPs/issues/721).\n //\n // - KittyBreeding: This file contains the methods necessary to breed cats together, including\n // keeping track of siring offers, and relies on an external genetic combination contract.\n //\n // - KittyAuctions: Here we have the public methods for auctioning or bidding on cats or siring\n // services. The actual auction functionality is handled in two sibling contracts (one\n // for sales and one for siring), while auction creation and bidding is mostly mediated\n // through this facet of the core contract.\n //\n // - KittyMinting: This final facet contains the functionality we use for creating new gen0 cats.\n // We can make up to 5000 \"promo\" cats that can be given away (especially important when\n // the community is new), and all others can only be created and then immediately put up\n // for auction via an algorithmically determined starting price. Regardless of how they\n // are created, there is a hard limit of 50k gen0 cats. After that, it's all up to the\n // community to breed, breed, breed!\n\n // Set in case the core contract is broken and an upgrade is required\n address public newContractAddress;\n\n /// @notice Creates the main CryptoKitties smart contract instance.\n function KittyCore() public {\n // Starts paused.\n paused = true;\n\n // the creator of the contract is the initial CEO\n ceoAddress = msg.sender;\n\n // the creator of the contract is also the initial COO\n cooAddress = msg.sender;\n\n // start with the mythical kitten 0 - so we don't have generation-0 parent issues\n _createKitty(0, 0, 0, uint256(-1), address(0));\n }\n\n /// @dev Used to mark the smart contract as upgraded, in case there is a serious\n /// breaking bug. This method does nothing but keep track of the new contract and\n /// emit a message indicating that the new address is set. It's up to clients of this\n /// contract to update to the new contract address in that case. (This contract will\n /// be paused indefinitely if such an upgrade takes place.)\n /// @param _v2Address new address\n function setNewAddress(address _v2Address) external onlyCEO whenPaused {\n // See README.md for updgrade plan\n newContractAddress = _v2Address;\n ContractUpgrade(_v2Address);\n }\n\n /// @notice No tipping!\n /// @dev Reject all Ether from being sent here, unless it's from one of the\n /// two auction contracts. (Hopefully, we can prevent user accidents.)\n function() external payable {\n require(\n msg.sender == address(saleAuction) ||\n msg.sender == address(siringAuction)\n );\n }\n\n /// @notice Returns all the relevant information about a specific kitty.\n /// @param _id The ID of the kitty of interest.\n function getKitty(uint256 _id)\n external\n view\n returns (\n bool isGestating,\n bool isReady,\n uint256 cooldownIndex,\n uint256 nextActionAt,\n uint256 siringWithId,\n uint256 birthTime,\n uint256 matronId,\n uint256 sireId,\n uint256 generation,\n uint256 genes\n ) {\n Kitty storage kit = kitties[_id];\n\n // if this variable is 0 then it's not gestating\n isGestating = (kit.siringWithId != 0);\n isReady = (kit.cooldownEndBlock <= block.number);\n cooldownIndex = uint256(kit.cooldownIndex);\n nextActionAt = uint256(kit.cooldownEndBlock);\n siringWithId = uint256(kit.siringWithId);\n birthTime = uint256(kit.birthTime);\n matronId = uint256(kit.matronId);\n sireId = uint256(kit.sireId);\n generation = uint256(kit.generation);\n genes = kit.genes;\n }\n\n /// @dev Override unpause so it requires all external contract addresses\n /// to be set before contract can be unpaused. Also, we can't have\n /// newContractAddress set either, because then the contract was upgraded.\n /// @notice This is public rather than external so we can call super.unpause\n /// without using an expensive CALL.\n function unpause() public onlyCEO whenPaused {\n require(saleAuction != address(0));\n require(siringAuction != address(0));\n require(geneScience != address(0));\n require(newContractAddress == address(0));\n\n // Actually unpause the contract.\n super.unpause();\n }\n\n // @dev Allows the CFO to capture the balance available to the contract.\n function withdrawBalance() external onlyCFO {\n uint256 balance = this.balance;\n // Subtract all the currently pregnant kittens we have, plus 1 of margin.\n uint256 subtractFees = (pregnantKitties + 1) * autoBirthFee;\n\n if (balance > subtractFees) {\n cfoAddress.send(balance - subtractFees);\n }\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "exportedSymbols": { "ClockAuction": [ 8872 @@ -51770,5 +51770,5 @@ }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:47.755Z" + "updatedAt": "2018-10-09T17:45:35.953Z" } \ No newline at end of file diff --git a/artifacts/json/KittyAuction.json b/artifacts/json/KittyAuction.json index c09a907f..af72e771 100644 --- a/artifacts/json/KittyAuction.json +++ b/artifacts/json/KittyAuction.json @@ -885,15 +885,15 @@ "type": "event" } ], - "bytecode": "0x60606040526000600260146101000a81548160ff0219169083151502179055506101c060405190810160405280603c63ffffffff1663ffffffff168152602001607863ffffffff1663ffffffff16815260200161012c63ffffffff1663ffffffff16815260200161025863ffffffff1663ffffffff16815260200161070863ffffffff1663ffffffff168152602001610e1063ffffffff1663ffffffff168152602001611c2063ffffffff1663ffffffff16815260200161384063ffffffff1663ffffffff16815260200161708063ffffffff1663ffffffff16815260200161e10063ffffffff1663ffffffff1681526020016201518063ffffffff1663ffffffff1681526020016202a30063ffffffff1663ffffffff1681526020016205460063ffffffff1663ffffffff16815260200162093a8063ffffffff1663ffffffff16815250600390600e6200015692919062000179565b50600f60055566071afd498d0000600e5534156200017357600080fd5b62000259565b82600e600701600890048101928215620002105791602002820160005b83821115620001dc57835183826101000a81548163ffffffff021916908363ffffffff160217905550926020019260040160208160030104928301926001030262000196565b80156200020e5782816101000a81549063ffffffff0219169055600401602081600301049283019260010302620001dc565b505b5090506200021f919062000223565b5090565b6200025691905b808211156200025257600081816101000a81549063ffffffff0219169055506001016200022a565b5090565b90565b6145fe80620002696000396000f30060606040526004361061023b576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146102405780630519ce791461029a5780630560ff44146102ef57806306fdde031461039f578063095ea7b31461042d5780630a0f81681461046f57806314001f4c146104c457806318160ddd146104fd578063183a7947146105265780631940a9361461054f57806321717ebf1461058a57806323b872dd146105df57806324e7a38a1461064057806327d7874c146106795780632ba73c15146106b25780633d7d3f5a146106eb5780633f4ba83a1461072957806346116e6f1461073e57806346d22c70146107a1578063481af3d3146107e55780634ad8c938146108485780634b85fd55146108865780634dfff04f146108a95780634e0a3379146108eb5780635663896e146109245780635c975abb146109475780636352211e146109745780636fbde40d146109d757806370a0823114610a105780637a7d493714610a5d5780638456cb5914610a865780638462151c14610a9b57806388c2a0bf14610b2957806391876e5714610b6057806395d89b4114610b755780639d6fac6f14610c03578063a45f4bfc14610c46578063a9059cbb14610ca9578063b047fb5014610ceb578063b0c35c0514610d40578063bc4006f514610d69578063d3e6f49f14610dbe578063e17b25af14610df9578063e6cbe35114610e32578063ed60ade614610e87578063f2b47d5214610ea8578063f7d8c88314610efd575b600080fd5b341561024b57600080fd5b61028060048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050610f1e565b604051808215151515815260200191505060405180910390f35b34156102a557600080fd5b6102ad61122f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102fa57600080fd5b61032460048080359060200190919080359060200190820180359060200191909192905050611255565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610364578082015181840152602081019050610349565b50505050905090810190601f1680156103915780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156103aa57600080fd5b6103b26113c0565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103f25780820151818401526020810190506103d7565b50505050905090810190601f16801561041f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561043857600080fd5b61046d600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506113f9565b005b341561047a57600080fd5b6104826114bb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104cf57600080fd5b6104fb600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506114e0565b005b341561050857600080fd5b610510611617565b6040518082815260200191505060405180910390f35b341561053157600080fd5b610539611627565b6040518082815260200191505060405180910390f35b341561055a57600080fd5b610570600480803590602001909190505061162d565b604051808215151515815260200191505060405180910390f35b341561059557600080fd5b61059d61167f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156105ea57600080fd5b61063e600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506116a5565b005b341561064b57600080fd5b610677600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611756565b005b341561068457600080fd5b6106b0600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061188d565b005b34156106bd57600080fd5b6106e9600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611967565b005b34156106f657600080fd5b6107276004808035906020019091908035906020019091908035906020019091908035906020019091905050611a42565b005b341561073457600080fd5b61073c611baa565b005b341561074957600080fd5b61075f6004808035906020019091905050611c3d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156107ac57600080fd5b6107cb6004808035906020019091908035906020019091905050611c70565b604051808215151515815260200191505060405180910390f35b34156107f057600080fd5b6108066004808035906020019091905050611cf8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561085357600080fd5b6108846004808035906020019091908035906020019091908035906020019091908035906020019091905050611d2b565b005b341561089157600080fd5b6108a76004808035906020019091905050611e92565b005b34156108b457600080fd5b6108e9600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611ef8565b005b34156108f657600080fd5b610922600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611f7f565b005b341561092f57600080fd5b610945600480803590602001909190505061205a565b005b341561095257600080fd5b61095a6121ae565b604051808215151515815260200191505060405180910390f35b341561097f57600080fd5b61099560048080359060200190919050506121c1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156109e257600080fd5b610a0e600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061223a565b005b3415610a1b57600080fd5b610a47600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612371565b6040518082815260200191505060405180910390f35b3415610a6857600080fd5b610a706123ba565b6040518082815260200191505060405180910390f35b3415610a9157600080fd5b610a996123c0565b005b3415610aa657600080fd5b610ad2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612504565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610b15578082015181840152602081019050610afa565b505050509050019250505060405180910390f35b3415610b3457600080fd5b610b4a600480803590602001909190505061263b565b6040518082815260200191505060405180910390f35b3415610b6b57600080fd5b610b73612a5a565b005b3415610b8057600080fd5b610b88612c99565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610bc8578082015181840152602081019050610bad565b50505050905090810190601f168015610bf55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610c0e57600080fd5b610c246004808035906020019091905050612cd2565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3415610c5157600080fd5b610c676004808035906020019091905050612d01565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610cb457600080fd5b610ce9600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050612d34565b005b3415610cf657600080fd5b610cfe612ea5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610d4b57600080fd5b610d53612ecb565b6040518082815260200191505060405180910390f35b3415610d7457600080fd5b610d7c612ed1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610dc957600080fd5b610ddf6004808035906020019091905050612ef7565b604051808215151515815260200191505060405180910390f35b3415610e0457600080fd5b610e30600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050613066565b005b3415610e3d57600080fd5b610e45613105565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610ea6600480803590602001909190803590602001909190505061312b565b005b3415610eb357600080fd5b610ebb613314565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610f1c600480803590602001909190803590602001909190505061333a565b005b600060405180807f737570706f727473496e74657266616365286279746573342900000000000000815250601901905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611228575060405180807f746f6b656e4d657461646174612875696e743235362c737472696e6729000000815250601d019050604051809103902060405180807f746f6b656e734f664f776e6572286164647265737329000000000000000000008152506016019050604051809103902060405180807f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81526020017f74323536290000000000000000000000000000000000000000000000000000008152506025019050604051809103902060405180807f7472616e7366657228616464726573732c75696e7432353629000000000000008152506019019050604051809103902060405180807f617070726f766528616464726573732c75696e743235362900000000000000008152506018019050604051809103902060405180807f6f776e65724f662875696e7432353629000000000000000000000000000000008152506010019050604051809103902060405180807f62616c616e63654f6628616464726573732900000000000000000000000000008152506012019050604051809103902060405180807f746f74616c537570706c79282900000000000000000000000000000000000000815250600d019050604051809103902060405180807f73796d626f6c28290000000000000000000000000000000000000000000000008152506008019050604051809103902060405180807f6e616d6528290000000000000000000000000000000000000000000000000000815250600601905060405180910390201818181818181818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61125d61440d565b611265614421565b60008073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156112c457600080fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb4799f2878787600060405160a001526040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180848152602001806020018281038252848482818152602001925080828437820191505094505050505060a060405180830381600087803b151561137f57600080fd5b6102c65a03f1151561139057600080fd5b5050506040518060800180519060200160405280925081935050506113b5828261367b565b925050509392505050565b6040805190810160405280600d81526020017f43727970746f4b6974746965730000000000000000000000000000000000000081525081565b61140333826136d3565b151561140e57600080fd5b611418818361373f565b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561153d57600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166376190f8f6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156115ac57600080fd5b6102c65a03f115156115bd57600080fd5b5050506040518051905015156115d257600080fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600160068054905003905090565b600f5481565b6000808211151561163d57600080fd5b600060068381548110151561164e57fe5b906000526020600020906002020160010160189054906101000a900463ffffffff1663ffffffff1614159050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156116e157600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561171c57600080fd5b6117263382613795565b151561173157600080fd5b61173b83826136d3565b151561174657600080fd5b611751838383613801565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156117b357600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166354c15b826000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561182257600080fd5b6102c65a03f1151561183357600080fd5b50505060405180519050151561184857600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156118e857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561192457600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156119c257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156119fe57600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260149054906101000a900460ff16151515611a5e57600080fd5b611a6833856136d3565b1515611a7357600080fd5b611a7c8461162d565b151515611a8857600080fd5b611ab484600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661373f565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a85858585336040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b1515611b9057600080fd5b6102c65a03f11515611ba157600080fd5b50505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c0557600080fd5b600260149054906101000a900460ff161515611c2057600080fd5b6000600260146101000a81548160ff021916908315150217905550565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008085111515611c8357600080fd5b600084111515611c9257600080fd5b600685815481101515611ca157fe5b90600052602060002090600202019150600684815481101515611cc057fe5b90600052602060002090600202019050611cdc82868387613a39565b8015611cee5750611ced8486613c4e565b5b9250505092915050565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff16151515611d4757600080fd5b611d5133856136d3565b1515611d5c57600080fd5b611d6584612ef7565b1515611d7057600080fd5b611d9c84600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661373f565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a85858585336040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b1515611e7857600080fd5b6102c65a03f11515611e8957600080fd5b50505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611eee57600080fd5b80600e8190555050565b600260149054906101000a900460ff16151515611f1457600080fd5b611f1e33826136d3565b1515611f2957600080fd5b81600a600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611fda57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561201657600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061210257506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061215a5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561216557600080fd5b60036000600e8110151561217557fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff16811015156121a457600080fd5b8060058190555050565b600260149054906101000a900460ff1681565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561223557600080fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561229757600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166385b861886000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561230657600080fd5b6102c65a03f1151561231757600080fd5b50505060405180519050151561232c57600080fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061246857506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806124c05750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156124cb57600080fd5b600260149054906101000a900460ff161515156124e757600080fd5b6001600260146101000a81548160ff021916908315150217905550565b61250c61444c565b600061251661444c565b600080600061252487612371565b9450600085141561255657600060405180591061253e5750595b90808252806020026020018201604052509550612631565b846040518059106125645750595b9080825280602002602001820160405250935061257f611617565b925060009150600190505b828111151561262d578673ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156126205780848381518110151561260957fe5b906020019060200201818152505081806001019250505b808060010191505061258a565b8395505b5050505050919050565b600080600080600080600080600260149054906101000a900460ff1615151561266357600080fd5b60068981548110151561267257fe5b9060005260206000209060020201965060008760010160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16141515156126b457600080fd5b6127ea876101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050613d61565b15156127f557600080fd5b8660010160189054906101000a900463ffffffff1663ffffffff16955060068681548110151561282157fe5b9060005260206000209060020201945086600101601e9054906101000a900461ffff16935086600101601e9054906101000a900461ffff1661ffff1685600101601e9054906101000a900461ffff1661ffff1611156128905784600101601e9054906101000a900461ffff1693505b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d9f5aed8860000154876000015460018b60010160089054906101000a900467ffffffffffffffff16036000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018381526020018267ffffffffffffffff1681526020019350505050602060405180830381600087803b151561296657600080fd5b6102c65a03f1151561297757600080fd5b505050604051805190509250600760008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506129e7898860010160189054906101000a900463ffffffff1663ffffffff166001870161ffff168686613d9c565b90508660010160186101000a81549063ffffffff0219169055600f60008154809291906001900391905055503373ffffffffffffffffffffffffffffffffffffffff166108fc600e549081150290604051600060405180830381858888f193505050505080975050505050505050919050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612b0257506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80612b5a5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515612b6557600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b1515612bea57600080fd5b6102c65a03f11515612bfb57600080fd5b505050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b1515612c8357600080fd5b6102c65a03f11515612c9457600080fd5b505050565b6040805190810160405280600281526020017f434b00000000000000000000000000000000000000000000000000000000000081525081565b600381600e81101515612ce157fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff16151515612d5057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612d8c57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612dc757600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612e2457600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612e8157600080fd5b612e8b33826136d3565b1515612e9657600080fd5b612ea1338383613801565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600083111515612f0957600080fd5b600683815481101515612f1857fe5b9060005260206000209060020201905061305e816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff168152505061408f565b915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156130c157600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260149054906101000a900460ff1615151561314957600080fd5b61315333836136d3565b151561315e57600080fd5b61316782612ef7565b151561317257600080fd5b61317c82846140c9565b151561318757600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c55d0f56846000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561322057600080fd5b6102c65a03f1151561323157600080fd5b505050604051805190509050600e548101341015151561325057600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663454a2ab3600e543403856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808281526020019150506000604051808303818588803b15156132e457600080fd5b6125ee5a03f115156132f557600080fd5b5050505061330f8263ffffffff168463ffffffff16614122565b505050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600260149054906101000a900460ff1615151561335957600080fd5b600e54341015151561336a57600080fd5b61337433856136d3565b151561337f57600080fd5b6133898385613c4e565b151561339457600080fd5b6006848154811015156133a357fe5b906000526020600020906002020191506134e9826101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff168152505061408f565b15156134f457600080fd5b60068381548110151561350357fe5b90600052602060002090600202019050613649816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff168152505061408f565b151561365457600080fd5b61366082858386613a39565b151561366b57600080fd5b6136758484614122565b50505050565b61368361440d565b61368b61440d565b6000808460405180591061369c5750595b9080825280601f01601f191660200182016040525092506020830191508590506136c78282876142ec565b82935050505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff166007600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b806009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008273ffffffffffffffffffffffffffffffffffffffff166009600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151561399557600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600a600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556009600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b600081841415613a4c5760009050613c46565b818560010160109054906101000a900463ffffffff1663ffffffff161480613a8d5750818560010160149054906101000a900463ffffffff1663ffffffff16145b15613a9b5760009050613c46565b838360010160109054906101000a900463ffffffff1663ffffffff161480613adc5750838360010160149054906101000a900463ffffffff1663ffffffff16145b15613aea5760009050613c46565b60008360010160109054906101000a900463ffffffff1663ffffffff161480613b2d575060008560010160109054906101000a900463ffffffff1663ffffffff16145b15613b3b5760019050613c46565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff161480613bb057508460010160149054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff16145b15613bbe5760009050613c46565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff161480613c3357508460010160149054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff16145b15613c415760009050613c46565b600190505b949350505050565b60008060006007600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161480613d5757508173ffffffffffffffffffffffffffffffffffffffff16600a600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b9250505092915050565b6000808260a0015163ffffffff1614158015613d9557504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b600080613da7614460565b60008863ffffffff1689141515613dbd57600080fd5b8763ffffffff1688141515613dd157600080fd5b8661ffff1687141515613de357600080fd5b600287811515613def57fe5b049250600d8361ffff161115613e0457600d92505b610100604051908101604052808781526020014267ffffffffffffffff168152602001600067ffffffffffffffff1681526020018a63ffffffff1681526020018963ffffffff168152602001600063ffffffff1681526020018461ffff1681526020018861ffff168152509150600160068054806001018281613e8791906144d4565b916000526020600020906002020160008590919091506000820151816000015560208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601c6101000a81548161ffff021916908361ffff16021790555060e082015181600101601e6101000a81548161ffff021916908361ffff16021790555050500390508063ffffffff1681141515613fd957600080fd5b7f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad58582846060015163ffffffff16856080015163ffffffff168660000151604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a161408060008683613801565b80935050505095945050505050565b6000808260a0015163ffffffff161480156140c257504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b60008060006006858154811015156140dd57fe5b906000526020600020906002020191506006848154811015156140fc57fe5b9060005260206000209060020201905061411882868387613a39565b9250505092915050565b60008060068381548110151561413457fe5b9060005260206000209060020201915060068481548110151561415357fe5b90600052602060002090600202019050828160010160186101000a81548163ffffffff021916908363ffffffff16021790555061418f82614337565b61419881614337565b600a600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600a600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600f600081548092919060010191905055507f241ea03ca20251805084d27d4440371c34a0b85ff108f6bb5611248f73818b806007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685858460010160089054906101000a900467ffffffffffffffff16604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018267ffffffffffffffff16815260200194505050505060405180910390a150505050565b60005b60208210151561431457825184526020840193506020830192506020820391506142ef565b6001826020036101000a0390508019835116818551168181178652505050505050565b43600554600383600101601c9054906101000a900461ffff1661ffff16600e8110151561436057fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff1681151561438b57fe5b04018160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600d81600101601c9054906101000a900461ffff1661ffff16101561440a57600181600101601c8282829054906101000a900461ffff160192506101000a81548161ffff021916908361ffff1602179055505b50565b602060405190810160405280600081525090565b6080604051908101604052806004905b60008019168152602001906001900390816144315790505090565b602060405190810160405280600081525090565b6101006040519081016040528060008152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600061ffff168152602001600061ffff1681525090565b815481835581811511614501576002028160020283600052602060002091820191016145009190614506565b5b505050565b6145cf91905b808211156145cb576000808201600090556001820160006101000a81549067ffffffffffffffff02191690556001820160086101000a81549067ffffffffffffffff02191690556001820160106101000a81549063ffffffff02191690556001820160146101000a81549063ffffffff02191690556001820160186101000a81549063ffffffff021916905560018201601c6101000a81549061ffff021916905560018201601e6101000a81549061ffff02191690555060020161450c565b5090565b905600a165627a7a72305820f98b08fb3ef3e5c151dffa5e0c63c43a6e679b6ff349c8101c24a4a587f004990029", - "deployedBytecode": "0x60606040526004361061023b576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146102405780630519ce791461029a5780630560ff44146102ef57806306fdde031461039f578063095ea7b31461042d5780630a0f81681461046f57806314001f4c146104c457806318160ddd146104fd578063183a7947146105265780631940a9361461054f57806321717ebf1461058a57806323b872dd146105df57806324e7a38a1461064057806327d7874c146106795780632ba73c15146106b25780633d7d3f5a146106eb5780633f4ba83a1461072957806346116e6f1461073e57806346d22c70146107a1578063481af3d3146107e55780634ad8c938146108485780634b85fd55146108865780634dfff04f146108a95780634e0a3379146108eb5780635663896e146109245780635c975abb146109475780636352211e146109745780636fbde40d146109d757806370a0823114610a105780637a7d493714610a5d5780638456cb5914610a865780638462151c14610a9b57806388c2a0bf14610b2957806391876e5714610b6057806395d89b4114610b755780639d6fac6f14610c03578063a45f4bfc14610c46578063a9059cbb14610ca9578063b047fb5014610ceb578063b0c35c0514610d40578063bc4006f514610d69578063d3e6f49f14610dbe578063e17b25af14610df9578063e6cbe35114610e32578063ed60ade614610e87578063f2b47d5214610ea8578063f7d8c88314610efd575b600080fd5b341561024b57600080fd5b61028060048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050610f1e565b604051808215151515815260200191505060405180910390f35b34156102a557600080fd5b6102ad61122f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102fa57600080fd5b61032460048080359060200190919080359060200190820180359060200191909192905050611255565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610364578082015181840152602081019050610349565b50505050905090810190601f1680156103915780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156103aa57600080fd5b6103b26113c0565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103f25780820151818401526020810190506103d7565b50505050905090810190601f16801561041f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561043857600080fd5b61046d600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506113f9565b005b341561047a57600080fd5b6104826114bb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104cf57600080fd5b6104fb600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506114e0565b005b341561050857600080fd5b610510611617565b6040518082815260200191505060405180910390f35b341561053157600080fd5b610539611627565b6040518082815260200191505060405180910390f35b341561055a57600080fd5b610570600480803590602001909190505061162d565b604051808215151515815260200191505060405180910390f35b341561059557600080fd5b61059d61167f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156105ea57600080fd5b61063e600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506116a5565b005b341561064b57600080fd5b610677600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611756565b005b341561068457600080fd5b6106b0600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061188d565b005b34156106bd57600080fd5b6106e9600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611967565b005b34156106f657600080fd5b6107276004808035906020019091908035906020019091908035906020019091908035906020019091905050611a42565b005b341561073457600080fd5b61073c611baa565b005b341561074957600080fd5b61075f6004808035906020019091905050611c3d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156107ac57600080fd5b6107cb6004808035906020019091908035906020019091905050611c70565b604051808215151515815260200191505060405180910390f35b34156107f057600080fd5b6108066004808035906020019091905050611cf8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561085357600080fd5b6108846004808035906020019091908035906020019091908035906020019091908035906020019091905050611d2b565b005b341561089157600080fd5b6108a76004808035906020019091905050611e92565b005b34156108b457600080fd5b6108e9600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611ef8565b005b34156108f657600080fd5b610922600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611f7f565b005b341561092f57600080fd5b610945600480803590602001909190505061205a565b005b341561095257600080fd5b61095a6121ae565b604051808215151515815260200191505060405180910390f35b341561097f57600080fd5b61099560048080359060200190919050506121c1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156109e257600080fd5b610a0e600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061223a565b005b3415610a1b57600080fd5b610a47600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612371565b6040518082815260200191505060405180910390f35b3415610a6857600080fd5b610a706123ba565b6040518082815260200191505060405180910390f35b3415610a9157600080fd5b610a996123c0565b005b3415610aa657600080fd5b610ad2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612504565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610b15578082015181840152602081019050610afa565b505050509050019250505060405180910390f35b3415610b3457600080fd5b610b4a600480803590602001909190505061263b565b6040518082815260200191505060405180910390f35b3415610b6b57600080fd5b610b73612a5a565b005b3415610b8057600080fd5b610b88612c99565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610bc8578082015181840152602081019050610bad565b50505050905090810190601f168015610bf55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610c0e57600080fd5b610c246004808035906020019091905050612cd2565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3415610c5157600080fd5b610c676004808035906020019091905050612d01565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610cb457600080fd5b610ce9600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050612d34565b005b3415610cf657600080fd5b610cfe612ea5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610d4b57600080fd5b610d53612ecb565b6040518082815260200191505060405180910390f35b3415610d7457600080fd5b610d7c612ed1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610dc957600080fd5b610ddf6004808035906020019091905050612ef7565b604051808215151515815260200191505060405180910390f35b3415610e0457600080fd5b610e30600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050613066565b005b3415610e3d57600080fd5b610e45613105565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610ea6600480803590602001909190803590602001909190505061312b565b005b3415610eb357600080fd5b610ebb613314565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610f1c600480803590602001909190803590602001909190505061333a565b005b600060405180807f737570706f727473496e74657266616365286279746573342900000000000000815250601901905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611228575060405180807f746f6b656e4d657461646174612875696e743235362c737472696e6729000000815250601d019050604051809103902060405180807f746f6b656e734f664f776e6572286164647265737329000000000000000000008152506016019050604051809103902060405180807f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81526020017f74323536290000000000000000000000000000000000000000000000000000008152506025019050604051809103902060405180807f7472616e7366657228616464726573732c75696e7432353629000000000000008152506019019050604051809103902060405180807f617070726f766528616464726573732c75696e743235362900000000000000008152506018019050604051809103902060405180807f6f776e65724f662875696e7432353629000000000000000000000000000000008152506010019050604051809103902060405180807f62616c616e63654f6628616464726573732900000000000000000000000000008152506012019050604051809103902060405180807f746f74616c537570706c79282900000000000000000000000000000000000000815250600d019050604051809103902060405180807f73796d626f6c28290000000000000000000000000000000000000000000000008152506008019050604051809103902060405180807f6e616d6528290000000000000000000000000000000000000000000000000000815250600601905060405180910390201818181818181818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61125d61440d565b611265614421565b60008073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156112c457600080fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb4799f2878787600060405160a001526040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180848152602001806020018281038252848482818152602001925080828437820191505094505050505060a060405180830381600087803b151561137f57600080fd5b6102c65a03f1151561139057600080fd5b5050506040518060800180519060200160405280925081935050506113b5828261367b565b925050509392505050565b6040805190810160405280600d81526020017f43727970746f4b6974746965730000000000000000000000000000000000000081525081565b61140333826136d3565b151561140e57600080fd5b611418818361373f565b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561153d57600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166376190f8f6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156115ac57600080fd5b6102c65a03f115156115bd57600080fd5b5050506040518051905015156115d257600080fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600160068054905003905090565b600f5481565b6000808211151561163d57600080fd5b600060068381548110151561164e57fe5b906000526020600020906002020160010160189054906101000a900463ffffffff1663ffffffff1614159050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156116e157600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561171c57600080fd5b6117263382613795565b151561173157600080fd5b61173b83826136d3565b151561174657600080fd5b611751838383613801565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156117b357600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166354c15b826000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561182257600080fd5b6102c65a03f1151561183357600080fd5b50505060405180519050151561184857600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156118e857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561192457600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156119c257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156119fe57600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260149054906101000a900460ff16151515611a5e57600080fd5b611a6833856136d3565b1515611a7357600080fd5b611a7c8461162d565b151515611a8857600080fd5b611ab484600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661373f565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a85858585336040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b1515611b9057600080fd5b6102c65a03f11515611ba157600080fd5b50505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c0557600080fd5b600260149054906101000a900460ff161515611c2057600080fd5b6000600260146101000a81548160ff021916908315150217905550565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008085111515611c8357600080fd5b600084111515611c9257600080fd5b600685815481101515611ca157fe5b90600052602060002090600202019150600684815481101515611cc057fe5b90600052602060002090600202019050611cdc82868387613a39565b8015611cee5750611ced8486613c4e565b5b9250505092915050565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff16151515611d4757600080fd5b611d5133856136d3565b1515611d5c57600080fd5b611d6584612ef7565b1515611d7057600080fd5b611d9c84600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661373f565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a85858585336040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b1515611e7857600080fd5b6102c65a03f11515611e8957600080fd5b50505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611eee57600080fd5b80600e8190555050565b600260149054906101000a900460ff16151515611f1457600080fd5b611f1e33826136d3565b1515611f2957600080fd5b81600a600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611fda57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561201657600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061210257506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061215a5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561216557600080fd5b60036000600e8110151561217557fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff16811015156121a457600080fd5b8060058190555050565b600260149054906101000a900460ff1681565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561223557600080fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561229757600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166385b861886000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561230657600080fd5b6102c65a03f1151561231757600080fd5b50505060405180519050151561232c57600080fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061246857506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806124c05750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156124cb57600080fd5b600260149054906101000a900460ff161515156124e757600080fd5b6001600260146101000a81548160ff021916908315150217905550565b61250c61444c565b600061251661444c565b600080600061252487612371565b9450600085141561255657600060405180591061253e5750595b90808252806020026020018201604052509550612631565b846040518059106125645750595b9080825280602002602001820160405250935061257f611617565b925060009150600190505b828111151561262d578673ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156126205780848381518110151561260957fe5b906020019060200201818152505081806001019250505b808060010191505061258a565b8395505b5050505050919050565b600080600080600080600080600260149054906101000a900460ff1615151561266357600080fd5b60068981548110151561267257fe5b9060005260206000209060020201965060008760010160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16141515156126b457600080fd5b6127ea876101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050613d61565b15156127f557600080fd5b8660010160189054906101000a900463ffffffff1663ffffffff16955060068681548110151561282157fe5b9060005260206000209060020201945086600101601e9054906101000a900461ffff16935086600101601e9054906101000a900461ffff1661ffff1685600101601e9054906101000a900461ffff1661ffff1611156128905784600101601e9054906101000a900461ffff1693505b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d9f5aed8860000154876000015460018b60010160089054906101000a900467ffffffffffffffff16036000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018381526020018267ffffffffffffffff1681526020019350505050602060405180830381600087803b151561296657600080fd5b6102c65a03f1151561297757600080fd5b505050604051805190509250600760008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506129e7898860010160189054906101000a900463ffffffff1663ffffffff166001870161ffff168686613d9c565b90508660010160186101000a81549063ffffffff0219169055600f60008154809291906001900391905055503373ffffffffffffffffffffffffffffffffffffffff166108fc600e549081150290604051600060405180830381858888f193505050505080975050505050505050919050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612b0257506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80612b5a5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515612b6557600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b1515612bea57600080fd5b6102c65a03f11515612bfb57600080fd5b505050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b1515612c8357600080fd5b6102c65a03f11515612c9457600080fd5b505050565b6040805190810160405280600281526020017f434b00000000000000000000000000000000000000000000000000000000000081525081565b600381600e81101515612ce157fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff16151515612d5057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612d8c57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612dc757600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612e2457600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612e8157600080fd5b612e8b33826136d3565b1515612e9657600080fd5b612ea1338383613801565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600083111515612f0957600080fd5b600683815481101515612f1857fe5b9060005260206000209060020201905061305e816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff168152505061408f565b915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156130c157600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260149054906101000a900460ff1615151561314957600080fd5b61315333836136d3565b151561315e57600080fd5b61316782612ef7565b151561317257600080fd5b61317c82846140c9565b151561318757600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c55d0f56846000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561322057600080fd5b6102c65a03f1151561323157600080fd5b505050604051805190509050600e548101341015151561325057600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663454a2ab3600e543403856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808281526020019150506000604051808303818588803b15156132e457600080fd5b6125ee5a03f115156132f557600080fd5b5050505061330f8263ffffffff168463ffffffff16614122565b505050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600260149054906101000a900460ff1615151561335957600080fd5b600e54341015151561336a57600080fd5b61337433856136d3565b151561337f57600080fd5b6133898385613c4e565b151561339457600080fd5b6006848154811015156133a357fe5b906000526020600020906002020191506134e9826101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff168152505061408f565b15156134f457600080fd5b60068381548110151561350357fe5b90600052602060002090600202019050613649816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff168152505061408f565b151561365457600080fd5b61366082858386613a39565b151561366b57600080fd5b6136758484614122565b50505050565b61368361440d565b61368b61440d565b6000808460405180591061369c5750595b9080825280601f01601f191660200182016040525092506020830191508590506136c78282876142ec565b82935050505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff166007600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b806009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008273ffffffffffffffffffffffffffffffffffffffff166009600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151561399557600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600a600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556009600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b600081841415613a4c5760009050613c46565b818560010160109054906101000a900463ffffffff1663ffffffff161480613a8d5750818560010160149054906101000a900463ffffffff1663ffffffff16145b15613a9b5760009050613c46565b838360010160109054906101000a900463ffffffff1663ffffffff161480613adc5750838360010160149054906101000a900463ffffffff1663ffffffff16145b15613aea5760009050613c46565b60008360010160109054906101000a900463ffffffff1663ffffffff161480613b2d575060008560010160109054906101000a900463ffffffff1663ffffffff16145b15613b3b5760019050613c46565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff161480613bb057508460010160149054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff16145b15613bbe5760009050613c46565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff161480613c3357508460010160149054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff16145b15613c415760009050613c46565b600190505b949350505050565b60008060006007600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161480613d5757508173ffffffffffffffffffffffffffffffffffffffff16600a600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b9250505092915050565b6000808260a0015163ffffffff1614158015613d9557504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b600080613da7614460565b60008863ffffffff1689141515613dbd57600080fd5b8763ffffffff1688141515613dd157600080fd5b8661ffff1687141515613de357600080fd5b600287811515613def57fe5b049250600d8361ffff161115613e0457600d92505b610100604051908101604052808781526020014267ffffffffffffffff168152602001600067ffffffffffffffff1681526020018a63ffffffff1681526020018963ffffffff168152602001600063ffffffff1681526020018461ffff1681526020018861ffff168152509150600160068054806001018281613e8791906144d4565b916000526020600020906002020160008590919091506000820151816000015560208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601c6101000a81548161ffff021916908361ffff16021790555060e082015181600101601e6101000a81548161ffff021916908361ffff16021790555050500390508063ffffffff1681141515613fd957600080fd5b7f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad58582846060015163ffffffff16856080015163ffffffff168660000151604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a161408060008683613801565b80935050505095945050505050565b6000808260a0015163ffffffff161480156140c257504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b60008060006006858154811015156140dd57fe5b906000526020600020906002020191506006848154811015156140fc57fe5b9060005260206000209060020201905061411882868387613a39565b9250505092915050565b60008060068381548110151561413457fe5b9060005260206000209060020201915060068481548110151561415357fe5b90600052602060002090600202019050828160010160186101000a81548163ffffffff021916908363ffffffff16021790555061418f82614337565b61419881614337565b600a600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600a600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600f600081548092919060010191905055507f241ea03ca20251805084d27d4440371c34a0b85ff108f6bb5611248f73818b806007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685858460010160089054906101000a900467ffffffffffffffff16604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018267ffffffffffffffff16815260200194505050505060405180910390a150505050565b60005b60208210151561431457825184526020840193506020830192506020820391506142ef565b6001826020036101000a0390508019835116818551168181178652505050505050565b43600554600383600101601c9054906101000a900461ffff1661ffff16600e8110151561436057fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff1681151561438b57fe5b04018160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600d81600101601c9054906101000a900461ffff1661ffff16101561440a57600181600101601c8282829054906101000a900461ffff160192506101000a81548161ffff021916908361ffff1602179055505b50565b602060405190810160405280600081525090565b6080604051908101604052806004905b60008019168152602001906001900390816144315790505090565b602060405190810160405280600081525090565b6101006040519081016040528060008152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600061ffff168152602001600061ffff1681525090565b815481835581811511614501576002028160020283600052602060002091820191016145009190614506565b5b505050565b6145cf91905b808211156145cb576000808201600090556001820160006101000a81549067ffffffffffffffff02191690556001820160086101000a81549067ffffffffffffffff02191690556001820160106101000a81549063ffffffff02191690556001820160146101000a81549063ffffffff02191690556001820160186101000a81549063ffffffff021916905560018201601c6101000a81549061ffff021916905560018201601e6101000a81549061ffff02191690555060020161450c565b5090565b905600a165627a7a72305820f98b08fb3ef3e5c151dffa5e0c63c43a6e679b6ff349c8101c24a4a587f004990029", + "bytecode": "0x60606040526000600260146101000a81548160ff0219169083151502179055506101c060405190810160405280603c63ffffffff1663ffffffff168152602001607863ffffffff1663ffffffff16815260200161012c63ffffffff1663ffffffff16815260200161025863ffffffff1663ffffffff16815260200161070863ffffffff1663ffffffff168152602001610e1063ffffffff1663ffffffff168152602001611c2063ffffffff1663ffffffff16815260200161384063ffffffff1663ffffffff16815260200161708063ffffffff1663ffffffff16815260200161e10063ffffffff1663ffffffff1681526020016201518063ffffffff1663ffffffff1681526020016202a30063ffffffff1663ffffffff1681526020016205460063ffffffff1663ffffffff16815260200162093a8063ffffffff1663ffffffff16815250600390600e6200015692919062000179565b50600f60055566071afd498d0000600e5534156200017357600080fd5b62000259565b82600e600701600890048101928215620002105791602002820160005b83821115620001dc57835183826101000a81548163ffffffff021916908363ffffffff160217905550926020019260040160208160030104928301926001030262000196565b80156200020e5782816101000a81549063ffffffff0219169055600401602081600301049283019260010302620001dc565b505b5090506200021f919062000223565b5090565b6200025691905b808211156200025257600081816101000a81549063ffffffff0219169055506001016200022a565b5090565b90565b6145fe80620002696000396000f30060606040526004361061023b576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146102405780630519ce791461029a5780630560ff44146102ef57806306fdde031461039f578063095ea7b31461042d5780630a0f81681461046f57806314001f4c146104c457806318160ddd146104fd578063183a7947146105265780631940a9361461054f57806321717ebf1461058a57806323b872dd146105df57806324e7a38a1461064057806327d7874c146106795780632ba73c15146106b25780633d7d3f5a146106eb5780633f4ba83a1461072957806346116e6f1461073e57806346d22c70146107a1578063481af3d3146107e55780634ad8c938146108485780634b85fd55146108865780634dfff04f146108a95780634e0a3379146108eb5780635663896e146109245780635c975abb146109475780636352211e146109745780636fbde40d146109d757806370a0823114610a105780637a7d493714610a5d5780638456cb5914610a865780638462151c14610a9b57806388c2a0bf14610b2957806391876e5714610b6057806395d89b4114610b755780639d6fac6f14610c03578063a45f4bfc14610c46578063a9059cbb14610ca9578063b047fb5014610ceb578063b0c35c0514610d40578063bc4006f514610d69578063d3e6f49f14610dbe578063e17b25af14610df9578063e6cbe35114610e32578063ed60ade614610e87578063f2b47d5214610ea8578063f7d8c88314610efd575b600080fd5b341561024b57600080fd5b61028060048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050610f1e565b604051808215151515815260200191505060405180910390f35b34156102a557600080fd5b6102ad61122f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102fa57600080fd5b61032460048080359060200190919080359060200190820180359060200191909192905050611255565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610364578082015181840152602081019050610349565b50505050905090810190601f1680156103915780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156103aa57600080fd5b6103b26113c0565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103f25780820151818401526020810190506103d7565b50505050905090810190601f16801561041f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561043857600080fd5b61046d600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506113f9565b005b341561047a57600080fd5b6104826114bb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104cf57600080fd5b6104fb600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506114e0565b005b341561050857600080fd5b610510611617565b6040518082815260200191505060405180910390f35b341561053157600080fd5b610539611627565b6040518082815260200191505060405180910390f35b341561055a57600080fd5b610570600480803590602001909190505061162d565b604051808215151515815260200191505060405180910390f35b341561059557600080fd5b61059d61167f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156105ea57600080fd5b61063e600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506116a5565b005b341561064b57600080fd5b610677600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611756565b005b341561068457600080fd5b6106b0600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061188d565b005b34156106bd57600080fd5b6106e9600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611967565b005b34156106f657600080fd5b6107276004808035906020019091908035906020019091908035906020019091908035906020019091905050611a42565b005b341561073457600080fd5b61073c611baa565b005b341561074957600080fd5b61075f6004808035906020019091905050611c3d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156107ac57600080fd5b6107cb6004808035906020019091908035906020019091905050611c70565b604051808215151515815260200191505060405180910390f35b34156107f057600080fd5b6108066004808035906020019091905050611cf8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561085357600080fd5b6108846004808035906020019091908035906020019091908035906020019091908035906020019091905050611d2b565b005b341561089157600080fd5b6108a76004808035906020019091905050611e92565b005b34156108b457600080fd5b6108e9600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611ef8565b005b34156108f657600080fd5b610922600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611f7f565b005b341561092f57600080fd5b610945600480803590602001909190505061205a565b005b341561095257600080fd5b61095a6121ae565b604051808215151515815260200191505060405180910390f35b341561097f57600080fd5b61099560048080359060200190919050506121c1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156109e257600080fd5b610a0e600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061223a565b005b3415610a1b57600080fd5b610a47600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612371565b6040518082815260200191505060405180910390f35b3415610a6857600080fd5b610a706123ba565b6040518082815260200191505060405180910390f35b3415610a9157600080fd5b610a996123c0565b005b3415610aa657600080fd5b610ad2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612504565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610b15578082015181840152602081019050610afa565b505050509050019250505060405180910390f35b3415610b3457600080fd5b610b4a600480803590602001909190505061263b565b6040518082815260200191505060405180910390f35b3415610b6b57600080fd5b610b73612a5a565b005b3415610b8057600080fd5b610b88612c99565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610bc8578082015181840152602081019050610bad565b50505050905090810190601f168015610bf55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610c0e57600080fd5b610c246004808035906020019091905050612cd2565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3415610c5157600080fd5b610c676004808035906020019091905050612d01565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610cb457600080fd5b610ce9600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050612d34565b005b3415610cf657600080fd5b610cfe612ea5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610d4b57600080fd5b610d53612ecb565b6040518082815260200191505060405180910390f35b3415610d7457600080fd5b610d7c612ed1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610dc957600080fd5b610ddf6004808035906020019091905050612ef7565b604051808215151515815260200191505060405180910390f35b3415610e0457600080fd5b610e30600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050613066565b005b3415610e3d57600080fd5b610e45613105565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610ea6600480803590602001909190803590602001909190505061312b565b005b3415610eb357600080fd5b610ebb613314565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610f1c600480803590602001909190803590602001909190505061333a565b005b600060405180807f737570706f727473496e74657266616365286279746573342900000000000000815250601901905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611228575060405180807f746f6b656e4d657461646174612875696e743235362c737472696e6729000000815250601d019050604051809103902060405180807f746f6b656e734f664f776e6572286164647265737329000000000000000000008152506016019050604051809103902060405180807f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81526020017f74323536290000000000000000000000000000000000000000000000000000008152506025019050604051809103902060405180807f7472616e7366657228616464726573732c75696e7432353629000000000000008152506019019050604051809103902060405180807f617070726f766528616464726573732c75696e743235362900000000000000008152506018019050604051809103902060405180807f6f776e65724f662875696e7432353629000000000000000000000000000000008152506010019050604051809103902060405180807f62616c616e63654f6628616464726573732900000000000000000000000000008152506012019050604051809103902060405180807f746f74616c537570706c79282900000000000000000000000000000000000000815250600d019050604051809103902060405180807f73796d626f6c28290000000000000000000000000000000000000000000000008152506008019050604051809103902060405180807f6e616d6528290000000000000000000000000000000000000000000000000000815250600601905060405180910390201818181818181818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61125d61440d565b611265614421565b60008073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156112c457600080fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb4799f2878787600060405160a001526040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180848152602001806020018281038252848482818152602001925080828437820191505094505050505060a060405180830381600087803b151561137f57600080fd5b6102c65a03f1151561139057600080fd5b5050506040518060800180519060200160405280925081935050506113b5828261367b565b925050509392505050565b6040805190810160405280600d81526020017f43727970746f4b6974746965730000000000000000000000000000000000000081525081565b61140333826136d3565b151561140e57600080fd5b611418818361373f565b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561153d57600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166376190f8f6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156115ac57600080fd5b6102c65a03f115156115bd57600080fd5b5050506040518051905015156115d257600080fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600160068054905003905090565b600f5481565b6000808211151561163d57600080fd5b600060068381548110151561164e57fe5b906000526020600020906002020160010160189054906101000a900463ffffffff1663ffffffff1614159050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156116e157600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561171c57600080fd5b6117263382613795565b151561173157600080fd5b61173b83826136d3565b151561174657600080fd5b611751838383613801565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156117b357600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166354c15b826000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561182257600080fd5b6102c65a03f1151561183357600080fd5b50505060405180519050151561184857600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156118e857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561192457600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156119c257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156119fe57600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260149054906101000a900460ff16151515611a5e57600080fd5b611a6833856136d3565b1515611a7357600080fd5b611a7c8461162d565b151515611a8857600080fd5b611ab484600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661373f565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a85858585336040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b1515611b9057600080fd5b6102c65a03f11515611ba157600080fd5b50505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c0557600080fd5b600260149054906101000a900460ff161515611c2057600080fd5b6000600260146101000a81548160ff021916908315150217905550565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008085111515611c8357600080fd5b600084111515611c9257600080fd5b600685815481101515611ca157fe5b90600052602060002090600202019150600684815481101515611cc057fe5b90600052602060002090600202019050611cdc82868387613a39565b8015611cee5750611ced8486613c4e565b5b9250505092915050565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff16151515611d4757600080fd5b611d5133856136d3565b1515611d5c57600080fd5b611d6584612ef7565b1515611d7057600080fd5b611d9c84600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661373f565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a85858585336040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b1515611e7857600080fd5b6102c65a03f11515611e8957600080fd5b50505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611eee57600080fd5b80600e8190555050565b600260149054906101000a900460ff16151515611f1457600080fd5b611f1e33826136d3565b1515611f2957600080fd5b81600a600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611fda57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561201657600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061210257506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061215a5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561216557600080fd5b60036000600e8110151561217557fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff16811015156121a457600080fd5b8060058190555050565b600260149054906101000a900460ff1681565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561223557600080fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561229757600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166385b861886000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561230657600080fd5b6102c65a03f1151561231757600080fd5b50505060405180519050151561232c57600080fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061246857506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806124c05750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156124cb57600080fd5b600260149054906101000a900460ff161515156124e757600080fd5b6001600260146101000a81548160ff021916908315150217905550565b61250c61444c565b600061251661444c565b600080600061252487612371565b9450600085141561255657600060405180591061253e5750595b90808252806020026020018201604052509550612631565b846040518059106125645750595b9080825280602002602001820160405250935061257f611617565b925060009150600190505b828111151561262d578673ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156126205780848381518110151561260957fe5b906020019060200201818152505081806001019250505b808060010191505061258a565b8395505b5050505050919050565b600080600080600080600080600260149054906101000a900460ff1615151561266357600080fd5b60068981548110151561267257fe5b9060005260206000209060020201965060008760010160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16141515156126b457600080fd5b6127ea876101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050613d61565b15156127f557600080fd5b8660010160189054906101000a900463ffffffff1663ffffffff16955060068681548110151561282157fe5b9060005260206000209060020201945086600101601e9054906101000a900461ffff16935086600101601e9054906101000a900461ffff1661ffff1685600101601e9054906101000a900461ffff1661ffff1611156128905784600101601e9054906101000a900461ffff1693505b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d9f5aed8860000154876000015460018b60010160089054906101000a900467ffffffffffffffff16036000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018381526020018267ffffffffffffffff1681526020019350505050602060405180830381600087803b151561296657600080fd5b6102c65a03f1151561297757600080fd5b505050604051805190509250600760008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506129e7898860010160189054906101000a900463ffffffff1663ffffffff166001870161ffff168686613d9c565b90508660010160186101000a81549063ffffffff0219169055600f60008154809291906001900391905055503373ffffffffffffffffffffffffffffffffffffffff166108fc600e549081150290604051600060405180830381858888f193505050505080975050505050505050919050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612b0257506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80612b5a5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515612b6557600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b1515612bea57600080fd5b6102c65a03f11515612bfb57600080fd5b505050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b1515612c8357600080fd5b6102c65a03f11515612c9457600080fd5b505050565b6040805190810160405280600281526020017f434b00000000000000000000000000000000000000000000000000000000000081525081565b600381600e81101515612ce157fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff16151515612d5057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612d8c57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612dc757600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612e2457600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612e8157600080fd5b612e8b33826136d3565b1515612e9657600080fd5b612ea1338383613801565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600083111515612f0957600080fd5b600683815481101515612f1857fe5b9060005260206000209060020201905061305e816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff168152505061408f565b915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156130c157600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260149054906101000a900460ff1615151561314957600080fd5b61315333836136d3565b151561315e57600080fd5b61316782612ef7565b151561317257600080fd5b61317c82846140c9565b151561318757600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c55d0f56846000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561322057600080fd5b6102c65a03f1151561323157600080fd5b505050604051805190509050600e548101341015151561325057600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663454a2ab3600e543403856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808281526020019150506000604051808303818588803b15156132e457600080fd5b6125ee5a03f115156132f557600080fd5b5050505061330f8263ffffffff168463ffffffff16614122565b505050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600260149054906101000a900460ff1615151561335957600080fd5b600e54341015151561336a57600080fd5b61337433856136d3565b151561337f57600080fd5b6133898385613c4e565b151561339457600080fd5b6006848154811015156133a357fe5b906000526020600020906002020191506134e9826101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff168152505061408f565b15156134f457600080fd5b60068381548110151561350357fe5b90600052602060002090600202019050613649816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff168152505061408f565b151561365457600080fd5b61366082858386613a39565b151561366b57600080fd5b6136758484614122565b50505050565b61368361440d565b61368b61440d565b6000808460405180591061369c5750595b9080825280601f01601f191660200182016040525092506020830191508590506136c78282876142ec565b82935050505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff166007600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b806009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008273ffffffffffffffffffffffffffffffffffffffff166009600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151561399557600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600a600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556009600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b600081841415613a4c5760009050613c46565b818560010160109054906101000a900463ffffffff1663ffffffff161480613a8d5750818560010160149054906101000a900463ffffffff1663ffffffff16145b15613a9b5760009050613c46565b838360010160109054906101000a900463ffffffff1663ffffffff161480613adc5750838360010160149054906101000a900463ffffffff1663ffffffff16145b15613aea5760009050613c46565b60008360010160109054906101000a900463ffffffff1663ffffffff161480613b2d575060008560010160109054906101000a900463ffffffff1663ffffffff16145b15613b3b5760019050613c46565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff161480613bb057508460010160149054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff16145b15613bbe5760009050613c46565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff161480613c3357508460010160149054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff16145b15613c415760009050613c46565b600190505b949350505050565b60008060006007600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161480613d5757508173ffffffffffffffffffffffffffffffffffffffff16600a600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b9250505092915050565b6000808260a0015163ffffffff1614158015613d9557504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b600080613da7614460565b60008863ffffffff1689141515613dbd57600080fd5b8763ffffffff1688141515613dd157600080fd5b8661ffff1687141515613de357600080fd5b600287811515613def57fe5b049250600d8361ffff161115613e0457600d92505b610100604051908101604052808781526020014267ffffffffffffffff168152602001600067ffffffffffffffff1681526020018a63ffffffff1681526020018963ffffffff168152602001600063ffffffff1681526020018461ffff1681526020018861ffff168152509150600160068054806001018281613e8791906144d4565b916000526020600020906002020160008590919091506000820151816000015560208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601c6101000a81548161ffff021916908361ffff16021790555060e082015181600101601e6101000a81548161ffff021916908361ffff16021790555050500390508063ffffffff1681141515613fd957600080fd5b7f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad58582846060015163ffffffff16856080015163ffffffff168660000151604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a161408060008683613801565b80935050505095945050505050565b6000808260a0015163ffffffff161480156140c257504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b60008060006006858154811015156140dd57fe5b906000526020600020906002020191506006848154811015156140fc57fe5b9060005260206000209060020201905061411882868387613a39565b9250505092915050565b60008060068381548110151561413457fe5b9060005260206000209060020201915060068481548110151561415357fe5b90600052602060002090600202019050828160010160186101000a81548163ffffffff021916908363ffffffff16021790555061418f82614337565b61419881614337565b600a600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600a600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600f600081548092919060010191905055507f241ea03ca20251805084d27d4440371c34a0b85ff108f6bb5611248f73818b806007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685858460010160089054906101000a900467ffffffffffffffff16604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018267ffffffffffffffff16815260200194505050505060405180910390a150505050565b60005b60208210151561431457825184526020840193506020830192506020820391506142ef565b6001826020036101000a0390508019835116818551168181178652505050505050565b43600554600383600101601c9054906101000a900461ffff1661ffff16600e8110151561436057fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff1681151561438b57fe5b04018160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600d81600101601c9054906101000a900461ffff1661ffff16101561440a57600181600101601c8282829054906101000a900461ffff160192506101000a81548161ffff021916908361ffff1602179055505b50565b602060405190810160405280600081525090565b6080604051908101604052806004905b60008019168152602001906001900390816144315790505090565b602060405190810160405280600081525090565b6101006040519081016040528060008152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600061ffff168152602001600061ffff1681525090565b815481835581811511614501576002028160020283600052602060002091820191016145009190614506565b5b505050565b6145cf91905b808211156145cb576000808201600090556001820160006101000a81549067ffffffffffffffff02191690556001820160086101000a81549067ffffffffffffffff02191690556001820160106101000a81549063ffffffff02191690556001820160146101000a81549063ffffffff02191690556001820160186101000a81549063ffffffff021916905560018201601c6101000a81549061ffff021916905560018201601e6101000a81549061ffff02191690555060020161450c565b5090565b905600a165627a7a723058209362fe414c30b76be5bab99038d1480636f63affb77367ed007af7ff14b65b110029", + "deployedBytecode": "0x60606040526004361061023b576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146102405780630519ce791461029a5780630560ff44146102ef57806306fdde031461039f578063095ea7b31461042d5780630a0f81681461046f57806314001f4c146104c457806318160ddd146104fd578063183a7947146105265780631940a9361461054f57806321717ebf1461058a57806323b872dd146105df57806324e7a38a1461064057806327d7874c146106795780632ba73c15146106b25780633d7d3f5a146106eb5780633f4ba83a1461072957806346116e6f1461073e57806346d22c70146107a1578063481af3d3146107e55780634ad8c938146108485780634b85fd55146108865780634dfff04f146108a95780634e0a3379146108eb5780635663896e146109245780635c975abb146109475780636352211e146109745780636fbde40d146109d757806370a0823114610a105780637a7d493714610a5d5780638456cb5914610a865780638462151c14610a9b57806388c2a0bf14610b2957806391876e5714610b6057806395d89b4114610b755780639d6fac6f14610c03578063a45f4bfc14610c46578063a9059cbb14610ca9578063b047fb5014610ceb578063b0c35c0514610d40578063bc4006f514610d69578063d3e6f49f14610dbe578063e17b25af14610df9578063e6cbe35114610e32578063ed60ade614610e87578063f2b47d5214610ea8578063f7d8c88314610efd575b600080fd5b341561024b57600080fd5b61028060048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050610f1e565b604051808215151515815260200191505060405180910390f35b34156102a557600080fd5b6102ad61122f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102fa57600080fd5b61032460048080359060200190919080359060200190820180359060200191909192905050611255565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610364578082015181840152602081019050610349565b50505050905090810190601f1680156103915780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156103aa57600080fd5b6103b26113c0565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103f25780820151818401526020810190506103d7565b50505050905090810190601f16801561041f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561043857600080fd5b61046d600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506113f9565b005b341561047a57600080fd5b6104826114bb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104cf57600080fd5b6104fb600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506114e0565b005b341561050857600080fd5b610510611617565b6040518082815260200191505060405180910390f35b341561053157600080fd5b610539611627565b6040518082815260200191505060405180910390f35b341561055a57600080fd5b610570600480803590602001909190505061162d565b604051808215151515815260200191505060405180910390f35b341561059557600080fd5b61059d61167f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156105ea57600080fd5b61063e600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506116a5565b005b341561064b57600080fd5b610677600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611756565b005b341561068457600080fd5b6106b0600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061188d565b005b34156106bd57600080fd5b6106e9600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611967565b005b34156106f657600080fd5b6107276004808035906020019091908035906020019091908035906020019091908035906020019091905050611a42565b005b341561073457600080fd5b61073c611baa565b005b341561074957600080fd5b61075f6004808035906020019091905050611c3d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156107ac57600080fd5b6107cb6004808035906020019091908035906020019091905050611c70565b604051808215151515815260200191505060405180910390f35b34156107f057600080fd5b6108066004808035906020019091905050611cf8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561085357600080fd5b6108846004808035906020019091908035906020019091908035906020019091908035906020019091905050611d2b565b005b341561089157600080fd5b6108a76004808035906020019091905050611e92565b005b34156108b457600080fd5b6108e9600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611ef8565b005b34156108f657600080fd5b610922600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611f7f565b005b341561092f57600080fd5b610945600480803590602001909190505061205a565b005b341561095257600080fd5b61095a6121ae565b604051808215151515815260200191505060405180910390f35b341561097f57600080fd5b61099560048080359060200190919050506121c1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156109e257600080fd5b610a0e600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061223a565b005b3415610a1b57600080fd5b610a47600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612371565b6040518082815260200191505060405180910390f35b3415610a6857600080fd5b610a706123ba565b6040518082815260200191505060405180910390f35b3415610a9157600080fd5b610a996123c0565b005b3415610aa657600080fd5b610ad2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612504565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610b15578082015181840152602081019050610afa565b505050509050019250505060405180910390f35b3415610b3457600080fd5b610b4a600480803590602001909190505061263b565b6040518082815260200191505060405180910390f35b3415610b6b57600080fd5b610b73612a5a565b005b3415610b8057600080fd5b610b88612c99565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610bc8578082015181840152602081019050610bad565b50505050905090810190601f168015610bf55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610c0e57600080fd5b610c246004808035906020019091905050612cd2565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3415610c5157600080fd5b610c676004808035906020019091905050612d01565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610cb457600080fd5b610ce9600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050612d34565b005b3415610cf657600080fd5b610cfe612ea5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610d4b57600080fd5b610d53612ecb565b6040518082815260200191505060405180910390f35b3415610d7457600080fd5b610d7c612ed1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610dc957600080fd5b610ddf6004808035906020019091905050612ef7565b604051808215151515815260200191505060405180910390f35b3415610e0457600080fd5b610e30600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050613066565b005b3415610e3d57600080fd5b610e45613105565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610ea6600480803590602001909190803590602001909190505061312b565b005b3415610eb357600080fd5b610ebb613314565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610f1c600480803590602001909190803590602001909190505061333a565b005b600060405180807f737570706f727473496e74657266616365286279746573342900000000000000815250601901905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611228575060405180807f746f6b656e4d657461646174612875696e743235362c737472696e6729000000815250601d019050604051809103902060405180807f746f6b656e734f664f776e6572286164647265737329000000000000000000008152506016019050604051809103902060405180807f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81526020017f74323536290000000000000000000000000000000000000000000000000000008152506025019050604051809103902060405180807f7472616e7366657228616464726573732c75696e7432353629000000000000008152506019019050604051809103902060405180807f617070726f766528616464726573732c75696e743235362900000000000000008152506018019050604051809103902060405180807f6f776e65724f662875696e7432353629000000000000000000000000000000008152506010019050604051809103902060405180807f62616c616e63654f6628616464726573732900000000000000000000000000008152506012019050604051809103902060405180807f746f74616c537570706c79282900000000000000000000000000000000000000815250600d019050604051809103902060405180807f73796d626f6c28290000000000000000000000000000000000000000000000008152506008019050604051809103902060405180807f6e616d6528290000000000000000000000000000000000000000000000000000815250600601905060405180910390201818181818181818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61125d61440d565b611265614421565b60008073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156112c457600080fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb4799f2878787600060405160a001526040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180848152602001806020018281038252848482818152602001925080828437820191505094505050505060a060405180830381600087803b151561137f57600080fd5b6102c65a03f1151561139057600080fd5b5050506040518060800180519060200160405280925081935050506113b5828261367b565b925050509392505050565b6040805190810160405280600d81526020017f43727970746f4b6974746965730000000000000000000000000000000000000081525081565b61140333826136d3565b151561140e57600080fd5b611418818361373f565b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561153d57600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166376190f8f6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156115ac57600080fd5b6102c65a03f115156115bd57600080fd5b5050506040518051905015156115d257600080fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600160068054905003905090565b600f5481565b6000808211151561163d57600080fd5b600060068381548110151561164e57fe5b906000526020600020906002020160010160189054906101000a900463ffffffff1663ffffffff1614159050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156116e157600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561171c57600080fd5b6117263382613795565b151561173157600080fd5b61173b83826136d3565b151561174657600080fd5b611751838383613801565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156117b357600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166354c15b826000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561182257600080fd5b6102c65a03f1151561183357600080fd5b50505060405180519050151561184857600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156118e857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561192457600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156119c257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156119fe57600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260149054906101000a900460ff16151515611a5e57600080fd5b611a6833856136d3565b1515611a7357600080fd5b611a7c8461162d565b151515611a8857600080fd5b611ab484600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661373f565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a85858585336040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b1515611b9057600080fd5b6102c65a03f11515611ba157600080fd5b50505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c0557600080fd5b600260149054906101000a900460ff161515611c2057600080fd5b6000600260146101000a81548160ff021916908315150217905550565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008085111515611c8357600080fd5b600084111515611c9257600080fd5b600685815481101515611ca157fe5b90600052602060002090600202019150600684815481101515611cc057fe5b90600052602060002090600202019050611cdc82868387613a39565b8015611cee5750611ced8486613c4e565b5b9250505092915050565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff16151515611d4757600080fd5b611d5133856136d3565b1515611d5c57600080fd5b611d6584612ef7565b1515611d7057600080fd5b611d9c84600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661373f565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a85858585336040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b1515611e7857600080fd5b6102c65a03f11515611e8957600080fd5b50505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611eee57600080fd5b80600e8190555050565b600260149054906101000a900460ff16151515611f1457600080fd5b611f1e33826136d3565b1515611f2957600080fd5b81600a600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611fda57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561201657600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061210257506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061215a5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561216557600080fd5b60036000600e8110151561217557fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff16811015156121a457600080fd5b8060058190555050565b600260149054906101000a900460ff1681565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561223557600080fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561229757600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166385b861886000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561230657600080fd5b6102c65a03f1151561231757600080fd5b50505060405180519050151561232c57600080fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061246857506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806124c05750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156124cb57600080fd5b600260149054906101000a900460ff161515156124e757600080fd5b6001600260146101000a81548160ff021916908315150217905550565b61250c61444c565b600061251661444c565b600080600061252487612371565b9450600085141561255657600060405180591061253e5750595b90808252806020026020018201604052509550612631565b846040518059106125645750595b9080825280602002602001820160405250935061257f611617565b925060009150600190505b828111151561262d578673ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156126205780848381518110151561260957fe5b906020019060200201818152505081806001019250505b808060010191505061258a565b8395505b5050505050919050565b600080600080600080600080600260149054906101000a900460ff1615151561266357600080fd5b60068981548110151561267257fe5b9060005260206000209060020201965060008760010160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16141515156126b457600080fd5b6127ea876101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050613d61565b15156127f557600080fd5b8660010160189054906101000a900463ffffffff1663ffffffff16955060068681548110151561282157fe5b9060005260206000209060020201945086600101601e9054906101000a900461ffff16935086600101601e9054906101000a900461ffff1661ffff1685600101601e9054906101000a900461ffff1661ffff1611156128905784600101601e9054906101000a900461ffff1693505b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d9f5aed8860000154876000015460018b60010160089054906101000a900467ffffffffffffffff16036000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018381526020018267ffffffffffffffff1681526020019350505050602060405180830381600087803b151561296657600080fd5b6102c65a03f1151561297757600080fd5b505050604051805190509250600760008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506129e7898860010160189054906101000a900463ffffffff1663ffffffff166001870161ffff168686613d9c565b90508660010160186101000a81549063ffffffff0219169055600f60008154809291906001900391905055503373ffffffffffffffffffffffffffffffffffffffff166108fc600e549081150290604051600060405180830381858888f193505050505080975050505050505050919050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612b0257506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80612b5a5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515612b6557600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b1515612bea57600080fd5b6102c65a03f11515612bfb57600080fd5b505050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b1515612c8357600080fd5b6102c65a03f11515612c9457600080fd5b505050565b6040805190810160405280600281526020017f434b00000000000000000000000000000000000000000000000000000000000081525081565b600381600e81101515612ce157fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff16151515612d5057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612d8c57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612dc757600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612e2457600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612e8157600080fd5b612e8b33826136d3565b1515612e9657600080fd5b612ea1338383613801565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600083111515612f0957600080fd5b600683815481101515612f1857fe5b9060005260206000209060020201905061305e816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff168152505061408f565b915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156130c157600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260149054906101000a900460ff1615151561314957600080fd5b61315333836136d3565b151561315e57600080fd5b61316782612ef7565b151561317257600080fd5b61317c82846140c9565b151561318757600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c55d0f56846000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561322057600080fd5b6102c65a03f1151561323157600080fd5b505050604051805190509050600e548101341015151561325057600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663454a2ab3600e543403856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808281526020019150506000604051808303818588803b15156132e457600080fd5b6125ee5a03f115156132f557600080fd5b5050505061330f8263ffffffff168463ffffffff16614122565b505050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600260149054906101000a900460ff1615151561335957600080fd5b600e54341015151561336a57600080fd5b61337433856136d3565b151561337f57600080fd5b6133898385613c4e565b151561339457600080fd5b6006848154811015156133a357fe5b906000526020600020906002020191506134e9826101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff168152505061408f565b15156134f457600080fd5b60068381548110151561350357fe5b90600052602060002090600202019050613649816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff168152505061408f565b151561365457600080fd5b61366082858386613a39565b151561366b57600080fd5b6136758484614122565b50505050565b61368361440d565b61368b61440d565b6000808460405180591061369c5750595b9080825280601f01601f191660200182016040525092506020830191508590506136c78282876142ec565b82935050505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff166007600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b806009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008273ffffffffffffffffffffffffffffffffffffffff166009600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151561399557600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600a600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556009600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b600081841415613a4c5760009050613c46565b818560010160109054906101000a900463ffffffff1663ffffffff161480613a8d5750818560010160149054906101000a900463ffffffff1663ffffffff16145b15613a9b5760009050613c46565b838360010160109054906101000a900463ffffffff1663ffffffff161480613adc5750838360010160149054906101000a900463ffffffff1663ffffffff16145b15613aea5760009050613c46565b60008360010160109054906101000a900463ffffffff1663ffffffff161480613b2d575060008560010160109054906101000a900463ffffffff1663ffffffff16145b15613b3b5760019050613c46565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff161480613bb057508460010160149054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff16145b15613bbe5760009050613c46565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff161480613c3357508460010160149054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff16145b15613c415760009050613c46565b600190505b949350505050565b60008060006007600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161480613d5757508173ffffffffffffffffffffffffffffffffffffffff16600a600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b9250505092915050565b6000808260a0015163ffffffff1614158015613d9557504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b600080613da7614460565b60008863ffffffff1689141515613dbd57600080fd5b8763ffffffff1688141515613dd157600080fd5b8661ffff1687141515613de357600080fd5b600287811515613def57fe5b049250600d8361ffff161115613e0457600d92505b610100604051908101604052808781526020014267ffffffffffffffff168152602001600067ffffffffffffffff1681526020018a63ffffffff1681526020018963ffffffff168152602001600063ffffffff1681526020018461ffff1681526020018861ffff168152509150600160068054806001018281613e8791906144d4565b916000526020600020906002020160008590919091506000820151816000015560208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601c6101000a81548161ffff021916908361ffff16021790555060e082015181600101601e6101000a81548161ffff021916908361ffff16021790555050500390508063ffffffff1681141515613fd957600080fd5b7f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad58582846060015163ffffffff16856080015163ffffffff168660000151604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a161408060008683613801565b80935050505095945050505050565b6000808260a0015163ffffffff161480156140c257504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b60008060006006858154811015156140dd57fe5b906000526020600020906002020191506006848154811015156140fc57fe5b9060005260206000209060020201905061411882868387613a39565b9250505092915050565b60008060068381548110151561413457fe5b9060005260206000209060020201915060068481548110151561415357fe5b90600052602060002090600202019050828160010160186101000a81548163ffffffff021916908363ffffffff16021790555061418f82614337565b61419881614337565b600a600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600a600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600f600081548092919060010191905055507f241ea03ca20251805084d27d4440371c34a0b85ff108f6bb5611248f73818b806007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685858460010160089054906101000a900467ffffffffffffffff16604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018267ffffffffffffffff16815260200194505050505060405180910390a150505050565b60005b60208210151561431457825184526020840193506020830192506020820391506142ef565b6001826020036101000a0390508019835116818551168181178652505050505050565b43600554600383600101601c9054906101000a900461ffff1661ffff16600e8110151561436057fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff1681151561438b57fe5b04018160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600d81600101601c9054906101000a900461ffff1661ffff16101561440a57600181600101601c8282829054906101000a900461ffff160192506101000a81548161ffff021916908361ffff1602179055505b50565b602060405190810160405280600081525090565b6080604051908101604052806004905b60008019168152602001906001900390816144315790505090565b602060405190810160405280600081525090565b6101006040519081016040528060008152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600061ffff168152602001600061ffff1681525090565b815481835581811511614501576002028160020283600052602060002091820191016145009190614506565b5b505050565b6145cf91905b808211156145cb576000808201600090556001820160006101000a81549067ffffffffffffffff02191690556001820160086101000a81549067ffffffffffffffff02191690556001820160106101000a81549063ffffffff02191690556001820160146101000a81549063ffffffff02191690556001820160186101000a81549063ffffffff021916905560018201601c6101000a81549061ffff021916905560018201601e6101000a81549061ffff02191690555060020161450c565b5090565b905600a165627a7a723058209362fe414c30b76be5bab99038d1480636f63affb77367ed007af7ff14b65b110029", "sourceMap": "65949:4866:18:-;;;5032:5;5011:26;;;;;;;;;;;;;;;;;;;;11384:339;;;;;;;;;11427:9;11384:339;;;;;;;;11450:9;11384:339;;;;;;;;11473:9;11384:339;;;;;;;;11496:10;11384:339;;;;;;;;11520:10;11384:339;;;;;;;;11544:7;11384:339;;;;;;;;11565:7;11384:339;;;;;;;;11586:7;11384:339;;;;;;;;11607:7;11384:339;;;;;;;;11628:8;11384:339;;;;;;;;11650:6;11384:339;;;;;;;;11670:6;11384:339;;;;;;;;11690:6;11384:339;;;;;;;;11710:6;11384:339;;;;;;;;;;;;;;;:::i;:::-;;11840:2;11807:35;;30582:8;30552:38;;65949:4866;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;", "deployedSourceMap": "65949:4866:18:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19989:327;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4848:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29456:346;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18924:45:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24204:395:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4817:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66994:477;;;;;;;;;;;;;;;;;;;;;;;;;;;;25978:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30647:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35349:235;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13853:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25066:784;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31057:470;;;;;;;;;;;;;;;;;;;;;;;;;;;;5800:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;6346;;;;;;;;;;;;;;;;;;;;;;;;;;;;67586:978;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7359:126;;;;;;;;;;;;;;13283:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38051:388;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12965:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68725:796;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34379:90;;;;;;;;;;;;;;;;;;;;;;;;;;33972:189;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6073:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;17342:139;;;;;;;;;;;;;;;;;;;;;;;;;;5011:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26205:180;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66412:467;;;;;;;;;;;;;;;;;;;;;;;;;;;;22243:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11807:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6990:81;;;;;;;;;;;;;;26841:853;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;42595:1586:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70671:142;;;;;;;;;;;;;;18975:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11384:339:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12465:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22790:990;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4879:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30552:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19070:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34991:207;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20416:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;13564:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69769:703;;;;;;;;;;;;;;;;;;;;;;;;;;30817:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40000:1958;;;;;;;;;;;;;;;;;;;;;;;;;;19989:327;20060:4;19175:38;;;;;;;;;;;;;;;;;;;20219:41;;;:12;:41;;;;20218:90;;;;19697:42;;;;;;;;;;;;;;;;;;;19647:35;;;;;;;;;;;;;;;;;;;19582:50;;;;;;;;;;;;;;;;;;;;;;;;19529:38;;;;;;;;;;;;;;;;;;;19477:37;;;;;;;;;;;;;;;;;;;19433:29;;;;;;;;;;;;;;;;;;;19387:31;;;;;;;;;;;;;;;;;;;19346:26;;;;;;;;;;;;;;;;;;;19310:21;;;;;;;;;;;;;;;;;;;19276:19;;;;;;;;;;;;;;;;;;;19269:63;:104;:150;:194;:246;:299;:364;:414;:471;20266:41;;;:12;:41;;;;20218:90;20210:99;;19989:327;;;:::o;4848:25::-;;;;;;;;;;;;;:::o;29456:346::-;29548:14;;:::i;:::-;29621:24;;:::i;:::-;29655:13;29608:1;29582:28;;:14;;;;;;;;;;;:28;;;;29574:37;;;;;;;;29696:14;;;;;;;;;;;:26;;;29723:8;29733:19;;29696:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29678:75;;;;;;;;29771:24;29781:6;29789:5;29771:9;:24::i;:::-;29764:31;;29456:346;;;;;;;:::o;18924:45::-;;;;;;;;;;;;;;;;;;;;:::o;24204:395::-;24384:27;24390:10;24402:8;24384:5;:27::i;:::-;24376:36;;;;;;;;24491:23;24500:8;24510:3;24491:8;:23::i;:::-;24557:35;24566:10;24578:3;24583:8;24557:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24204:395;;:::o;4817:25::-;;;;;;;;;;;;;:::o;66994:477::-;67072:36;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;67130:8;67072:67;;67339:17;:38;;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67331:49;;;;;;;;67447:17;67431:13;;:33;;;;;;;;;;;;;;;;;;66994:477;;:::o;25978:92::-;26022:4;26062:1;26045:7;:14;;;;:18;26038:25;;25978:92;:::o;30647:30::-;;;;:::o;35349:235::-;35420:4;35459:1;35448:8;:12;35440:21;;;;;;;;35576:1;35542:7;35550:8;35542:17;;;;;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;:35;;;;35535:42;;35349:235;;;:::o;13853:39::-;;;;;;;;;;;;;:::o;25066:784::-;25305:1;25290:17;;:3;:17;;;;25282:26;;;;;;;;25563:4;25548:20;;:3;:20;;;;25540:29;;;;;;;;25637:34;25650:10;25662:8;25637:12;:34::i;:::-;25629:43;;;;;;;;25690:22;25696:5;25703:8;25690:5;:22::i;:::-;25682:31;;;;;;;;25812;25822:5;25829:3;25834:8;25812:9;:31::i;:::-;25066:784;;;:::o;31057:470::-;31133:38;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;31195:8;31133:71;;31404:17;:31;;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31396:42;;;;;;;;31503:17;31489:11;;:31;;;;;;;;;;;;;;;;;;31057:470;;:::o;5800:128::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;5887:1;5868:21;;:7;:21;;;;5860:30;;;;;;;;5914:7;5901:10;;:20;;;;;;;;;;;;;;;;;;5800:128;:::o;6346:::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;6433:1;6414:21;;:7;:21;;;;6406:30;;;;;;;;6460:7;6447:10;;:20;;;;;;;;;;;;;;;;;;6346:128;:::o;67586:978::-;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;67958:27;67964:10;67976:8;67958:5;:27::i;:::-;67950:36;;;;;;;;68198:20;68209:8;68198:10;:20::i;:::-;68197:21;68189:30;;;;;;;;68229:31;68238:8;68248:11;;;;;;;;;;;68229:8;:31::i;:::-;68399:11;;;;;;;;;;;:25;;;68438:8;68460:14;68488:12;68514:9;68537:10;68399:158;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67586:978;;;;:::o;7359:126::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;6812:6;;;;;;;;;;;6804:15;;;;;;;;7473:5;7464:6;;:14;;;;;;;;;;;;;;;;;;7359:126::o;13283:56::-;;;;;;;;;;;;;;;;;;;;;;:::o;38051:388::-;38143:4;38225:20;38276:18;38183:1;38171:9;:13;38163:22;;;;;;;;38213:1;38203:7;:11;38195:20;;;;;;;;38248:7;38256:9;38248:18;;;;;;;;;;;;;;;;;;;;38225:41;;38297:7;38305;38297:16;;;;;;;;;;;;;;;;;;;;38276:37;;38330:52;38349:6;38357:9;38368:4;38374:7;38330:18;:52::i;:::-;:102;;;;;38394:38;38413:7;38422:9;38394:18;:38::i;:::-;38330:102;38323:109;;38051:388;;;;;;:::o;12965:56::-;;;;;;;;;;;;;;;;;;;;;;:::o;68725:796::-;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;69099:27;69105:10;69117:8;69099:5;:27::i;:::-;69091:36;;;;;;;;69145:24;69160:8;69145:14;:24::i;:::-;69137:33;;;;;;;;69180;69189:8;69199:13;;;;;;;;;;;69180:8;:33::i;:::-;69354:13;;;;;;;;;;;:27;;;69395:8;69417:14;69445:12;69471:9;69494:10;69354:160;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68725:796;;;;:::o;34379:90::-;5435:10;;;;;;;;;;;5421:24;;:10;:24;;;5413:33;;;;;;;;34459:3;34444:12;:18;;;;34379:90;:::o;33972:189::-;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;34080:26;34086:10;34098:7;34080:5;:26::i;:::-;34072:35;;;;;;;;34149:5;34117:20;:29;34138:7;34117:29;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;33972:189;;:::o;6073:128::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;6160:1;6141:21;;:7;:21;;;;6133:30;;;;;;;;6187:7;6174:10;;:20;;;;;;;;;;;;;;;;;;6073:128;:::o;17342:139::-;5537:10;;;;;;;;;;;5523:24;;:10;:24;;;:64;;;;5577:10;;;;;;;;;;;5563:24;;:10;:24;;;5523:64;:104;;;;5617:10;;;;;;;;;;;5603:24;;:10;:24;;;5523:104;5502:135;;;;;;;;17429:9;17439:1;17429:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17422:19;;:4;:19;17414:28;;;;;;;;17470:4;17452:15;:22;;;;17342:139;:::o;5011:26::-;;;;;;;;;;;;;:::o;26205:180::-;26275:13;26312:17;:27;26330:8;26312:27;;;;;;;;;;;;;;;;;;;;;26304:35;;26375:1;26358:19;;:5;:19;;;;26350:28;;;;;;;;26205:180;;;:::o;66412:467::-;66488:34;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;66542:8;66488:63;;66751:17;:36;;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66743:47;;;;;;;;66855:17;66841:11;;:31;;;;;;;;;;;;;;;;;;66412:467;;:::o;22243:122::-;22299:13;22331:19;:27;22351:6;22331:27;;;;;;;;;;;;;;;;22324:34;;22243:122;;;:::o;11807:35::-;;;;:::o;6990:81::-;5537:10;;;;;;;;;;;5523:24;;:10;:24;;;:64;;;;5577:10;;;;;;;;;;;5563:24;;:10;:24;;;5523:64;:104;;;;5617:10;;;;;;;;;;;5603:24;;:10;:24;;;5523:104;5502:135;;;;;;;;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;7060:4;7051:6;;:13;;;;;;;;;;;;;;;;;;6990:81::o;26841:853::-;26902:21;;:::i;:::-;26935:18;27110:23;;:::i;:::-;27175:17;27222:19;27402:13;26956:17;26966:6;26956:9;:17::i;:::-;26935:38;;27002:1;26988:10;:15;26984:704;;;27077:1;27063:16;;;;;;;;;;;;;;;;;;;;;;;;27056:23;;;;26984:704;27150:10;27136:25;;;;;;;;;;;;;;;;;;;;;;;;27110:51;;27195:13;:11;:13::i;:::-;27175:33;;27244:1;27222:23;;27443:1;27435:9;;27430:220;27455:9;27446:5;:18;;27430:220;;;27525:6;27497:34;;:17;:24;27515:5;27497:24;;;;;;;;;;;;;;;;;;;;;:34;;;27493:143;;;27577:5;27555:6;27562:11;27555:19;;;;;;;;;;;;;;;;;:27;;;;;27604:13;;;;;;;27493:143;27466:7;;;;;;;27430:220;;;27671:6;27664:13;;26841:853;;;;;;;;;:::o;42595:1586::-;42676:7;42753:20;43068:14;43114:18;43230:16;43436:18;43575:13;43629:16;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;42776:7;42784:9;42776:18;;;;;;;;;;;;;;;;;;;;42753:41;;42882:1;42862:6;:16;;;;;;;;;;;;:21;;;;42854:30;;;;;;;;42977:27;42997:6;42977:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:19;:27::i;:::-;42969:36;;;;;;;;43085:6;:19;;;;;;;;;;;;43068:36;;;;43135:7;43143:6;43135:15;;;;;;;;;;;;;;;;;;;;43114:36;;43249:6;:17;;;;;;;;;;;;43230:36;;43298:6;:17;;;;;;;;;;;;43280:35;;:4;:15;;;;;;;;;;;;:35;;;43276:93;;;43343:4;:15;;;;;;;;;;;;43331:27;;43276:93;43457:11;;;;;;;;;;;:20;;;43478:6;:12;;;43492:4;:10;;;43530:1;43504:6;:23;;;;;;;;;;;;:27;43457:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43436:96;;43591:17;:28;43609:9;43591:28;;;;;;;;;;;;;;;;;;;;;43575:44;;43648:78;43661:9;43672:6;:19;;;;;;;;;;;;43648:78;;43705:1;43693:9;:13;43648:78;;43708:10;43720:5;43648:12;:78::i;:::-;43629:97;;43888:6;:19;;;43881:26;;;;;;;;;;;43984:15;;:17;;;;;;;;;;;;;;44081:10;:15;;:29;44097:12;;44081:29;;;;;;;;;;;;;;;;;;;;;;;;44166:8;44159:15;;42595:1586;;;;;;;;;;:::o;70671:142::-;5537:10;;;;;;;;;;;5523:24;;:10;:24;;;:64;;;;5577:10;;;;;;;;;;;5563:24;;:10;:24;;;5523:64;:104;;;;5617:10;;;;;;;;;;;5603:24;;:10;:24;;;5523:104;5502:135;;;;;;;;70736:11;;;;;;;;;;;:27;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70775:13;;;;;;;;;;;:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70671:142::o;18975:36::-;;;;;;;;;;;;;;;;;;;;:::o;11384:339::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;12465:53::-;;;;;;;;;;;;;;;;;;;;;;:::o;22790:990::-;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;22999:1;22984:17;;:3;:17;;;;22976:26;;;;;;;;23257:4;23242:20;;:3;:20;;;;23234:29;;;;;;;;23498:11;;;;;;;;;;;23483:27;;:3;:27;;;;23475:36;;;;;;;;23544:13;;;;;;;;;;;23529:29;;:3;:29;;;;23521:38;;;;;;;;23621:27;23627:10;23639:8;23621:5;:27::i;:::-;23613:36;;;;;;;;23737;23747:10;23759:3;23764:8;23737:9;:36::i;:::-;22790:990;;:::o;4879:25::-;;;;;;;;;;;;;:::o;30552:38::-;;;;:::o;19070:43::-;;;;;;;;;;;;;:::o;34991:207::-;35066:4;35117:17;35105:1;35094:8;:12;35086:21;;;;;;;;35137:7;35145:8;35137:17;;;;;;;;;;;;;;;;;;;;35117:37;;35171:20;35187:3;35171:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:15;:20::i;:::-;35164:27;;34991:207;;;;:::o;20416:142::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;20534:16;20495:14;;:56;;;;;;;;;;;;;;;;;;20416:142;:::o;13564:35::-;;;;;;;;;;;;;:::o;69769:703::-;70165:20;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;69967:28;69973:10;69985:9;69967:5;:28::i;:::-;69959:37;;;;;;;;70014:25;70029:9;70014:14;:25::i;:::-;70006:34;;;;;;;;70058:43;70082:9;70093:7;70058:23;:43::i;:::-;70050:52;;;;;;;;70188:13;;;;;;;;;;;:29;;;70218:7;70188:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70165:61;;70272:12;;70257;:27;70244:9;:40;;70236:49;;;;;;;;70351:13;;;;;;;;;;;:17;;;70387:12;;70375:9;:24;70401:7;70351:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70419:46;70437:9;70419:46;;70456:7;70419:46;;:10;:46::i;:::-;69769:703;;;:::o;30817:39::-;;;;;;;;;;;;;:::o;40000:1958::-;41267:20;41494:18;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;40168:12;;40155:9;:25;;40147:34;;;;;;;;40239:28;40245:10;40257:9;40239:5;:28::i;:::-;40231:37;;;;;;;;41165:38;41184:7;41193:9;41165:18;:38::i;:::-;41157:47;;;;;;;;41290:7;41298:9;41290:18;;;;;;;;;;;;;;;;;;;;41267:41;;41409:23;41425:6;41409:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:15;:23::i;:::-;41401:32;;;;;;;;41515:7;41523;41515:16;;;;;;;;;;;;;;;;;;;;41494:37;;41630:21;41646:4;41630:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:15;:21::i;:::-;41622:30;;;;;;;;41728:130;41764:6;41788:9;41815:4;41837:7;41728:18;:130::i;:::-;41720:139;;;;;;;;41921:30;41932:9;41943:7;41921:10;:30::i;:::-;40000:1958;;;;:::o;28808:403::-;28894:6;;:::i;:::-;28912:16;;:::i;:::-;28966:17;28993:16;28942:13;28931:25;;;;;;;;;;;;;;;;;;;;;;;;;;;28912:44;;29074:2;29060:12;29056:3;29043:34;;29102:9;29090:21;;29131:43;29139:9;29150:8;29160:13;29131:7;:43::i;:::-;29192:12;29185:19;;28808:403;;;;;;;:::o;20967:145::-;21042:4;21096:9;21065:40;;:17;:27;21083:8;21065:27;;;;;;;;;;;;;;;;;;;;;:40;;;21058:47;;20967:145;;;;:::o;21944:123::-;22051:9;22018:20;:30;22039:8;22018:30;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;21944:123;;:::o;21346:155::-;21428:4;21485:9;21451:43;;:20;:30;21472:8;21451:30;;;;;;;;;;;;;;;;;;;;;:43;;;21444:50;;21346:155;;;;:::o;13965:758::-;14129:19;:24;14149:3;14129:24;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;14225:3;14195:17;:27;14213:8;14195:27;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;14345:1;14328:19;;:5;:19;;;;14324:317;;;14363:19;:26;14383:5;14363:26;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;14485:20;:30;14506:8;14485:30;;;;;;;;;;;;14478:37;;;;;;;;;;;14600:20;:30;14621:8;14600:30;;;;;;;;;;;;14593:37;;;;;;;;;;;14324:317;14686:30;14695:5;14702:3;14707:8;14686:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13965:758;;;:::o;35986:1169::-;36165:4;36246:7;36233:9;:20;36229:63;;;36276:5;36269:12;;;;36229:63;36377:7;36357;:16;;;;;;;;;;;;:27;;;:56;;;;36406:7;36388;:14;;;;;;;;;;;;:25;;;36357:56;36353:99;;;36436:5;36429:12;;;;36353:99;36483:9;36465:5;:14;;;;;;;;;;;;:27;;;:56;;;;36512:9;36496:5;:12;;;;;;;;;;;;:25;;;36465:56;36461:99;;;36544:5;36537:12;;;;36461:99;36714:1;36696:5;:14;;;;;;;;;;;;:19;;;:44;;;;36739:1;36719:7;:16;;;;;;;;;;;;:21;;;36696:44;36692:86;;;36763:4;36756:11;;;;36692:86;36869:7;:16;;;;;;;;;;;;36851:34;;:5;:14;;;;;;;;;;;;:34;;;:70;;;;36907:7;:14;;;;;;;;;;;;36889:32;;:5;:14;;;;;;;;;;;;:32;;;36851:70;36847:113;;;36944:5;36937:12;;;;36847:113;36989:7;:16;;;;;;;;;;;;36973:32;;:5;:12;;;;;;;;;;;;:32;;;:66;;;;37025:7;:14;;;;;;;;;;;;37009:30;;:5;:12;;;;;;;;;;;;:30;;;36973:66;36969:109;;;37062:5;37055:12;;;;36969:109;37144:4;37137:11;;35986:1169;;;;;;;:::o;32350:441::-;32437:4;32453:19;32513:17;32475;:28;32493:9;32475:28;;;;;;;;;;;;;;;;;;;;;32453:50;;32533:17;:26;32551:7;32533:26;;;;;;;;;;;;;;;;;;;;;32513:46;;32726:9;32711:24;;:11;:24;;;:72;;;;32772:11;32739:44;;:20;:29;32760:7;32739:29;;;;;;;;;;;;;;;;;;;;;:44;;;32711:72;32703:81;;32350:441;;;;;;:::o;34588:177::-;34654:4;34702:1;34678:7;:20;;;:25;;;;34677:81;;;;;34744:12;34709:48;;:7;:24;;;:48;;;;34677:81;34670:88;;34588:177;;;:::o;15381:1876::-;15564:4;16148:20;16281:19;;:::i;:::-;16624;15942:9;15927:26;;15914:9;:39;15906:48;;;;;;;;15998:7;15983:24;;15972:7;:35;15964:44;;;;;;;;16056:11;16041:28;;16026:11;:43;16018:52;;;;;;;;16192:1;16178:11;:15;;;;;;;;16148:46;;16224:2;16208:13;:18;;;16204:67;;;16258:2;16242:18;;16204:67;16303:311;;;;;;;;;16330:6;16303:311;;;;16368:3;16303:311;;;;;;16404:1;16303:311;;;;;;16436:9;16303:311;;;;;;16475:7;16303:311;;;;;;16511:1;16303:311;;;;;;16541:13;16303:311;;;;;;16587:11;16303:311;;;;;16281:333;;16669:1;16646:7;:20;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;16659:6;16646:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:24;16624:46;;16857:11;16842:28;;16827:11;:43;16819:52;;;;;;;;16914:160;16933:6;16953:11;16986:6;:15;;;16978:24;;17024:6;:13;;;17016:22;;17052:6;:12;;;16914:160;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17188:33;17198:1;17201:6;17209:11;17188:9;:33::i;:::-;17239:11;17232:18;;15381:1876;;;;;;;;;;:::o;31720:397::-;31780:4;32057:1;32036:4;:17;;;:22;;;32035:75;;;;;32096:12;32064:45;;:4;:21;;;:45;;;;32035:75;32028:82;;31720:397;;;:::o;37332:288::-;37436:4;37456:20;37507:18;37479:7;37487:9;37479:18;;;;;;;;;;;;;;;;;;;;37456:41;;37528:7;37536;37528:16;;;;;;;;;;;;;;;;;;;;37507:37;;37561:52;37580:6;37588:9;37599:4;37605:7;37561:18;:52::i;:::-;37554:59;;37332:288;;;;;;:::o;38573:924::-;38705:18;38752:20;38726:7;38734;38726:16;;;;;;;;;;;;;;;;;;;;38705:37;;38775:7;38783:9;38775:18;;;;;;;;;;;;;;;;;;;;38752:41;;38907:7;38878:6;:19;;;:37;;;;;;;;;;;;;;;;;;38976:22;38993:4;38976:16;:22::i;:::-;39008:24;39025:6;39008:16;:24::i;:::-;39185:20;:31;39206:9;39185:31;;;;;;;;;;;;39178:38;;;;;;;;;;;39233:20;:29;39254:7;39233:29;;;;;;;;;;;;39226:36;;;;;;;;;;;39342:15;;:17;;;;;;;;;;;;;39407:83;39416:17;:28;39434:9;39416:28;;;;;;;;;;;;;;;;;;;;;39446:9;39457:7;39466:6;:23;;;;;;;;;;;;39407:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38573:924;;;;:::o;27965:565::-;28301:12;28089:170;28103:2;28095:4;:10;;28089:170;;;28180:4;28174:5;28167;28160:6;28222:2;28213:11;;;;28246:2;28238:10;;;;28115:2;28107:10;;;;28089:170;;;28337:1;28329:4;28324:2;:9;28316:3;:18;:22;28301:37;;28407:4;28403:3;28396:4;28390:5;28386:3;28460:4;28452:5;28446;28442:3;28505:7;28495:8;28492:2;28485:5;28478:6;28357:167;;;;;;:::o;33053:596::-;33306:12;33287:15;;33254:9;33264:7;:21;;;;;;;;;;;;33254:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:48;;;;;;;;;;33253:65;33219:7;:24;;;:100;;;;;;;;;;;;;;;;;;33588:2;33564:7;:21;;;;;;;;;;;;:26;;;33560:83;;;33631:1;33606:7;:21;;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33560:83;33053:596;:::o;65949:4866::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", "source": "pragma solidity 0.4.18;\n\n/**\n The following contract code, titled KittyCore, was written by Cryptokitties and published\n and retrieved from https://etherscan.io/address/0x06012c8cf97bead5deae237070f9587f8e7a266d#code.\n\n It is included in the current project for test purposes, to ensure that our collateralizer can\n handle ERC721 tokens created by the KittyCore contract.\n*/\n\n/**\n * @title KittiesOwnable\n * @dev The KittiesOwnable contract has an owner address, and provides basic authorization control\n * functions, this simplifies the implementation of \"user permissions\".\n */\ncontract KittiesOwnable {\n address public owner;\n\n\n /**\n\t * @dev The KittiesOwnable constructor sets the original `owner` of the contract to the sender\n\t * account.\n\t */\n function KittiesOwnable() {\n owner = msg.sender;\n }\n\n\n /**\n\t * @dev Throws if called by any account other than the owner.\n\t */\n modifier onlyOwner() {\n require(msg.sender == owner);\n _;\n }\n\n\n /**\n\t * @dev Allows the current owner to transfer control of the contract to a newOwner.\n\t * @param newOwner The address to transfer ownership to.\n\t */\n function transferOwnership(address newOwner) onlyOwner {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n\n}\n\n\n\n/// @title Interface for contracts conforming to ERC-721: Non-Fungible Tokens\n/// @author Dieter Shirley (https://github.com/dete)\ncontract KittiesERC721 {\n // Required methods\n function totalSupply() public view returns (uint256 total);\n function balanceOf(address _owner) public view returns (uint256 balance);\n function ownerOf(uint256 _tokenId) external view returns (address owner);\n function approve(address _to, uint256 _tokenId) external;\n function transfer(address _to, uint256 _tokenId) external;\n function transferFrom(address _from, address _to, uint256 _tokenId) external;\n\n // Events\n event Transfer(address from, address to, uint256 tokenId);\n event Approval(address owner, address approved, uint256 tokenId);\n\n // Optional\n // function name() public view returns (string name);\n // function symbol() public view returns (string symbol);\n // function tokensOfOwner(address _owner) external view returns (uint256[] tokenIds);\n // function tokenMetadata(uint256 _tokenId, string _preferredTransport) public view returns (string infoUrl);\n\n // ERC-165 Compatibility (https://github.com/ethereum/EIPs/issues/165)\n function supportsInterface(bytes4 _interfaceID) external view returns (bool);\n}\n\n\n// // Auction wrapper functions\n\n\n// Auction wrapper functions\n\n\n\n\n\n\n\n/// @title SEKRETOOOO\ncontract GeneScienceInterface {\n /// @dev simply a boolean to indicate this is the contract we expect to be\n function isGeneScience() public pure returns (bool);\n\n /// @dev given genes of kitten 1 & 2, return a genetic combination - may have a random factor\n /// @param genes1 genes of mom\n /// @param genes2 genes of sire\n /// @return the genes that are supposed to be passed down the child\n function mixGenes(uint256 genes1, uint256 genes2, uint256 targetBlock) public returns (uint256);\n}\n\n\n\n\n\n\n\n/// @title A facet of KittyCore that manages special access privileges.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyAccessControl {\n // This facet controls access control for CryptoKitties. There are four roles managed here:\n //\n // - The CEO: The CEO can reassign other roles and change the addresses of our dependent smart\n // contracts. It is also the only role that can unpause the smart contract. It is initially\n // set to the address that created the smart contract in the KittyCore constructor.\n //\n // - The CFO: The CFO can withdraw funds from KittyCore and its auction contracts.\n //\n // - The COO: The COO can release gen0 kitties to auction, and mint promo cats.\n //\n // It should be noted that these roles are distinct without overlap in their access abilities, the\n // abilities listed for each role above are exhaustive. In particular, while the CEO can assign any\n // address to any role, the CEO address itself doesn't have the ability to act in those roles. This\n // restriction is intentional so that we aren't tempted to use the CEO address frequently out of\n // convenience. The less we use an address, the less likely it is that we somehow compromise the\n // account.\n\n /// @dev Emited when contract is upgraded - See README.md for updgrade plan\n event ContractUpgrade(address newContract);\n\n // The addresses of the accounts (or contracts) that can execute actions within each roles.\n address public ceoAddress;\n address public cfoAddress;\n address public cooAddress;\n\n // @dev Keeps track whether the contract is paused. When that is true, most actions are blocked\n bool public paused = false;\n\n /// @dev Access modifier for CEO-only functionality\n modifier onlyCEO() {\n require(msg.sender == ceoAddress);\n _;\n }\n\n /// @dev Access modifier for CFO-only functionality\n modifier onlyCFO() {\n require(msg.sender == cfoAddress);\n _;\n }\n\n /// @dev Access modifier for COO-only functionality\n modifier onlyCOO() {\n require(msg.sender == cooAddress);\n _;\n }\n\n modifier onlyCLevel() {\n require(\n msg.sender == cooAddress ||\n msg.sender == ceoAddress ||\n msg.sender == cfoAddress\n );\n _;\n }\n\n /// @dev Assigns a new address to act as the CEO. Only available to the current CEO.\n /// @param _newCEO The address of the new CEO\n function setCEO(address _newCEO) external onlyCEO {\n require(_newCEO != address(0));\n\n ceoAddress = _newCEO;\n }\n\n /// @dev Assigns a new address to act as the CFO. Only available to the current CEO.\n /// @param _newCFO The address of the new CFO\n function setCFO(address _newCFO) external onlyCEO {\n require(_newCFO != address(0));\n\n cfoAddress = _newCFO;\n }\n\n /// @dev Assigns a new address to act as the COO. Only available to the current CEO.\n /// @param _newCOO The address of the new COO\n function setCOO(address _newCOO) external onlyCEO {\n require(_newCOO != address(0));\n\n cooAddress = _newCOO;\n }\n\n /*** KittiesPausable functionality adapted from OpenZeppelin ***/\n\n /// @dev Modifier to allow actions only when the contract IS NOT paused\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /// @dev Modifier to allow actions only when the contract IS paused\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /// @dev Called by any \"C-level\" role to pause the contract. Used only when\n /// a bug or exploit is detected and we need to limit damage.\n function pause() external onlyCLevel whenNotPaused {\n paused = true;\n }\n\n /// @dev Unpauses the smart contract. Can only be called by the CEO, since\n /// one reason we may pause the contract is when CFO or COO accounts are\n /// compromised.\n /// @notice This is public rather than external so it can be called by\n /// derived contracts.\n function unpause() public onlyCEO whenPaused {\n // can't unpause if contract was upgraded\n paused = false;\n }\n}\n\n\n\n\n/// @title Base contract for CryptoKitties. Holds all common structs, events and base variables.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBase is KittyAccessControl {\n /*** EVENTS ***/\n\n /// @dev The Birth event is fired whenever a new kitten comes into existence. This obviously\n /// includes any time a cat is created through the giveBirth method, but it is also called\n /// when a new gen0 cat is created.\n event Birth(address owner, uint256 kittyId, uint256 matronId, uint256 sireId, uint256 genes);\n\n /// @dev Transfer event as defined in current draft of ERC721. Emitted every time a kitten\n /// ownership is assigned, including births.\n event Transfer(address from, address to, uint256 tokenId);\n\n /*** DATA TYPES ***/\n\n /// @dev The main Kitty struct. Every cat in CryptoKitties is represented by a copy\n /// of this structure, so great care was taken to ensure that it fits neatly into\n /// exactly two 256-bit words. Note that the order of the members in this structure\n /// is important because of the byte-packing rules used by Ethereum.\n /// Ref: http://solidity.readthedocs.io/en/develop/miscellaneous.html\n struct Kitty {\n // The Kitty's genetic code is packed into these 256-bits, the format is\n // sooper-sekret! A cat's genes never change.\n uint256 genes;\n\n // The timestamp from the block when this cat came into existence.\n uint64 birthTime;\n\n // The minimum timestamp after which this cat can engage in breeding\n // activities again. This same timestamp is used for the pregnancy\n // timer (for matrons) as well as the siring cooldown.\n uint64 cooldownEndBlock;\n\n // The ID of the parents of this kitty, set to 0 for gen0 cats.\n // Note that using 32-bit unsigned integers limits us to a \"mere\"\n // 4 billion cats. This number might seem small until you realize\n // that Ethereum currently has a limit of about 500 million\n // transactions per year! So, this definitely won't be a problem\n // for several years (even as Ethereum learns to scale).\n uint32 matronId;\n uint32 sireId;\n\n // Set to the ID of the sire cat for matrons that are pregnant,\n // zero otherwise. A non-zero value here is how we know a cat\n // is pregnant. Used to retrieve the genetic material for the new\n // kitten when the birth transpires.\n uint32 siringWithId;\n\n // Set to the index in the cooldown array (see below) that represents\n // the current cooldown duration for this Kitty. This starts at zero\n // for gen0 cats, and is initialized to floor(generation/2) for others.\n // Incremented by one for each successful breeding action, regardless\n // of whether this cat is acting as matron or sire.\n uint16 cooldownIndex;\n\n // The \"generation number\" of this cat. Cats minted by the CK contract\n // for sale are called \"gen0\" and have a generation number of 0. The\n // generation number of all other cats is the larger of the two generation\n // numbers of their parents, plus one.\n // (i.e. max(matron.generation, sire.generation) + 1)\n uint16 generation;\n }\n\n /*** CONSTANTS ***/\n\n /// @dev A lookup table indicating the cooldown duration after any successful\n /// breeding action, called \"pregnancy time\" for matrons and \"siring cooldown\"\n /// for sires. Designed such that the cooldown roughly doubles each time a cat\n /// is bred, encouraging owners not to just keep breeding the same cat over\n /// and over again. Caps out at one week (a cat can breed an unbounded number\n /// of times, and the maximum cooldown is always seven days).\n uint32[14] public cooldowns = [\n uint32(1 minutes),\n uint32(2 minutes),\n uint32(5 minutes),\n uint32(10 minutes),\n uint32(30 minutes),\n uint32(1 hours),\n uint32(2 hours),\n uint32(4 hours),\n uint32(8 hours),\n uint32(16 hours),\n uint32(1 days),\n uint32(2 days),\n uint32(4 days),\n uint32(7 days)\n ];\n\n // An approximation of currently how many seconds are in between blocks.\n uint256 public secondsPerBlock = 15;\n\n /*** STORAGE ***/\n\n /// @dev An array containing the Kitty struct for all Kitties in existence. The ID\n /// of each cat is actually an index into this array. Note that ID 0 is a negacat,\n /// the unKitty, the mythical beast that is the parent of all gen0 cats. A bizarre\n /// creature that is both matron and sire... to itself! Has an invalid genetic code.\n /// In other words, cat ID 0 is invalid... ;-)\n Kitty[] kitties;\n\n /// @dev A mapping from cat IDs to the address that owns them. All cats have\n /// some valid owner address, even gen0 cats are created with a non-zero owner.\n mapping (uint256 => address) public kittyIndexToOwner;\n\n // @dev A mapping from owner address to count of tokens that address owns.\n // Used internally inside balanceOf() to resolve ownership count.\n mapping (address => uint256) ownershipTokenCount;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to call\n /// transferFrom(). Each Kitty can only have one approved address for transfer\n /// at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public kittyIndexToApproved;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to use\n /// this Kitty for siring via breedWith(). Each Kitty can only have one approved\n /// address for siring at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public sireAllowedToAddress;\n\n /// @dev The address of the ClockAuction contract that handles sales of Kitties. This\n /// same contract handles both peer-to-peer sales as well as the gen0 sales which are\n /// initiated every 15 minutes.\n SaleClockAuction public saleAuction;\n\n /// @dev The address of a custom ClockAuction subclassed contract that handles siring\n /// auctions. Needs to be separate from saleAuction because the actions taken on success\n /// after a sales and siring auction are quite different.\n SiringClockAuction public siringAuction;\n\n /// @dev Assigns ownership of a specific Kitty to an address.\n function _transfer(address _from, address _to, uint256 _tokenId) internal {\n // Since the number of kittens is capped to 2^32 we can't overflow this\n ownershipTokenCount[_to]++;\n // transfer ownership\n kittyIndexToOwner[_tokenId] = _to;\n // When creating new kittens _from is 0x0, but we can't account that address.\n if (_from != address(0)) {\n ownershipTokenCount[_from]--;\n // once the kitten is transferred also clear sire allowances\n delete sireAllowedToAddress[_tokenId];\n // clear any previously approved ownership exchange\n delete kittyIndexToApproved[_tokenId];\n }\n // Emit the transfer event.\n Transfer(_from, _to, _tokenId);\n }\n\n /// @dev An internal method that creates a new kitty and stores it. This\n /// method doesn't do any checking and should only be called when the\n /// input data is known to be valid. Will generate both a Birth event\n /// and a Transfer event.\n /// @param _matronId The kitty ID of the matron of this cat (zero for gen0)\n /// @param _sireId The kitty ID of the sire of this cat (zero for gen0)\n /// @param _generation The generation number of this cat, must be computed by caller.\n /// @param _genes The kitty's genetic code.\n /// @param _owner The inital owner of this cat, must be non-zero (except for the unKitty, ID 0)\n function _createKitty(\n uint256 _matronId,\n uint256 _sireId,\n uint256 _generation,\n uint256 _genes,\n address _owner\n )\n internal\n returns (uint)\n {\n // These requires are not strictly necessary, our calling code should make\n // sure that these conditions are never broken. However! _createKitty() is already\n // an expensive call (for storage), and it doesn't hurt to be especially careful\n // to ensure our data structures are always valid.\n require(_matronId == uint256(uint32(_matronId)));\n require(_sireId == uint256(uint32(_sireId)));\n require(_generation == uint256(uint16(_generation)));\n\n // New kitty starts with the same cooldown as parent gen/2\n uint16 cooldownIndex = uint16(_generation / 2);\n if (cooldownIndex > 13) {\n cooldownIndex = 13;\n }\n\n Kitty memory _kitty = Kitty({\n genes: _genes,\n birthTime: uint64(now),\n cooldownEndBlock: 0,\n matronId: uint32(_matronId),\n sireId: uint32(_sireId),\n siringWithId: 0,\n cooldownIndex: cooldownIndex,\n generation: uint16(_generation)\n });\n uint256 newKittenId = kitties.push(_kitty) - 1;\n\n // It's probably never going to happen, 4 billion cats is A LOT, but\n // let's just be 100% sure we never let this happen.\n require(newKittenId == uint256(uint32(newKittenId)));\n\n // emit the birth event\n Birth(\n _owner,\n newKittenId,\n uint256(_kitty.matronId),\n uint256(_kitty.sireId),\n _kitty.genes\n );\n\n // This will assign ownership, and also emit the Transfer event as\n // per ERC721 draft\n _transfer(0, _owner, newKittenId);\n\n return newKittenId;\n }\n\n // Any C-level can fix how many seconds per blocks are currently observed.\n function setSecondsPerBlock(uint256 secs) external onlyCLevel {\n require(secs < cooldowns[0]);\n secondsPerBlock = secs;\n }\n}\n\n\n\n\n\n/// @title The external contract that is responsible for generating metadata for the kitties,\n/// it has one function that will return the data as bytes.\ncontract KittiesERC721Metadata {\n /// @dev Given a token Id, returns a byte array that is supposed to be converted into string.\n function getMetadata(uint256 _tokenId, string) public view returns (bytes32[4] buffer, uint256 count) {\n if (_tokenId == 1) {\n buffer[0] = \"Hello World! :D\";\n count = 15;\n } else if (_tokenId == 2) {\n buffer[0] = \"I would definitely choose a medi\";\n buffer[1] = \"um length string.\";\n count = 49;\n } else if (_tokenId == 3) {\n buffer[0] = \"Lorem ipsum dolor sit amet, mi e\";\n buffer[1] = \"st accumsan dapibus augue lorem,\";\n buffer[2] = \" tristique vestibulum id, libero\";\n buffer[3] = \" suscipit varius sapien aliquam.\";\n count = 128;\n }\n }\n}\n\n\n/// @title The facet of the CryptoKitties core contract that manages ownership, ERC-721 (draft) compliant.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev Ref: https://github.com/ethereum/EIPs/issues/721\n/// See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyOwnership is KittyBase, KittiesERC721 {\n\n /// @notice Name and symbol of the non fungible token, as defined in ERC721.\n string public constant name = \"CryptoKitties\";\n string public constant symbol = \"CK\";\n\n // The contract that will return kitty metadata\n KittiesERC721Metadata public erc721Metadata;\n\n bytes4 constant InterfaceSignature_ERC165 =\n bytes4(keccak256('supportsInterface(bytes4)'));\n\n bytes4 constant InterfaceSignature_ERC721 =\n bytes4(keccak256('name()')) ^\n bytes4(keccak256('symbol()')) ^\n bytes4(keccak256('totalSupply()')) ^\n bytes4(keccak256('balanceOf(address)')) ^\n bytes4(keccak256('ownerOf(uint256)')) ^\n bytes4(keccak256('approve(address,uint256)')) ^\n bytes4(keccak256('transfer(address,uint256)')) ^\n bytes4(keccak256('transferFrom(address,address,uint256)')) ^\n bytes4(keccak256('tokensOfOwner(address)')) ^\n bytes4(keccak256('tokenMetadata(uint256,string)'));\n\n /// @notice Introspection interface as per ERC-165 (https://github.com/ethereum/EIPs/issues/165).\n /// Returns true for any standardized interfaces implemented by this contract. We implement\n /// ERC-165 (obviously!) and ERC-721.\n function supportsInterface(bytes4 _interfaceID) external view returns (bool)\n {\n // DEBUG ONLY\n //require((InterfaceSignature_ERC165 == 0x01ffc9a7) && (InterfaceSignature_ERC721 == 0x9a20483d));\n\n return ((_interfaceID == InterfaceSignature_ERC165) || (_interfaceID == InterfaceSignature_ERC721));\n }\n\n /// @dev Set the address of the sibling contract that tracks metadata.\n /// CEO only.\n function setMetadataAddress(address _contractAddress) public onlyCEO {\n erc721Metadata = KittiesERC721Metadata(_contractAddress);\n }\n\n // Internal utility functions: These functions all assume that their input arguments\n // are valid. We leave it to public methods to sanitize their inputs and follow\n // the required logic.\n\n /// @dev Checks if a given address is the current owner of a particular Kitty.\n /// @param _claimant the address we are validating against.\n /// @param _tokenId kitten id, only valid when > 0\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToOwner[_tokenId] == _claimant;\n }\n\n /// @dev Checks if a given address currently has transferApproval for a particular Kitty.\n /// @param _claimant the address we are confirming kitten is approved for.\n /// @param _tokenId kitten id, only valid when > 0\n function _approvedFor(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToApproved[_tokenId] == _claimant;\n }\n\n /// @dev Marks an address as being approved for transferFrom(), overwriting any previous\n /// approval. Setting _approved to address(0) clears all transfer approval.\n /// NOTE: _approve() does NOT send the Approval event. This is intentional because\n /// _approve() and transferFrom() are used together for putting Kitties on auction, and\n /// there is no value in spamming the log with Approval events in that case.\n function _approve(uint256 _tokenId, address _approved) internal {\n kittyIndexToApproved[_tokenId] = _approved;\n }\n\n /// @notice Returns the number of Kitties owned by a specific address.\n /// @param _owner The owner address to check.\n /// @dev Required for ERC-721 compliance\n function balanceOf(address _owner) public view returns (uint256 count) {\n return ownershipTokenCount[_owner];\n }\n\n /// @notice Transfers a Kitty to another address. If transferring to a smart\n /// contract be VERY CAREFUL to ensure that it is aware of ERC-721 (or\n /// CryptoKitties specifically) or your Kitty may be lost forever. Seriously.\n /// @param _to The address of the recipient, can be a user or contract.\n /// @param _tokenId The ID of the Kitty to transfer.\n /// @dev Required for ERC-721 compliance.\n function transfer(\n address _to,\n uint256 _tokenId\n )\n external\n whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Disallow transfers to the auction contracts to prevent accidental\n // misuse. Auction contracts should only take ownership of kitties\n // through the allow + transferFrom flow.\n require(_to != address(saleAuction));\n require(_to != address(siringAuction));\n\n // You can only send your own cat.\n require(_owns(msg.sender, _tokenId));\n\n // Reassign ownership, clear pending approvals, emit Transfer event.\n _transfer(msg.sender, _to, _tokenId);\n }\n\n /// @notice Grant another address the right to transfer a specific Kitty via\n /// transferFrom(). This is the preferred flow for transfering NFTs to contracts.\n /// @param _to The address to be granted transfer approval. Pass address(0) to\n /// clear all approvals.\n /// @param _tokenId The ID of the Kitty that can be transferred if this call succeeds.\n /// @dev Required for ERC-721 compliance.\n function approve(\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Only an owner can grant transfer approval.\n require(_owns(msg.sender, _tokenId));\n\n // Register the approval (replacing any previous approval).\n _approve(_tokenId, _to);\n\n // Emit approval event.\n Approval(msg.sender, _to, _tokenId);\n }\n\n /// @notice Transfer a Kitty owned by another address, for which the calling address\n /// has previously been granted transfer approval by the owner.\n /// @param _from The address that owns the Kitty to be transfered.\n /// @param _to The address that should take ownership of the Kitty. Can be any address,\n /// including the caller.\n /// @param _tokenId The ID of the Kitty to be transferred.\n /// @dev Required for ERC-721 compliance.\n function transferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Check for approval and valid ownership\n require(_approvedFor(msg.sender, _tokenId));\n require(_owns(_from, _tokenId));\n\n // Reassign ownership (also clears pending approvals and emits Transfer event).\n _transfer(_from, _to, _tokenId);\n }\n\n /// @notice Returns the total number of Kitties currently in existence.\n /// @dev Required for ERC-721 compliance.\n function totalSupply() public view returns (uint) {\n return kitties.length - 1;\n }\n\n /// @notice Returns the address currently assigned ownership of a given Kitty.\n /// @dev Required for ERC-721 compliance.\n function ownerOf(uint256 _tokenId)\n external\n view\n returns (address owner)\n {\n owner = kittyIndexToOwner[_tokenId];\n\n require(owner != address(0));\n }\n\n /// @notice Returns a list of all Kitty IDs assigned to an address.\n /// @param _owner The owner whose Kitties we are interested in.\n /// @dev This method MUST NEVER be called by smart contract code. First, it's fairly\n /// expensive (it walks the entire Kitty array looking for cats belonging to owner),\n /// but it also returns a dynamic array, which is only supported for web3 calls, and\n /// not contract-to-contract calls.\n function tokensOfOwner(address _owner) external view returns(uint256[] ownerTokens) {\n uint256 tokenCount = balanceOf(_owner);\n\n if (tokenCount == 0) {\n // Return an empty array\n return new uint256[](0);\n } else {\n uint256[] memory result = new uint256[](tokenCount);\n uint256 totalCats = totalSupply();\n uint256 resultIndex = 0;\n\n // We count on the fact that all cats have IDs starting at 1 and increasing\n // sequentially up to the totalCat count.\n uint256 catId;\n\n for (catId = 1; catId <= totalCats; catId++) {\n if (kittyIndexToOwner[catId] == _owner) {\n result[resultIndex] = catId;\n resultIndex++;\n }\n }\n\n return result;\n }\n }\n\n /// @dev Adapted from memcpy() by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _memcpy(uint _dest, uint _src, uint _len) private view {\n // Copy word-length chunks while possible\n for(; _len >= 32; _len -= 32) {\n assembly {\n mstore(_dest, mload(_src))\n }\n _dest += 32;\n _src += 32;\n }\n\n // Copy remaining bytes\n uint256 mask = 256 ** (32 - _len) - 1;\n assembly {\n let srcpart := and(mload(_src), not(mask))\n let destpart := and(mload(_dest), mask)\n mstore(_dest, or(destpart, srcpart))\n }\n }\n\n /// @dev Adapted from toString(slice) by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _toString(bytes32[4] _rawBytes, uint256 _stringLength) private view returns (string) {\n var outputString = new string(_stringLength);\n uint256 outputPtr;\n uint256 bytesPtr;\n\n assembly {\n outputPtr := add(outputString, 32)\n bytesPtr := _rawBytes\n }\n\n _memcpy(outputPtr, bytesPtr, _stringLength);\n\n return outputString;\n }\n\n /// @notice Returns a URI pointing to a metadata package for this token conforming to\n /// ERC-721 (https://github.com/ethereum/EIPs/issues/721)\n /// @param _tokenId The ID number of the Kitty whose metadata should be returned.\n function tokenMetadata(uint256 _tokenId, string _preferredTransport) external view returns (string infoUrl) {\n require(erc721Metadata != address(0));\n bytes32[4] memory buffer;\n uint256 count;\n (buffer, count) = erc721Metadata.getMetadata(_tokenId, _preferredTransport);\n\n return _toString(buffer, count);\n }\n}\n\n\n\n/// @title A facet of KittyCore that manages Kitty siring, gestation, and birth.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBreeding is KittyOwnership {\n\n /// @dev The Pregnant event is fired when two cats successfully breed and the pregnancy\n /// timer begins for the matron.\n event Pregnant(address owner, uint256 matronId, uint256 sireId, uint256 cooldownEndBlock);\n\n /// @notice The minimum payment required to use breedWithAuto(). This fee goes towards\n /// the gas cost paid by whatever calls giveBirth(), and can be dynamically updated by\n /// the COO role as the gas price changes.\n uint256 public autoBirthFee = 2 finney;\n\n // Keeps track of number of pregnant kitties.\n uint256 public pregnantKitties;\n\n /// @dev The address of the sibling contract that is used to implement the sooper-sekret\n /// genetic combination algorithm.\n GeneScienceInterface public geneScience;\n\n /// @dev Update the address of the genetic contract, can only be called by the CEO.\n /// @param _address An address of a GeneScience contract instance to be used from this point forward.\n function setGeneScienceAddress(address _address) external onlyCEO {\n GeneScienceInterface candidateContract = GeneScienceInterface(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isGeneScience());\n\n // Set the new contract address\n geneScience = candidateContract;\n }\n\n /// @dev Checks that a given kitten is able to breed. Requires that the\n /// current cooldown is finished (for sires) and also checks that there is\n /// no pending pregnancy.\n function _isReadyToBreed(Kitty _kit) internal view returns (bool) {\n // In addition to checking the cooldownEndBlock, we also need to check to see if\n // the cat has a pending birth; there can be some period of time between the end\n // of the pregnacy timer and the birth event.\n return (_kit.siringWithId == 0) && (_kit.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @dev Check if a sire has authorized breeding with this matron. True if both sire\n /// and matron have the same owner, or if the sire has given siring permission to\n /// the matron's owner (via approveSiring()).\n function _isSiringPermitted(uint256 _sireId, uint256 _matronId) internal view returns (bool) {\n address matronOwner = kittyIndexToOwner[_matronId];\n address sireOwner = kittyIndexToOwner[_sireId];\n\n // Siring is okay if they have same owner, or if the matron's owner was given\n // permission to breed with this sire.\n return (matronOwner == sireOwner || sireAllowedToAddress[_sireId] == matronOwner);\n }\n\n /// @dev Set the cooldownEndTime for the given Kitty, based on its current cooldownIndex.\n /// Also increments the cooldownIndex (unless it has hit the cap).\n /// @param _kitten A reference to the Kitty in storage which needs its timer started.\n function _triggerCooldown(Kitty storage _kitten) internal {\n // Compute an estimation of the cooldown time in blocks (based on current cooldownIndex).\n _kitten.cooldownEndBlock = uint64((cooldowns[_kitten.cooldownIndex]/secondsPerBlock) + block.number);\n\n // Increment the breeding count, clamping it at 13, which is the length of the\n // cooldowns array. We could check the array size dynamically, but hard-coding\n // this as a constant saves gas. Yay, Solidity!\n if (_kitten.cooldownIndex < 13) {\n _kitten.cooldownIndex += 1;\n }\n }\n\n /// @notice Grants approval to another user to sire with one of your Kitties.\n /// @param _addr The address that will be able to sire with your Kitty. Set to\n /// address(0) to clear all siring approvals for this Kitty.\n /// @param _sireId A Kitty that you own that _addr will now be able to sire with.\n function approveSiring(address _addr, uint256 _sireId)\n external\n whenNotPaused\n {\n require(_owns(msg.sender, _sireId));\n sireAllowedToAddress[_sireId] = _addr;\n }\n\n /// @dev Updates the minimum payment required for calling giveBirthAuto(). Can only\n /// be called by the COO address. (This fee is used to offset the gas cost incurred\n /// by the autobirth daemon).\n function setAutoBirthFee(uint256 val) external onlyCOO {\n autoBirthFee = val;\n }\n\n /// @dev Checks to see if a given Kitty is pregnant and (if so) if the gestation\n /// period has passed.\n function _isReadyToGiveBirth(Kitty _matron) private view returns (bool) {\n return (_matron.siringWithId != 0) && (_matron.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @notice Checks that a given kitten is able to breed (i.e. it is not pregnant or\n /// in the middle of a siring cooldown).\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isReadyToBreed(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n Kitty storage kit = kitties[_kittyId];\n return _isReadyToBreed(kit);\n }\n\n /// @dev Checks whether a kitty is currently pregnant.\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isPregnant(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n // A kitty is pregnant if and only if this field is set\n return kitties[_kittyId].siringWithId != 0;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair. DOES NOT\n /// check ownership permissions (that is up to the caller).\n /// @param _matron A reference to the Kitty struct of the potential matron.\n /// @param _matronId The matron's ID.\n /// @param _sire A reference to the Kitty struct of the potential sire.\n /// @param _sireId The sire's ID\n function _isValidMatingPair(\n Kitty storage _matron,\n uint256 _matronId,\n Kitty storage _sire,\n uint256 _sireId\n )\n private\n view\n returns(bool)\n {\n // A Kitty can't breed with itself!\n if (_matronId == _sireId) {\n return false;\n }\n\n // Kitties can't breed with their parents.\n if (_matron.matronId == _sireId || _matron.sireId == _sireId) {\n return false;\n }\n if (_sire.matronId == _matronId || _sire.sireId == _matronId) {\n return false;\n }\n\n // We can short circuit the sibling check (below) if either cat is\n // gen zero (has a matron ID of zero).\n if (_sire.matronId == 0 || _matron.matronId == 0) {\n return true;\n }\n\n // Kitties can't breed with full or half siblings.\n if (_sire.matronId == _matron.matronId || _sire.matronId == _matron.sireId) {\n return false;\n }\n if (_sire.sireId == _matron.matronId || _sire.sireId == _matron.sireId) {\n return false;\n }\n\n // Everything seems cool! Let's get DTF.\n return true;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair for\n /// breeding via auction (i.e. skips ownership and siring approval checks).\n function _canBreedWithViaAuction(uint256 _matronId, uint256 _sireId)\n internal\n view\n returns (bool)\n {\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId);\n }\n\n /// @notice Checks to see if two cats can breed together, including checks for\n /// ownership and siring approvals. Does NOT check that both cats are ready for\n /// breeding (i.e. breedWith could still fail until the cooldowns are finished).\n /// TODO: Shouldn't this check pregnancy and cooldowns?!?\n /// @param _matronId The ID of the proposed matron.\n /// @param _sireId The ID of the proposed sire.\n function canBreedWith(uint256 _matronId, uint256 _sireId)\n external\n view\n returns(bool)\n {\n require(_matronId > 0);\n require(_sireId > 0);\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId) &&\n _isSiringPermitted(_sireId, _matronId);\n }\n\n /// @dev Internal utility function to initiate breeding, assumes that all breeding\n /// requirements have been checked.\n function _breedWith(uint256 _matronId, uint256 _sireId) internal {\n // Grab a reference to the Kitties from storage.\n Kitty storage sire = kitties[_sireId];\n Kitty storage matron = kitties[_matronId];\n\n // Mark the matron as pregnant, keeping track of who the sire is.\n matron.siringWithId = uint32(_sireId);\n\n // Trigger the cooldown for both parents.\n _triggerCooldown(sire);\n _triggerCooldown(matron);\n\n // Clear siring permission for both parents. This may not be strictly necessary\n // but it's likely to avoid confusion!\n delete sireAllowedToAddress[_matronId];\n delete sireAllowedToAddress[_sireId];\n\n // Every time a kitty gets pregnant, counter is incremented.\n pregnantKitties++;\n\n // Emit the pregnancy event.\n Pregnant(kittyIndexToOwner[_matronId], _matronId, _sireId, matron.cooldownEndBlock);\n }\n\n /// @notice Breed a Kitty you own (as matron) with a sire that you own, or for which you\n /// have previously been given Siring approval. Will either make your cat pregnant, or will\n /// fail entirely. Requires a pre-payment of the fee given out to the first caller of giveBirth()\n /// @param _matronId The ID of the Kitty acting as matron (will end up pregnant if successful)\n /// @param _sireId The ID of the Kitty acting as sire (will begin its siring cooldown if successful)\n function breedWithAuto(uint256 _matronId, uint256 _sireId)\n external\n payable\n whenNotPaused\n {\n // Checks for payment.\n require(msg.value >= autoBirthFee);\n\n // Caller must own the matron.\n require(_owns(msg.sender, _matronId));\n\n // Neither sire nor matron are allowed to be on auction during a normal\n // breeding operation, but we don't need to check that explicitly.\n // For matron: The caller of this function can't be the owner of the matron\n // because the owner of a Kitty on auction is the auction house, and the\n // auction house will never call breedWith().\n // For sire: Similarly, a sire on auction will be owned by the auction house\n // and the act of transferring ownership will have cleared any oustanding\n // siring approval.\n // Thus we don't need to spend gas explicitly checking to see if either cat\n // is on auction.\n\n // Check that matron and sire are both owned by caller, or that the sire\n // has given siring permission to caller (i.e. matron's owner).\n // Will fail for _sireId = 0\n require(_isSiringPermitted(_sireId, _matronId));\n\n // Grab a reference to the potential matron\n Kitty storage matron = kitties[_matronId];\n\n // Make sure matron isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(matron));\n\n // Grab a reference to the potential sire\n Kitty storage sire = kitties[_sireId];\n\n // Make sure sire isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(sire));\n\n // Test that these cats are a valid mating pair.\n require(_isValidMatingPair(\n matron,\n _matronId,\n sire,\n _sireId\n ));\n\n // All checks passed, kitty gets pregnant!\n _breedWith(_matronId, _sireId);\n }\n\n /// @notice Have a pregnant Kitty give birth!\n /// @param _matronId A Kitty ready to give birth.\n /// @return The Kitty ID of the new kitten.\n /// @dev Looks at a given Kitty and, if pregnant and if the gestation period has passed,\n /// combines the genes of the two parents to create a new kitten. The new Kitty is assigned\n /// to the current owner of the matron. Upon successful completion, both the matron and the\n /// new kitten will be ready to breed again. Note that anyone can call this function (if they\n /// are willing to pay the gas!), but the new kitten always goes to the mother's owner.\n function giveBirth(uint256 _matronId)\n external\n whenNotPaused\n returns(uint256)\n {\n // Grab a reference to the matron in storage.\n Kitty storage matron = kitties[_matronId];\n\n // Check that the matron is a valid cat.\n require(matron.birthTime != 0);\n\n // Check that the matron is pregnant, and that its time has come!\n require(_isReadyToGiveBirth(matron));\n\n // Grab a reference to the sire in storage.\n uint256 sireId = matron.siringWithId;\n Kitty storage sire = kitties[sireId];\n\n // Determine the higher generation number of the two parents\n uint16 parentGen = matron.generation;\n if (sire.generation > matron.generation) {\n parentGen = sire.generation;\n }\n\n // Call the sooper-sekret gene mixing operation.\n uint256 childGenes = geneScience.mixGenes(matron.genes, sire.genes, matron.cooldownEndBlock - 1);\n\n // Make the new kitten!\n address owner = kittyIndexToOwner[_matronId];\n uint256 kittenId = _createKitty(_matronId, matron.siringWithId, parentGen + 1, childGenes, owner);\n\n // Clear the reference to sire from the matron (REQUIRED! Having siringWithId\n // set is what marks a matron as being pregnant.)\n delete matron.siringWithId;\n\n // Every time a kitty gives birth counter is decremented.\n pregnantKitties--;\n\n // Send the balance fee to the person who made birth happen.\n msg.sender.send(autoBirthFee);\n\n // return the new kitten's ID\n return kittenId;\n }\n}\n\n\n\n\n\n\n\n\n\n\n/// @title Auction Core\n/// @dev Contains models, variables, and internal methods for the auction.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuctionBase {\n\n // Represents an auction on an NFT\n struct Auction {\n // Current owner of NFT\n address seller;\n // Price (in wei) at beginning of auction\n uint128 startingPrice;\n // Price (in wei) at end of auction\n uint128 endingPrice;\n // Duration (in seconds) of auction\n uint64 duration;\n // Time when auction started\n // NOTE: 0 if this auction has been concluded\n uint64 startedAt;\n }\n\n // Reference to contract tracking NFT ownership\n KittiesERC721 public nonFungibleContract;\n\n // Cut owner takes on each auction, measured in basis points (1/100 of a percent).\n // Values 0-10,000 map to 0%-100%\n uint256 public ownerCut;\n\n // Map from token ID to their corresponding auction.\n mapping (uint256 => Auction) tokenIdToAuction;\n\n event AuctionCreated(uint256 tokenId, uint256 startingPrice, uint256 endingPrice, uint256 duration);\n event AuctionSuccessful(uint256 tokenId, uint256 totalPrice, address winner);\n event AuctionCancelled(uint256 tokenId);\n\n /// @dev Returns true if the claimant owns the token.\n /// @param _claimant - Address claiming to own the token.\n /// @param _tokenId - ID of token whose ownership to verify.\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return (nonFungibleContract.ownerOf(_tokenId) == _claimant);\n }\n\n /// @dev Escrows the NFT, assigning ownership to this contract.\n /// Throws if the escrow fails.\n /// @param _owner - Current owner address of token to escrow.\n /// @param _tokenId - ID of token whose approval to verify.\n function _escrow(address _owner, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transferFrom(_owner, this, _tokenId);\n }\n\n /// @dev Transfers an NFT owned by this contract to another address.\n /// Returns true if the transfer succeeds.\n /// @param _receiver - Address to transfer NFT to.\n /// @param _tokenId - ID of token to transfer.\n function _transfer(address _receiver, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transfer(_receiver, _tokenId);\n }\n\n /// @dev Adds an auction to the list of open auctions. Also fires the\n /// AuctionCreated event.\n /// @param _tokenId The ID of the token to be put on auction.\n /// @param _auction Auction to add.\n function _addAuction(uint256 _tokenId, Auction _auction) internal {\n // Require that all auctions have a duration of\n // at least one minute. (Keeps our math from getting hairy!)\n require(_auction.duration >= 1 minutes);\n\n tokenIdToAuction[_tokenId] = _auction;\n\n AuctionCreated(\n uint256(_tokenId),\n uint256(_auction.startingPrice),\n uint256(_auction.endingPrice),\n uint256(_auction.duration)\n );\n }\n\n /// @dev Cancels an auction unconditionally.\n function _cancelAuction(uint256 _tokenId, address _seller) internal {\n _removeAuction(_tokenId);\n _transfer(_seller, _tokenId);\n AuctionCancelled(_tokenId);\n }\n\n /// @dev Computes the price and transfers winnings.\n /// Does NOT transfer ownership of token.\n function _bid(uint256 _tokenId, uint256 _bidAmount)\n internal\n returns (uint256)\n {\n // Get a reference to the auction struct\n Auction storage auction = tokenIdToAuction[_tokenId];\n\n // Explicitly check that this auction is currently live.\n // (Because of how Ethereum mappings work, we can't just count\n // on the lookup above failing. An invalid _tokenId will just\n // return an auction object that is all zeros.)\n require(_isOnAuction(auction));\n\n // Check that the bid is greater than or equal to the current price\n uint256 price = _currentPrice(auction);\n require(_bidAmount >= price);\n\n // Grab a reference to the seller before the auction struct\n // gets deleted.\n address seller = auction.seller;\n\n // The bid is good! Remove the auction before sending the fees\n // to the sender so we can't have a reentrancy attack.\n _removeAuction(_tokenId);\n\n // Transfer proceeds to seller (if there are any!)\n if (price > 0) {\n // Calculate the auctioneer's cut.\n // (NOTE: _computeCut() is guaranteed to return a\n // value <= price, so this subtraction can't go negative.)\n uint256 auctioneerCut = _computeCut(price);\n uint256 sellerProceeds = price - auctioneerCut;\n\n // NOTE: Doing a transfer() in the middle of a complex\n // method like this is generally discouraged because of\n // reentrancy attacks and DoS attacks if the seller is\n // a contract with an invalid fallback function. We explicitly\n // guard against reentrancy attacks by removing the auction\n // before calling transfer(), and the only thing the seller\n // can DoS is the sale of their own asset! (And if it's an\n // accident, they can call cancelAuction(). )\n seller.transfer(sellerProceeds);\n }\n\n // Calculate any excess funds included with the bid. If the excess\n // is anything worth worrying about, transfer it back to bidder.\n // NOTE: We checked above that the bid amount is greater than or\n // equal to the price so this cannot underflow.\n uint256 bidExcess = _bidAmount - price;\n\n // Return the funds. Similar to the previous transfer, this is\n // not susceptible to a re-entry attack because the auction is\n // removed before any transfers occur.\n msg.sender.transfer(bidExcess);\n\n // Tell the world!\n AuctionSuccessful(_tokenId, price, msg.sender);\n\n return price;\n }\n\n /// @dev Removes an auction from the list of open auctions.\n /// @param _tokenId - ID of NFT on auction.\n function _removeAuction(uint256 _tokenId) internal {\n delete tokenIdToAuction[_tokenId];\n }\n\n /// @dev Returns true if the NFT is on auction.\n /// @param _auction - Auction to check.\n function _isOnAuction(Auction storage _auction) internal view returns (bool) {\n return (_auction.startedAt > 0);\n }\n\n /// @dev Returns current price of an NFT on auction. Broken into two\n /// functions (this one, that computes the duration from the auction\n /// structure, and the other that does the price computation) so we\n /// can easily test that the price computation works correctly.\n function _currentPrice(Auction storage _auction)\n internal\n view\n returns (uint256)\n {\n uint256 secondsPassed = 0;\n\n // A bit of insurance against negative values (or wraparound).\n // Probably not necessary (since Ethereum guarnatees that the\n // now variable doesn't ever go backwards).\n if (now > _auction.startedAt) {\n secondsPassed = now - _auction.startedAt;\n }\n\n return _computeCurrentPrice(\n _auction.startingPrice,\n _auction.endingPrice,\n _auction.duration,\n secondsPassed\n );\n }\n\n /// @dev Computes the current price of an auction. Factored out\n /// from _currentPrice so we can run extensive unit tests.\n /// When testing, make this function public and turn on\n /// `Current price computation` test suite.\n function _computeCurrentPrice(\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n uint256 _secondsPassed\n )\n internal\n pure\n returns (uint256)\n {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our public functions carefully cap the maximum values for\n // time (at 64-bits) and currency (at 128-bits). _duration is\n // also known to be non-zero (see the require() statement in\n // _addAuction())\n if (_secondsPassed >= _duration) {\n // We've reached the end of the dynamic pricing portion\n // of the auction, just return the end price.\n return _endingPrice;\n } else {\n // Starting price can be higher than ending price (and often is!), so\n // this delta can be negative.\n int256 totalPriceChange = int256(_endingPrice) - int256(_startingPrice);\n\n // This multiplication can't overflow, _secondsPassed will easily fit within\n // 64-bits, and totalPriceChange will easily fit within 128-bits, their product\n // will always fit within 256-bits.\n int256 currentPriceChange = totalPriceChange * int256(_secondsPassed) / int256(_duration);\n\n // currentPriceChange can be negative, but if so, will have a magnitude\n // less that _startingPrice. Thus, this result will always end up positive.\n int256 currentPrice = int256(_startingPrice) + currentPriceChange;\n\n return uint256(currentPrice);\n }\n }\n\n /// @dev Computes owner's cut of a sale.\n /// @param _price - Sale price of NFT.\n function _computeCut(uint256 _price) internal view returns (uint256) {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our entry functions carefully cap the maximum values for\n // currency (at 128-bits), and ownerCut <= 10000 (see the require()\n // statement in the ClockAuction constructor). The result of this\n // function is always guaranteed to be <= _price.\n return _price * ownerCut / 10000;\n }\n\n}\n\n\n\n\n\n\n\n/**\n * @title KittiesPausable\n * @dev Base contract which allows children to implement an emergency stop mechanism.\n */\ncontract KittiesPausable is KittiesOwnable {\n event Pause();\n event Unpause();\n\n bool public paused = false;\n\n\n /**\n\t * @dev modifier to allow actions only when the contract IS paused\n\t */\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /**\n\t * @dev modifier to allow actions only when the contract IS NOT paused\n\t */\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /**\n\t * @dev called by the owner to pause, triggers stopped state\n\t */\n function pause() onlyOwner whenNotPaused returns (bool) {\n paused = true;\n Pause();\n return true;\n }\n\n /**\n\t * @dev called by the owner to unpause, returns to normal state\n\t */\n function unpause() onlyOwner whenPaused returns (bool) {\n paused = false;\n Unpause();\n return true;\n }\n}\n\n\n/// @title Clock auction for non-fungible tokens.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuction is KittiesPausable, ClockAuctionBase {\n\n /// @dev The ERC-165 interface signature for ERC-721.\n /// Ref: https://github.com/ethereum/EIPs/issues/165\n /// Ref: https://github.com/ethereum/EIPs/issues/721\n bytes4 constant InterfaceSignature_ERC721 = bytes4(0x9a20483d);\n\n /// @dev Constructor creates a reference to the NFT ownership contract\n /// and verifies the owner cut is in the valid range.\n /// @param _nftAddress - address of a deployed contract implementing\n /// the Nonfungible Interface.\n /// @param _cut - percent cut the owner takes on each auction, must be\n /// between 0-10,000.\n function ClockAuction(address _nftAddress, uint256 _cut) public {\n require(_cut <= 10000);\n ownerCut = _cut;\n\n KittiesERC721 candidateContract = KittiesERC721(_nftAddress);\n require(candidateContract.supportsInterface(InterfaceSignature_ERC721));\n nonFungibleContract = candidateContract;\n }\n\n /// @dev Remove all Ether from the contract, which is the owner's cuts\n /// as well as any Ether sent directly to the contract address.\n /// Always transfers to the NFT contract, but can be called either by\n /// the owner or the NFT contract.\n function withdrawBalance() external {\n address nftAddress = address(nonFungibleContract);\n\n require(\n msg.sender == owner ||\n msg.sender == nftAddress\n );\n // We are using this boolean method to make sure that even if one fails it will still work\n bool res = nftAddress.send(this.balance);\n }\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of time to move between starting\n /// price and ending price (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n whenNotPaused\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(_owns(msg.sender, _tokenId));\n _escrow(msg.sender, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Bids on an open auction, completing the auction and transferring\n /// ownership of the NFT if enough Ether is supplied.\n /// @param _tokenId - ID of token to bid on.\n function bid(uint256 _tokenId)\n external\n payable\n whenNotPaused\n {\n // _bid will throw if the bid or funds transfer fails\n _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n }\n\n /// @dev Cancels an auction that hasn't been won yet.\n /// Returns the NFT to original owner.\n /// @notice This is a state-modifying function that can\n /// be called while the contract is paused.\n /// @param _tokenId - ID of token on auction\n function cancelAuction(uint256 _tokenId)\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n address seller = auction.seller;\n require(msg.sender == seller);\n _cancelAuction(_tokenId, seller);\n }\n\n /// @dev Cancels an auction when the contract is paused.\n /// Only the owner may do this, and NFTs are returned to\n /// the seller. This should only be used in emergencies.\n /// @param _tokenId - ID of the NFT on auction to cancel.\n function cancelAuctionWhenPaused(uint256 _tokenId)\n whenPaused\n onlyOwner\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n _cancelAuction(_tokenId, auction.seller);\n }\n\n /// @dev Returns auction info for an NFT on auction.\n /// @param _tokenId - ID of NFT on auction.\n function getAuction(uint256 _tokenId)\n external\n view\n returns\n (\n address seller,\n uint256 startingPrice,\n uint256 endingPrice,\n uint256 duration,\n uint256 startedAt\n ) {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return (\n auction.seller,\n auction.startingPrice,\n auction.endingPrice,\n auction.duration,\n auction.startedAt\n );\n }\n\n /// @dev Returns the current price of an auction.\n /// @param _tokenId - ID of the token price we are checking.\n function getCurrentPrice(uint256 _tokenId)\n external\n view\n returns (uint256)\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return _currentPrice(auction);\n }\n\n}\n\n\n/// @title Reverse auction modified for siring\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SiringClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSiringAuctionAddress() call.\n bool public isSiringClockAuction = true;\n\n // Delegate constructor\n function SiringClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction. Since this function is wrapped,\n /// require sender to be KittyCore contract.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Places a bid for siring. Requires the sender\n /// is the KittyCore contract because all bid methods\n /// should be wrapped. Also returns the kitty to the\n /// seller rather than the winner.\n function bid(uint256 _tokenId)\n external\n payable\n {\n require(msg.sender == address(nonFungibleContract));\n address seller = tokenIdToAuction[_tokenId].seller;\n // _bid checks that token ID is valid and will throw if bid fails\n _bid(_tokenId, msg.value);\n // We transfer the kitty back to the seller, the winner will get\n // the offspring\n _transfer(seller, _tokenId);\n }\n\n}\n\n\n\n\n\n/// @title Clock auction modified for sale of kitties\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SaleClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSaleAuctionAddress() call.\n bool public isSaleClockAuction = true;\n\n // Tracks last 5 sale price of gen0 kitty sales\n uint256 public gen0SaleCount;\n uint256[5] public lastGen0SalePrices;\n\n // Delegate constructor\n function SaleClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Updates lastSalePrice if seller is the nft contract\n /// Otherwise, works the same as default bid method.\n function bid(uint256 _tokenId)\n external\n payable\n {\n // _bid verifies token ID size\n address seller = tokenIdToAuction[_tokenId].seller;\n uint256 price = _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n\n // If not a gen0 auction, exit\n if (seller == address(nonFungibleContract)) {\n // Track gen0 sale prices\n lastGen0SalePrices[gen0SaleCount % 5] = price;\n gen0SaleCount++;\n }\n }\n\n function averageGen0SalePrice() external view returns (uint256) {\n uint256 sum = 0;\n for (uint256 i = 0; i < 5; i++) {\n sum += lastGen0SalePrices[i];\n }\n return sum / 5;\n }\n\n}\n\n\n/// @title Handles creating auctions for sale and siring of kitties.\n/// This wrapper of ReverseAuction exists only so that users can create\n/// auctions with only one transaction.\ncontract KittyAuction is KittyBreeding {\n\n // @notice The auction contract variables are defined in KittyBase to allow\n // us to refer to them in KittyOwnership to prevent accidental transfers.\n // `saleAuction` refers to the auction for gen0 and p2p sale of kitties.\n // `siringAuction` refers to the auction for siring rights of kitties.\n\n /// @dev Sets the reference to the sale auction.\n /// @param _address - Address of sale contract.\n function setSaleAuctionAddress(address _address) external onlyCEO {\n SaleClockAuction candidateContract = SaleClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSaleClockAuction());\n\n // Set the new contract address\n saleAuction = candidateContract;\n }\n\n /// @dev Sets the reference to the siring auction.\n /// @param _address - Address of siring contract.\n function setSiringAuctionAddress(address _address) external onlyCEO {\n SiringClockAuction candidateContract = SiringClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSiringClockAuction());\n\n // Set the new contract address\n siringAuction = candidateContract;\n }\n\n /// @dev Put a kitty up for auction.\n /// Does some ownership trickery to create auctions in one tx.\n function createSaleAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n // Ensure the kitty is not pregnant to prevent the auction\n // contract accidentally receiving ownership of the child.\n // NOTE: the kitty IS allowed to be in a cooldown.\n require(!isPregnant(_kittyId));\n _approve(_kittyId, saleAuction);\n // Sale auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n saleAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Put a kitty up for auction to be sire.\n /// Performs checks to ensure the kitty can be sired, then\n /// delegates to reverse auction.\n function createSiringAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n require(isReadyToBreed(_kittyId));\n _approve(_kittyId, siringAuction);\n // Siring auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n siringAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Completes a siring auction by bidding.\n /// Immediately breeds the winning matron with the sire on auction.\n /// @param _sireId - ID of the sire on auction.\n /// @param _matronId - ID of the matron owned by the bidder.\n function bidOnSiringAuction(\n uint256 _sireId,\n uint256 _matronId\n )\n external\n payable\n whenNotPaused\n {\n // Auction contract checks input sizes\n require(_owns(msg.sender, _matronId));\n require(isReadyToBreed(_matronId));\n require(_canBreedWithViaAuction(_matronId, _sireId));\n\n // Define the current price of the auction.\n uint256 currentPrice = siringAuction.getCurrentPrice(_sireId);\n require(msg.value >= currentPrice + autoBirthFee);\n\n // Siring auction will throw if the bid fails.\n siringAuction.bid.value(msg.value - autoBirthFee)(_sireId);\n _breedWith(uint32(_matronId), uint32(_sireId));\n }\n\n /// @dev Transfers the balance of the sale auction contract\n /// to the KittyCore contract. We use two-step withdrawal to\n /// prevent two transfer calls in the auction bid function.\n function withdrawAuctionBalances() external onlyCLevel {\n saleAuction.withdrawBalance();\n siringAuction.withdrawBalance();\n }\n}\n\n\n/// @title all functions related to creating kittens\ncontract KittyMinting is KittyAuction {\n\n // Limits the number of cats the contract owner can ever create.\n uint256 public constant PROMO_CREATION_LIMIT = 5000;\n uint256 public constant GEN0_CREATION_LIMIT = 45000;\n\n // Constants for gen0 auctions.\n uint256 public constant GEN0_STARTING_PRICE = 10 finney;\n uint256 public constant GEN0_AUCTION_DURATION = 1 days;\n\n // Counts the number of cats the contract owner has created.\n uint256 public promoCreatedCount;\n uint256 public gen0CreatedCount;\n\n /// @dev we can create promo kittens, up to a limit. Only callable by COO\n /// @param _genes the encoded genes of the kitten to be created, any value is accepted\n /// @param _owner the future owner of the created kittens. Default to contract COO\n function createPromoKitty(uint256 _genes, address _owner) external onlyCOO {\n address kittyOwner = _owner;\n if (kittyOwner == address(0)) {\n kittyOwner = cooAddress;\n }\n require(promoCreatedCount < PROMO_CREATION_LIMIT);\n\n promoCreatedCount++;\n _createKitty(0, 0, 0, _genes, kittyOwner);\n }\n\n /// @dev Creates a new gen0 kitty with the given genes and\n /// creates an auction for it.\n function createGen0Auction(uint256 _genes) external onlyCOO {\n require(gen0CreatedCount < GEN0_CREATION_LIMIT);\n\n uint256 kittyId = _createKitty(0, 0, 0, _genes, address(this));\n _approve(kittyId, saleAuction);\n\n saleAuction.createAuction(\n kittyId,\n _computeNextGen0Price(),\n 0,\n GEN0_AUCTION_DURATION,\n address(this)\n );\n\n gen0CreatedCount++;\n }\n\n /// @dev Computes the next gen0 auction starting price, given\n /// the average of the past 5 prices + 50%.\n function _computeNextGen0Price() internal view returns (uint256) {\n uint256 avePrice = saleAuction.averageGen0SalePrice();\n\n // Sanity check to ensure we don't overflow arithmetic\n require(avePrice == uint256(uint128(avePrice)));\n\n uint256 nextPrice = avePrice + (avePrice / 2);\n\n // We never auction for less than starting price\n if (nextPrice < GEN0_STARTING_PRICE) {\n nextPrice = GEN0_STARTING_PRICE;\n }\n\n return nextPrice;\n }\n}\n\n\n/// @title CryptoKitties: Collectible, breedable, and oh-so-adorable cats on the Ethereum blockchain.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev The main CryptoKitties contract, keeps track of kittens so they don't wander around and get lost.\ncontract KittyCore is KittyMinting {\n\n // This is the main CryptoKitties contract. In order to keep our code seperated into logical sections,\n // we've broken it up in two ways. First, we have several seperately-instantiated sibling contracts\n // that handle auctions and our super-top-secret genetic combination algorithm. The auctions are\n // seperate since their logic is somewhat complex and there's always a risk of subtle bugs. By keeping\n // them in their own contracts, we can upgrade them without disrupting the main contract that tracks\n // kitty ownership. The genetic combination algorithm is kept seperate so we can open-source all of\n // the rest of our code without making it _too_ easy for folks to figure out how the genetics work.\n // Don't worry, I'm sure someone will reverse engineer it soon enough!\n //\n // Secondly, we break the core contract into multiple files using inheritence, one for each major\n // facet of functionality of CK. This allows us to keep related code bundled together while still\n // avoiding a single giant file with everything in it. The breakdown is as follows:\n //\n // - KittyBase: This is where we define the most fundamental code shared throughout the core\n // functionality. This includes our main data storage, constants and data types, plus\n // internal functions for managing these items.\n //\n // - KittyAccessControl: This contract manages the various addresses and constraints for operations\n // that can be executed only by specific roles. Namely CEO, CFO and COO.\n //\n // - KittyOwnership: This provides the methods required for basic non-fungible token\n // transactions, following the draft ERC-721 spec (https://github.com/ethereum/EIPs/issues/721).\n //\n // - KittyBreeding: This file contains the methods necessary to breed cats together, including\n // keeping track of siring offers, and relies on an external genetic combination contract.\n //\n // - KittyAuctions: Here we have the public methods for auctioning or bidding on cats or siring\n // services. The actual auction functionality is handled in two sibling contracts (one\n // for sales and one for siring), while auction creation and bidding is mostly mediated\n // through this facet of the core contract.\n //\n // - KittyMinting: This final facet contains the functionality we use for creating new gen0 cats.\n // We can make up to 5000 \"promo\" cats that can be given away (especially important when\n // the community is new), and all others can only be created and then immediately put up\n // for auction via an algorithmically determined starting price. Regardless of how they\n // are created, there is a hard limit of 50k gen0 cats. After that, it's all up to the\n // community to breed, breed, breed!\n\n // Set in case the core contract is broken and an upgrade is required\n address public newContractAddress;\n\n /// @notice Creates the main CryptoKitties smart contract instance.\n function KittyCore() public {\n // Starts paused.\n paused = true;\n\n // the creator of the contract is the initial CEO\n ceoAddress = msg.sender;\n\n // the creator of the contract is also the initial COO\n cooAddress = msg.sender;\n\n // start with the mythical kitten 0 - so we don't have generation-0 parent issues\n _createKitty(0, 0, 0, uint256(-1), address(0));\n }\n\n /// @dev Used to mark the smart contract as upgraded, in case there is a serious\n /// breaking bug. This method does nothing but keep track of the new contract and\n /// emit a message indicating that the new address is set. It's up to clients of this\n /// contract to update to the new contract address in that case. (This contract will\n /// be paused indefinitely if such an upgrade takes place.)\n /// @param _v2Address new address\n function setNewAddress(address _v2Address) external onlyCEO whenPaused {\n // See README.md for updgrade plan\n newContractAddress = _v2Address;\n ContractUpgrade(_v2Address);\n }\n\n /// @notice No tipping!\n /// @dev Reject all Ether from being sent here, unless it's from one of the\n /// two auction contracts. (Hopefully, we can prevent user accidents.)\n function() external payable {\n require(\n msg.sender == address(saleAuction) ||\n msg.sender == address(siringAuction)\n );\n }\n\n /// @notice Returns all the relevant information about a specific kitty.\n /// @param _id The ID of the kitty of interest.\n function getKitty(uint256 _id)\n external\n view\n returns (\n bool isGestating,\n bool isReady,\n uint256 cooldownIndex,\n uint256 nextActionAt,\n uint256 siringWithId,\n uint256 birthTime,\n uint256 matronId,\n uint256 sireId,\n uint256 generation,\n uint256 genes\n ) {\n Kitty storage kit = kitties[_id];\n\n // if this variable is 0 then it's not gestating\n isGestating = (kit.siringWithId != 0);\n isReady = (kit.cooldownEndBlock <= block.number);\n cooldownIndex = uint256(kit.cooldownIndex);\n nextActionAt = uint256(kit.cooldownEndBlock);\n siringWithId = uint256(kit.siringWithId);\n birthTime = uint256(kit.birthTime);\n matronId = uint256(kit.matronId);\n sireId = uint256(kit.sireId);\n generation = uint256(kit.generation);\n genes = kit.genes;\n }\n\n /// @dev Override unpause so it requires all external contract addresses\n /// to be set before contract can be unpaused. Also, we can't have\n /// newContractAddress set either, because then the contract was upgraded.\n /// @notice This is public rather than external so we can call super.unpause\n /// without using an expensive CALL.\n function unpause() public onlyCEO whenPaused {\n require(saleAuction != address(0));\n require(siringAuction != address(0));\n require(geneScience != address(0));\n require(newContractAddress == address(0));\n\n // Actually unpause the contract.\n super.unpause();\n }\n\n // @dev Allows the CFO to capture the balance available to the contract.\n function withdrawBalance() external onlyCFO {\n uint256 balance = this.balance;\n // Subtract all the currently pregnant kittens we have, plus 1 of margin.\n uint256 subtractFees = (pregnantKitties + 1) * autoBirthFee;\n\n if (balance > subtractFees) {\n cfoAddress.send(balance - subtractFees);\n }\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "exportedSymbols": { "ClockAuction": [ 8872 @@ -52525,5 +52525,5 @@ }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:47.781Z" + "updatedAt": "2018-10-09T17:45:36.264Z" } \ No newline at end of file diff --git a/artifacts/json/KittyBase.json b/artifacts/json/KittyBase.json index 47f95c86..c4af1c39 100644 --- a/artifacts/json/KittyBase.json +++ b/artifacts/json/KittyBase.json @@ -316,15 +316,15 @@ "type": "event" } ], - "bytecode": "0x60606040526000600260146101000a81548160ff0219169083151502179055506101c060405190810160405280603c63ffffffff1663ffffffff168152602001607863ffffffff1663ffffffff16815260200161012c63ffffffff1663ffffffff16815260200161025863ffffffff1663ffffffff16815260200161070863ffffffff1663ffffffff168152602001610e1063ffffffff1663ffffffff168152602001611c2063ffffffff1663ffffffff16815260200161384063ffffffff1663ffffffff16815260200161708063ffffffff1663ffffffff16815260200161e10063ffffffff1663ffffffff1681526020016201518063ffffffff1663ffffffff1681526020016202a30063ffffffff1663ffffffff1681526020016205460063ffffffff1663ffffffff16815260200162093a8063ffffffff1663ffffffff16815250600390600e61015492919061016a565b50600f600555341561016557600080fd5b610240565b82600e6007016008900481019282156101fc5791602002820160005b838211156101ca57835183826101000a81548163ffffffff021916908363ffffffff1602179055509260200192600401602081600301049283019260010302610186565b80156101fa5782816101000a81549063ffffffff02191690556004016020816003010492830192600103026101ca565b505b509050610209919061020d565b5090565b61023d91905b8082111561023957600081816101000a81549063ffffffff021916905550600101610213565b5090565b90565b610cde8061024f6000396000f3006060604052600436106100f1576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630519ce79146100f65780630a0f81681461014b57806321717ebf146101a057806327d7874c146101f55780632ba73c151461022e5780633f4ba83a1461026757806346116e6f1461027c578063481af3d3146102df5780634e0a3379146103425780635663896e1461037b5780635c975abb1461039e5780637a7d4937146103cb5780638456cb59146103f45780639d6fac6f14610409578063a45f4bfc1461044c578063b047fb50146104af578063e6cbe35114610504575b600080fd5b341561010157600080fd5b610109610559565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015657600080fd5b61015e61057f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101ab57600080fd5b6101b36105a4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561020057600080fd5b61022c600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506105ca565b005b341561023957600080fd5b610265600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506106a4565b005b341561027257600080fd5b61027a61077f565b005b341561028757600080fd5b61029d6004808035906020019091905050610812565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102ea57600080fd5b6103006004808035906020019091905050610845565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561034d57600080fd5b610379600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610878565b005b341561038657600080fd5b61039c6004808035906020019091905050610953565b005b34156103a957600080fd5b6103b1610aa7565b604051808215151515815260200191505060405180910390f35b34156103d657600080fd5b6103de610aba565b6040518082815260200191505060405180910390f35b34156103ff57600080fd5b610407610ac0565b005b341561041457600080fd5b61042a6004808035906020019091905050610c04565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b341561045757600080fd5b61046d6004808035906020019091905050610c33565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104ba57600080fd5b6104c2610c66565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561050f57600080fd5b610517610c8c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561062557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561066157600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156106ff57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561073b57600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156107da57600080fd5b600260149054906101000a900460ff1615156107f557600080fd5b6000600260146101000a81548160ff021916908315150217905550565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108d357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561090f57600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806109fb57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80610a535750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515610a5e57600080fd5b60036000600e81101515610a6e57fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff1681101515610a9d57600080fd5b8060058190555050565b600260149054906101000a900460ff1681565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610b6857506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80610bc05750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515610bcb57600080fd5b600260149054906101000a900460ff16151515610be757600080fd5b6001600260146101000a81548160ff021916908315150217905550565b600381600e81101515610c1357fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16815600a165627a7a72305820792f7b70c652d5440952b1544e2649682ea61239fa1f0a83403e80688010c9910029", - "deployedBytecode": "0x6060604052600436106100f1576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630519ce79146100f65780630a0f81681461014b57806321717ebf146101a057806327d7874c146101f55780632ba73c151461022e5780633f4ba83a1461026757806346116e6f1461027c578063481af3d3146102df5780634e0a3379146103425780635663896e1461037b5780635c975abb1461039e5780637a7d4937146103cb5780638456cb59146103f45780639d6fac6f14610409578063a45f4bfc1461044c578063b047fb50146104af578063e6cbe35114610504575b600080fd5b341561010157600080fd5b610109610559565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015657600080fd5b61015e61057f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101ab57600080fd5b6101b36105a4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561020057600080fd5b61022c600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506105ca565b005b341561023957600080fd5b610265600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506106a4565b005b341561027257600080fd5b61027a61077f565b005b341561028757600080fd5b61029d6004808035906020019091905050610812565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102ea57600080fd5b6103006004808035906020019091905050610845565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561034d57600080fd5b610379600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610878565b005b341561038657600080fd5b61039c6004808035906020019091905050610953565b005b34156103a957600080fd5b6103b1610aa7565b604051808215151515815260200191505060405180910390f35b34156103d657600080fd5b6103de610aba565b6040518082815260200191505060405180910390f35b34156103ff57600080fd5b610407610ac0565b005b341561041457600080fd5b61042a6004808035906020019091905050610c04565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b341561045757600080fd5b61046d6004808035906020019091905050610c33565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104ba57600080fd5b6104c2610c66565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561050f57600080fd5b610517610c8c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561062557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561066157600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156106ff57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561073b57600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156107da57600080fd5b600260149054906101000a900460ff1615156107f557600080fd5b6000600260146101000a81548160ff021916908315150217905550565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108d357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561090f57600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806109fb57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80610a535750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515610a5e57600080fd5b60036000600e81101515610a6e57fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff1681101515610a9d57600080fd5b8060058190555050565b600260149054906101000a900460ff1681565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610b6857506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80610bc05750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515610bcb57600080fd5b600260149054906101000a900460ff16151515610be757600080fd5b6001600260146101000a81548160ff021916908315150217905550565b600381600e81101515610c1357fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16815600a165627a7a72305820792f7b70c652d5440952b1544e2649682ea61239fa1f0a83403e80688010c9910029", + "bytecode": "0x60606040526000600260146101000a81548160ff0219169083151502179055506101c060405190810160405280603c63ffffffff1663ffffffff168152602001607863ffffffff1663ffffffff16815260200161012c63ffffffff1663ffffffff16815260200161025863ffffffff1663ffffffff16815260200161070863ffffffff1663ffffffff168152602001610e1063ffffffff1663ffffffff168152602001611c2063ffffffff1663ffffffff16815260200161384063ffffffff1663ffffffff16815260200161708063ffffffff1663ffffffff16815260200161e10063ffffffff1663ffffffff1681526020016201518063ffffffff1663ffffffff1681526020016202a30063ffffffff1663ffffffff1681526020016205460063ffffffff1663ffffffff16815260200162093a8063ffffffff1663ffffffff16815250600390600e61015492919061016a565b50600f600555341561016557600080fd5b610240565b82600e6007016008900481019282156101fc5791602002820160005b838211156101ca57835183826101000a81548163ffffffff021916908363ffffffff1602179055509260200192600401602081600301049283019260010302610186565b80156101fa5782816101000a81549063ffffffff02191690556004016020816003010492830192600103026101ca565b505b509050610209919061020d565b5090565b61023d91905b8082111561023957600081816101000a81549063ffffffff021916905550600101610213565b5090565b90565b610cde8061024f6000396000f3006060604052600436106100f1576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630519ce79146100f65780630a0f81681461014b57806321717ebf146101a057806327d7874c146101f55780632ba73c151461022e5780633f4ba83a1461026757806346116e6f1461027c578063481af3d3146102df5780634e0a3379146103425780635663896e1461037b5780635c975abb1461039e5780637a7d4937146103cb5780638456cb59146103f45780639d6fac6f14610409578063a45f4bfc1461044c578063b047fb50146104af578063e6cbe35114610504575b600080fd5b341561010157600080fd5b610109610559565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015657600080fd5b61015e61057f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101ab57600080fd5b6101b36105a4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561020057600080fd5b61022c600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506105ca565b005b341561023957600080fd5b610265600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506106a4565b005b341561027257600080fd5b61027a61077f565b005b341561028757600080fd5b61029d6004808035906020019091905050610812565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102ea57600080fd5b6103006004808035906020019091905050610845565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561034d57600080fd5b610379600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610878565b005b341561038657600080fd5b61039c6004808035906020019091905050610953565b005b34156103a957600080fd5b6103b1610aa7565b604051808215151515815260200191505060405180910390f35b34156103d657600080fd5b6103de610aba565b6040518082815260200191505060405180910390f35b34156103ff57600080fd5b610407610ac0565b005b341561041457600080fd5b61042a6004808035906020019091905050610c04565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b341561045757600080fd5b61046d6004808035906020019091905050610c33565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104ba57600080fd5b6104c2610c66565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561050f57600080fd5b610517610c8c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561062557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561066157600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156106ff57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561073b57600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156107da57600080fd5b600260149054906101000a900460ff1615156107f557600080fd5b6000600260146101000a81548160ff021916908315150217905550565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108d357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561090f57600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806109fb57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80610a535750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515610a5e57600080fd5b60036000600e81101515610a6e57fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff1681101515610a9d57600080fd5b8060058190555050565b600260149054906101000a900460ff1681565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610b6857506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80610bc05750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515610bcb57600080fd5b600260149054906101000a900460ff16151515610be757600080fd5b6001600260146101000a81548160ff021916908315150217905550565b600381600e81101515610c1357fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16815600a165627a7a723058209da33ce618c25c7f590fc42128c0871c0b749c7049116955bf4eb60c0d692d180029", + "deployedBytecode": "0x6060604052600436106100f1576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630519ce79146100f65780630a0f81681461014b57806321717ebf146101a057806327d7874c146101f55780632ba73c151461022e5780633f4ba83a1461026757806346116e6f1461027c578063481af3d3146102df5780634e0a3379146103425780635663896e1461037b5780635c975abb1461039e5780637a7d4937146103cb5780638456cb59146103f45780639d6fac6f14610409578063a45f4bfc1461044c578063b047fb50146104af578063e6cbe35114610504575b600080fd5b341561010157600080fd5b610109610559565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015657600080fd5b61015e61057f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101ab57600080fd5b6101b36105a4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561020057600080fd5b61022c600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506105ca565b005b341561023957600080fd5b610265600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506106a4565b005b341561027257600080fd5b61027a61077f565b005b341561028757600080fd5b61029d6004808035906020019091905050610812565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102ea57600080fd5b6103006004808035906020019091905050610845565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561034d57600080fd5b610379600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610878565b005b341561038657600080fd5b61039c6004808035906020019091905050610953565b005b34156103a957600080fd5b6103b1610aa7565b604051808215151515815260200191505060405180910390f35b34156103d657600080fd5b6103de610aba565b6040518082815260200191505060405180910390f35b34156103ff57600080fd5b610407610ac0565b005b341561041457600080fd5b61042a6004808035906020019091905050610c04565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b341561045757600080fd5b61046d6004808035906020019091905050610c33565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104ba57600080fd5b6104c2610c66565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561050f57600080fd5b610517610c8c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561062557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561066157600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156106ff57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561073b57600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156107da57600080fd5b600260149054906101000a900460ff1615156107f557600080fd5b6000600260146101000a81548160ff021916908315150217905550565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108d357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561090f57600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806109fb57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80610a535750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515610a5e57600080fd5b60036000600e81101515610a6e57fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff1681101515610a9d57600080fd5b8060058190555050565b600260149054906101000a900460ff1681565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610b6857506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80610bc05750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515610bcb57600080fd5b600260149054906101000a900460ff16151515610be757600080fd5b6001600260146101000a81548160ff021916908315150217905550565b600381600e81101515610c1357fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16815600a165627a7a723058209da33ce618c25c7f590fc42128c0871c0b749c7049116955bf4eb60c0d692d180029", "sourceMap": "7747:9736:18:-;;;5032:5;5011:26;;;;;;;;;;;;;;;;;;;;11384:339;;;;;;;;;11427:9;11384:339;;;;;;;;11450:9;11384:339;;;;;;;;11473:9;11384:339;;;;;;;;11496:10;11384:339;;;;;;;;11520:10;11384:339;;;;;;;;11544:7;11384:339;;;;;;;;11565:7;11384:339;;;;;;;;11586:7;11384:339;;;;;;;;11607:7;11384:339;;;;;;;;11628:8;11384:339;;;;;;;;11650:6;11384:339;;;;;;;;11670:6;11384:339;;;;;;;;11690:6;11384:339;;;;;;;;11710:6;11384:339;;;;;;;;;;;;;;;:::i;:::-;;11840:2;11807:35;;7747:9736;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;", "deployedSourceMap": "7747:9736:18:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4848:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4817;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13853:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5800:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;6346;;;;;;;;;;;;;;;;;;;;;;;;;;;;7359:126;;;;;;;;;;;;;;13283:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12965;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6073:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;17342:139;;;;;;;;;;;;;;;;;;;;;;;;;;5011:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11807:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6990:81;;;;;;;;;;;;;;11384:339;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12465:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4879:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13564:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4848:25;;;;;;;;;;;;;:::o;4817:::-;;;;;;;;;;;;;:::o;13853:39::-;;;;;;;;;;;;;:::o;5800:128::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;5887:1;5868:21;;:7;:21;;;;5860:30;;;;;;;;5914:7;5901:10;;:20;;;;;;;;;;;;;;;;;;5800:128;:::o;6346:::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;6433:1;6414:21;;:7;:21;;;;6406:30;;;;;;;;6460:7;6447:10;;:20;;;;;;;;;;;;;;;;;;6346:128;:::o;7359:126::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;6812:6;;;;;;;;;;;6804:15;;;;;;;;7473:5;7464:6;;:14;;;;;;;;;;;;;;;;;;7359:126::o;13283:56::-;;;;;;;;;;;;;;;;;;;;;;:::o;12965:::-;;;;;;;;;;;;;;;;;;;;;;:::o;6073:128::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;6160:1;6141:21;;:7;:21;;;;6133:30;;;;;;;;6187:7;6174:10;;:20;;;;;;;;;;;;;;;;;;6073:128;:::o;17342:139::-;5537:10;;;;;;;;;;;5523:24;;:10;:24;;;:64;;;;5577:10;;;;;;;;;;;5563:24;;:10;:24;;;5523:64;:104;;;;5617:10;;;;;;;;;;;5603:24;;:10;:24;;;5523:104;5502:135;;;;;;;;17429:9;17439:1;17429:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17422:19;;:4;:19;17414:28;;;;;;;;17470:4;17452:15;:22;;;;17342:139;:::o;5011:26::-;;;;;;;;;;;;;:::o;11807:35::-;;;;:::o;6990:81::-;5537:10;;;;;;;;;;;5523:24;;:10;:24;;;:64;;;;5577:10;;;;;;;;;;;5563:24;;:10;:24;;;5523:64;:104;;;;5617:10;;;;;;;;;;;5603:24;;:10;:24;;;5523:104;5502:135;;;;;;;;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;7060:4;7051:6;;:13;;;;;;;;;;;;;;;;;;6990:81::o;11384:339::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;12465:53::-;;;;;;;;;;;;;;;;;;;;;;:::o;4879:25::-;;;;;;;;;;;;;:::o;13564:35::-;;;;;;;;;;;;;:::o", "source": "pragma solidity 0.4.18;\n\n/**\n The following contract code, titled KittyCore, was written by Cryptokitties and published\n and retrieved from https://etherscan.io/address/0x06012c8cf97bead5deae237070f9587f8e7a266d#code.\n\n It is included in the current project for test purposes, to ensure that our collateralizer can\n handle ERC721 tokens created by the KittyCore contract.\n*/\n\n/**\n * @title KittiesOwnable\n * @dev The KittiesOwnable contract has an owner address, and provides basic authorization control\n * functions, this simplifies the implementation of \"user permissions\".\n */\ncontract KittiesOwnable {\n address public owner;\n\n\n /**\n\t * @dev The KittiesOwnable constructor sets the original `owner` of the contract to the sender\n\t * account.\n\t */\n function KittiesOwnable() {\n owner = msg.sender;\n }\n\n\n /**\n\t * @dev Throws if called by any account other than the owner.\n\t */\n modifier onlyOwner() {\n require(msg.sender == owner);\n _;\n }\n\n\n /**\n\t * @dev Allows the current owner to transfer control of the contract to a newOwner.\n\t * @param newOwner The address to transfer ownership to.\n\t */\n function transferOwnership(address newOwner) onlyOwner {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n\n}\n\n\n\n/// @title Interface for contracts conforming to ERC-721: Non-Fungible Tokens\n/// @author Dieter Shirley (https://github.com/dete)\ncontract KittiesERC721 {\n // Required methods\n function totalSupply() public view returns (uint256 total);\n function balanceOf(address _owner) public view returns (uint256 balance);\n function ownerOf(uint256 _tokenId) external view returns (address owner);\n function approve(address _to, uint256 _tokenId) external;\n function transfer(address _to, uint256 _tokenId) external;\n function transferFrom(address _from, address _to, uint256 _tokenId) external;\n\n // Events\n event Transfer(address from, address to, uint256 tokenId);\n event Approval(address owner, address approved, uint256 tokenId);\n\n // Optional\n // function name() public view returns (string name);\n // function symbol() public view returns (string symbol);\n // function tokensOfOwner(address _owner) external view returns (uint256[] tokenIds);\n // function tokenMetadata(uint256 _tokenId, string _preferredTransport) public view returns (string infoUrl);\n\n // ERC-165 Compatibility (https://github.com/ethereum/EIPs/issues/165)\n function supportsInterface(bytes4 _interfaceID) external view returns (bool);\n}\n\n\n// // Auction wrapper functions\n\n\n// Auction wrapper functions\n\n\n\n\n\n\n\n/// @title SEKRETOOOO\ncontract GeneScienceInterface {\n /// @dev simply a boolean to indicate this is the contract we expect to be\n function isGeneScience() public pure returns (bool);\n\n /// @dev given genes of kitten 1 & 2, return a genetic combination - may have a random factor\n /// @param genes1 genes of mom\n /// @param genes2 genes of sire\n /// @return the genes that are supposed to be passed down the child\n function mixGenes(uint256 genes1, uint256 genes2, uint256 targetBlock) public returns (uint256);\n}\n\n\n\n\n\n\n\n/// @title A facet of KittyCore that manages special access privileges.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyAccessControl {\n // This facet controls access control for CryptoKitties. There are four roles managed here:\n //\n // - The CEO: The CEO can reassign other roles and change the addresses of our dependent smart\n // contracts. It is also the only role that can unpause the smart contract. It is initially\n // set to the address that created the smart contract in the KittyCore constructor.\n //\n // - The CFO: The CFO can withdraw funds from KittyCore and its auction contracts.\n //\n // - The COO: The COO can release gen0 kitties to auction, and mint promo cats.\n //\n // It should be noted that these roles are distinct without overlap in their access abilities, the\n // abilities listed for each role above are exhaustive. In particular, while the CEO can assign any\n // address to any role, the CEO address itself doesn't have the ability to act in those roles. This\n // restriction is intentional so that we aren't tempted to use the CEO address frequently out of\n // convenience. The less we use an address, the less likely it is that we somehow compromise the\n // account.\n\n /// @dev Emited when contract is upgraded - See README.md for updgrade plan\n event ContractUpgrade(address newContract);\n\n // The addresses of the accounts (or contracts) that can execute actions within each roles.\n address public ceoAddress;\n address public cfoAddress;\n address public cooAddress;\n\n // @dev Keeps track whether the contract is paused. When that is true, most actions are blocked\n bool public paused = false;\n\n /// @dev Access modifier for CEO-only functionality\n modifier onlyCEO() {\n require(msg.sender == ceoAddress);\n _;\n }\n\n /// @dev Access modifier for CFO-only functionality\n modifier onlyCFO() {\n require(msg.sender == cfoAddress);\n _;\n }\n\n /// @dev Access modifier for COO-only functionality\n modifier onlyCOO() {\n require(msg.sender == cooAddress);\n _;\n }\n\n modifier onlyCLevel() {\n require(\n msg.sender == cooAddress ||\n msg.sender == ceoAddress ||\n msg.sender == cfoAddress\n );\n _;\n }\n\n /// @dev Assigns a new address to act as the CEO. Only available to the current CEO.\n /// @param _newCEO The address of the new CEO\n function setCEO(address _newCEO) external onlyCEO {\n require(_newCEO != address(0));\n\n ceoAddress = _newCEO;\n }\n\n /// @dev Assigns a new address to act as the CFO. Only available to the current CEO.\n /// @param _newCFO The address of the new CFO\n function setCFO(address _newCFO) external onlyCEO {\n require(_newCFO != address(0));\n\n cfoAddress = _newCFO;\n }\n\n /// @dev Assigns a new address to act as the COO. Only available to the current CEO.\n /// @param _newCOO The address of the new COO\n function setCOO(address _newCOO) external onlyCEO {\n require(_newCOO != address(0));\n\n cooAddress = _newCOO;\n }\n\n /*** KittiesPausable functionality adapted from OpenZeppelin ***/\n\n /// @dev Modifier to allow actions only when the contract IS NOT paused\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /// @dev Modifier to allow actions only when the contract IS paused\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /// @dev Called by any \"C-level\" role to pause the contract. Used only when\n /// a bug or exploit is detected and we need to limit damage.\n function pause() external onlyCLevel whenNotPaused {\n paused = true;\n }\n\n /// @dev Unpauses the smart contract. Can only be called by the CEO, since\n /// one reason we may pause the contract is when CFO or COO accounts are\n /// compromised.\n /// @notice This is public rather than external so it can be called by\n /// derived contracts.\n function unpause() public onlyCEO whenPaused {\n // can't unpause if contract was upgraded\n paused = false;\n }\n}\n\n\n\n\n/// @title Base contract for CryptoKitties. Holds all common structs, events and base variables.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBase is KittyAccessControl {\n /*** EVENTS ***/\n\n /// @dev The Birth event is fired whenever a new kitten comes into existence. This obviously\n /// includes any time a cat is created through the giveBirth method, but it is also called\n /// when a new gen0 cat is created.\n event Birth(address owner, uint256 kittyId, uint256 matronId, uint256 sireId, uint256 genes);\n\n /// @dev Transfer event as defined in current draft of ERC721. Emitted every time a kitten\n /// ownership is assigned, including births.\n event Transfer(address from, address to, uint256 tokenId);\n\n /*** DATA TYPES ***/\n\n /// @dev The main Kitty struct. Every cat in CryptoKitties is represented by a copy\n /// of this structure, so great care was taken to ensure that it fits neatly into\n /// exactly two 256-bit words. Note that the order of the members in this structure\n /// is important because of the byte-packing rules used by Ethereum.\n /// Ref: http://solidity.readthedocs.io/en/develop/miscellaneous.html\n struct Kitty {\n // The Kitty's genetic code is packed into these 256-bits, the format is\n // sooper-sekret! A cat's genes never change.\n uint256 genes;\n\n // The timestamp from the block when this cat came into existence.\n uint64 birthTime;\n\n // The minimum timestamp after which this cat can engage in breeding\n // activities again. This same timestamp is used for the pregnancy\n // timer (for matrons) as well as the siring cooldown.\n uint64 cooldownEndBlock;\n\n // The ID of the parents of this kitty, set to 0 for gen0 cats.\n // Note that using 32-bit unsigned integers limits us to a \"mere\"\n // 4 billion cats. This number might seem small until you realize\n // that Ethereum currently has a limit of about 500 million\n // transactions per year! So, this definitely won't be a problem\n // for several years (even as Ethereum learns to scale).\n uint32 matronId;\n uint32 sireId;\n\n // Set to the ID of the sire cat for matrons that are pregnant,\n // zero otherwise. A non-zero value here is how we know a cat\n // is pregnant. Used to retrieve the genetic material for the new\n // kitten when the birth transpires.\n uint32 siringWithId;\n\n // Set to the index in the cooldown array (see below) that represents\n // the current cooldown duration for this Kitty. This starts at zero\n // for gen0 cats, and is initialized to floor(generation/2) for others.\n // Incremented by one for each successful breeding action, regardless\n // of whether this cat is acting as matron or sire.\n uint16 cooldownIndex;\n\n // The \"generation number\" of this cat. Cats minted by the CK contract\n // for sale are called \"gen0\" and have a generation number of 0. The\n // generation number of all other cats is the larger of the two generation\n // numbers of their parents, plus one.\n // (i.e. max(matron.generation, sire.generation) + 1)\n uint16 generation;\n }\n\n /*** CONSTANTS ***/\n\n /// @dev A lookup table indicating the cooldown duration after any successful\n /// breeding action, called \"pregnancy time\" for matrons and \"siring cooldown\"\n /// for sires. Designed such that the cooldown roughly doubles each time a cat\n /// is bred, encouraging owners not to just keep breeding the same cat over\n /// and over again. Caps out at one week (a cat can breed an unbounded number\n /// of times, and the maximum cooldown is always seven days).\n uint32[14] public cooldowns = [\n uint32(1 minutes),\n uint32(2 minutes),\n uint32(5 minutes),\n uint32(10 minutes),\n uint32(30 minutes),\n uint32(1 hours),\n uint32(2 hours),\n uint32(4 hours),\n uint32(8 hours),\n uint32(16 hours),\n uint32(1 days),\n uint32(2 days),\n uint32(4 days),\n uint32(7 days)\n ];\n\n // An approximation of currently how many seconds are in between blocks.\n uint256 public secondsPerBlock = 15;\n\n /*** STORAGE ***/\n\n /// @dev An array containing the Kitty struct for all Kitties in existence. The ID\n /// of each cat is actually an index into this array. Note that ID 0 is a negacat,\n /// the unKitty, the mythical beast that is the parent of all gen0 cats. A bizarre\n /// creature that is both matron and sire... to itself! Has an invalid genetic code.\n /// In other words, cat ID 0 is invalid... ;-)\n Kitty[] kitties;\n\n /// @dev A mapping from cat IDs to the address that owns them. All cats have\n /// some valid owner address, even gen0 cats are created with a non-zero owner.\n mapping (uint256 => address) public kittyIndexToOwner;\n\n // @dev A mapping from owner address to count of tokens that address owns.\n // Used internally inside balanceOf() to resolve ownership count.\n mapping (address => uint256) ownershipTokenCount;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to call\n /// transferFrom(). Each Kitty can only have one approved address for transfer\n /// at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public kittyIndexToApproved;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to use\n /// this Kitty for siring via breedWith(). Each Kitty can only have one approved\n /// address for siring at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public sireAllowedToAddress;\n\n /// @dev The address of the ClockAuction contract that handles sales of Kitties. This\n /// same contract handles both peer-to-peer sales as well as the gen0 sales which are\n /// initiated every 15 minutes.\n SaleClockAuction public saleAuction;\n\n /// @dev The address of a custom ClockAuction subclassed contract that handles siring\n /// auctions. Needs to be separate from saleAuction because the actions taken on success\n /// after a sales and siring auction are quite different.\n SiringClockAuction public siringAuction;\n\n /// @dev Assigns ownership of a specific Kitty to an address.\n function _transfer(address _from, address _to, uint256 _tokenId) internal {\n // Since the number of kittens is capped to 2^32 we can't overflow this\n ownershipTokenCount[_to]++;\n // transfer ownership\n kittyIndexToOwner[_tokenId] = _to;\n // When creating new kittens _from is 0x0, but we can't account that address.\n if (_from != address(0)) {\n ownershipTokenCount[_from]--;\n // once the kitten is transferred also clear sire allowances\n delete sireAllowedToAddress[_tokenId];\n // clear any previously approved ownership exchange\n delete kittyIndexToApproved[_tokenId];\n }\n // Emit the transfer event.\n Transfer(_from, _to, _tokenId);\n }\n\n /// @dev An internal method that creates a new kitty and stores it. This\n /// method doesn't do any checking and should only be called when the\n /// input data is known to be valid. Will generate both a Birth event\n /// and a Transfer event.\n /// @param _matronId The kitty ID of the matron of this cat (zero for gen0)\n /// @param _sireId The kitty ID of the sire of this cat (zero for gen0)\n /// @param _generation The generation number of this cat, must be computed by caller.\n /// @param _genes The kitty's genetic code.\n /// @param _owner The inital owner of this cat, must be non-zero (except for the unKitty, ID 0)\n function _createKitty(\n uint256 _matronId,\n uint256 _sireId,\n uint256 _generation,\n uint256 _genes,\n address _owner\n )\n internal\n returns (uint)\n {\n // These requires are not strictly necessary, our calling code should make\n // sure that these conditions are never broken. However! _createKitty() is already\n // an expensive call (for storage), and it doesn't hurt to be especially careful\n // to ensure our data structures are always valid.\n require(_matronId == uint256(uint32(_matronId)));\n require(_sireId == uint256(uint32(_sireId)));\n require(_generation == uint256(uint16(_generation)));\n\n // New kitty starts with the same cooldown as parent gen/2\n uint16 cooldownIndex = uint16(_generation / 2);\n if (cooldownIndex > 13) {\n cooldownIndex = 13;\n }\n\n Kitty memory _kitty = Kitty({\n genes: _genes,\n birthTime: uint64(now),\n cooldownEndBlock: 0,\n matronId: uint32(_matronId),\n sireId: uint32(_sireId),\n siringWithId: 0,\n cooldownIndex: cooldownIndex,\n generation: uint16(_generation)\n });\n uint256 newKittenId = kitties.push(_kitty) - 1;\n\n // It's probably never going to happen, 4 billion cats is A LOT, but\n // let's just be 100% sure we never let this happen.\n require(newKittenId == uint256(uint32(newKittenId)));\n\n // emit the birth event\n Birth(\n _owner,\n newKittenId,\n uint256(_kitty.matronId),\n uint256(_kitty.sireId),\n _kitty.genes\n );\n\n // This will assign ownership, and also emit the Transfer event as\n // per ERC721 draft\n _transfer(0, _owner, newKittenId);\n\n return newKittenId;\n }\n\n // Any C-level can fix how many seconds per blocks are currently observed.\n function setSecondsPerBlock(uint256 secs) external onlyCLevel {\n require(secs < cooldowns[0]);\n secondsPerBlock = secs;\n }\n}\n\n\n\n\n\n/// @title The external contract that is responsible for generating metadata for the kitties,\n/// it has one function that will return the data as bytes.\ncontract KittiesERC721Metadata {\n /// @dev Given a token Id, returns a byte array that is supposed to be converted into string.\n function getMetadata(uint256 _tokenId, string) public view returns (bytes32[4] buffer, uint256 count) {\n if (_tokenId == 1) {\n buffer[0] = \"Hello World! :D\";\n count = 15;\n } else if (_tokenId == 2) {\n buffer[0] = \"I would definitely choose a medi\";\n buffer[1] = \"um length string.\";\n count = 49;\n } else if (_tokenId == 3) {\n buffer[0] = \"Lorem ipsum dolor sit amet, mi e\";\n buffer[1] = \"st accumsan dapibus augue lorem,\";\n buffer[2] = \" tristique vestibulum id, libero\";\n buffer[3] = \" suscipit varius sapien aliquam.\";\n count = 128;\n }\n }\n}\n\n\n/// @title The facet of the CryptoKitties core contract that manages ownership, ERC-721 (draft) compliant.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev Ref: https://github.com/ethereum/EIPs/issues/721\n/// See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyOwnership is KittyBase, KittiesERC721 {\n\n /// @notice Name and symbol of the non fungible token, as defined in ERC721.\n string public constant name = \"CryptoKitties\";\n string public constant symbol = \"CK\";\n\n // The contract that will return kitty metadata\n KittiesERC721Metadata public erc721Metadata;\n\n bytes4 constant InterfaceSignature_ERC165 =\n bytes4(keccak256('supportsInterface(bytes4)'));\n\n bytes4 constant InterfaceSignature_ERC721 =\n bytes4(keccak256('name()')) ^\n bytes4(keccak256('symbol()')) ^\n bytes4(keccak256('totalSupply()')) ^\n bytes4(keccak256('balanceOf(address)')) ^\n bytes4(keccak256('ownerOf(uint256)')) ^\n bytes4(keccak256('approve(address,uint256)')) ^\n bytes4(keccak256('transfer(address,uint256)')) ^\n bytes4(keccak256('transferFrom(address,address,uint256)')) ^\n bytes4(keccak256('tokensOfOwner(address)')) ^\n bytes4(keccak256('tokenMetadata(uint256,string)'));\n\n /// @notice Introspection interface as per ERC-165 (https://github.com/ethereum/EIPs/issues/165).\n /// Returns true for any standardized interfaces implemented by this contract. We implement\n /// ERC-165 (obviously!) and ERC-721.\n function supportsInterface(bytes4 _interfaceID) external view returns (bool)\n {\n // DEBUG ONLY\n //require((InterfaceSignature_ERC165 == 0x01ffc9a7) && (InterfaceSignature_ERC721 == 0x9a20483d));\n\n return ((_interfaceID == InterfaceSignature_ERC165) || (_interfaceID == InterfaceSignature_ERC721));\n }\n\n /// @dev Set the address of the sibling contract that tracks metadata.\n /// CEO only.\n function setMetadataAddress(address _contractAddress) public onlyCEO {\n erc721Metadata = KittiesERC721Metadata(_contractAddress);\n }\n\n // Internal utility functions: These functions all assume that their input arguments\n // are valid. We leave it to public methods to sanitize their inputs and follow\n // the required logic.\n\n /// @dev Checks if a given address is the current owner of a particular Kitty.\n /// @param _claimant the address we are validating against.\n /// @param _tokenId kitten id, only valid when > 0\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToOwner[_tokenId] == _claimant;\n }\n\n /// @dev Checks if a given address currently has transferApproval for a particular Kitty.\n /// @param _claimant the address we are confirming kitten is approved for.\n /// @param _tokenId kitten id, only valid when > 0\n function _approvedFor(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToApproved[_tokenId] == _claimant;\n }\n\n /// @dev Marks an address as being approved for transferFrom(), overwriting any previous\n /// approval. Setting _approved to address(0) clears all transfer approval.\n /// NOTE: _approve() does NOT send the Approval event. This is intentional because\n /// _approve() and transferFrom() are used together for putting Kitties on auction, and\n /// there is no value in spamming the log with Approval events in that case.\n function _approve(uint256 _tokenId, address _approved) internal {\n kittyIndexToApproved[_tokenId] = _approved;\n }\n\n /// @notice Returns the number of Kitties owned by a specific address.\n /// @param _owner The owner address to check.\n /// @dev Required for ERC-721 compliance\n function balanceOf(address _owner) public view returns (uint256 count) {\n return ownershipTokenCount[_owner];\n }\n\n /// @notice Transfers a Kitty to another address. If transferring to a smart\n /// contract be VERY CAREFUL to ensure that it is aware of ERC-721 (or\n /// CryptoKitties specifically) or your Kitty may be lost forever. Seriously.\n /// @param _to The address of the recipient, can be a user or contract.\n /// @param _tokenId The ID of the Kitty to transfer.\n /// @dev Required for ERC-721 compliance.\n function transfer(\n address _to,\n uint256 _tokenId\n )\n external\n whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Disallow transfers to the auction contracts to prevent accidental\n // misuse. Auction contracts should only take ownership of kitties\n // through the allow + transferFrom flow.\n require(_to != address(saleAuction));\n require(_to != address(siringAuction));\n\n // You can only send your own cat.\n require(_owns(msg.sender, _tokenId));\n\n // Reassign ownership, clear pending approvals, emit Transfer event.\n _transfer(msg.sender, _to, _tokenId);\n }\n\n /// @notice Grant another address the right to transfer a specific Kitty via\n /// transferFrom(). This is the preferred flow for transfering NFTs to contracts.\n /// @param _to The address to be granted transfer approval. Pass address(0) to\n /// clear all approvals.\n /// @param _tokenId The ID of the Kitty that can be transferred if this call succeeds.\n /// @dev Required for ERC-721 compliance.\n function approve(\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Only an owner can grant transfer approval.\n require(_owns(msg.sender, _tokenId));\n\n // Register the approval (replacing any previous approval).\n _approve(_tokenId, _to);\n\n // Emit approval event.\n Approval(msg.sender, _to, _tokenId);\n }\n\n /// @notice Transfer a Kitty owned by another address, for which the calling address\n /// has previously been granted transfer approval by the owner.\n /// @param _from The address that owns the Kitty to be transfered.\n /// @param _to The address that should take ownership of the Kitty. Can be any address,\n /// including the caller.\n /// @param _tokenId The ID of the Kitty to be transferred.\n /// @dev Required for ERC-721 compliance.\n function transferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Check for approval and valid ownership\n require(_approvedFor(msg.sender, _tokenId));\n require(_owns(_from, _tokenId));\n\n // Reassign ownership (also clears pending approvals and emits Transfer event).\n _transfer(_from, _to, _tokenId);\n }\n\n /// @notice Returns the total number of Kitties currently in existence.\n /// @dev Required for ERC-721 compliance.\n function totalSupply() public view returns (uint) {\n return kitties.length - 1;\n }\n\n /// @notice Returns the address currently assigned ownership of a given Kitty.\n /// @dev Required for ERC-721 compliance.\n function ownerOf(uint256 _tokenId)\n external\n view\n returns (address owner)\n {\n owner = kittyIndexToOwner[_tokenId];\n\n require(owner != address(0));\n }\n\n /// @notice Returns a list of all Kitty IDs assigned to an address.\n /// @param _owner The owner whose Kitties we are interested in.\n /// @dev This method MUST NEVER be called by smart contract code. First, it's fairly\n /// expensive (it walks the entire Kitty array looking for cats belonging to owner),\n /// but it also returns a dynamic array, which is only supported for web3 calls, and\n /// not contract-to-contract calls.\n function tokensOfOwner(address _owner) external view returns(uint256[] ownerTokens) {\n uint256 tokenCount = balanceOf(_owner);\n\n if (tokenCount == 0) {\n // Return an empty array\n return new uint256[](0);\n } else {\n uint256[] memory result = new uint256[](tokenCount);\n uint256 totalCats = totalSupply();\n uint256 resultIndex = 0;\n\n // We count on the fact that all cats have IDs starting at 1 and increasing\n // sequentially up to the totalCat count.\n uint256 catId;\n\n for (catId = 1; catId <= totalCats; catId++) {\n if (kittyIndexToOwner[catId] == _owner) {\n result[resultIndex] = catId;\n resultIndex++;\n }\n }\n\n return result;\n }\n }\n\n /// @dev Adapted from memcpy() by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _memcpy(uint _dest, uint _src, uint _len) private view {\n // Copy word-length chunks while possible\n for(; _len >= 32; _len -= 32) {\n assembly {\n mstore(_dest, mload(_src))\n }\n _dest += 32;\n _src += 32;\n }\n\n // Copy remaining bytes\n uint256 mask = 256 ** (32 - _len) - 1;\n assembly {\n let srcpart := and(mload(_src), not(mask))\n let destpart := and(mload(_dest), mask)\n mstore(_dest, or(destpart, srcpart))\n }\n }\n\n /// @dev Adapted from toString(slice) by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _toString(bytes32[4] _rawBytes, uint256 _stringLength) private view returns (string) {\n var outputString = new string(_stringLength);\n uint256 outputPtr;\n uint256 bytesPtr;\n\n assembly {\n outputPtr := add(outputString, 32)\n bytesPtr := _rawBytes\n }\n\n _memcpy(outputPtr, bytesPtr, _stringLength);\n\n return outputString;\n }\n\n /// @notice Returns a URI pointing to a metadata package for this token conforming to\n /// ERC-721 (https://github.com/ethereum/EIPs/issues/721)\n /// @param _tokenId The ID number of the Kitty whose metadata should be returned.\n function tokenMetadata(uint256 _tokenId, string _preferredTransport) external view returns (string infoUrl) {\n require(erc721Metadata != address(0));\n bytes32[4] memory buffer;\n uint256 count;\n (buffer, count) = erc721Metadata.getMetadata(_tokenId, _preferredTransport);\n\n return _toString(buffer, count);\n }\n}\n\n\n\n/// @title A facet of KittyCore that manages Kitty siring, gestation, and birth.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBreeding is KittyOwnership {\n\n /// @dev The Pregnant event is fired when two cats successfully breed and the pregnancy\n /// timer begins for the matron.\n event Pregnant(address owner, uint256 matronId, uint256 sireId, uint256 cooldownEndBlock);\n\n /// @notice The minimum payment required to use breedWithAuto(). This fee goes towards\n /// the gas cost paid by whatever calls giveBirth(), and can be dynamically updated by\n /// the COO role as the gas price changes.\n uint256 public autoBirthFee = 2 finney;\n\n // Keeps track of number of pregnant kitties.\n uint256 public pregnantKitties;\n\n /// @dev The address of the sibling contract that is used to implement the sooper-sekret\n /// genetic combination algorithm.\n GeneScienceInterface public geneScience;\n\n /// @dev Update the address of the genetic contract, can only be called by the CEO.\n /// @param _address An address of a GeneScience contract instance to be used from this point forward.\n function setGeneScienceAddress(address _address) external onlyCEO {\n GeneScienceInterface candidateContract = GeneScienceInterface(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isGeneScience());\n\n // Set the new contract address\n geneScience = candidateContract;\n }\n\n /// @dev Checks that a given kitten is able to breed. Requires that the\n /// current cooldown is finished (for sires) and also checks that there is\n /// no pending pregnancy.\n function _isReadyToBreed(Kitty _kit) internal view returns (bool) {\n // In addition to checking the cooldownEndBlock, we also need to check to see if\n // the cat has a pending birth; there can be some period of time between the end\n // of the pregnacy timer and the birth event.\n return (_kit.siringWithId == 0) && (_kit.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @dev Check if a sire has authorized breeding with this matron. True if both sire\n /// and matron have the same owner, or if the sire has given siring permission to\n /// the matron's owner (via approveSiring()).\n function _isSiringPermitted(uint256 _sireId, uint256 _matronId) internal view returns (bool) {\n address matronOwner = kittyIndexToOwner[_matronId];\n address sireOwner = kittyIndexToOwner[_sireId];\n\n // Siring is okay if they have same owner, or if the matron's owner was given\n // permission to breed with this sire.\n return (matronOwner == sireOwner || sireAllowedToAddress[_sireId] == matronOwner);\n }\n\n /// @dev Set the cooldownEndTime for the given Kitty, based on its current cooldownIndex.\n /// Also increments the cooldownIndex (unless it has hit the cap).\n /// @param _kitten A reference to the Kitty in storage which needs its timer started.\n function _triggerCooldown(Kitty storage _kitten) internal {\n // Compute an estimation of the cooldown time in blocks (based on current cooldownIndex).\n _kitten.cooldownEndBlock = uint64((cooldowns[_kitten.cooldownIndex]/secondsPerBlock) + block.number);\n\n // Increment the breeding count, clamping it at 13, which is the length of the\n // cooldowns array. We could check the array size dynamically, but hard-coding\n // this as a constant saves gas. Yay, Solidity!\n if (_kitten.cooldownIndex < 13) {\n _kitten.cooldownIndex += 1;\n }\n }\n\n /// @notice Grants approval to another user to sire with one of your Kitties.\n /// @param _addr The address that will be able to sire with your Kitty. Set to\n /// address(0) to clear all siring approvals for this Kitty.\n /// @param _sireId A Kitty that you own that _addr will now be able to sire with.\n function approveSiring(address _addr, uint256 _sireId)\n external\n whenNotPaused\n {\n require(_owns(msg.sender, _sireId));\n sireAllowedToAddress[_sireId] = _addr;\n }\n\n /// @dev Updates the minimum payment required for calling giveBirthAuto(). Can only\n /// be called by the COO address. (This fee is used to offset the gas cost incurred\n /// by the autobirth daemon).\n function setAutoBirthFee(uint256 val) external onlyCOO {\n autoBirthFee = val;\n }\n\n /// @dev Checks to see if a given Kitty is pregnant and (if so) if the gestation\n /// period has passed.\n function _isReadyToGiveBirth(Kitty _matron) private view returns (bool) {\n return (_matron.siringWithId != 0) && (_matron.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @notice Checks that a given kitten is able to breed (i.e. it is not pregnant or\n /// in the middle of a siring cooldown).\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isReadyToBreed(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n Kitty storage kit = kitties[_kittyId];\n return _isReadyToBreed(kit);\n }\n\n /// @dev Checks whether a kitty is currently pregnant.\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isPregnant(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n // A kitty is pregnant if and only if this field is set\n return kitties[_kittyId].siringWithId != 0;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair. DOES NOT\n /// check ownership permissions (that is up to the caller).\n /// @param _matron A reference to the Kitty struct of the potential matron.\n /// @param _matronId The matron's ID.\n /// @param _sire A reference to the Kitty struct of the potential sire.\n /// @param _sireId The sire's ID\n function _isValidMatingPair(\n Kitty storage _matron,\n uint256 _matronId,\n Kitty storage _sire,\n uint256 _sireId\n )\n private\n view\n returns(bool)\n {\n // A Kitty can't breed with itself!\n if (_matronId == _sireId) {\n return false;\n }\n\n // Kitties can't breed with their parents.\n if (_matron.matronId == _sireId || _matron.sireId == _sireId) {\n return false;\n }\n if (_sire.matronId == _matronId || _sire.sireId == _matronId) {\n return false;\n }\n\n // We can short circuit the sibling check (below) if either cat is\n // gen zero (has a matron ID of zero).\n if (_sire.matronId == 0 || _matron.matronId == 0) {\n return true;\n }\n\n // Kitties can't breed with full or half siblings.\n if (_sire.matronId == _matron.matronId || _sire.matronId == _matron.sireId) {\n return false;\n }\n if (_sire.sireId == _matron.matronId || _sire.sireId == _matron.sireId) {\n return false;\n }\n\n // Everything seems cool! Let's get DTF.\n return true;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair for\n /// breeding via auction (i.e. skips ownership and siring approval checks).\n function _canBreedWithViaAuction(uint256 _matronId, uint256 _sireId)\n internal\n view\n returns (bool)\n {\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId);\n }\n\n /// @notice Checks to see if two cats can breed together, including checks for\n /// ownership and siring approvals. Does NOT check that both cats are ready for\n /// breeding (i.e. breedWith could still fail until the cooldowns are finished).\n /// TODO: Shouldn't this check pregnancy and cooldowns?!?\n /// @param _matronId The ID of the proposed matron.\n /// @param _sireId The ID of the proposed sire.\n function canBreedWith(uint256 _matronId, uint256 _sireId)\n external\n view\n returns(bool)\n {\n require(_matronId > 0);\n require(_sireId > 0);\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId) &&\n _isSiringPermitted(_sireId, _matronId);\n }\n\n /// @dev Internal utility function to initiate breeding, assumes that all breeding\n /// requirements have been checked.\n function _breedWith(uint256 _matronId, uint256 _sireId) internal {\n // Grab a reference to the Kitties from storage.\n Kitty storage sire = kitties[_sireId];\n Kitty storage matron = kitties[_matronId];\n\n // Mark the matron as pregnant, keeping track of who the sire is.\n matron.siringWithId = uint32(_sireId);\n\n // Trigger the cooldown for both parents.\n _triggerCooldown(sire);\n _triggerCooldown(matron);\n\n // Clear siring permission for both parents. This may not be strictly necessary\n // but it's likely to avoid confusion!\n delete sireAllowedToAddress[_matronId];\n delete sireAllowedToAddress[_sireId];\n\n // Every time a kitty gets pregnant, counter is incremented.\n pregnantKitties++;\n\n // Emit the pregnancy event.\n Pregnant(kittyIndexToOwner[_matronId], _matronId, _sireId, matron.cooldownEndBlock);\n }\n\n /// @notice Breed a Kitty you own (as matron) with a sire that you own, or for which you\n /// have previously been given Siring approval. Will either make your cat pregnant, or will\n /// fail entirely. Requires a pre-payment of the fee given out to the first caller of giveBirth()\n /// @param _matronId The ID of the Kitty acting as matron (will end up pregnant if successful)\n /// @param _sireId The ID of the Kitty acting as sire (will begin its siring cooldown if successful)\n function breedWithAuto(uint256 _matronId, uint256 _sireId)\n external\n payable\n whenNotPaused\n {\n // Checks for payment.\n require(msg.value >= autoBirthFee);\n\n // Caller must own the matron.\n require(_owns(msg.sender, _matronId));\n\n // Neither sire nor matron are allowed to be on auction during a normal\n // breeding operation, but we don't need to check that explicitly.\n // For matron: The caller of this function can't be the owner of the matron\n // because the owner of a Kitty on auction is the auction house, and the\n // auction house will never call breedWith().\n // For sire: Similarly, a sire on auction will be owned by the auction house\n // and the act of transferring ownership will have cleared any oustanding\n // siring approval.\n // Thus we don't need to spend gas explicitly checking to see if either cat\n // is on auction.\n\n // Check that matron and sire are both owned by caller, or that the sire\n // has given siring permission to caller (i.e. matron's owner).\n // Will fail for _sireId = 0\n require(_isSiringPermitted(_sireId, _matronId));\n\n // Grab a reference to the potential matron\n Kitty storage matron = kitties[_matronId];\n\n // Make sure matron isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(matron));\n\n // Grab a reference to the potential sire\n Kitty storage sire = kitties[_sireId];\n\n // Make sure sire isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(sire));\n\n // Test that these cats are a valid mating pair.\n require(_isValidMatingPair(\n matron,\n _matronId,\n sire,\n _sireId\n ));\n\n // All checks passed, kitty gets pregnant!\n _breedWith(_matronId, _sireId);\n }\n\n /// @notice Have a pregnant Kitty give birth!\n /// @param _matronId A Kitty ready to give birth.\n /// @return The Kitty ID of the new kitten.\n /// @dev Looks at a given Kitty and, if pregnant and if the gestation period has passed,\n /// combines the genes of the two parents to create a new kitten. The new Kitty is assigned\n /// to the current owner of the matron. Upon successful completion, both the matron and the\n /// new kitten will be ready to breed again. Note that anyone can call this function (if they\n /// are willing to pay the gas!), but the new kitten always goes to the mother's owner.\n function giveBirth(uint256 _matronId)\n external\n whenNotPaused\n returns(uint256)\n {\n // Grab a reference to the matron in storage.\n Kitty storage matron = kitties[_matronId];\n\n // Check that the matron is a valid cat.\n require(matron.birthTime != 0);\n\n // Check that the matron is pregnant, and that its time has come!\n require(_isReadyToGiveBirth(matron));\n\n // Grab a reference to the sire in storage.\n uint256 sireId = matron.siringWithId;\n Kitty storage sire = kitties[sireId];\n\n // Determine the higher generation number of the two parents\n uint16 parentGen = matron.generation;\n if (sire.generation > matron.generation) {\n parentGen = sire.generation;\n }\n\n // Call the sooper-sekret gene mixing operation.\n uint256 childGenes = geneScience.mixGenes(matron.genes, sire.genes, matron.cooldownEndBlock - 1);\n\n // Make the new kitten!\n address owner = kittyIndexToOwner[_matronId];\n uint256 kittenId = _createKitty(_matronId, matron.siringWithId, parentGen + 1, childGenes, owner);\n\n // Clear the reference to sire from the matron (REQUIRED! Having siringWithId\n // set is what marks a matron as being pregnant.)\n delete matron.siringWithId;\n\n // Every time a kitty gives birth counter is decremented.\n pregnantKitties--;\n\n // Send the balance fee to the person who made birth happen.\n msg.sender.send(autoBirthFee);\n\n // return the new kitten's ID\n return kittenId;\n }\n}\n\n\n\n\n\n\n\n\n\n\n/// @title Auction Core\n/// @dev Contains models, variables, and internal methods for the auction.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuctionBase {\n\n // Represents an auction on an NFT\n struct Auction {\n // Current owner of NFT\n address seller;\n // Price (in wei) at beginning of auction\n uint128 startingPrice;\n // Price (in wei) at end of auction\n uint128 endingPrice;\n // Duration (in seconds) of auction\n uint64 duration;\n // Time when auction started\n // NOTE: 0 if this auction has been concluded\n uint64 startedAt;\n }\n\n // Reference to contract tracking NFT ownership\n KittiesERC721 public nonFungibleContract;\n\n // Cut owner takes on each auction, measured in basis points (1/100 of a percent).\n // Values 0-10,000 map to 0%-100%\n uint256 public ownerCut;\n\n // Map from token ID to their corresponding auction.\n mapping (uint256 => Auction) tokenIdToAuction;\n\n event AuctionCreated(uint256 tokenId, uint256 startingPrice, uint256 endingPrice, uint256 duration);\n event AuctionSuccessful(uint256 tokenId, uint256 totalPrice, address winner);\n event AuctionCancelled(uint256 tokenId);\n\n /// @dev Returns true if the claimant owns the token.\n /// @param _claimant - Address claiming to own the token.\n /// @param _tokenId - ID of token whose ownership to verify.\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return (nonFungibleContract.ownerOf(_tokenId) == _claimant);\n }\n\n /// @dev Escrows the NFT, assigning ownership to this contract.\n /// Throws if the escrow fails.\n /// @param _owner - Current owner address of token to escrow.\n /// @param _tokenId - ID of token whose approval to verify.\n function _escrow(address _owner, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transferFrom(_owner, this, _tokenId);\n }\n\n /// @dev Transfers an NFT owned by this contract to another address.\n /// Returns true if the transfer succeeds.\n /// @param _receiver - Address to transfer NFT to.\n /// @param _tokenId - ID of token to transfer.\n function _transfer(address _receiver, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transfer(_receiver, _tokenId);\n }\n\n /// @dev Adds an auction to the list of open auctions. Also fires the\n /// AuctionCreated event.\n /// @param _tokenId The ID of the token to be put on auction.\n /// @param _auction Auction to add.\n function _addAuction(uint256 _tokenId, Auction _auction) internal {\n // Require that all auctions have a duration of\n // at least one minute. (Keeps our math from getting hairy!)\n require(_auction.duration >= 1 minutes);\n\n tokenIdToAuction[_tokenId] = _auction;\n\n AuctionCreated(\n uint256(_tokenId),\n uint256(_auction.startingPrice),\n uint256(_auction.endingPrice),\n uint256(_auction.duration)\n );\n }\n\n /// @dev Cancels an auction unconditionally.\n function _cancelAuction(uint256 _tokenId, address _seller) internal {\n _removeAuction(_tokenId);\n _transfer(_seller, _tokenId);\n AuctionCancelled(_tokenId);\n }\n\n /// @dev Computes the price and transfers winnings.\n /// Does NOT transfer ownership of token.\n function _bid(uint256 _tokenId, uint256 _bidAmount)\n internal\n returns (uint256)\n {\n // Get a reference to the auction struct\n Auction storage auction = tokenIdToAuction[_tokenId];\n\n // Explicitly check that this auction is currently live.\n // (Because of how Ethereum mappings work, we can't just count\n // on the lookup above failing. An invalid _tokenId will just\n // return an auction object that is all zeros.)\n require(_isOnAuction(auction));\n\n // Check that the bid is greater than or equal to the current price\n uint256 price = _currentPrice(auction);\n require(_bidAmount >= price);\n\n // Grab a reference to the seller before the auction struct\n // gets deleted.\n address seller = auction.seller;\n\n // The bid is good! Remove the auction before sending the fees\n // to the sender so we can't have a reentrancy attack.\n _removeAuction(_tokenId);\n\n // Transfer proceeds to seller (if there are any!)\n if (price > 0) {\n // Calculate the auctioneer's cut.\n // (NOTE: _computeCut() is guaranteed to return a\n // value <= price, so this subtraction can't go negative.)\n uint256 auctioneerCut = _computeCut(price);\n uint256 sellerProceeds = price - auctioneerCut;\n\n // NOTE: Doing a transfer() in the middle of a complex\n // method like this is generally discouraged because of\n // reentrancy attacks and DoS attacks if the seller is\n // a contract with an invalid fallback function. We explicitly\n // guard against reentrancy attacks by removing the auction\n // before calling transfer(), and the only thing the seller\n // can DoS is the sale of their own asset! (And if it's an\n // accident, they can call cancelAuction(). )\n seller.transfer(sellerProceeds);\n }\n\n // Calculate any excess funds included with the bid. If the excess\n // is anything worth worrying about, transfer it back to bidder.\n // NOTE: We checked above that the bid amount is greater than or\n // equal to the price so this cannot underflow.\n uint256 bidExcess = _bidAmount - price;\n\n // Return the funds. Similar to the previous transfer, this is\n // not susceptible to a re-entry attack because the auction is\n // removed before any transfers occur.\n msg.sender.transfer(bidExcess);\n\n // Tell the world!\n AuctionSuccessful(_tokenId, price, msg.sender);\n\n return price;\n }\n\n /// @dev Removes an auction from the list of open auctions.\n /// @param _tokenId - ID of NFT on auction.\n function _removeAuction(uint256 _tokenId) internal {\n delete tokenIdToAuction[_tokenId];\n }\n\n /// @dev Returns true if the NFT is on auction.\n /// @param _auction - Auction to check.\n function _isOnAuction(Auction storage _auction) internal view returns (bool) {\n return (_auction.startedAt > 0);\n }\n\n /// @dev Returns current price of an NFT on auction. Broken into two\n /// functions (this one, that computes the duration from the auction\n /// structure, and the other that does the price computation) so we\n /// can easily test that the price computation works correctly.\n function _currentPrice(Auction storage _auction)\n internal\n view\n returns (uint256)\n {\n uint256 secondsPassed = 0;\n\n // A bit of insurance against negative values (or wraparound).\n // Probably not necessary (since Ethereum guarnatees that the\n // now variable doesn't ever go backwards).\n if (now > _auction.startedAt) {\n secondsPassed = now - _auction.startedAt;\n }\n\n return _computeCurrentPrice(\n _auction.startingPrice,\n _auction.endingPrice,\n _auction.duration,\n secondsPassed\n );\n }\n\n /// @dev Computes the current price of an auction. Factored out\n /// from _currentPrice so we can run extensive unit tests.\n /// When testing, make this function public and turn on\n /// `Current price computation` test suite.\n function _computeCurrentPrice(\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n uint256 _secondsPassed\n )\n internal\n pure\n returns (uint256)\n {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our public functions carefully cap the maximum values for\n // time (at 64-bits) and currency (at 128-bits). _duration is\n // also known to be non-zero (see the require() statement in\n // _addAuction())\n if (_secondsPassed >= _duration) {\n // We've reached the end of the dynamic pricing portion\n // of the auction, just return the end price.\n return _endingPrice;\n } else {\n // Starting price can be higher than ending price (and often is!), so\n // this delta can be negative.\n int256 totalPriceChange = int256(_endingPrice) - int256(_startingPrice);\n\n // This multiplication can't overflow, _secondsPassed will easily fit within\n // 64-bits, and totalPriceChange will easily fit within 128-bits, their product\n // will always fit within 256-bits.\n int256 currentPriceChange = totalPriceChange * int256(_secondsPassed) / int256(_duration);\n\n // currentPriceChange can be negative, but if so, will have a magnitude\n // less that _startingPrice. Thus, this result will always end up positive.\n int256 currentPrice = int256(_startingPrice) + currentPriceChange;\n\n return uint256(currentPrice);\n }\n }\n\n /// @dev Computes owner's cut of a sale.\n /// @param _price - Sale price of NFT.\n function _computeCut(uint256 _price) internal view returns (uint256) {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our entry functions carefully cap the maximum values for\n // currency (at 128-bits), and ownerCut <= 10000 (see the require()\n // statement in the ClockAuction constructor). The result of this\n // function is always guaranteed to be <= _price.\n return _price * ownerCut / 10000;\n }\n\n}\n\n\n\n\n\n\n\n/**\n * @title KittiesPausable\n * @dev Base contract which allows children to implement an emergency stop mechanism.\n */\ncontract KittiesPausable is KittiesOwnable {\n event Pause();\n event Unpause();\n\n bool public paused = false;\n\n\n /**\n\t * @dev modifier to allow actions only when the contract IS paused\n\t */\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /**\n\t * @dev modifier to allow actions only when the contract IS NOT paused\n\t */\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /**\n\t * @dev called by the owner to pause, triggers stopped state\n\t */\n function pause() onlyOwner whenNotPaused returns (bool) {\n paused = true;\n Pause();\n return true;\n }\n\n /**\n\t * @dev called by the owner to unpause, returns to normal state\n\t */\n function unpause() onlyOwner whenPaused returns (bool) {\n paused = false;\n Unpause();\n return true;\n }\n}\n\n\n/// @title Clock auction for non-fungible tokens.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuction is KittiesPausable, ClockAuctionBase {\n\n /// @dev The ERC-165 interface signature for ERC-721.\n /// Ref: https://github.com/ethereum/EIPs/issues/165\n /// Ref: https://github.com/ethereum/EIPs/issues/721\n bytes4 constant InterfaceSignature_ERC721 = bytes4(0x9a20483d);\n\n /// @dev Constructor creates a reference to the NFT ownership contract\n /// and verifies the owner cut is in the valid range.\n /// @param _nftAddress - address of a deployed contract implementing\n /// the Nonfungible Interface.\n /// @param _cut - percent cut the owner takes on each auction, must be\n /// between 0-10,000.\n function ClockAuction(address _nftAddress, uint256 _cut) public {\n require(_cut <= 10000);\n ownerCut = _cut;\n\n KittiesERC721 candidateContract = KittiesERC721(_nftAddress);\n require(candidateContract.supportsInterface(InterfaceSignature_ERC721));\n nonFungibleContract = candidateContract;\n }\n\n /// @dev Remove all Ether from the contract, which is the owner's cuts\n /// as well as any Ether sent directly to the contract address.\n /// Always transfers to the NFT contract, but can be called either by\n /// the owner or the NFT contract.\n function withdrawBalance() external {\n address nftAddress = address(nonFungibleContract);\n\n require(\n msg.sender == owner ||\n msg.sender == nftAddress\n );\n // We are using this boolean method to make sure that even if one fails it will still work\n bool res = nftAddress.send(this.balance);\n }\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of time to move between starting\n /// price and ending price (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n whenNotPaused\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(_owns(msg.sender, _tokenId));\n _escrow(msg.sender, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Bids on an open auction, completing the auction and transferring\n /// ownership of the NFT if enough Ether is supplied.\n /// @param _tokenId - ID of token to bid on.\n function bid(uint256 _tokenId)\n external\n payable\n whenNotPaused\n {\n // _bid will throw if the bid or funds transfer fails\n _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n }\n\n /// @dev Cancels an auction that hasn't been won yet.\n /// Returns the NFT to original owner.\n /// @notice This is a state-modifying function that can\n /// be called while the contract is paused.\n /// @param _tokenId - ID of token on auction\n function cancelAuction(uint256 _tokenId)\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n address seller = auction.seller;\n require(msg.sender == seller);\n _cancelAuction(_tokenId, seller);\n }\n\n /// @dev Cancels an auction when the contract is paused.\n /// Only the owner may do this, and NFTs are returned to\n /// the seller. This should only be used in emergencies.\n /// @param _tokenId - ID of the NFT on auction to cancel.\n function cancelAuctionWhenPaused(uint256 _tokenId)\n whenPaused\n onlyOwner\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n _cancelAuction(_tokenId, auction.seller);\n }\n\n /// @dev Returns auction info for an NFT on auction.\n /// @param _tokenId - ID of NFT on auction.\n function getAuction(uint256 _tokenId)\n external\n view\n returns\n (\n address seller,\n uint256 startingPrice,\n uint256 endingPrice,\n uint256 duration,\n uint256 startedAt\n ) {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return (\n auction.seller,\n auction.startingPrice,\n auction.endingPrice,\n auction.duration,\n auction.startedAt\n );\n }\n\n /// @dev Returns the current price of an auction.\n /// @param _tokenId - ID of the token price we are checking.\n function getCurrentPrice(uint256 _tokenId)\n external\n view\n returns (uint256)\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return _currentPrice(auction);\n }\n\n}\n\n\n/// @title Reverse auction modified for siring\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SiringClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSiringAuctionAddress() call.\n bool public isSiringClockAuction = true;\n\n // Delegate constructor\n function SiringClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction. Since this function is wrapped,\n /// require sender to be KittyCore contract.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Places a bid for siring. Requires the sender\n /// is the KittyCore contract because all bid methods\n /// should be wrapped. Also returns the kitty to the\n /// seller rather than the winner.\n function bid(uint256 _tokenId)\n external\n payable\n {\n require(msg.sender == address(nonFungibleContract));\n address seller = tokenIdToAuction[_tokenId].seller;\n // _bid checks that token ID is valid and will throw if bid fails\n _bid(_tokenId, msg.value);\n // We transfer the kitty back to the seller, the winner will get\n // the offspring\n _transfer(seller, _tokenId);\n }\n\n}\n\n\n\n\n\n/// @title Clock auction modified for sale of kitties\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SaleClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSaleAuctionAddress() call.\n bool public isSaleClockAuction = true;\n\n // Tracks last 5 sale price of gen0 kitty sales\n uint256 public gen0SaleCount;\n uint256[5] public lastGen0SalePrices;\n\n // Delegate constructor\n function SaleClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Updates lastSalePrice if seller is the nft contract\n /// Otherwise, works the same as default bid method.\n function bid(uint256 _tokenId)\n external\n payable\n {\n // _bid verifies token ID size\n address seller = tokenIdToAuction[_tokenId].seller;\n uint256 price = _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n\n // If not a gen0 auction, exit\n if (seller == address(nonFungibleContract)) {\n // Track gen0 sale prices\n lastGen0SalePrices[gen0SaleCount % 5] = price;\n gen0SaleCount++;\n }\n }\n\n function averageGen0SalePrice() external view returns (uint256) {\n uint256 sum = 0;\n for (uint256 i = 0; i < 5; i++) {\n sum += lastGen0SalePrices[i];\n }\n return sum / 5;\n }\n\n}\n\n\n/// @title Handles creating auctions for sale and siring of kitties.\n/// This wrapper of ReverseAuction exists only so that users can create\n/// auctions with only one transaction.\ncontract KittyAuction is KittyBreeding {\n\n // @notice The auction contract variables are defined in KittyBase to allow\n // us to refer to them in KittyOwnership to prevent accidental transfers.\n // `saleAuction` refers to the auction for gen0 and p2p sale of kitties.\n // `siringAuction` refers to the auction for siring rights of kitties.\n\n /// @dev Sets the reference to the sale auction.\n /// @param _address - Address of sale contract.\n function setSaleAuctionAddress(address _address) external onlyCEO {\n SaleClockAuction candidateContract = SaleClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSaleClockAuction());\n\n // Set the new contract address\n saleAuction = candidateContract;\n }\n\n /// @dev Sets the reference to the siring auction.\n /// @param _address - Address of siring contract.\n function setSiringAuctionAddress(address _address) external onlyCEO {\n SiringClockAuction candidateContract = SiringClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSiringClockAuction());\n\n // Set the new contract address\n siringAuction = candidateContract;\n }\n\n /// @dev Put a kitty up for auction.\n /// Does some ownership trickery to create auctions in one tx.\n function createSaleAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n // Ensure the kitty is not pregnant to prevent the auction\n // contract accidentally receiving ownership of the child.\n // NOTE: the kitty IS allowed to be in a cooldown.\n require(!isPregnant(_kittyId));\n _approve(_kittyId, saleAuction);\n // Sale auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n saleAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Put a kitty up for auction to be sire.\n /// Performs checks to ensure the kitty can be sired, then\n /// delegates to reverse auction.\n function createSiringAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n require(isReadyToBreed(_kittyId));\n _approve(_kittyId, siringAuction);\n // Siring auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n siringAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Completes a siring auction by bidding.\n /// Immediately breeds the winning matron with the sire on auction.\n /// @param _sireId - ID of the sire on auction.\n /// @param _matronId - ID of the matron owned by the bidder.\n function bidOnSiringAuction(\n uint256 _sireId,\n uint256 _matronId\n )\n external\n payable\n whenNotPaused\n {\n // Auction contract checks input sizes\n require(_owns(msg.sender, _matronId));\n require(isReadyToBreed(_matronId));\n require(_canBreedWithViaAuction(_matronId, _sireId));\n\n // Define the current price of the auction.\n uint256 currentPrice = siringAuction.getCurrentPrice(_sireId);\n require(msg.value >= currentPrice + autoBirthFee);\n\n // Siring auction will throw if the bid fails.\n siringAuction.bid.value(msg.value - autoBirthFee)(_sireId);\n _breedWith(uint32(_matronId), uint32(_sireId));\n }\n\n /// @dev Transfers the balance of the sale auction contract\n /// to the KittyCore contract. We use two-step withdrawal to\n /// prevent two transfer calls in the auction bid function.\n function withdrawAuctionBalances() external onlyCLevel {\n saleAuction.withdrawBalance();\n siringAuction.withdrawBalance();\n }\n}\n\n\n/// @title all functions related to creating kittens\ncontract KittyMinting is KittyAuction {\n\n // Limits the number of cats the contract owner can ever create.\n uint256 public constant PROMO_CREATION_LIMIT = 5000;\n uint256 public constant GEN0_CREATION_LIMIT = 45000;\n\n // Constants for gen0 auctions.\n uint256 public constant GEN0_STARTING_PRICE = 10 finney;\n uint256 public constant GEN0_AUCTION_DURATION = 1 days;\n\n // Counts the number of cats the contract owner has created.\n uint256 public promoCreatedCount;\n uint256 public gen0CreatedCount;\n\n /// @dev we can create promo kittens, up to a limit. Only callable by COO\n /// @param _genes the encoded genes of the kitten to be created, any value is accepted\n /// @param _owner the future owner of the created kittens. Default to contract COO\n function createPromoKitty(uint256 _genes, address _owner) external onlyCOO {\n address kittyOwner = _owner;\n if (kittyOwner == address(0)) {\n kittyOwner = cooAddress;\n }\n require(promoCreatedCount < PROMO_CREATION_LIMIT);\n\n promoCreatedCount++;\n _createKitty(0, 0, 0, _genes, kittyOwner);\n }\n\n /// @dev Creates a new gen0 kitty with the given genes and\n /// creates an auction for it.\n function createGen0Auction(uint256 _genes) external onlyCOO {\n require(gen0CreatedCount < GEN0_CREATION_LIMIT);\n\n uint256 kittyId = _createKitty(0, 0, 0, _genes, address(this));\n _approve(kittyId, saleAuction);\n\n saleAuction.createAuction(\n kittyId,\n _computeNextGen0Price(),\n 0,\n GEN0_AUCTION_DURATION,\n address(this)\n );\n\n gen0CreatedCount++;\n }\n\n /// @dev Computes the next gen0 auction starting price, given\n /// the average of the past 5 prices + 50%.\n function _computeNextGen0Price() internal view returns (uint256) {\n uint256 avePrice = saleAuction.averageGen0SalePrice();\n\n // Sanity check to ensure we don't overflow arithmetic\n require(avePrice == uint256(uint128(avePrice)));\n\n uint256 nextPrice = avePrice + (avePrice / 2);\n\n // We never auction for less than starting price\n if (nextPrice < GEN0_STARTING_PRICE) {\n nextPrice = GEN0_STARTING_PRICE;\n }\n\n return nextPrice;\n }\n}\n\n\n/// @title CryptoKitties: Collectible, breedable, and oh-so-adorable cats on the Ethereum blockchain.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev The main CryptoKitties contract, keeps track of kittens so they don't wander around and get lost.\ncontract KittyCore is KittyMinting {\n\n // This is the main CryptoKitties contract. In order to keep our code seperated into logical sections,\n // we've broken it up in two ways. First, we have several seperately-instantiated sibling contracts\n // that handle auctions and our super-top-secret genetic combination algorithm. The auctions are\n // seperate since their logic is somewhat complex and there's always a risk of subtle bugs. By keeping\n // them in their own contracts, we can upgrade them without disrupting the main contract that tracks\n // kitty ownership. The genetic combination algorithm is kept seperate so we can open-source all of\n // the rest of our code without making it _too_ easy for folks to figure out how the genetics work.\n // Don't worry, I'm sure someone will reverse engineer it soon enough!\n //\n // Secondly, we break the core contract into multiple files using inheritence, one for each major\n // facet of functionality of CK. This allows us to keep related code bundled together while still\n // avoiding a single giant file with everything in it. The breakdown is as follows:\n //\n // - KittyBase: This is where we define the most fundamental code shared throughout the core\n // functionality. This includes our main data storage, constants and data types, plus\n // internal functions for managing these items.\n //\n // - KittyAccessControl: This contract manages the various addresses and constraints for operations\n // that can be executed only by specific roles. Namely CEO, CFO and COO.\n //\n // - KittyOwnership: This provides the methods required for basic non-fungible token\n // transactions, following the draft ERC-721 spec (https://github.com/ethereum/EIPs/issues/721).\n //\n // - KittyBreeding: This file contains the methods necessary to breed cats together, including\n // keeping track of siring offers, and relies on an external genetic combination contract.\n //\n // - KittyAuctions: Here we have the public methods for auctioning or bidding on cats or siring\n // services. The actual auction functionality is handled in two sibling contracts (one\n // for sales and one for siring), while auction creation and bidding is mostly mediated\n // through this facet of the core contract.\n //\n // - KittyMinting: This final facet contains the functionality we use for creating new gen0 cats.\n // We can make up to 5000 \"promo\" cats that can be given away (especially important when\n // the community is new), and all others can only be created and then immediately put up\n // for auction via an algorithmically determined starting price. Regardless of how they\n // are created, there is a hard limit of 50k gen0 cats. After that, it's all up to the\n // community to breed, breed, breed!\n\n // Set in case the core contract is broken and an upgrade is required\n address public newContractAddress;\n\n /// @notice Creates the main CryptoKitties smart contract instance.\n function KittyCore() public {\n // Starts paused.\n paused = true;\n\n // the creator of the contract is the initial CEO\n ceoAddress = msg.sender;\n\n // the creator of the contract is also the initial COO\n cooAddress = msg.sender;\n\n // start with the mythical kitten 0 - so we don't have generation-0 parent issues\n _createKitty(0, 0, 0, uint256(-1), address(0));\n }\n\n /// @dev Used to mark the smart contract as upgraded, in case there is a serious\n /// breaking bug. This method does nothing but keep track of the new contract and\n /// emit a message indicating that the new address is set. It's up to clients of this\n /// contract to update to the new contract address in that case. (This contract will\n /// be paused indefinitely if such an upgrade takes place.)\n /// @param _v2Address new address\n function setNewAddress(address _v2Address) external onlyCEO whenPaused {\n // See README.md for updgrade plan\n newContractAddress = _v2Address;\n ContractUpgrade(_v2Address);\n }\n\n /// @notice No tipping!\n /// @dev Reject all Ether from being sent here, unless it's from one of the\n /// two auction contracts. (Hopefully, we can prevent user accidents.)\n function() external payable {\n require(\n msg.sender == address(saleAuction) ||\n msg.sender == address(siringAuction)\n );\n }\n\n /// @notice Returns all the relevant information about a specific kitty.\n /// @param _id The ID of the kitty of interest.\n function getKitty(uint256 _id)\n external\n view\n returns (\n bool isGestating,\n bool isReady,\n uint256 cooldownIndex,\n uint256 nextActionAt,\n uint256 siringWithId,\n uint256 birthTime,\n uint256 matronId,\n uint256 sireId,\n uint256 generation,\n uint256 genes\n ) {\n Kitty storage kit = kitties[_id];\n\n // if this variable is 0 then it's not gestating\n isGestating = (kit.siringWithId != 0);\n isReady = (kit.cooldownEndBlock <= block.number);\n cooldownIndex = uint256(kit.cooldownIndex);\n nextActionAt = uint256(kit.cooldownEndBlock);\n siringWithId = uint256(kit.siringWithId);\n birthTime = uint256(kit.birthTime);\n matronId = uint256(kit.matronId);\n sireId = uint256(kit.sireId);\n generation = uint256(kit.generation);\n genes = kit.genes;\n }\n\n /// @dev Override unpause so it requires all external contract addresses\n /// to be set before contract can be unpaused. Also, we can't have\n /// newContractAddress set either, because then the contract was upgraded.\n /// @notice This is public rather than external so we can call super.unpause\n /// without using an expensive CALL.\n function unpause() public onlyCEO whenPaused {\n require(saleAuction != address(0));\n require(siringAuction != address(0));\n require(geneScience != address(0));\n require(newContractAddress == address(0));\n\n // Actually unpause the contract.\n super.unpause();\n }\n\n // @dev Allows the CFO to capture the balance available to the contract.\n function withdrawBalance() external onlyCFO {\n uint256 balance = this.balance;\n // Subtract all the currently pregnant kittens we have, plus 1 of margin.\n uint256 subtractFees = (pregnantKitties + 1) * autoBirthFee;\n\n if (balance > subtractFees) {\n cfoAddress.send(balance - subtractFees);\n }\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "exportedSymbols": { "ClockAuction": [ 8872 @@ -51956,5 +51956,5 @@ }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:47.854Z" + "updatedAt": "2018-10-09T17:45:36.187Z" } \ No newline at end of file diff --git a/artifacts/json/KittyBreeding.json b/artifacts/json/KittyBreeding.json index ad579bd9..7507b746 100644 --- a/artifacts/json/KittyBreeding.json +++ b/artifacts/json/KittyBreeding.json @@ -778,15 +778,15 @@ "type": "event" } ], - "bytecode": "0x60606040526000600260146101000a81548160ff0219169083151502179055506101c060405190810160405280603c63ffffffff1663ffffffff168152602001607863ffffffff1663ffffffff16815260200161012c63ffffffff1663ffffffff16815260200161025863ffffffff1663ffffffff16815260200161070863ffffffff1663ffffffff168152602001610e1063ffffffff1663ffffffff168152602001611c2063ffffffff1663ffffffff16815260200161384063ffffffff1663ffffffff16815260200161708063ffffffff1663ffffffff16815260200161e10063ffffffff1663ffffffff1681526020016201518063ffffffff1663ffffffff1681526020016202a30063ffffffff1663ffffffff1681526020016205460063ffffffff1663ffffffff16815260200162093a8063ffffffff1663ffffffff16815250600390600e6200015692919062000179565b50600f60055566071afd498d0000600e5534156200017357600080fd5b62000259565b82600e600701600890048101928215620002105791602002820160005b83821115620001dc57835183826101000a81548163ffffffff021916908363ffffffff160217905550926020019260040160208160030104928301926001030262000196565b80156200020e5782816101000a81549063ffffffff0219169055600401602081600301049283019260010302620001dc565b505b5090506200021f919062000223565b5090565b6200025691905b808211156200025257600081816101000a81549063ffffffff0219169055506001016200022a565b5090565b90565b613ada80620002696000396000f3006060604052600436106101f9576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146101fe5780630519ce79146102585780630560ff44146102ad57806306fdde031461035d578063095ea7b3146103eb5780630a0f81681461042d57806318160ddd14610482578063183a7947146104ab5780631940a936146104d457806321717ebf1461050f57806323b872dd1461056457806324e7a38a146105c557806327d7874c146105fe5780632ba73c15146106375780633f4ba83a1461067057806346116e6f1461068557806346d22c70146106e8578063481af3d31461072c5780634b85fd551461078f5780634dfff04f146107b25780634e0a3379146107f45780635663896e1461082d5780635c975abb146108505780636352211e1461087d57806370a08231146108e05780637a7d49371461092d5780638456cb59146109565780638462151c1461096b57806388c2a0bf146109f957806395d89b4114610a305780639d6fac6f14610abe578063a45f4bfc14610b01578063a9059cbb14610b64578063b047fb5014610ba6578063b0c35c0514610bfb578063bc4006f514610c24578063d3e6f49f14610c79578063e17b25af14610cb4578063e6cbe35114610ced578063f2b47d5214610d42578063f7d8c88314610d97575b600080fd5b341561020957600080fd5b61023e60048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050610db8565b604051808215151515815260200191505060405180910390f35b341561026357600080fd5b61026b6110c9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102b857600080fd5b6102e2600480803590602001909190803590602001908201803590602001919091929050506110ef565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610322578082015181840152602081019050610307565b50505050905090810190601f16801561034f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561036857600080fd5b61037061125a565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103b0578082015181840152602081019050610395565b50505050905090810190601f1680156103dd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156103f657600080fd5b61042b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611293565b005b341561043857600080fd5b610440611355565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561048d57600080fd5b61049561137a565b6040518082815260200191505060405180910390f35b34156104b657600080fd5b6104be61138a565b6040518082815260200191505060405180910390f35b34156104df57600080fd5b6104f56004808035906020019091905050611390565b604051808215151515815260200191505060405180910390f35b341561051a57600080fd5b6105226113e2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561056f57600080fd5b6105c3600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611408565b005b34156105d057600080fd5b6105fc600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506114b9565b005b341561060957600080fd5b610635600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506115f0565b005b341561064257600080fd5b61066e600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506116ca565b005b341561067b57600080fd5b6106836117a5565b005b341561069057600080fd5b6106a66004808035906020019091905050611838565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156106f357600080fd5b610712600480803590602001909190803590602001909190505061186b565b604051808215151515815260200191505060405180910390f35b341561073757600080fd5b61074d60048080359060200190919050506118f3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561079a57600080fd5b6107b06004808035906020019091905050611926565b005b34156107bd57600080fd5b6107f2600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061198c565b005b34156107ff57600080fd5b61082b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611a13565b005b341561083857600080fd5b61084e6004808035906020019091905050611aee565b005b341561085b57600080fd5b610863611c42565b604051808215151515815260200191505060405180910390f35b341561088857600080fd5b61089e6004808035906020019091905050611c55565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156108eb57600080fd5b610917600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611cce565b6040518082815260200191505060405180910390f35b341561093857600080fd5b610940611d17565b6040518082815260200191505060405180910390f35b341561096157600080fd5b610969611d1d565b005b341561097657600080fd5b6109a2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611e61565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156109e55780820151818401526020810190506109ca565b505050509050019250505060405180910390f35b3415610a0457600080fd5b610a1a6004808035906020019091905050611f98565b6040518082815260200191505060405180910390f35b3415610a3b57600080fd5b610a436123b7565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610a83578082015181840152602081019050610a68565b50505050905090810190601f168015610ab05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610ac957600080fd5b610adf60048080359060200190919050506123f0565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3415610b0c57600080fd5b610b22600480803590602001909190505061241f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610b6f57600080fd5b610ba4600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050612452565b005b3415610bb157600080fd5b610bb96125c3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610c0657600080fd5b610c0e6125e9565b6040518082815260200191505060405180910390f35b3415610c2f57600080fd5b610c376125ef565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610c8457600080fd5b610c9a6004808035906020019091905050612615565b604051808215151515815260200191505060405180910390f35b3415610cbf57600080fd5b610ceb600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612784565b005b3415610cf857600080fd5b610d00612823565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610d4d57600080fd5b610d55612849565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610db6600480803590602001909190803590602001909190505061286f565b005b600060405180807f737570706f727473496e74657266616365286279746573342900000000000000815250601901905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806110c2575060405180807f746f6b656e4d657461646174612875696e743235362c737472696e6729000000815250601d019050604051809103902060405180807f746f6b656e734f664f776e6572286164647265737329000000000000000000008152506016019050604051809103902060405180807f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81526020017f74323536290000000000000000000000000000000000000000000000000000008152506025019050604051809103902060405180807f7472616e7366657228616464726573732c75696e7432353629000000000000008152506019019050604051809103902060405180807f617070726f766528616464726573732c75696e743235362900000000000000008152506018019050604051809103902060405180807f6f776e65724f662875696e7432353629000000000000000000000000000000008152506010019050604051809103902060405180807f62616c616e63654f6628616464726573732900000000000000000000000000008152506012019050604051809103902060405180807f746f74616c537570706c79282900000000000000000000000000000000000000815250600d019050604051809103902060405180807f73796d626f6c28290000000000000000000000000000000000000000000000008152506008019050604051809103902060405180807f6e616d6528290000000000000000000000000000000000000000000000000000815250600601905060405180910390201818181818181818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6110f76138e9565b6110ff6138fd565b60008073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561115e57600080fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb4799f2878787600060405160a001526040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180848152602001806020018281038252848482818152602001925080828437820191505094505050505060a060405180830381600087803b151561121957600080fd5b6102c65a03f1151561122a57600080fd5b50505060405180608001805190602001604052809250819350505061124f8282612bb0565b925050509392505050565b6040805190810160405280600d81526020017f43727970746f4b6974746965730000000000000000000000000000000000000081525081565b61129d3382612c08565b15156112a857600080fd5b6112b28183612c74565b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160068054905003905090565b600f5481565b600080821115156113a057600080fd5b60006006838154811015156113b157fe5b906000526020600020906002020160010160189054906101000a900463ffffffff1663ffffffff1614159050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561144457600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561147f57600080fd5b6114893382612cca565b151561149457600080fd5b61149e8382612c08565b15156114a957600080fd5b6114b4838383612d36565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561151657600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166354c15b826000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561158557600080fd5b6102c65a03f1151561159657600080fd5b5050506040518051905015156115ab57600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561164b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561168757600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561172557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561176157600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561180057600080fd5b600260149054906101000a900460ff16151561181b57600080fd5b6000600260146101000a81548160ff021916908315150217905550565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000808511151561187e57600080fd5b60008411151561188d57600080fd5b60068581548110151561189c57fe5b906000526020600020906002020191506006848154811015156118bb57fe5b906000526020600020906002020190506118d782868387612f6e565b80156118e957506118e88486613183565b5b9250505092915050565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561198257600080fd5b80600e8190555050565b600260149054906101000a900460ff161515156119a857600080fd5b6119b23382612c08565b15156119bd57600080fd5b81600a600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a6e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611aaa57600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611b9657506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80611bee5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515611bf957600080fd5b60036000600e81101515611c0957fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff1681101515611c3857600080fd5b8060058190555050565b600260149054906101000a900460ff1681565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611cc957600080fd5b919050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611dc557506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80611e1d5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515611e2857600080fd5b600260149054906101000a900460ff16151515611e4457600080fd5b6001600260146101000a81548160ff021916908315150217905550565b611e69613928565b6000611e73613928565b6000806000611e8187611cce565b94506000851415611eb3576000604051805910611e9b5750595b90808252806020026020018201604052509550611f8e565b84604051805910611ec15750595b90808252806020026020018201604052509350611edc61137a565b925060009150600190505b8281111515611f8a578673ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611f7d57808483815181101515611f6657fe5b906020019060200201818152505081806001019250505b8080600101915050611ee7565b8395505b5050505050919050565b600080600080600080600080600260149054906101000a900460ff16151515611fc057600080fd5b600689815481101515611fcf57fe5b9060005260206000209060020201965060008760010160009054906101000a900467ffffffffffffffff1667ffffffffffffffff161415151561201157600080fd5b612147876101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050613296565b151561215257600080fd5b8660010160189054906101000a900463ffffffff1663ffffffff16955060068681548110151561217e57fe5b9060005260206000209060020201945086600101601e9054906101000a900461ffff16935086600101601e9054906101000a900461ffff1661ffff1685600101601e9054906101000a900461ffff1661ffff1611156121ed5784600101601e9054906101000a900461ffff1693505b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d9f5aed8860000154876000015460018b60010160089054906101000a900467ffffffffffffffff16036000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018381526020018267ffffffffffffffff1681526020019350505050602060405180830381600087803b15156122c357600080fd5b6102c65a03f115156122d457600080fd5b505050604051805190509250600760008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150612344898860010160189054906101000a900463ffffffff1663ffffffff166001870161ffff1686866132d1565b90508660010160186101000a81549063ffffffff0219169055600f60008154809291906001900391905055503373ffffffffffffffffffffffffffffffffffffffff166108fc600e549081150290604051600060405180830381858888f193505050505080975050505050505050919050565b6040805190810160405280600281526020017f434b00000000000000000000000000000000000000000000000000000000000081525081565b600381600e811015156123ff57fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff1615151561246e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156124aa57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156124e557600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561254257600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561259f57600080fd5b6125a93382612c08565b15156125b457600080fd5b6125bf338383612d36565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008311151561262757600080fd5b60068381548110151561263657fe5b9060005260206000209060020201905061277c816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff16815250506135c4565b915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156127df57600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600260149054906101000a900460ff1615151561288e57600080fd5b600e54341015151561289f57600080fd5b6128a93385612c08565b15156128b457600080fd5b6128be8385613183565b15156128c957600080fd5b6006848154811015156128d857fe5b90600052602060002090600202019150612a1e826101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff16815250506135c4565b1515612a2957600080fd5b600683815481101515612a3857fe5b90600052602060002090600202019050612b7e816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff16815250506135c4565b1515612b8957600080fd5b612b9582858386612f6e565b1515612ba057600080fd5b612baa84846135fe565b50505050565b612bb86138e9565b612bc06138e9565b60008084604051805910612bd15750595b9080825280601f01601f19166020018201604052509250602083019150859050612bfc8282876137c8565b82935050505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff166007600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b806009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008273ffffffffffffffffffffffffffffffffffffffff166009600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515612eca57600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600a600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556009600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b600081841415612f81576000905061317b565b818560010160109054906101000a900463ffffffff1663ffffffff161480612fc25750818560010160149054906101000a900463ffffffff1663ffffffff16145b15612fd0576000905061317b565b838360010160109054906101000a900463ffffffff1663ffffffff1614806130115750838360010160149054906101000a900463ffffffff1663ffffffff16145b1561301f576000905061317b565b60008360010160109054906101000a900463ffffffff1663ffffffff161480613062575060008560010160109054906101000a900463ffffffff1663ffffffff16145b15613070576001905061317b565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff1614806130e557508460010160149054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff16145b156130f3576000905061317b565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff16148061316857508460010160149054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff16145b15613176576000905061317b565b600190505b949350505050565b60008060006007600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16148061328c57508173ffffffffffffffffffffffffffffffffffffffff16600a600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b9250505092915050565b6000808260a0015163ffffffff16141580156132ca57504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b6000806132dc61393c565b60008863ffffffff16891415156132f257600080fd5b8763ffffffff168814151561330657600080fd5b8661ffff168714151561331857600080fd5b60028781151561332457fe5b049250600d8361ffff16111561333957600d92505b610100604051908101604052808781526020014267ffffffffffffffff168152602001600067ffffffffffffffff1681526020018a63ffffffff1681526020018963ffffffff168152602001600063ffffffff1681526020018461ffff1681526020018861ffff1681525091506001600680548060010182816133bc91906139b0565b916000526020600020906002020160008590919091506000820151816000015560208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601c6101000a81548161ffff021916908361ffff16021790555060e082015181600101601e6101000a81548161ffff021916908361ffff16021790555050500390508063ffffffff168114151561350e57600080fd5b7f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad58582846060015163ffffffff16856080015163ffffffff168660000151604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a16135b560008683612d36565b80935050505095945050505050565b6000808260a0015163ffffffff161480156135f757504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b60008060068381548110151561361057fe5b9060005260206000209060020201915060068481548110151561362f57fe5b90600052602060002090600202019050828160010160186101000a81548163ffffffff021916908363ffffffff16021790555061366b82613813565b61367481613813565b600a600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600a600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600f600081548092919060010191905055507f241ea03ca20251805084d27d4440371c34a0b85ff108f6bb5611248f73818b806007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685858460010160089054906101000a900467ffffffffffffffff16604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018267ffffffffffffffff16815260200194505050505060405180910390a150505050565b60005b6020821015156137f057825184526020840193506020830192506020820391506137cb565b6001826020036101000a0390508019835116818551168181178652505050505050565b43600554600383600101601c9054906101000a900461ffff1661ffff16600e8110151561383c57fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff1681151561386757fe5b04018160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600d81600101601c9054906101000a900461ffff1661ffff1610156138e657600181600101601c8282829054906101000a900461ffff160192506101000a81548161ffff021916908361ffff1602179055505b50565b602060405190810160405280600081525090565b6080604051908101604052806004905b600080191681526020019060019003908161390d5790505090565b602060405190810160405280600081525090565b6101006040519081016040528060008152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600061ffff168152602001600061ffff1681525090565b8154818355818115116139dd576002028160020283600052602060002091820191016139dc91906139e2565b5b505050565b613aab91905b80821115613aa7576000808201600090556001820160006101000a81549067ffffffffffffffff02191690556001820160086101000a81549067ffffffffffffffff02191690556001820160106101000a81549063ffffffff02191690556001820160146101000a81549063ffffffff02191690556001820160186101000a81549063ffffffff021916905560018201601c6101000a81549061ffff021916905560018201601e6101000a81549061ffff0219169055506002016139e8565b5090565b905600a165627a7a72305820840f0fd2671ca6801b000327af52853444a96b86b0c33b7e35dd609b2ae20fff0029", - "deployedBytecode": "0x6060604052600436106101f9576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146101fe5780630519ce79146102585780630560ff44146102ad57806306fdde031461035d578063095ea7b3146103eb5780630a0f81681461042d57806318160ddd14610482578063183a7947146104ab5780631940a936146104d457806321717ebf1461050f57806323b872dd1461056457806324e7a38a146105c557806327d7874c146105fe5780632ba73c15146106375780633f4ba83a1461067057806346116e6f1461068557806346d22c70146106e8578063481af3d31461072c5780634b85fd551461078f5780634dfff04f146107b25780634e0a3379146107f45780635663896e1461082d5780635c975abb146108505780636352211e1461087d57806370a08231146108e05780637a7d49371461092d5780638456cb59146109565780638462151c1461096b57806388c2a0bf146109f957806395d89b4114610a305780639d6fac6f14610abe578063a45f4bfc14610b01578063a9059cbb14610b64578063b047fb5014610ba6578063b0c35c0514610bfb578063bc4006f514610c24578063d3e6f49f14610c79578063e17b25af14610cb4578063e6cbe35114610ced578063f2b47d5214610d42578063f7d8c88314610d97575b600080fd5b341561020957600080fd5b61023e60048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050610db8565b604051808215151515815260200191505060405180910390f35b341561026357600080fd5b61026b6110c9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102b857600080fd5b6102e2600480803590602001909190803590602001908201803590602001919091929050506110ef565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610322578082015181840152602081019050610307565b50505050905090810190601f16801561034f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561036857600080fd5b61037061125a565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103b0578082015181840152602081019050610395565b50505050905090810190601f1680156103dd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156103f657600080fd5b61042b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611293565b005b341561043857600080fd5b610440611355565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561048d57600080fd5b61049561137a565b6040518082815260200191505060405180910390f35b34156104b657600080fd5b6104be61138a565b6040518082815260200191505060405180910390f35b34156104df57600080fd5b6104f56004808035906020019091905050611390565b604051808215151515815260200191505060405180910390f35b341561051a57600080fd5b6105226113e2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561056f57600080fd5b6105c3600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611408565b005b34156105d057600080fd5b6105fc600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506114b9565b005b341561060957600080fd5b610635600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506115f0565b005b341561064257600080fd5b61066e600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506116ca565b005b341561067b57600080fd5b6106836117a5565b005b341561069057600080fd5b6106a66004808035906020019091905050611838565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156106f357600080fd5b610712600480803590602001909190803590602001909190505061186b565b604051808215151515815260200191505060405180910390f35b341561073757600080fd5b61074d60048080359060200190919050506118f3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561079a57600080fd5b6107b06004808035906020019091905050611926565b005b34156107bd57600080fd5b6107f2600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061198c565b005b34156107ff57600080fd5b61082b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611a13565b005b341561083857600080fd5b61084e6004808035906020019091905050611aee565b005b341561085b57600080fd5b610863611c42565b604051808215151515815260200191505060405180910390f35b341561088857600080fd5b61089e6004808035906020019091905050611c55565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156108eb57600080fd5b610917600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611cce565b6040518082815260200191505060405180910390f35b341561093857600080fd5b610940611d17565b6040518082815260200191505060405180910390f35b341561096157600080fd5b610969611d1d565b005b341561097657600080fd5b6109a2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611e61565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156109e55780820151818401526020810190506109ca565b505050509050019250505060405180910390f35b3415610a0457600080fd5b610a1a6004808035906020019091905050611f98565b6040518082815260200191505060405180910390f35b3415610a3b57600080fd5b610a436123b7565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610a83578082015181840152602081019050610a68565b50505050905090810190601f168015610ab05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610ac957600080fd5b610adf60048080359060200190919050506123f0565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3415610b0c57600080fd5b610b22600480803590602001909190505061241f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610b6f57600080fd5b610ba4600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050612452565b005b3415610bb157600080fd5b610bb96125c3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610c0657600080fd5b610c0e6125e9565b6040518082815260200191505060405180910390f35b3415610c2f57600080fd5b610c376125ef565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610c8457600080fd5b610c9a6004808035906020019091905050612615565b604051808215151515815260200191505060405180910390f35b3415610cbf57600080fd5b610ceb600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612784565b005b3415610cf857600080fd5b610d00612823565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610d4d57600080fd5b610d55612849565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610db6600480803590602001909190803590602001909190505061286f565b005b600060405180807f737570706f727473496e74657266616365286279746573342900000000000000815250601901905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806110c2575060405180807f746f6b656e4d657461646174612875696e743235362c737472696e6729000000815250601d019050604051809103902060405180807f746f6b656e734f664f776e6572286164647265737329000000000000000000008152506016019050604051809103902060405180807f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81526020017f74323536290000000000000000000000000000000000000000000000000000008152506025019050604051809103902060405180807f7472616e7366657228616464726573732c75696e7432353629000000000000008152506019019050604051809103902060405180807f617070726f766528616464726573732c75696e743235362900000000000000008152506018019050604051809103902060405180807f6f776e65724f662875696e7432353629000000000000000000000000000000008152506010019050604051809103902060405180807f62616c616e63654f6628616464726573732900000000000000000000000000008152506012019050604051809103902060405180807f746f74616c537570706c79282900000000000000000000000000000000000000815250600d019050604051809103902060405180807f73796d626f6c28290000000000000000000000000000000000000000000000008152506008019050604051809103902060405180807f6e616d6528290000000000000000000000000000000000000000000000000000815250600601905060405180910390201818181818181818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6110f76138e9565b6110ff6138fd565b60008073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561115e57600080fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb4799f2878787600060405160a001526040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180848152602001806020018281038252848482818152602001925080828437820191505094505050505060a060405180830381600087803b151561121957600080fd5b6102c65a03f1151561122a57600080fd5b50505060405180608001805190602001604052809250819350505061124f8282612bb0565b925050509392505050565b6040805190810160405280600d81526020017f43727970746f4b6974746965730000000000000000000000000000000000000081525081565b61129d3382612c08565b15156112a857600080fd5b6112b28183612c74565b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160068054905003905090565b600f5481565b600080821115156113a057600080fd5b60006006838154811015156113b157fe5b906000526020600020906002020160010160189054906101000a900463ffffffff1663ffffffff1614159050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561144457600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561147f57600080fd5b6114893382612cca565b151561149457600080fd5b61149e8382612c08565b15156114a957600080fd5b6114b4838383612d36565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561151657600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166354c15b826000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561158557600080fd5b6102c65a03f1151561159657600080fd5b5050506040518051905015156115ab57600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561164b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561168757600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561172557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561176157600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561180057600080fd5b600260149054906101000a900460ff16151561181b57600080fd5b6000600260146101000a81548160ff021916908315150217905550565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000808511151561187e57600080fd5b60008411151561188d57600080fd5b60068581548110151561189c57fe5b906000526020600020906002020191506006848154811015156118bb57fe5b906000526020600020906002020190506118d782868387612f6e565b80156118e957506118e88486613183565b5b9250505092915050565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561198257600080fd5b80600e8190555050565b600260149054906101000a900460ff161515156119a857600080fd5b6119b23382612c08565b15156119bd57600080fd5b81600a600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a6e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611aaa57600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611b9657506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80611bee5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515611bf957600080fd5b60036000600e81101515611c0957fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff1681101515611c3857600080fd5b8060058190555050565b600260149054906101000a900460ff1681565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611cc957600080fd5b919050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611dc557506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80611e1d5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515611e2857600080fd5b600260149054906101000a900460ff16151515611e4457600080fd5b6001600260146101000a81548160ff021916908315150217905550565b611e69613928565b6000611e73613928565b6000806000611e8187611cce565b94506000851415611eb3576000604051805910611e9b5750595b90808252806020026020018201604052509550611f8e565b84604051805910611ec15750595b90808252806020026020018201604052509350611edc61137a565b925060009150600190505b8281111515611f8a578673ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611f7d57808483815181101515611f6657fe5b906020019060200201818152505081806001019250505b8080600101915050611ee7565b8395505b5050505050919050565b600080600080600080600080600260149054906101000a900460ff16151515611fc057600080fd5b600689815481101515611fcf57fe5b9060005260206000209060020201965060008760010160009054906101000a900467ffffffffffffffff1667ffffffffffffffff161415151561201157600080fd5b612147876101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050613296565b151561215257600080fd5b8660010160189054906101000a900463ffffffff1663ffffffff16955060068681548110151561217e57fe5b9060005260206000209060020201945086600101601e9054906101000a900461ffff16935086600101601e9054906101000a900461ffff1661ffff1685600101601e9054906101000a900461ffff1661ffff1611156121ed5784600101601e9054906101000a900461ffff1693505b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d9f5aed8860000154876000015460018b60010160089054906101000a900467ffffffffffffffff16036000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018381526020018267ffffffffffffffff1681526020019350505050602060405180830381600087803b15156122c357600080fd5b6102c65a03f115156122d457600080fd5b505050604051805190509250600760008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150612344898860010160189054906101000a900463ffffffff1663ffffffff166001870161ffff1686866132d1565b90508660010160186101000a81549063ffffffff0219169055600f60008154809291906001900391905055503373ffffffffffffffffffffffffffffffffffffffff166108fc600e549081150290604051600060405180830381858888f193505050505080975050505050505050919050565b6040805190810160405280600281526020017f434b00000000000000000000000000000000000000000000000000000000000081525081565b600381600e811015156123ff57fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff1615151561246e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156124aa57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156124e557600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561254257600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561259f57600080fd5b6125a93382612c08565b15156125b457600080fd5b6125bf338383612d36565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008311151561262757600080fd5b60068381548110151561263657fe5b9060005260206000209060020201905061277c816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff16815250506135c4565b915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156127df57600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600260149054906101000a900460ff1615151561288e57600080fd5b600e54341015151561289f57600080fd5b6128a93385612c08565b15156128b457600080fd5b6128be8385613183565b15156128c957600080fd5b6006848154811015156128d857fe5b90600052602060002090600202019150612a1e826101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff16815250506135c4565b1515612a2957600080fd5b600683815481101515612a3857fe5b90600052602060002090600202019050612b7e816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff16815250506135c4565b1515612b8957600080fd5b612b9582858386612f6e565b1515612ba057600080fd5b612baa84846135fe565b50505050565b612bb86138e9565b612bc06138e9565b60008084604051805910612bd15750595b9080825280601f01601f19166020018201604052509250602083019150859050612bfc8282876137c8565b82935050505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff166007600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b806009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008273ffffffffffffffffffffffffffffffffffffffff166009600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515612eca57600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600a600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556009600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b600081841415612f81576000905061317b565b818560010160109054906101000a900463ffffffff1663ffffffff161480612fc25750818560010160149054906101000a900463ffffffff1663ffffffff16145b15612fd0576000905061317b565b838360010160109054906101000a900463ffffffff1663ffffffff1614806130115750838360010160149054906101000a900463ffffffff1663ffffffff16145b1561301f576000905061317b565b60008360010160109054906101000a900463ffffffff1663ffffffff161480613062575060008560010160109054906101000a900463ffffffff1663ffffffff16145b15613070576001905061317b565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff1614806130e557508460010160149054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff16145b156130f3576000905061317b565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff16148061316857508460010160149054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff16145b15613176576000905061317b565b600190505b949350505050565b60008060006007600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16148061328c57508173ffffffffffffffffffffffffffffffffffffffff16600a600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b9250505092915050565b6000808260a0015163ffffffff16141580156132ca57504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b6000806132dc61393c565b60008863ffffffff16891415156132f257600080fd5b8763ffffffff168814151561330657600080fd5b8661ffff168714151561331857600080fd5b60028781151561332457fe5b049250600d8361ffff16111561333957600d92505b610100604051908101604052808781526020014267ffffffffffffffff168152602001600067ffffffffffffffff1681526020018a63ffffffff1681526020018963ffffffff168152602001600063ffffffff1681526020018461ffff1681526020018861ffff1681525091506001600680548060010182816133bc91906139b0565b916000526020600020906002020160008590919091506000820151816000015560208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601c6101000a81548161ffff021916908361ffff16021790555060e082015181600101601e6101000a81548161ffff021916908361ffff16021790555050500390508063ffffffff168114151561350e57600080fd5b7f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad58582846060015163ffffffff16856080015163ffffffff168660000151604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a16135b560008683612d36565b80935050505095945050505050565b6000808260a0015163ffffffff161480156135f757504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b60008060068381548110151561361057fe5b9060005260206000209060020201915060068481548110151561362f57fe5b90600052602060002090600202019050828160010160186101000a81548163ffffffff021916908363ffffffff16021790555061366b82613813565b61367481613813565b600a600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600a600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600f600081548092919060010191905055507f241ea03ca20251805084d27d4440371c34a0b85ff108f6bb5611248f73818b806007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685858460010160089054906101000a900467ffffffffffffffff16604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018267ffffffffffffffff16815260200194505050505060405180910390a150505050565b60005b6020821015156137f057825184526020840193506020830192506020820391506137cb565b6001826020036101000a0390508019835116818551168181178652505050505050565b43600554600383600101601c9054906101000a900461ffff1661ffff16600e8110151561383c57fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff1681151561386757fe5b04018160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600d81600101601c9054906101000a900461ffff1661ffff1610156138e657600181600101601c8282829054906101000a900461ffff160192506101000a81548161ffff021916908361ffff1602179055505b50565b602060405190810160405280600081525090565b6080604051908101604052806004905b600080191681526020019060019003908161390d5790505090565b602060405190810160405280600081525090565b6101006040519081016040528060008152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600061ffff168152602001600061ffff1681525090565b8154818355818115116139dd576002028160020283600052602060002091820191016139dc91906139e2565b5b505050565b613aab91905b80821115613aa7576000808201600090556001820160006101000a81549067ffffffffffffffff02191690556001820160086101000a81549067ffffffffffffffff02191690556001820160106101000a81549063ffffffff02191690556001820160146101000a81549063ffffffff02191690556001820160186101000a81549063ffffffff021916905560018201601c6101000a81549061ffff021916905560018201601e6101000a81549061ffff0219169055506002016139e8565b5090565b905600a165627a7a72305820840f0fd2671ca6801b000327af52853444a96b86b0c33b7e35dd609b2ae20fff0029", + "bytecode": "0x60606040526000600260146101000a81548160ff0219169083151502179055506101c060405190810160405280603c63ffffffff1663ffffffff168152602001607863ffffffff1663ffffffff16815260200161012c63ffffffff1663ffffffff16815260200161025863ffffffff1663ffffffff16815260200161070863ffffffff1663ffffffff168152602001610e1063ffffffff1663ffffffff168152602001611c2063ffffffff1663ffffffff16815260200161384063ffffffff1663ffffffff16815260200161708063ffffffff1663ffffffff16815260200161e10063ffffffff1663ffffffff1681526020016201518063ffffffff1663ffffffff1681526020016202a30063ffffffff1663ffffffff1681526020016205460063ffffffff1663ffffffff16815260200162093a8063ffffffff1663ffffffff16815250600390600e6200015692919062000179565b50600f60055566071afd498d0000600e5534156200017357600080fd5b62000259565b82600e600701600890048101928215620002105791602002820160005b83821115620001dc57835183826101000a81548163ffffffff021916908363ffffffff160217905550926020019260040160208160030104928301926001030262000196565b80156200020e5782816101000a81549063ffffffff0219169055600401602081600301049283019260010302620001dc565b505b5090506200021f919062000223565b5090565b6200025691905b808211156200025257600081816101000a81549063ffffffff0219169055506001016200022a565b5090565b90565b613ada80620002696000396000f3006060604052600436106101f9576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146101fe5780630519ce79146102585780630560ff44146102ad57806306fdde031461035d578063095ea7b3146103eb5780630a0f81681461042d57806318160ddd14610482578063183a7947146104ab5780631940a936146104d457806321717ebf1461050f57806323b872dd1461056457806324e7a38a146105c557806327d7874c146105fe5780632ba73c15146106375780633f4ba83a1461067057806346116e6f1461068557806346d22c70146106e8578063481af3d31461072c5780634b85fd551461078f5780634dfff04f146107b25780634e0a3379146107f45780635663896e1461082d5780635c975abb146108505780636352211e1461087d57806370a08231146108e05780637a7d49371461092d5780638456cb59146109565780638462151c1461096b57806388c2a0bf146109f957806395d89b4114610a305780639d6fac6f14610abe578063a45f4bfc14610b01578063a9059cbb14610b64578063b047fb5014610ba6578063b0c35c0514610bfb578063bc4006f514610c24578063d3e6f49f14610c79578063e17b25af14610cb4578063e6cbe35114610ced578063f2b47d5214610d42578063f7d8c88314610d97575b600080fd5b341561020957600080fd5b61023e60048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050610db8565b604051808215151515815260200191505060405180910390f35b341561026357600080fd5b61026b6110c9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102b857600080fd5b6102e2600480803590602001909190803590602001908201803590602001919091929050506110ef565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610322578082015181840152602081019050610307565b50505050905090810190601f16801561034f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561036857600080fd5b61037061125a565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103b0578082015181840152602081019050610395565b50505050905090810190601f1680156103dd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156103f657600080fd5b61042b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611293565b005b341561043857600080fd5b610440611355565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561048d57600080fd5b61049561137a565b6040518082815260200191505060405180910390f35b34156104b657600080fd5b6104be61138a565b6040518082815260200191505060405180910390f35b34156104df57600080fd5b6104f56004808035906020019091905050611390565b604051808215151515815260200191505060405180910390f35b341561051a57600080fd5b6105226113e2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561056f57600080fd5b6105c3600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611408565b005b34156105d057600080fd5b6105fc600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506114b9565b005b341561060957600080fd5b610635600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506115f0565b005b341561064257600080fd5b61066e600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506116ca565b005b341561067b57600080fd5b6106836117a5565b005b341561069057600080fd5b6106a66004808035906020019091905050611838565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156106f357600080fd5b610712600480803590602001909190803590602001909190505061186b565b604051808215151515815260200191505060405180910390f35b341561073757600080fd5b61074d60048080359060200190919050506118f3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561079a57600080fd5b6107b06004808035906020019091905050611926565b005b34156107bd57600080fd5b6107f2600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061198c565b005b34156107ff57600080fd5b61082b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611a13565b005b341561083857600080fd5b61084e6004808035906020019091905050611aee565b005b341561085b57600080fd5b610863611c42565b604051808215151515815260200191505060405180910390f35b341561088857600080fd5b61089e6004808035906020019091905050611c55565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156108eb57600080fd5b610917600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611cce565b6040518082815260200191505060405180910390f35b341561093857600080fd5b610940611d17565b6040518082815260200191505060405180910390f35b341561096157600080fd5b610969611d1d565b005b341561097657600080fd5b6109a2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611e61565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156109e55780820151818401526020810190506109ca565b505050509050019250505060405180910390f35b3415610a0457600080fd5b610a1a6004808035906020019091905050611f98565b6040518082815260200191505060405180910390f35b3415610a3b57600080fd5b610a436123b7565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610a83578082015181840152602081019050610a68565b50505050905090810190601f168015610ab05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610ac957600080fd5b610adf60048080359060200190919050506123f0565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3415610b0c57600080fd5b610b22600480803590602001909190505061241f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610b6f57600080fd5b610ba4600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050612452565b005b3415610bb157600080fd5b610bb96125c3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610c0657600080fd5b610c0e6125e9565b6040518082815260200191505060405180910390f35b3415610c2f57600080fd5b610c376125ef565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610c8457600080fd5b610c9a6004808035906020019091905050612615565b604051808215151515815260200191505060405180910390f35b3415610cbf57600080fd5b610ceb600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612784565b005b3415610cf857600080fd5b610d00612823565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610d4d57600080fd5b610d55612849565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610db6600480803590602001909190803590602001909190505061286f565b005b600060405180807f737570706f727473496e74657266616365286279746573342900000000000000815250601901905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806110c2575060405180807f746f6b656e4d657461646174612875696e743235362c737472696e6729000000815250601d019050604051809103902060405180807f746f6b656e734f664f776e6572286164647265737329000000000000000000008152506016019050604051809103902060405180807f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81526020017f74323536290000000000000000000000000000000000000000000000000000008152506025019050604051809103902060405180807f7472616e7366657228616464726573732c75696e7432353629000000000000008152506019019050604051809103902060405180807f617070726f766528616464726573732c75696e743235362900000000000000008152506018019050604051809103902060405180807f6f776e65724f662875696e7432353629000000000000000000000000000000008152506010019050604051809103902060405180807f62616c616e63654f6628616464726573732900000000000000000000000000008152506012019050604051809103902060405180807f746f74616c537570706c79282900000000000000000000000000000000000000815250600d019050604051809103902060405180807f73796d626f6c28290000000000000000000000000000000000000000000000008152506008019050604051809103902060405180807f6e616d6528290000000000000000000000000000000000000000000000000000815250600601905060405180910390201818181818181818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6110f76138e9565b6110ff6138fd565b60008073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561115e57600080fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb4799f2878787600060405160a001526040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180848152602001806020018281038252848482818152602001925080828437820191505094505050505060a060405180830381600087803b151561121957600080fd5b6102c65a03f1151561122a57600080fd5b50505060405180608001805190602001604052809250819350505061124f8282612bb0565b925050509392505050565b6040805190810160405280600d81526020017f43727970746f4b6974746965730000000000000000000000000000000000000081525081565b61129d3382612c08565b15156112a857600080fd5b6112b28183612c74565b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160068054905003905090565b600f5481565b600080821115156113a057600080fd5b60006006838154811015156113b157fe5b906000526020600020906002020160010160189054906101000a900463ffffffff1663ffffffff1614159050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561144457600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561147f57600080fd5b6114893382612cca565b151561149457600080fd5b61149e8382612c08565b15156114a957600080fd5b6114b4838383612d36565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561151657600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166354c15b826000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561158557600080fd5b6102c65a03f1151561159657600080fd5b5050506040518051905015156115ab57600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561164b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561168757600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561172557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561176157600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561180057600080fd5b600260149054906101000a900460ff16151561181b57600080fd5b6000600260146101000a81548160ff021916908315150217905550565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000808511151561187e57600080fd5b60008411151561188d57600080fd5b60068581548110151561189c57fe5b906000526020600020906002020191506006848154811015156118bb57fe5b906000526020600020906002020190506118d782868387612f6e565b80156118e957506118e88486613183565b5b9250505092915050565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561198257600080fd5b80600e8190555050565b600260149054906101000a900460ff161515156119a857600080fd5b6119b23382612c08565b15156119bd57600080fd5b81600a600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a6e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611aaa57600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611b9657506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80611bee5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515611bf957600080fd5b60036000600e81101515611c0957fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff1681101515611c3857600080fd5b8060058190555050565b600260149054906101000a900460ff1681565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611cc957600080fd5b919050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611dc557506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80611e1d5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515611e2857600080fd5b600260149054906101000a900460ff16151515611e4457600080fd5b6001600260146101000a81548160ff021916908315150217905550565b611e69613928565b6000611e73613928565b6000806000611e8187611cce565b94506000851415611eb3576000604051805910611e9b5750595b90808252806020026020018201604052509550611f8e565b84604051805910611ec15750595b90808252806020026020018201604052509350611edc61137a565b925060009150600190505b8281111515611f8a578673ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611f7d57808483815181101515611f6657fe5b906020019060200201818152505081806001019250505b8080600101915050611ee7565b8395505b5050505050919050565b600080600080600080600080600260149054906101000a900460ff16151515611fc057600080fd5b600689815481101515611fcf57fe5b9060005260206000209060020201965060008760010160009054906101000a900467ffffffffffffffff1667ffffffffffffffff161415151561201157600080fd5b612147876101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050613296565b151561215257600080fd5b8660010160189054906101000a900463ffffffff1663ffffffff16955060068681548110151561217e57fe5b9060005260206000209060020201945086600101601e9054906101000a900461ffff16935086600101601e9054906101000a900461ffff1661ffff1685600101601e9054906101000a900461ffff1661ffff1611156121ed5784600101601e9054906101000a900461ffff1693505b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d9f5aed8860000154876000015460018b60010160089054906101000a900467ffffffffffffffff16036000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018381526020018267ffffffffffffffff1681526020019350505050602060405180830381600087803b15156122c357600080fd5b6102c65a03f115156122d457600080fd5b505050604051805190509250600760008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150612344898860010160189054906101000a900463ffffffff1663ffffffff166001870161ffff1686866132d1565b90508660010160186101000a81549063ffffffff0219169055600f60008154809291906001900391905055503373ffffffffffffffffffffffffffffffffffffffff166108fc600e549081150290604051600060405180830381858888f193505050505080975050505050505050919050565b6040805190810160405280600281526020017f434b00000000000000000000000000000000000000000000000000000000000081525081565b600381600e811015156123ff57fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff1615151561246e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156124aa57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156124e557600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561254257600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561259f57600080fd5b6125a93382612c08565b15156125b457600080fd5b6125bf338383612d36565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008311151561262757600080fd5b60068381548110151561263657fe5b9060005260206000209060020201905061277c816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff16815250506135c4565b915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156127df57600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600260149054906101000a900460ff1615151561288e57600080fd5b600e54341015151561289f57600080fd5b6128a93385612c08565b15156128b457600080fd5b6128be8385613183565b15156128c957600080fd5b6006848154811015156128d857fe5b90600052602060002090600202019150612a1e826101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff16815250506135c4565b1515612a2957600080fd5b600683815481101515612a3857fe5b90600052602060002090600202019050612b7e816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff16815250506135c4565b1515612b8957600080fd5b612b9582858386612f6e565b1515612ba057600080fd5b612baa84846135fe565b50505050565b612bb86138e9565b612bc06138e9565b60008084604051805910612bd15750595b9080825280601f01601f19166020018201604052509250602083019150859050612bfc8282876137c8565b82935050505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff166007600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b806009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008273ffffffffffffffffffffffffffffffffffffffff166009600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515612eca57600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600a600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556009600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b600081841415612f81576000905061317b565b818560010160109054906101000a900463ffffffff1663ffffffff161480612fc25750818560010160149054906101000a900463ffffffff1663ffffffff16145b15612fd0576000905061317b565b838360010160109054906101000a900463ffffffff1663ffffffff1614806130115750838360010160149054906101000a900463ffffffff1663ffffffff16145b1561301f576000905061317b565b60008360010160109054906101000a900463ffffffff1663ffffffff161480613062575060008560010160109054906101000a900463ffffffff1663ffffffff16145b15613070576001905061317b565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff1614806130e557508460010160149054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff16145b156130f3576000905061317b565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff16148061316857508460010160149054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff16145b15613176576000905061317b565b600190505b949350505050565b60008060006007600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16148061328c57508173ffffffffffffffffffffffffffffffffffffffff16600a600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b9250505092915050565b6000808260a0015163ffffffff16141580156132ca57504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b6000806132dc61393c565b60008863ffffffff16891415156132f257600080fd5b8763ffffffff168814151561330657600080fd5b8661ffff168714151561331857600080fd5b60028781151561332457fe5b049250600d8361ffff16111561333957600d92505b610100604051908101604052808781526020014267ffffffffffffffff168152602001600067ffffffffffffffff1681526020018a63ffffffff1681526020018963ffffffff168152602001600063ffffffff1681526020018461ffff1681526020018861ffff1681525091506001600680548060010182816133bc91906139b0565b916000526020600020906002020160008590919091506000820151816000015560208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601c6101000a81548161ffff021916908361ffff16021790555060e082015181600101601e6101000a81548161ffff021916908361ffff16021790555050500390508063ffffffff168114151561350e57600080fd5b7f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad58582846060015163ffffffff16856080015163ffffffff168660000151604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a16135b560008683612d36565b80935050505095945050505050565b6000808260a0015163ffffffff161480156135f757504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b60008060068381548110151561361057fe5b9060005260206000209060020201915060068481548110151561362f57fe5b90600052602060002090600202019050828160010160186101000a81548163ffffffff021916908363ffffffff16021790555061366b82613813565b61367481613813565b600a600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600a600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600f600081548092919060010191905055507f241ea03ca20251805084d27d4440371c34a0b85ff108f6bb5611248f73818b806007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685858460010160089054906101000a900467ffffffffffffffff16604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018267ffffffffffffffff16815260200194505050505060405180910390a150505050565b60005b6020821015156137f057825184526020840193506020830192506020820391506137cb565b6001826020036101000a0390508019835116818551168181178652505050505050565b43600554600383600101601c9054906101000a900461ffff1661ffff16600e8110151561383c57fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff1681151561386757fe5b04018160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600d81600101601c9054906101000a900461ffff1661ffff1610156138e657600181600101601c8282829054906101000a900461ffff160192506101000a81548161ffff021916908361ffff1602179055505b50565b602060405190810160405280600081525090565b6080604051908101604052806004905b600080191681526020019060019003908161390d5790505090565b602060405190810160405280600081525090565b6101006040519081016040528060008152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600061ffff168152602001600061ffff1681525090565b8154818355818115116139dd576002028160020283600052602060002091820191016139dc91906139e2565b5b505050565b613aab91905b80821115613aa7576000808201600090556001820160006101000a81549067ffffffffffffffff02191690556001820160086101000a81549067ffffffffffffffff02191690556001820160106101000a81549063ffffffff02191690556001820160146101000a81549063ffffffff02191690556001820160186101000a81549063ffffffff021916905560018201601c6101000a81549061ffff021916905560018201601e6101000a81549061ffff0219169055506002016139e8565b5090565b905600a165627a7a72305820502d44c851e6be3c227b97dcb1afe15bf3adcd2b5656c7324d92aa42dade9a0d0029", + "deployedBytecode": "0x6060604052600436106101f9576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146101fe5780630519ce79146102585780630560ff44146102ad57806306fdde031461035d578063095ea7b3146103eb5780630a0f81681461042d57806318160ddd14610482578063183a7947146104ab5780631940a936146104d457806321717ebf1461050f57806323b872dd1461056457806324e7a38a146105c557806327d7874c146105fe5780632ba73c15146106375780633f4ba83a1461067057806346116e6f1461068557806346d22c70146106e8578063481af3d31461072c5780634b85fd551461078f5780634dfff04f146107b25780634e0a3379146107f45780635663896e1461082d5780635c975abb146108505780636352211e1461087d57806370a08231146108e05780637a7d49371461092d5780638456cb59146109565780638462151c1461096b57806388c2a0bf146109f957806395d89b4114610a305780639d6fac6f14610abe578063a45f4bfc14610b01578063a9059cbb14610b64578063b047fb5014610ba6578063b0c35c0514610bfb578063bc4006f514610c24578063d3e6f49f14610c79578063e17b25af14610cb4578063e6cbe35114610ced578063f2b47d5214610d42578063f7d8c88314610d97575b600080fd5b341561020957600080fd5b61023e60048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050610db8565b604051808215151515815260200191505060405180910390f35b341561026357600080fd5b61026b6110c9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102b857600080fd5b6102e2600480803590602001909190803590602001908201803590602001919091929050506110ef565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610322578082015181840152602081019050610307565b50505050905090810190601f16801561034f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561036857600080fd5b61037061125a565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103b0578082015181840152602081019050610395565b50505050905090810190601f1680156103dd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156103f657600080fd5b61042b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611293565b005b341561043857600080fd5b610440611355565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561048d57600080fd5b61049561137a565b6040518082815260200191505060405180910390f35b34156104b657600080fd5b6104be61138a565b6040518082815260200191505060405180910390f35b34156104df57600080fd5b6104f56004808035906020019091905050611390565b604051808215151515815260200191505060405180910390f35b341561051a57600080fd5b6105226113e2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561056f57600080fd5b6105c3600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611408565b005b34156105d057600080fd5b6105fc600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506114b9565b005b341561060957600080fd5b610635600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506115f0565b005b341561064257600080fd5b61066e600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506116ca565b005b341561067b57600080fd5b6106836117a5565b005b341561069057600080fd5b6106a66004808035906020019091905050611838565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156106f357600080fd5b610712600480803590602001909190803590602001909190505061186b565b604051808215151515815260200191505060405180910390f35b341561073757600080fd5b61074d60048080359060200190919050506118f3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561079a57600080fd5b6107b06004808035906020019091905050611926565b005b34156107bd57600080fd5b6107f2600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061198c565b005b34156107ff57600080fd5b61082b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611a13565b005b341561083857600080fd5b61084e6004808035906020019091905050611aee565b005b341561085b57600080fd5b610863611c42565b604051808215151515815260200191505060405180910390f35b341561088857600080fd5b61089e6004808035906020019091905050611c55565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156108eb57600080fd5b610917600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611cce565b6040518082815260200191505060405180910390f35b341561093857600080fd5b610940611d17565b6040518082815260200191505060405180910390f35b341561096157600080fd5b610969611d1d565b005b341561097657600080fd5b6109a2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611e61565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156109e55780820151818401526020810190506109ca565b505050509050019250505060405180910390f35b3415610a0457600080fd5b610a1a6004808035906020019091905050611f98565b6040518082815260200191505060405180910390f35b3415610a3b57600080fd5b610a436123b7565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610a83578082015181840152602081019050610a68565b50505050905090810190601f168015610ab05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610ac957600080fd5b610adf60048080359060200190919050506123f0565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3415610b0c57600080fd5b610b22600480803590602001909190505061241f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610b6f57600080fd5b610ba4600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050612452565b005b3415610bb157600080fd5b610bb96125c3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610c0657600080fd5b610c0e6125e9565b6040518082815260200191505060405180910390f35b3415610c2f57600080fd5b610c376125ef565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610c8457600080fd5b610c9a6004808035906020019091905050612615565b604051808215151515815260200191505060405180910390f35b3415610cbf57600080fd5b610ceb600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612784565b005b3415610cf857600080fd5b610d00612823565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610d4d57600080fd5b610d55612849565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610db6600480803590602001909190803590602001909190505061286f565b005b600060405180807f737570706f727473496e74657266616365286279746573342900000000000000815250601901905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806110c2575060405180807f746f6b656e4d657461646174612875696e743235362c737472696e6729000000815250601d019050604051809103902060405180807f746f6b656e734f664f776e6572286164647265737329000000000000000000008152506016019050604051809103902060405180807f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81526020017f74323536290000000000000000000000000000000000000000000000000000008152506025019050604051809103902060405180807f7472616e7366657228616464726573732c75696e7432353629000000000000008152506019019050604051809103902060405180807f617070726f766528616464726573732c75696e743235362900000000000000008152506018019050604051809103902060405180807f6f776e65724f662875696e7432353629000000000000000000000000000000008152506010019050604051809103902060405180807f62616c616e63654f6628616464726573732900000000000000000000000000008152506012019050604051809103902060405180807f746f74616c537570706c79282900000000000000000000000000000000000000815250600d019050604051809103902060405180807f73796d626f6c28290000000000000000000000000000000000000000000000008152506008019050604051809103902060405180807f6e616d6528290000000000000000000000000000000000000000000000000000815250600601905060405180910390201818181818181818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6110f76138e9565b6110ff6138fd565b60008073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561115e57600080fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb4799f2878787600060405160a001526040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180848152602001806020018281038252848482818152602001925080828437820191505094505050505060a060405180830381600087803b151561121957600080fd5b6102c65a03f1151561122a57600080fd5b50505060405180608001805190602001604052809250819350505061124f8282612bb0565b925050509392505050565b6040805190810160405280600d81526020017f43727970746f4b6974746965730000000000000000000000000000000000000081525081565b61129d3382612c08565b15156112a857600080fd5b6112b28183612c74565b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160068054905003905090565b600f5481565b600080821115156113a057600080fd5b60006006838154811015156113b157fe5b906000526020600020906002020160010160189054906101000a900463ffffffff1663ffffffff1614159050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561144457600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561147f57600080fd5b6114893382612cca565b151561149457600080fd5b61149e8382612c08565b15156114a957600080fd5b6114b4838383612d36565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561151657600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166354c15b826000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561158557600080fd5b6102c65a03f1151561159657600080fd5b5050506040518051905015156115ab57600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561164b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561168757600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561172557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561176157600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561180057600080fd5b600260149054906101000a900460ff16151561181b57600080fd5b6000600260146101000a81548160ff021916908315150217905550565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000808511151561187e57600080fd5b60008411151561188d57600080fd5b60068581548110151561189c57fe5b906000526020600020906002020191506006848154811015156118bb57fe5b906000526020600020906002020190506118d782868387612f6e565b80156118e957506118e88486613183565b5b9250505092915050565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561198257600080fd5b80600e8190555050565b600260149054906101000a900460ff161515156119a857600080fd5b6119b23382612c08565b15156119bd57600080fd5b81600a600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a6e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611aaa57600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611b9657506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80611bee5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515611bf957600080fd5b60036000600e81101515611c0957fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff1681101515611c3857600080fd5b8060058190555050565b600260149054906101000a900460ff1681565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611cc957600080fd5b919050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611dc557506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80611e1d5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515611e2857600080fd5b600260149054906101000a900460ff16151515611e4457600080fd5b6001600260146101000a81548160ff021916908315150217905550565b611e69613928565b6000611e73613928565b6000806000611e8187611cce565b94506000851415611eb3576000604051805910611e9b5750595b90808252806020026020018201604052509550611f8e565b84604051805910611ec15750595b90808252806020026020018201604052509350611edc61137a565b925060009150600190505b8281111515611f8a578673ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611f7d57808483815181101515611f6657fe5b906020019060200201818152505081806001019250505b8080600101915050611ee7565b8395505b5050505050919050565b600080600080600080600080600260149054906101000a900460ff16151515611fc057600080fd5b600689815481101515611fcf57fe5b9060005260206000209060020201965060008760010160009054906101000a900467ffffffffffffffff1667ffffffffffffffff161415151561201157600080fd5b612147876101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050613296565b151561215257600080fd5b8660010160189054906101000a900463ffffffff1663ffffffff16955060068681548110151561217e57fe5b9060005260206000209060020201945086600101601e9054906101000a900461ffff16935086600101601e9054906101000a900461ffff1661ffff1685600101601e9054906101000a900461ffff1661ffff1611156121ed5784600101601e9054906101000a900461ffff1693505b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d9f5aed8860000154876000015460018b60010160089054906101000a900467ffffffffffffffff16036000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018381526020018267ffffffffffffffff1681526020019350505050602060405180830381600087803b15156122c357600080fd5b6102c65a03f115156122d457600080fd5b505050604051805190509250600760008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150612344898860010160189054906101000a900463ffffffff1663ffffffff166001870161ffff1686866132d1565b90508660010160186101000a81549063ffffffff0219169055600f60008154809291906001900391905055503373ffffffffffffffffffffffffffffffffffffffff166108fc600e549081150290604051600060405180830381858888f193505050505080975050505050505050919050565b6040805190810160405280600281526020017f434b00000000000000000000000000000000000000000000000000000000000081525081565b600381600e811015156123ff57fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff1615151561246e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156124aa57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156124e557600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561254257600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561259f57600080fd5b6125a93382612c08565b15156125b457600080fd5b6125bf338383612d36565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008311151561262757600080fd5b60068381548110151561263657fe5b9060005260206000209060020201905061277c816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff16815250506135c4565b915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156127df57600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600260149054906101000a900460ff1615151561288e57600080fd5b600e54341015151561289f57600080fd5b6128a93385612c08565b15156128b457600080fd5b6128be8385613183565b15156128c957600080fd5b6006848154811015156128d857fe5b90600052602060002090600202019150612a1e826101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff16815250506135c4565b1515612a2957600080fd5b600683815481101515612a3857fe5b90600052602060002090600202019050612b7e816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff16815250506135c4565b1515612b8957600080fd5b612b9582858386612f6e565b1515612ba057600080fd5b612baa84846135fe565b50505050565b612bb86138e9565b612bc06138e9565b60008084604051805910612bd15750595b9080825280601f01601f19166020018201604052509250602083019150859050612bfc8282876137c8565b82935050505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff166007600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b806009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008273ffffffffffffffffffffffffffffffffffffffff166009600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515612eca57600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600a600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556009600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b600081841415612f81576000905061317b565b818560010160109054906101000a900463ffffffff1663ffffffff161480612fc25750818560010160149054906101000a900463ffffffff1663ffffffff16145b15612fd0576000905061317b565b838360010160109054906101000a900463ffffffff1663ffffffff1614806130115750838360010160149054906101000a900463ffffffff1663ffffffff16145b1561301f576000905061317b565b60008360010160109054906101000a900463ffffffff1663ffffffff161480613062575060008560010160109054906101000a900463ffffffff1663ffffffff16145b15613070576001905061317b565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff1614806130e557508460010160149054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff16145b156130f3576000905061317b565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff16148061316857508460010160149054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff16145b15613176576000905061317b565b600190505b949350505050565b60008060006007600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16148061328c57508173ffffffffffffffffffffffffffffffffffffffff16600a600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b9250505092915050565b6000808260a0015163ffffffff16141580156132ca57504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b6000806132dc61393c565b60008863ffffffff16891415156132f257600080fd5b8763ffffffff168814151561330657600080fd5b8661ffff168714151561331857600080fd5b60028781151561332457fe5b049250600d8361ffff16111561333957600d92505b610100604051908101604052808781526020014267ffffffffffffffff168152602001600067ffffffffffffffff1681526020018a63ffffffff1681526020018963ffffffff168152602001600063ffffffff1681526020018461ffff1681526020018861ffff1681525091506001600680548060010182816133bc91906139b0565b916000526020600020906002020160008590919091506000820151816000015560208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601c6101000a81548161ffff021916908361ffff16021790555060e082015181600101601e6101000a81548161ffff021916908361ffff16021790555050500390508063ffffffff168114151561350e57600080fd5b7f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad58582846060015163ffffffff16856080015163ffffffff168660000151604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a16135b560008683612d36565b80935050505095945050505050565b6000808260a0015163ffffffff161480156135f757504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b60008060068381548110151561361057fe5b9060005260206000209060020201915060068481548110151561362f57fe5b90600052602060002090600202019050828160010160186101000a81548163ffffffff021916908363ffffffff16021790555061366b82613813565b61367481613813565b600a600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600a600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600f600081548092919060010191905055507f241ea03ca20251805084d27d4440371c34a0b85ff108f6bb5611248f73818b806007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685858460010160089054906101000a900467ffffffffffffffff16604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018267ffffffffffffffff16815260200194505050505060405180910390a150505050565b60005b6020821015156137f057825184526020840193506020830192506020820391506137cb565b6001826020036101000a0390508019835116818551168181178652505050505050565b43600554600383600101601c9054906101000a900461ffff1661ffff16600e8110151561383c57fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff1681151561386757fe5b04018160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600d81600101601c9054906101000a900461ffff1661ffff1610156138e657600181600101601c8282829054906101000a900461ffff160192506101000a81548161ffff021916908361ffff1602179055505b50565b602060405190810160405280600081525090565b6080604051908101604052806004905b600080191681526020019060019003908161390d5790505090565b602060405190810160405280600081525090565b6101006040519081016040528060008152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600061ffff168152602001600061ffff1681525090565b8154818355818115116139dd576002028160020283600052602060002091820191016139dc91906139e2565b5b505050565b613aab91905b80821115613aa7576000808201600090556001820160006101000a81549067ffffffffffffffff02191690556001820160086101000a81549067ffffffffffffffff02191690556001820160106101000a81549063ffffffff02191690556001820160146101000a81549063ffffffff02191690556001820160186101000a81549063ffffffff021916905560018201601c6101000a81549061ffff021916905560018201601e6101000a81549061ffff0219169055506002016139e8565b5090565b905600a165627a7a72305820502d44c851e6be3c227b97dcb1afe15bf3adcd2b5656c7324d92aa42dade9a0d0029", "sourceMap": "30047:14136:18:-;;;5032:5;5011:26;;;;;;;;;;;;;;;;;;;;11384:339;;;;;;;;;11427:9;11384:339;;;;;;;;11450:9;11384:339;;;;;;;;11473:9;11384:339;;;;;;;;11496:10;11384:339;;;;;;;;11520:10;11384:339;;;;;;;;11544:7;11384:339;;;;;;;;11565:7;11384:339;;;;;;;;11586:7;11384:339;;;;;;;;11607:7;11384:339;;;;;;;;11628:8;11384:339;;;;;;;;11650:6;11384:339;;;;;;;;11670:6;11384:339;;;;;;;;11690:6;11384:339;;;;;;;;11710:6;11384:339;;;;;;;;;;;;;;;:::i;:::-;;11840:2;11807:35;;30582:8;30552:38;;30047:14136;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;", "deployedSourceMap": "30047:14136:18:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19989:327;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4848:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29456:346;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18924:45:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24204:395:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4817:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25978:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30647:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35349:235;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13853:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25066:784;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31057:470;;;;;;;;;;;;;;;;;;;;;;;;;;;;5800:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;6346;;;;;;;;;;;;;;;;;;;;;;;;;;;;7359:126;;;;;;;;;;;;;;13283:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38051:388;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12965:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34379:90;;;;;;;;;;;;;;;;;;;;;;;;;;33972:189;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6073:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;17342:139;;;;;;;;;;;;;;;;;;;;;;;;;;5011:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26205:180;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22243:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11807:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6990:81;;;;;;;;;;;;;;26841:853;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;42595:1586:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18975:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11384:339:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12465:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22790:990;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4879:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30552:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19070:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34991:207;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20416:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;13564:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30817:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40000:1958;;;;;;;;;;;;;;;;;;;;;;;;;;19989:327;20060:4;19175:38;;;;;;;;;;;;;;;;;;;20219:41;;;:12;:41;;;;20218:90;;;;19697:42;;;;;;;;;;;;;;;;;;;19647:35;;;;;;;;;;;;;;;;;;;19582:50;;;;;;;;;;;;;;;;;;;;;;;;19529:38;;;;;;;;;;;;;;;;;;;19477:37;;;;;;;;;;;;;;;;;;;19433:29;;;;;;;;;;;;;;;;;;;19387:31;;;;;;;;;;;;;;;;;;;19346:26;;;;;;;;;;;;;;;;;;;19310:21;;;;;;;;;;;;;;;;;;;19276:19;;;;;;;;;;;;;;;;;;;19269:63;:104;:150;:194;:246;:299;:364;:414;:471;20266:41;;;:12;:41;;;;20218:90;20210:99;;19989:327;;;:::o;4848:25::-;;;;;;;;;;;;;:::o;29456:346::-;29548:14;;:::i;:::-;29621:24;;:::i;:::-;29655:13;29608:1;29582:28;;:14;;;;;;;;;;;:28;;;;29574:37;;;;;;;;29696:14;;;;;;;;;;;:26;;;29723:8;29733:19;;29696:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29678:75;;;;;;;;29771:24;29781:6;29789:5;29771:9;:24::i;:::-;29764:31;;29456:346;;;;;;;:::o;18924:45::-;;;;;;;;;;;;;;;;;;;;:::o;24204:395::-;24384:27;24390:10;24402:8;24384:5;:27::i;:::-;24376:36;;;;;;;;24491:23;24500:8;24510:3;24491:8;:23::i;:::-;24557:35;24566:10;24578:3;24583:8;24557:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24204:395;;:::o;4817:25::-;;;;;;;;;;;;;:::o;25978:92::-;26022:4;26062:1;26045:7;:14;;;;:18;26038:25;;25978:92;:::o;30647:30::-;;;;:::o;35349:235::-;35420:4;35459:1;35448:8;:12;35440:21;;;;;;;;35576:1;35542:7;35550:8;35542:17;;;;;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;:35;;;;35535:42;;35349:235;;;:::o;13853:39::-;;;;;;;;;;;;;:::o;25066:784::-;25305:1;25290:17;;:3;:17;;;;25282:26;;;;;;;;25563:4;25548:20;;:3;:20;;;;25540:29;;;;;;;;25637:34;25650:10;25662:8;25637:12;:34::i;:::-;25629:43;;;;;;;;25690:22;25696:5;25703:8;25690:5;:22::i;:::-;25682:31;;;;;;;;25812;25822:5;25829:3;25834:8;25812:9;:31::i;:::-;25066:784;;;:::o;31057:470::-;31133:38;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;31195:8;31133:71;;31404:17;:31;;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31396:42;;;;;;;;31503:17;31489:11;;:31;;;;;;;;;;;;;;;;;;31057:470;;:::o;5800:128::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;5887:1;5868:21;;:7;:21;;;;5860:30;;;;;;;;5914:7;5901:10;;:20;;;;;;;;;;;;;;;;;;5800:128;:::o;6346:::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;6433:1;6414:21;;:7;:21;;;;6406:30;;;;;;;;6460:7;6447:10;;:20;;;;;;;;;;;;;;;;;;6346:128;:::o;7359:126::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;6812:6;;;;;;;;;;;6804:15;;;;;;;;7473:5;7464:6;;:14;;;;;;;;;;;;;;;;;;7359:126::o;13283:56::-;;;;;;;;;;;;;;;;;;;;;;:::o;38051:388::-;38143:4;38225:20;38276:18;38183:1;38171:9;:13;38163:22;;;;;;;;38213:1;38203:7;:11;38195:20;;;;;;;;38248:7;38256:9;38248:18;;;;;;;;;;;;;;;;;;;;38225:41;;38297:7;38305;38297:16;;;;;;;;;;;;;;;;;;;;38276:37;;38330:52;38349:6;38357:9;38368:4;38374:7;38330:18;:52::i;:::-;:102;;;;;38394:38;38413:7;38422:9;38394:18;:38::i;:::-;38330:102;38323:109;;38051:388;;;;;;:::o;12965:56::-;;;;;;;;;;;;;;;;;;;;;;:::o;34379:90::-;5435:10;;;;;;;;;;;5421:24;;:10;:24;;;5413:33;;;;;;;;34459:3;34444:12;:18;;;;34379:90;:::o;33972:189::-;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;34080:26;34086:10;34098:7;34080:5;:26::i;:::-;34072:35;;;;;;;;34149:5;34117:20;:29;34138:7;34117:29;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;33972:189;;:::o;6073:128::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;6160:1;6141:21;;:7;:21;;;;6133:30;;;;;;;;6187:7;6174:10;;:20;;;;;;;;;;;;;;;;;;6073:128;:::o;17342:139::-;5537:10;;;;;;;;;;;5523:24;;:10;:24;;;:64;;;;5577:10;;;;;;;;;;;5563:24;;:10;:24;;;5523:64;:104;;;;5617:10;;;;;;;;;;;5603:24;;:10;:24;;;5523:104;5502:135;;;;;;;;17429:9;17439:1;17429:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17422:19;;:4;:19;17414:28;;;;;;;;17470:4;17452:15;:22;;;;17342:139;:::o;5011:26::-;;;;;;;;;;;;;:::o;26205:180::-;26275:13;26312:17;:27;26330:8;26312:27;;;;;;;;;;;;;;;;;;;;;26304:35;;26375:1;26358:19;;:5;:19;;;;26350:28;;;;;;;;26205:180;;;:::o;22243:122::-;22299:13;22331:19;:27;22351:6;22331:27;;;;;;;;;;;;;;;;22324:34;;22243:122;;;:::o;11807:35::-;;;;:::o;6990:81::-;5537:10;;;;;;;;;;;5523:24;;:10;:24;;;:64;;;;5577:10;;;;;;;;;;;5563:24;;:10;:24;;;5523:64;:104;;;;5617:10;;;;;;;;;;;5603:24;;:10;:24;;;5523:104;5502:135;;;;;;;;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;7060:4;7051:6;;:13;;;;;;;;;;;;;;;;;;6990:81::o;26841:853::-;26902:21;;:::i;:::-;26935:18;27110:23;;:::i;:::-;27175:17;27222:19;27402:13;26956:17;26966:6;26956:9;:17::i;:::-;26935:38;;27002:1;26988:10;:15;26984:704;;;27077:1;27063:16;;;;;;;;;;;;;;;;;;;;;;;;27056:23;;;;26984:704;27150:10;27136:25;;;;;;;;;;;;;;;;;;;;;;;;27110:51;;27195:13;:11;:13::i;:::-;27175:33;;27244:1;27222:23;;27443:1;27435:9;;27430:220;27455:9;27446:5;:18;;27430:220;;;27525:6;27497:34;;:17;:24;27515:5;27497:24;;;;;;;;;;;;;;;;;;;;;:34;;;27493:143;;;27577:5;27555:6;27562:11;27555:19;;;;;;;;;;;;;;;;;:27;;;;;27604:13;;;;;;;27493:143;27466:7;;;;;;;27430:220;;;27671:6;27664:13;;26841:853;;;;;;;;;:::o;42595:1586::-;42676:7;42753:20;43068:14;43114:18;43230:16;43436:18;43575:13;43629:16;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;42776:7;42784:9;42776:18;;;;;;;;;;;;;;;;;;;;42753:41;;42882:1;42862:6;:16;;;;;;;;;;;;:21;;;;42854:30;;;;;;;;42977:27;42997:6;42977:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:19;:27::i;:::-;42969:36;;;;;;;;43085:6;:19;;;;;;;;;;;;43068:36;;;;43135:7;43143:6;43135:15;;;;;;;;;;;;;;;;;;;;43114:36;;43249:6;:17;;;;;;;;;;;;43230:36;;43298:6;:17;;;;;;;;;;;;43280:35;;:4;:15;;;;;;;;;;;;:35;;;43276:93;;;43343:4;:15;;;;;;;;;;;;43331:27;;43276:93;43457:11;;;;;;;;;;;:20;;;43478:6;:12;;;43492:4;:10;;;43530:1;43504:6;:23;;;;;;;;;;;;:27;43457:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43436:96;;43591:17;:28;43609:9;43591:28;;;;;;;;;;;;;;;;;;;;;43575:44;;43648:78;43661:9;43672:6;:19;;;;;;;;;;;;43648:78;;43705:1;43693:9;:13;43648:78;;43708:10;43720:5;43648:12;:78::i;:::-;43629:97;;43888:6;:19;;;43881:26;;;;;;;;;;;43984:15;;:17;;;;;;;;;;;;;;44081:10;:15;;:29;44097:12;;44081:29;;;;;;;;;;;;;;;;;;;;;;;;44166:8;44159:15;;42595:1586;;;;;;;;;;:::o;18975:36::-;;;;;;;;;;;;;;;;;;;;:::o;11384:339::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;12465:53::-;;;;;;;;;;;;;;;;;;;;;;:::o;22790:990::-;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;22999:1;22984:17;;:3;:17;;;;22976:26;;;;;;;;23257:4;23242:20;;:3;:20;;;;23234:29;;;;;;;;23498:11;;;;;;;;;;;23483:27;;:3;:27;;;;23475:36;;;;;;;;23544:13;;;;;;;;;;;23529:29;;:3;:29;;;;23521:38;;;;;;;;23621:27;23627:10;23639:8;23621:5;:27::i;:::-;23613:36;;;;;;;;23737;23747:10;23759:3;23764:8;23737:9;:36::i;:::-;22790:990;;:::o;4879:25::-;;;;;;;;;;;;;:::o;30552:38::-;;;;:::o;19070:43::-;;;;;;;;;;;;;:::o;34991:207::-;35066:4;35117:17;35105:1;35094:8;:12;35086:21;;;;;;;;35137:7;35145:8;35137:17;;;;;;;;;;;;;;;;;;;;35117:37;;35171:20;35187:3;35171:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:15;:20::i;:::-;35164:27;;34991:207;;;;:::o;20416:142::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;20534:16;20495:14;;:56;;;;;;;;;;;;;;;;;;20416:142;:::o;13564:35::-;;;;;;;;;;;;;:::o;30817:39::-;;;;;;;;;;;;;:::o;40000:1958::-;41267:20;41494:18;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;40168:12;;40155:9;:25;;40147:34;;;;;;;;40239:28;40245:10;40257:9;40239:5;:28::i;:::-;40231:37;;;;;;;;41165:38;41184:7;41193:9;41165:18;:38::i;:::-;41157:47;;;;;;;;41290:7;41298:9;41290:18;;;;;;;;;;;;;;;;;;;;41267:41;;41409:23;41425:6;41409:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:15;:23::i;:::-;41401:32;;;;;;;;41515:7;41523;41515:16;;;;;;;;;;;;;;;;;;;;41494:37;;41630:21;41646:4;41630:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:15;:21::i;:::-;41622:30;;;;;;;;41728:130;41764:6;41788:9;41815:4;41837:7;41728:18;:130::i;:::-;41720:139;;;;;;;;41921:30;41932:9;41943:7;41921:10;:30::i;:::-;40000:1958;;;;:::o;28808:403::-;28894:6;;:::i;:::-;28912:16;;:::i;:::-;28966:17;28993:16;28942:13;28931:25;;;;;;;;;;;;;;;;;;;;;;;;;;;28912:44;;29074:2;29060:12;29056:3;29043:34;;29102:9;29090:21;;29131:43;29139:9;29150:8;29160:13;29131:7;:43::i;:::-;29192:12;29185:19;;28808:403;;;;;;;:::o;20967:145::-;21042:4;21096:9;21065:40;;:17;:27;21083:8;21065:27;;;;;;;;;;;;;;;;;;;;;:40;;;21058:47;;20967:145;;;;:::o;21944:123::-;22051:9;22018:20;:30;22039:8;22018:30;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;21944:123;;:::o;21346:155::-;21428:4;21485:9;21451:43;;:20;:30;21472:8;21451:30;;;;;;;;;;;;;;;;;;;;;:43;;;21444:50;;21346:155;;;;:::o;13965:758::-;14129:19;:24;14149:3;14129:24;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;14225:3;14195:17;:27;14213:8;14195:27;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;14345:1;14328:19;;:5;:19;;;;14324:317;;;14363:19;:26;14383:5;14363:26;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;14485:20;:30;14506:8;14485:30;;;;;;;;;;;;14478:37;;;;;;;;;;;14600:20;:30;14621:8;14600:30;;;;;;;;;;;;14593:37;;;;;;;;;;;14324:317;14686:30;14695:5;14702:3;14707:8;14686:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13965:758;;;:::o;35986:1169::-;36165:4;36246:7;36233:9;:20;36229:63;;;36276:5;36269:12;;;;36229:63;36377:7;36357;:16;;;;;;;;;;;;:27;;;:56;;;;36406:7;36388;:14;;;;;;;;;;;;:25;;;36357:56;36353:99;;;36436:5;36429:12;;;;36353:99;36483:9;36465:5;:14;;;;;;;;;;;;:27;;;:56;;;;36512:9;36496:5;:12;;;;;;;;;;;;:25;;;36465:56;36461:99;;;36544:5;36537:12;;;;36461:99;36714:1;36696:5;:14;;;;;;;;;;;;:19;;;:44;;;;36739:1;36719:7;:16;;;;;;;;;;;;:21;;;36696:44;36692:86;;;36763:4;36756:11;;;;36692:86;36869:7;:16;;;;;;;;;;;;36851:34;;:5;:14;;;;;;;;;;;;:34;;;:70;;;;36907:7;:14;;;;;;;;;;;;36889:32;;:5;:14;;;;;;;;;;;;:32;;;36851:70;36847:113;;;36944:5;36937:12;;;;36847:113;36989:7;:16;;;;;;;;;;;;36973:32;;:5;:12;;;;;;;;;;;;:32;;;:66;;;;37025:7;:14;;;;;;;;;;;;37009:30;;:5;:12;;;;;;;;;;;;:30;;;36973:66;36969:109;;;37062:5;37055:12;;;;36969:109;37144:4;37137:11;;35986:1169;;;;;;;:::o;32350:441::-;32437:4;32453:19;32513:17;32475;:28;32493:9;32475:28;;;;;;;;;;;;;;;;;;;;;32453:50;;32533:17;:26;32551:7;32533:26;;;;;;;;;;;;;;;;;;;;;32513:46;;32726:9;32711:24;;:11;:24;;;:72;;;;32772:11;32739:44;;:20;:29;32760:7;32739:29;;;;;;;;;;;;;;;;;;;;;:44;;;32711:72;32703:81;;32350:441;;;;;;:::o;34588:177::-;34654:4;34702:1;34678:7;:20;;;:25;;;;34677:81;;;;;34744:12;34709:48;;:7;:24;;;:48;;;;34677:81;34670:88;;34588:177;;;:::o;15381:1876::-;15564:4;16148:20;16281:19;;:::i;:::-;16624;15942:9;15927:26;;15914:9;:39;15906:48;;;;;;;;15998:7;15983:24;;15972:7;:35;15964:44;;;;;;;;16056:11;16041:28;;16026:11;:43;16018:52;;;;;;;;16192:1;16178:11;:15;;;;;;;;16148:46;;16224:2;16208:13;:18;;;16204:67;;;16258:2;16242:18;;16204:67;16303:311;;;;;;;;;16330:6;16303:311;;;;16368:3;16303:311;;;;;;16404:1;16303:311;;;;;;16436:9;16303:311;;;;;;16475:7;16303:311;;;;;;16511:1;16303:311;;;;;;16541:13;16303:311;;;;;;16587:11;16303:311;;;;;16281:333;;16669:1;16646:7;:20;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;16659:6;16646:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:24;16624:46;;16857:11;16842:28;;16827:11;:43;16819:52;;;;;;;;16914:160;16933:6;16953:11;16986:6;:15;;;16978:24;;17024:6;:13;;;17016:22;;17052:6;:12;;;16914:160;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17188:33;17198:1;17201:6;17209:11;17188:9;:33::i;:::-;17239:11;17232:18;;15381:1876;;;;;;;;;;:::o;31720:397::-;31780:4;32057:1;32036:4;:17;;;:22;;;32035:75;;;;;32096:12;32064:45;;:4;:21;;;:45;;;;32035:75;32028:82;;31720:397;;;:::o;38573:924::-;38705:18;38752:20;38726:7;38734;38726:16;;;;;;;;;;;;;;;;;;;;38705:37;;38775:7;38783:9;38775:18;;;;;;;;;;;;;;;;;;;;38752:41;;38907:7;38878:6;:19;;;:37;;;;;;;;;;;;;;;;;;38976:22;38993:4;38976:16;:22::i;:::-;39008:24;39025:6;39008:16;:24::i;:::-;39185:20;:31;39206:9;39185:31;;;;;;;;;;;;39178:38;;;;;;;;;;;39233:20;:29;39254:7;39233:29;;;;;;;;;;;;39226:36;;;;;;;;;;;39342:15;;:17;;;;;;;;;;;;;39407:83;39416:17;:28;39434:9;39416:28;;;;;;;;;;;;;;;;;;;;;39446:9;39457:7;39466:6;:23;;;;;;;;;;;;39407:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38573:924;;;;:::o;27965:565::-;28301:12;28089:170;28103:2;28095:4;:10;;28089:170;;;28180:4;28174:5;28167;28160:6;28222:2;28213:11;;;;28246:2;28238:10;;;;28115:2;28107:10;;;;28089:170;;;28337:1;28329:4;28324:2;:9;28316:3;:18;:22;28301:37;;28407:4;28403:3;28396:4;28390:5;28386:3;28460:4;28452:5;28446;28442:3;28505:7;28495:8;28492:2;28485:5;28478:6;28357:167;;;;;;:::o;33053:596::-;33306:12;33287:15;;33254:9;33264:7;:21;;;;;;;;;;;;33254:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:48;;;;;;;;;;33253:65;33219:7;:24;;;:100;;;;;;;;;;;;;;;;;;33588:2;33564:7;:21;;;;;;;;;;;;:26;;;33560:83;;;33631:1;33606:7;:21;;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33560:83;33053:596;:::o;30047:14136::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", "source": "pragma solidity 0.4.18;\n\n/**\n The following contract code, titled KittyCore, was written by Cryptokitties and published\n and retrieved from https://etherscan.io/address/0x06012c8cf97bead5deae237070f9587f8e7a266d#code.\n\n It is included in the current project for test purposes, to ensure that our collateralizer can\n handle ERC721 tokens created by the KittyCore contract.\n*/\n\n/**\n * @title KittiesOwnable\n * @dev The KittiesOwnable contract has an owner address, and provides basic authorization control\n * functions, this simplifies the implementation of \"user permissions\".\n */\ncontract KittiesOwnable {\n address public owner;\n\n\n /**\n\t * @dev The KittiesOwnable constructor sets the original `owner` of the contract to the sender\n\t * account.\n\t */\n function KittiesOwnable() {\n owner = msg.sender;\n }\n\n\n /**\n\t * @dev Throws if called by any account other than the owner.\n\t */\n modifier onlyOwner() {\n require(msg.sender == owner);\n _;\n }\n\n\n /**\n\t * @dev Allows the current owner to transfer control of the contract to a newOwner.\n\t * @param newOwner The address to transfer ownership to.\n\t */\n function transferOwnership(address newOwner) onlyOwner {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n\n}\n\n\n\n/// @title Interface for contracts conforming to ERC-721: Non-Fungible Tokens\n/// @author Dieter Shirley (https://github.com/dete)\ncontract KittiesERC721 {\n // Required methods\n function totalSupply() public view returns (uint256 total);\n function balanceOf(address _owner) public view returns (uint256 balance);\n function ownerOf(uint256 _tokenId) external view returns (address owner);\n function approve(address _to, uint256 _tokenId) external;\n function transfer(address _to, uint256 _tokenId) external;\n function transferFrom(address _from, address _to, uint256 _tokenId) external;\n\n // Events\n event Transfer(address from, address to, uint256 tokenId);\n event Approval(address owner, address approved, uint256 tokenId);\n\n // Optional\n // function name() public view returns (string name);\n // function symbol() public view returns (string symbol);\n // function tokensOfOwner(address _owner) external view returns (uint256[] tokenIds);\n // function tokenMetadata(uint256 _tokenId, string _preferredTransport) public view returns (string infoUrl);\n\n // ERC-165 Compatibility (https://github.com/ethereum/EIPs/issues/165)\n function supportsInterface(bytes4 _interfaceID) external view returns (bool);\n}\n\n\n// // Auction wrapper functions\n\n\n// Auction wrapper functions\n\n\n\n\n\n\n\n/// @title SEKRETOOOO\ncontract GeneScienceInterface {\n /// @dev simply a boolean to indicate this is the contract we expect to be\n function isGeneScience() public pure returns (bool);\n\n /// @dev given genes of kitten 1 & 2, return a genetic combination - may have a random factor\n /// @param genes1 genes of mom\n /// @param genes2 genes of sire\n /// @return the genes that are supposed to be passed down the child\n function mixGenes(uint256 genes1, uint256 genes2, uint256 targetBlock) public returns (uint256);\n}\n\n\n\n\n\n\n\n/// @title A facet of KittyCore that manages special access privileges.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyAccessControl {\n // This facet controls access control for CryptoKitties. There are four roles managed here:\n //\n // - The CEO: The CEO can reassign other roles and change the addresses of our dependent smart\n // contracts. It is also the only role that can unpause the smart contract. It is initially\n // set to the address that created the smart contract in the KittyCore constructor.\n //\n // - The CFO: The CFO can withdraw funds from KittyCore and its auction contracts.\n //\n // - The COO: The COO can release gen0 kitties to auction, and mint promo cats.\n //\n // It should be noted that these roles are distinct without overlap in their access abilities, the\n // abilities listed for each role above are exhaustive. In particular, while the CEO can assign any\n // address to any role, the CEO address itself doesn't have the ability to act in those roles. This\n // restriction is intentional so that we aren't tempted to use the CEO address frequently out of\n // convenience. The less we use an address, the less likely it is that we somehow compromise the\n // account.\n\n /// @dev Emited when contract is upgraded - See README.md for updgrade plan\n event ContractUpgrade(address newContract);\n\n // The addresses of the accounts (or contracts) that can execute actions within each roles.\n address public ceoAddress;\n address public cfoAddress;\n address public cooAddress;\n\n // @dev Keeps track whether the contract is paused. When that is true, most actions are blocked\n bool public paused = false;\n\n /// @dev Access modifier for CEO-only functionality\n modifier onlyCEO() {\n require(msg.sender == ceoAddress);\n _;\n }\n\n /// @dev Access modifier for CFO-only functionality\n modifier onlyCFO() {\n require(msg.sender == cfoAddress);\n _;\n }\n\n /// @dev Access modifier for COO-only functionality\n modifier onlyCOO() {\n require(msg.sender == cooAddress);\n _;\n }\n\n modifier onlyCLevel() {\n require(\n msg.sender == cooAddress ||\n msg.sender == ceoAddress ||\n msg.sender == cfoAddress\n );\n _;\n }\n\n /// @dev Assigns a new address to act as the CEO. Only available to the current CEO.\n /// @param _newCEO The address of the new CEO\n function setCEO(address _newCEO) external onlyCEO {\n require(_newCEO != address(0));\n\n ceoAddress = _newCEO;\n }\n\n /// @dev Assigns a new address to act as the CFO. Only available to the current CEO.\n /// @param _newCFO The address of the new CFO\n function setCFO(address _newCFO) external onlyCEO {\n require(_newCFO != address(0));\n\n cfoAddress = _newCFO;\n }\n\n /// @dev Assigns a new address to act as the COO. Only available to the current CEO.\n /// @param _newCOO The address of the new COO\n function setCOO(address _newCOO) external onlyCEO {\n require(_newCOO != address(0));\n\n cooAddress = _newCOO;\n }\n\n /*** KittiesPausable functionality adapted from OpenZeppelin ***/\n\n /// @dev Modifier to allow actions only when the contract IS NOT paused\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /// @dev Modifier to allow actions only when the contract IS paused\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /// @dev Called by any \"C-level\" role to pause the contract. Used only when\n /// a bug or exploit is detected and we need to limit damage.\n function pause() external onlyCLevel whenNotPaused {\n paused = true;\n }\n\n /// @dev Unpauses the smart contract. Can only be called by the CEO, since\n /// one reason we may pause the contract is when CFO or COO accounts are\n /// compromised.\n /// @notice This is public rather than external so it can be called by\n /// derived contracts.\n function unpause() public onlyCEO whenPaused {\n // can't unpause if contract was upgraded\n paused = false;\n }\n}\n\n\n\n\n/// @title Base contract for CryptoKitties. Holds all common structs, events and base variables.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBase is KittyAccessControl {\n /*** EVENTS ***/\n\n /// @dev The Birth event is fired whenever a new kitten comes into existence. This obviously\n /// includes any time a cat is created through the giveBirth method, but it is also called\n /// when a new gen0 cat is created.\n event Birth(address owner, uint256 kittyId, uint256 matronId, uint256 sireId, uint256 genes);\n\n /// @dev Transfer event as defined in current draft of ERC721. Emitted every time a kitten\n /// ownership is assigned, including births.\n event Transfer(address from, address to, uint256 tokenId);\n\n /*** DATA TYPES ***/\n\n /// @dev The main Kitty struct. Every cat in CryptoKitties is represented by a copy\n /// of this structure, so great care was taken to ensure that it fits neatly into\n /// exactly two 256-bit words. Note that the order of the members in this structure\n /// is important because of the byte-packing rules used by Ethereum.\n /// Ref: http://solidity.readthedocs.io/en/develop/miscellaneous.html\n struct Kitty {\n // The Kitty's genetic code is packed into these 256-bits, the format is\n // sooper-sekret! A cat's genes never change.\n uint256 genes;\n\n // The timestamp from the block when this cat came into existence.\n uint64 birthTime;\n\n // The minimum timestamp after which this cat can engage in breeding\n // activities again. This same timestamp is used for the pregnancy\n // timer (for matrons) as well as the siring cooldown.\n uint64 cooldownEndBlock;\n\n // The ID of the parents of this kitty, set to 0 for gen0 cats.\n // Note that using 32-bit unsigned integers limits us to a \"mere\"\n // 4 billion cats. This number might seem small until you realize\n // that Ethereum currently has a limit of about 500 million\n // transactions per year! So, this definitely won't be a problem\n // for several years (even as Ethereum learns to scale).\n uint32 matronId;\n uint32 sireId;\n\n // Set to the ID of the sire cat for matrons that are pregnant,\n // zero otherwise. A non-zero value here is how we know a cat\n // is pregnant. Used to retrieve the genetic material for the new\n // kitten when the birth transpires.\n uint32 siringWithId;\n\n // Set to the index in the cooldown array (see below) that represents\n // the current cooldown duration for this Kitty. This starts at zero\n // for gen0 cats, and is initialized to floor(generation/2) for others.\n // Incremented by one for each successful breeding action, regardless\n // of whether this cat is acting as matron or sire.\n uint16 cooldownIndex;\n\n // The \"generation number\" of this cat. Cats minted by the CK contract\n // for sale are called \"gen0\" and have a generation number of 0. The\n // generation number of all other cats is the larger of the two generation\n // numbers of their parents, plus one.\n // (i.e. max(matron.generation, sire.generation) + 1)\n uint16 generation;\n }\n\n /*** CONSTANTS ***/\n\n /// @dev A lookup table indicating the cooldown duration after any successful\n /// breeding action, called \"pregnancy time\" for matrons and \"siring cooldown\"\n /// for sires. Designed such that the cooldown roughly doubles each time a cat\n /// is bred, encouraging owners not to just keep breeding the same cat over\n /// and over again. Caps out at one week (a cat can breed an unbounded number\n /// of times, and the maximum cooldown is always seven days).\n uint32[14] public cooldowns = [\n uint32(1 minutes),\n uint32(2 minutes),\n uint32(5 minutes),\n uint32(10 minutes),\n uint32(30 minutes),\n uint32(1 hours),\n uint32(2 hours),\n uint32(4 hours),\n uint32(8 hours),\n uint32(16 hours),\n uint32(1 days),\n uint32(2 days),\n uint32(4 days),\n uint32(7 days)\n ];\n\n // An approximation of currently how many seconds are in between blocks.\n uint256 public secondsPerBlock = 15;\n\n /*** STORAGE ***/\n\n /// @dev An array containing the Kitty struct for all Kitties in existence. The ID\n /// of each cat is actually an index into this array. Note that ID 0 is a negacat,\n /// the unKitty, the mythical beast that is the parent of all gen0 cats. A bizarre\n /// creature that is both matron and sire... to itself! Has an invalid genetic code.\n /// In other words, cat ID 0 is invalid... ;-)\n Kitty[] kitties;\n\n /// @dev A mapping from cat IDs to the address that owns them. All cats have\n /// some valid owner address, even gen0 cats are created with a non-zero owner.\n mapping (uint256 => address) public kittyIndexToOwner;\n\n // @dev A mapping from owner address to count of tokens that address owns.\n // Used internally inside balanceOf() to resolve ownership count.\n mapping (address => uint256) ownershipTokenCount;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to call\n /// transferFrom(). Each Kitty can only have one approved address for transfer\n /// at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public kittyIndexToApproved;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to use\n /// this Kitty for siring via breedWith(). Each Kitty can only have one approved\n /// address for siring at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public sireAllowedToAddress;\n\n /// @dev The address of the ClockAuction contract that handles sales of Kitties. This\n /// same contract handles both peer-to-peer sales as well as the gen0 sales which are\n /// initiated every 15 minutes.\n SaleClockAuction public saleAuction;\n\n /// @dev The address of a custom ClockAuction subclassed contract that handles siring\n /// auctions. Needs to be separate from saleAuction because the actions taken on success\n /// after a sales and siring auction are quite different.\n SiringClockAuction public siringAuction;\n\n /// @dev Assigns ownership of a specific Kitty to an address.\n function _transfer(address _from, address _to, uint256 _tokenId) internal {\n // Since the number of kittens is capped to 2^32 we can't overflow this\n ownershipTokenCount[_to]++;\n // transfer ownership\n kittyIndexToOwner[_tokenId] = _to;\n // When creating new kittens _from is 0x0, but we can't account that address.\n if (_from != address(0)) {\n ownershipTokenCount[_from]--;\n // once the kitten is transferred also clear sire allowances\n delete sireAllowedToAddress[_tokenId];\n // clear any previously approved ownership exchange\n delete kittyIndexToApproved[_tokenId];\n }\n // Emit the transfer event.\n Transfer(_from, _to, _tokenId);\n }\n\n /// @dev An internal method that creates a new kitty and stores it. This\n /// method doesn't do any checking and should only be called when the\n /// input data is known to be valid. Will generate both a Birth event\n /// and a Transfer event.\n /// @param _matronId The kitty ID of the matron of this cat (zero for gen0)\n /// @param _sireId The kitty ID of the sire of this cat (zero for gen0)\n /// @param _generation The generation number of this cat, must be computed by caller.\n /// @param _genes The kitty's genetic code.\n /// @param _owner The inital owner of this cat, must be non-zero (except for the unKitty, ID 0)\n function _createKitty(\n uint256 _matronId,\n uint256 _sireId,\n uint256 _generation,\n uint256 _genes,\n address _owner\n )\n internal\n returns (uint)\n {\n // These requires are not strictly necessary, our calling code should make\n // sure that these conditions are never broken. However! _createKitty() is already\n // an expensive call (for storage), and it doesn't hurt to be especially careful\n // to ensure our data structures are always valid.\n require(_matronId == uint256(uint32(_matronId)));\n require(_sireId == uint256(uint32(_sireId)));\n require(_generation == uint256(uint16(_generation)));\n\n // New kitty starts with the same cooldown as parent gen/2\n uint16 cooldownIndex = uint16(_generation / 2);\n if (cooldownIndex > 13) {\n cooldownIndex = 13;\n }\n\n Kitty memory _kitty = Kitty({\n genes: _genes,\n birthTime: uint64(now),\n cooldownEndBlock: 0,\n matronId: uint32(_matronId),\n sireId: uint32(_sireId),\n siringWithId: 0,\n cooldownIndex: cooldownIndex,\n generation: uint16(_generation)\n });\n uint256 newKittenId = kitties.push(_kitty) - 1;\n\n // It's probably never going to happen, 4 billion cats is A LOT, but\n // let's just be 100% sure we never let this happen.\n require(newKittenId == uint256(uint32(newKittenId)));\n\n // emit the birth event\n Birth(\n _owner,\n newKittenId,\n uint256(_kitty.matronId),\n uint256(_kitty.sireId),\n _kitty.genes\n );\n\n // This will assign ownership, and also emit the Transfer event as\n // per ERC721 draft\n _transfer(0, _owner, newKittenId);\n\n return newKittenId;\n }\n\n // Any C-level can fix how many seconds per blocks are currently observed.\n function setSecondsPerBlock(uint256 secs) external onlyCLevel {\n require(secs < cooldowns[0]);\n secondsPerBlock = secs;\n }\n}\n\n\n\n\n\n/// @title The external contract that is responsible for generating metadata for the kitties,\n/// it has one function that will return the data as bytes.\ncontract KittiesERC721Metadata {\n /// @dev Given a token Id, returns a byte array that is supposed to be converted into string.\n function getMetadata(uint256 _tokenId, string) public view returns (bytes32[4] buffer, uint256 count) {\n if (_tokenId == 1) {\n buffer[0] = \"Hello World! :D\";\n count = 15;\n } else if (_tokenId == 2) {\n buffer[0] = \"I would definitely choose a medi\";\n buffer[1] = \"um length string.\";\n count = 49;\n } else if (_tokenId == 3) {\n buffer[0] = \"Lorem ipsum dolor sit amet, mi e\";\n buffer[1] = \"st accumsan dapibus augue lorem,\";\n buffer[2] = \" tristique vestibulum id, libero\";\n buffer[3] = \" suscipit varius sapien aliquam.\";\n count = 128;\n }\n }\n}\n\n\n/// @title The facet of the CryptoKitties core contract that manages ownership, ERC-721 (draft) compliant.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev Ref: https://github.com/ethereum/EIPs/issues/721\n/// See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyOwnership is KittyBase, KittiesERC721 {\n\n /// @notice Name and symbol of the non fungible token, as defined in ERC721.\n string public constant name = \"CryptoKitties\";\n string public constant symbol = \"CK\";\n\n // The contract that will return kitty metadata\n KittiesERC721Metadata public erc721Metadata;\n\n bytes4 constant InterfaceSignature_ERC165 =\n bytes4(keccak256('supportsInterface(bytes4)'));\n\n bytes4 constant InterfaceSignature_ERC721 =\n bytes4(keccak256('name()')) ^\n bytes4(keccak256('symbol()')) ^\n bytes4(keccak256('totalSupply()')) ^\n bytes4(keccak256('balanceOf(address)')) ^\n bytes4(keccak256('ownerOf(uint256)')) ^\n bytes4(keccak256('approve(address,uint256)')) ^\n bytes4(keccak256('transfer(address,uint256)')) ^\n bytes4(keccak256('transferFrom(address,address,uint256)')) ^\n bytes4(keccak256('tokensOfOwner(address)')) ^\n bytes4(keccak256('tokenMetadata(uint256,string)'));\n\n /// @notice Introspection interface as per ERC-165 (https://github.com/ethereum/EIPs/issues/165).\n /// Returns true for any standardized interfaces implemented by this contract. We implement\n /// ERC-165 (obviously!) and ERC-721.\n function supportsInterface(bytes4 _interfaceID) external view returns (bool)\n {\n // DEBUG ONLY\n //require((InterfaceSignature_ERC165 == 0x01ffc9a7) && (InterfaceSignature_ERC721 == 0x9a20483d));\n\n return ((_interfaceID == InterfaceSignature_ERC165) || (_interfaceID == InterfaceSignature_ERC721));\n }\n\n /// @dev Set the address of the sibling contract that tracks metadata.\n /// CEO only.\n function setMetadataAddress(address _contractAddress) public onlyCEO {\n erc721Metadata = KittiesERC721Metadata(_contractAddress);\n }\n\n // Internal utility functions: These functions all assume that their input arguments\n // are valid. We leave it to public methods to sanitize their inputs and follow\n // the required logic.\n\n /// @dev Checks if a given address is the current owner of a particular Kitty.\n /// @param _claimant the address we are validating against.\n /// @param _tokenId kitten id, only valid when > 0\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToOwner[_tokenId] == _claimant;\n }\n\n /// @dev Checks if a given address currently has transferApproval for a particular Kitty.\n /// @param _claimant the address we are confirming kitten is approved for.\n /// @param _tokenId kitten id, only valid when > 0\n function _approvedFor(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToApproved[_tokenId] == _claimant;\n }\n\n /// @dev Marks an address as being approved for transferFrom(), overwriting any previous\n /// approval. Setting _approved to address(0) clears all transfer approval.\n /// NOTE: _approve() does NOT send the Approval event. This is intentional because\n /// _approve() and transferFrom() are used together for putting Kitties on auction, and\n /// there is no value in spamming the log with Approval events in that case.\n function _approve(uint256 _tokenId, address _approved) internal {\n kittyIndexToApproved[_tokenId] = _approved;\n }\n\n /// @notice Returns the number of Kitties owned by a specific address.\n /// @param _owner The owner address to check.\n /// @dev Required for ERC-721 compliance\n function balanceOf(address _owner) public view returns (uint256 count) {\n return ownershipTokenCount[_owner];\n }\n\n /// @notice Transfers a Kitty to another address. If transferring to a smart\n /// contract be VERY CAREFUL to ensure that it is aware of ERC-721 (or\n /// CryptoKitties specifically) or your Kitty may be lost forever. Seriously.\n /// @param _to The address of the recipient, can be a user or contract.\n /// @param _tokenId The ID of the Kitty to transfer.\n /// @dev Required for ERC-721 compliance.\n function transfer(\n address _to,\n uint256 _tokenId\n )\n external\n whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Disallow transfers to the auction contracts to prevent accidental\n // misuse. Auction contracts should only take ownership of kitties\n // through the allow + transferFrom flow.\n require(_to != address(saleAuction));\n require(_to != address(siringAuction));\n\n // You can only send your own cat.\n require(_owns(msg.sender, _tokenId));\n\n // Reassign ownership, clear pending approvals, emit Transfer event.\n _transfer(msg.sender, _to, _tokenId);\n }\n\n /// @notice Grant another address the right to transfer a specific Kitty via\n /// transferFrom(). This is the preferred flow for transfering NFTs to contracts.\n /// @param _to The address to be granted transfer approval. Pass address(0) to\n /// clear all approvals.\n /// @param _tokenId The ID of the Kitty that can be transferred if this call succeeds.\n /// @dev Required for ERC-721 compliance.\n function approve(\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Only an owner can grant transfer approval.\n require(_owns(msg.sender, _tokenId));\n\n // Register the approval (replacing any previous approval).\n _approve(_tokenId, _to);\n\n // Emit approval event.\n Approval(msg.sender, _to, _tokenId);\n }\n\n /// @notice Transfer a Kitty owned by another address, for which the calling address\n /// has previously been granted transfer approval by the owner.\n /// @param _from The address that owns the Kitty to be transfered.\n /// @param _to The address that should take ownership of the Kitty. Can be any address,\n /// including the caller.\n /// @param _tokenId The ID of the Kitty to be transferred.\n /// @dev Required for ERC-721 compliance.\n function transferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Check for approval and valid ownership\n require(_approvedFor(msg.sender, _tokenId));\n require(_owns(_from, _tokenId));\n\n // Reassign ownership (also clears pending approvals and emits Transfer event).\n _transfer(_from, _to, _tokenId);\n }\n\n /// @notice Returns the total number of Kitties currently in existence.\n /// @dev Required for ERC-721 compliance.\n function totalSupply() public view returns (uint) {\n return kitties.length - 1;\n }\n\n /// @notice Returns the address currently assigned ownership of a given Kitty.\n /// @dev Required for ERC-721 compliance.\n function ownerOf(uint256 _tokenId)\n external\n view\n returns (address owner)\n {\n owner = kittyIndexToOwner[_tokenId];\n\n require(owner != address(0));\n }\n\n /// @notice Returns a list of all Kitty IDs assigned to an address.\n /// @param _owner The owner whose Kitties we are interested in.\n /// @dev This method MUST NEVER be called by smart contract code. First, it's fairly\n /// expensive (it walks the entire Kitty array looking for cats belonging to owner),\n /// but it also returns a dynamic array, which is only supported for web3 calls, and\n /// not contract-to-contract calls.\n function tokensOfOwner(address _owner) external view returns(uint256[] ownerTokens) {\n uint256 tokenCount = balanceOf(_owner);\n\n if (tokenCount == 0) {\n // Return an empty array\n return new uint256[](0);\n } else {\n uint256[] memory result = new uint256[](tokenCount);\n uint256 totalCats = totalSupply();\n uint256 resultIndex = 0;\n\n // We count on the fact that all cats have IDs starting at 1 and increasing\n // sequentially up to the totalCat count.\n uint256 catId;\n\n for (catId = 1; catId <= totalCats; catId++) {\n if (kittyIndexToOwner[catId] == _owner) {\n result[resultIndex] = catId;\n resultIndex++;\n }\n }\n\n return result;\n }\n }\n\n /// @dev Adapted from memcpy() by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _memcpy(uint _dest, uint _src, uint _len) private view {\n // Copy word-length chunks while possible\n for(; _len >= 32; _len -= 32) {\n assembly {\n mstore(_dest, mload(_src))\n }\n _dest += 32;\n _src += 32;\n }\n\n // Copy remaining bytes\n uint256 mask = 256 ** (32 - _len) - 1;\n assembly {\n let srcpart := and(mload(_src), not(mask))\n let destpart := and(mload(_dest), mask)\n mstore(_dest, or(destpart, srcpart))\n }\n }\n\n /// @dev Adapted from toString(slice) by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _toString(bytes32[4] _rawBytes, uint256 _stringLength) private view returns (string) {\n var outputString = new string(_stringLength);\n uint256 outputPtr;\n uint256 bytesPtr;\n\n assembly {\n outputPtr := add(outputString, 32)\n bytesPtr := _rawBytes\n }\n\n _memcpy(outputPtr, bytesPtr, _stringLength);\n\n return outputString;\n }\n\n /// @notice Returns a URI pointing to a metadata package for this token conforming to\n /// ERC-721 (https://github.com/ethereum/EIPs/issues/721)\n /// @param _tokenId The ID number of the Kitty whose metadata should be returned.\n function tokenMetadata(uint256 _tokenId, string _preferredTransport) external view returns (string infoUrl) {\n require(erc721Metadata != address(0));\n bytes32[4] memory buffer;\n uint256 count;\n (buffer, count) = erc721Metadata.getMetadata(_tokenId, _preferredTransport);\n\n return _toString(buffer, count);\n }\n}\n\n\n\n/// @title A facet of KittyCore that manages Kitty siring, gestation, and birth.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBreeding is KittyOwnership {\n\n /// @dev The Pregnant event is fired when two cats successfully breed and the pregnancy\n /// timer begins for the matron.\n event Pregnant(address owner, uint256 matronId, uint256 sireId, uint256 cooldownEndBlock);\n\n /// @notice The minimum payment required to use breedWithAuto(). This fee goes towards\n /// the gas cost paid by whatever calls giveBirth(), and can be dynamically updated by\n /// the COO role as the gas price changes.\n uint256 public autoBirthFee = 2 finney;\n\n // Keeps track of number of pregnant kitties.\n uint256 public pregnantKitties;\n\n /// @dev The address of the sibling contract that is used to implement the sooper-sekret\n /// genetic combination algorithm.\n GeneScienceInterface public geneScience;\n\n /// @dev Update the address of the genetic contract, can only be called by the CEO.\n /// @param _address An address of a GeneScience contract instance to be used from this point forward.\n function setGeneScienceAddress(address _address) external onlyCEO {\n GeneScienceInterface candidateContract = GeneScienceInterface(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isGeneScience());\n\n // Set the new contract address\n geneScience = candidateContract;\n }\n\n /// @dev Checks that a given kitten is able to breed. Requires that the\n /// current cooldown is finished (for sires) and also checks that there is\n /// no pending pregnancy.\n function _isReadyToBreed(Kitty _kit) internal view returns (bool) {\n // In addition to checking the cooldownEndBlock, we also need to check to see if\n // the cat has a pending birth; there can be some period of time between the end\n // of the pregnacy timer and the birth event.\n return (_kit.siringWithId == 0) && (_kit.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @dev Check if a sire has authorized breeding with this matron. True if both sire\n /// and matron have the same owner, or if the sire has given siring permission to\n /// the matron's owner (via approveSiring()).\n function _isSiringPermitted(uint256 _sireId, uint256 _matronId) internal view returns (bool) {\n address matronOwner = kittyIndexToOwner[_matronId];\n address sireOwner = kittyIndexToOwner[_sireId];\n\n // Siring is okay if they have same owner, or if the matron's owner was given\n // permission to breed with this sire.\n return (matronOwner == sireOwner || sireAllowedToAddress[_sireId] == matronOwner);\n }\n\n /// @dev Set the cooldownEndTime for the given Kitty, based on its current cooldownIndex.\n /// Also increments the cooldownIndex (unless it has hit the cap).\n /// @param _kitten A reference to the Kitty in storage which needs its timer started.\n function _triggerCooldown(Kitty storage _kitten) internal {\n // Compute an estimation of the cooldown time in blocks (based on current cooldownIndex).\n _kitten.cooldownEndBlock = uint64((cooldowns[_kitten.cooldownIndex]/secondsPerBlock) + block.number);\n\n // Increment the breeding count, clamping it at 13, which is the length of the\n // cooldowns array. We could check the array size dynamically, but hard-coding\n // this as a constant saves gas. Yay, Solidity!\n if (_kitten.cooldownIndex < 13) {\n _kitten.cooldownIndex += 1;\n }\n }\n\n /// @notice Grants approval to another user to sire with one of your Kitties.\n /// @param _addr The address that will be able to sire with your Kitty. Set to\n /// address(0) to clear all siring approvals for this Kitty.\n /// @param _sireId A Kitty that you own that _addr will now be able to sire with.\n function approveSiring(address _addr, uint256 _sireId)\n external\n whenNotPaused\n {\n require(_owns(msg.sender, _sireId));\n sireAllowedToAddress[_sireId] = _addr;\n }\n\n /// @dev Updates the minimum payment required for calling giveBirthAuto(). Can only\n /// be called by the COO address. (This fee is used to offset the gas cost incurred\n /// by the autobirth daemon).\n function setAutoBirthFee(uint256 val) external onlyCOO {\n autoBirthFee = val;\n }\n\n /// @dev Checks to see if a given Kitty is pregnant and (if so) if the gestation\n /// period has passed.\n function _isReadyToGiveBirth(Kitty _matron) private view returns (bool) {\n return (_matron.siringWithId != 0) && (_matron.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @notice Checks that a given kitten is able to breed (i.e. it is not pregnant or\n /// in the middle of a siring cooldown).\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isReadyToBreed(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n Kitty storage kit = kitties[_kittyId];\n return _isReadyToBreed(kit);\n }\n\n /// @dev Checks whether a kitty is currently pregnant.\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isPregnant(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n // A kitty is pregnant if and only if this field is set\n return kitties[_kittyId].siringWithId != 0;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair. DOES NOT\n /// check ownership permissions (that is up to the caller).\n /// @param _matron A reference to the Kitty struct of the potential matron.\n /// @param _matronId The matron's ID.\n /// @param _sire A reference to the Kitty struct of the potential sire.\n /// @param _sireId The sire's ID\n function _isValidMatingPair(\n Kitty storage _matron,\n uint256 _matronId,\n Kitty storage _sire,\n uint256 _sireId\n )\n private\n view\n returns(bool)\n {\n // A Kitty can't breed with itself!\n if (_matronId == _sireId) {\n return false;\n }\n\n // Kitties can't breed with their parents.\n if (_matron.matronId == _sireId || _matron.sireId == _sireId) {\n return false;\n }\n if (_sire.matronId == _matronId || _sire.sireId == _matronId) {\n return false;\n }\n\n // We can short circuit the sibling check (below) if either cat is\n // gen zero (has a matron ID of zero).\n if (_sire.matronId == 0 || _matron.matronId == 0) {\n return true;\n }\n\n // Kitties can't breed with full or half siblings.\n if (_sire.matronId == _matron.matronId || _sire.matronId == _matron.sireId) {\n return false;\n }\n if (_sire.sireId == _matron.matronId || _sire.sireId == _matron.sireId) {\n return false;\n }\n\n // Everything seems cool! Let's get DTF.\n return true;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair for\n /// breeding via auction (i.e. skips ownership and siring approval checks).\n function _canBreedWithViaAuction(uint256 _matronId, uint256 _sireId)\n internal\n view\n returns (bool)\n {\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId);\n }\n\n /// @notice Checks to see if two cats can breed together, including checks for\n /// ownership and siring approvals. Does NOT check that both cats are ready for\n /// breeding (i.e. breedWith could still fail until the cooldowns are finished).\n /// TODO: Shouldn't this check pregnancy and cooldowns?!?\n /// @param _matronId The ID of the proposed matron.\n /// @param _sireId The ID of the proposed sire.\n function canBreedWith(uint256 _matronId, uint256 _sireId)\n external\n view\n returns(bool)\n {\n require(_matronId > 0);\n require(_sireId > 0);\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId) &&\n _isSiringPermitted(_sireId, _matronId);\n }\n\n /// @dev Internal utility function to initiate breeding, assumes that all breeding\n /// requirements have been checked.\n function _breedWith(uint256 _matronId, uint256 _sireId) internal {\n // Grab a reference to the Kitties from storage.\n Kitty storage sire = kitties[_sireId];\n Kitty storage matron = kitties[_matronId];\n\n // Mark the matron as pregnant, keeping track of who the sire is.\n matron.siringWithId = uint32(_sireId);\n\n // Trigger the cooldown for both parents.\n _triggerCooldown(sire);\n _triggerCooldown(matron);\n\n // Clear siring permission for both parents. This may not be strictly necessary\n // but it's likely to avoid confusion!\n delete sireAllowedToAddress[_matronId];\n delete sireAllowedToAddress[_sireId];\n\n // Every time a kitty gets pregnant, counter is incremented.\n pregnantKitties++;\n\n // Emit the pregnancy event.\n Pregnant(kittyIndexToOwner[_matronId], _matronId, _sireId, matron.cooldownEndBlock);\n }\n\n /// @notice Breed a Kitty you own (as matron) with a sire that you own, or for which you\n /// have previously been given Siring approval. Will either make your cat pregnant, or will\n /// fail entirely. Requires a pre-payment of the fee given out to the first caller of giveBirth()\n /// @param _matronId The ID of the Kitty acting as matron (will end up pregnant if successful)\n /// @param _sireId The ID of the Kitty acting as sire (will begin its siring cooldown if successful)\n function breedWithAuto(uint256 _matronId, uint256 _sireId)\n external\n payable\n whenNotPaused\n {\n // Checks for payment.\n require(msg.value >= autoBirthFee);\n\n // Caller must own the matron.\n require(_owns(msg.sender, _matronId));\n\n // Neither sire nor matron are allowed to be on auction during a normal\n // breeding operation, but we don't need to check that explicitly.\n // For matron: The caller of this function can't be the owner of the matron\n // because the owner of a Kitty on auction is the auction house, and the\n // auction house will never call breedWith().\n // For sire: Similarly, a sire on auction will be owned by the auction house\n // and the act of transferring ownership will have cleared any oustanding\n // siring approval.\n // Thus we don't need to spend gas explicitly checking to see if either cat\n // is on auction.\n\n // Check that matron and sire are both owned by caller, or that the sire\n // has given siring permission to caller (i.e. matron's owner).\n // Will fail for _sireId = 0\n require(_isSiringPermitted(_sireId, _matronId));\n\n // Grab a reference to the potential matron\n Kitty storage matron = kitties[_matronId];\n\n // Make sure matron isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(matron));\n\n // Grab a reference to the potential sire\n Kitty storage sire = kitties[_sireId];\n\n // Make sure sire isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(sire));\n\n // Test that these cats are a valid mating pair.\n require(_isValidMatingPair(\n matron,\n _matronId,\n sire,\n _sireId\n ));\n\n // All checks passed, kitty gets pregnant!\n _breedWith(_matronId, _sireId);\n }\n\n /// @notice Have a pregnant Kitty give birth!\n /// @param _matronId A Kitty ready to give birth.\n /// @return The Kitty ID of the new kitten.\n /// @dev Looks at a given Kitty and, if pregnant and if the gestation period has passed,\n /// combines the genes of the two parents to create a new kitten. The new Kitty is assigned\n /// to the current owner of the matron. Upon successful completion, both the matron and the\n /// new kitten will be ready to breed again. Note that anyone can call this function (if they\n /// are willing to pay the gas!), but the new kitten always goes to the mother's owner.\n function giveBirth(uint256 _matronId)\n external\n whenNotPaused\n returns(uint256)\n {\n // Grab a reference to the matron in storage.\n Kitty storage matron = kitties[_matronId];\n\n // Check that the matron is a valid cat.\n require(matron.birthTime != 0);\n\n // Check that the matron is pregnant, and that its time has come!\n require(_isReadyToGiveBirth(matron));\n\n // Grab a reference to the sire in storage.\n uint256 sireId = matron.siringWithId;\n Kitty storage sire = kitties[sireId];\n\n // Determine the higher generation number of the two parents\n uint16 parentGen = matron.generation;\n if (sire.generation > matron.generation) {\n parentGen = sire.generation;\n }\n\n // Call the sooper-sekret gene mixing operation.\n uint256 childGenes = geneScience.mixGenes(matron.genes, sire.genes, matron.cooldownEndBlock - 1);\n\n // Make the new kitten!\n address owner = kittyIndexToOwner[_matronId];\n uint256 kittenId = _createKitty(_matronId, matron.siringWithId, parentGen + 1, childGenes, owner);\n\n // Clear the reference to sire from the matron (REQUIRED! Having siringWithId\n // set is what marks a matron as being pregnant.)\n delete matron.siringWithId;\n\n // Every time a kitty gives birth counter is decremented.\n pregnantKitties--;\n\n // Send the balance fee to the person who made birth happen.\n msg.sender.send(autoBirthFee);\n\n // return the new kitten's ID\n return kittenId;\n }\n}\n\n\n\n\n\n\n\n\n\n\n/// @title Auction Core\n/// @dev Contains models, variables, and internal methods for the auction.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuctionBase {\n\n // Represents an auction on an NFT\n struct Auction {\n // Current owner of NFT\n address seller;\n // Price (in wei) at beginning of auction\n uint128 startingPrice;\n // Price (in wei) at end of auction\n uint128 endingPrice;\n // Duration (in seconds) of auction\n uint64 duration;\n // Time when auction started\n // NOTE: 0 if this auction has been concluded\n uint64 startedAt;\n }\n\n // Reference to contract tracking NFT ownership\n KittiesERC721 public nonFungibleContract;\n\n // Cut owner takes on each auction, measured in basis points (1/100 of a percent).\n // Values 0-10,000 map to 0%-100%\n uint256 public ownerCut;\n\n // Map from token ID to their corresponding auction.\n mapping (uint256 => Auction) tokenIdToAuction;\n\n event AuctionCreated(uint256 tokenId, uint256 startingPrice, uint256 endingPrice, uint256 duration);\n event AuctionSuccessful(uint256 tokenId, uint256 totalPrice, address winner);\n event AuctionCancelled(uint256 tokenId);\n\n /// @dev Returns true if the claimant owns the token.\n /// @param _claimant - Address claiming to own the token.\n /// @param _tokenId - ID of token whose ownership to verify.\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return (nonFungibleContract.ownerOf(_tokenId) == _claimant);\n }\n\n /// @dev Escrows the NFT, assigning ownership to this contract.\n /// Throws if the escrow fails.\n /// @param _owner - Current owner address of token to escrow.\n /// @param _tokenId - ID of token whose approval to verify.\n function _escrow(address _owner, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transferFrom(_owner, this, _tokenId);\n }\n\n /// @dev Transfers an NFT owned by this contract to another address.\n /// Returns true if the transfer succeeds.\n /// @param _receiver - Address to transfer NFT to.\n /// @param _tokenId - ID of token to transfer.\n function _transfer(address _receiver, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transfer(_receiver, _tokenId);\n }\n\n /// @dev Adds an auction to the list of open auctions. Also fires the\n /// AuctionCreated event.\n /// @param _tokenId The ID of the token to be put on auction.\n /// @param _auction Auction to add.\n function _addAuction(uint256 _tokenId, Auction _auction) internal {\n // Require that all auctions have a duration of\n // at least one minute. (Keeps our math from getting hairy!)\n require(_auction.duration >= 1 minutes);\n\n tokenIdToAuction[_tokenId] = _auction;\n\n AuctionCreated(\n uint256(_tokenId),\n uint256(_auction.startingPrice),\n uint256(_auction.endingPrice),\n uint256(_auction.duration)\n );\n }\n\n /// @dev Cancels an auction unconditionally.\n function _cancelAuction(uint256 _tokenId, address _seller) internal {\n _removeAuction(_tokenId);\n _transfer(_seller, _tokenId);\n AuctionCancelled(_tokenId);\n }\n\n /// @dev Computes the price and transfers winnings.\n /// Does NOT transfer ownership of token.\n function _bid(uint256 _tokenId, uint256 _bidAmount)\n internal\n returns (uint256)\n {\n // Get a reference to the auction struct\n Auction storage auction = tokenIdToAuction[_tokenId];\n\n // Explicitly check that this auction is currently live.\n // (Because of how Ethereum mappings work, we can't just count\n // on the lookup above failing. An invalid _tokenId will just\n // return an auction object that is all zeros.)\n require(_isOnAuction(auction));\n\n // Check that the bid is greater than or equal to the current price\n uint256 price = _currentPrice(auction);\n require(_bidAmount >= price);\n\n // Grab a reference to the seller before the auction struct\n // gets deleted.\n address seller = auction.seller;\n\n // The bid is good! Remove the auction before sending the fees\n // to the sender so we can't have a reentrancy attack.\n _removeAuction(_tokenId);\n\n // Transfer proceeds to seller (if there are any!)\n if (price > 0) {\n // Calculate the auctioneer's cut.\n // (NOTE: _computeCut() is guaranteed to return a\n // value <= price, so this subtraction can't go negative.)\n uint256 auctioneerCut = _computeCut(price);\n uint256 sellerProceeds = price - auctioneerCut;\n\n // NOTE: Doing a transfer() in the middle of a complex\n // method like this is generally discouraged because of\n // reentrancy attacks and DoS attacks if the seller is\n // a contract with an invalid fallback function. We explicitly\n // guard against reentrancy attacks by removing the auction\n // before calling transfer(), and the only thing the seller\n // can DoS is the sale of their own asset! (And if it's an\n // accident, they can call cancelAuction(). )\n seller.transfer(sellerProceeds);\n }\n\n // Calculate any excess funds included with the bid. If the excess\n // is anything worth worrying about, transfer it back to bidder.\n // NOTE: We checked above that the bid amount is greater than or\n // equal to the price so this cannot underflow.\n uint256 bidExcess = _bidAmount - price;\n\n // Return the funds. Similar to the previous transfer, this is\n // not susceptible to a re-entry attack because the auction is\n // removed before any transfers occur.\n msg.sender.transfer(bidExcess);\n\n // Tell the world!\n AuctionSuccessful(_tokenId, price, msg.sender);\n\n return price;\n }\n\n /// @dev Removes an auction from the list of open auctions.\n /// @param _tokenId - ID of NFT on auction.\n function _removeAuction(uint256 _tokenId) internal {\n delete tokenIdToAuction[_tokenId];\n }\n\n /// @dev Returns true if the NFT is on auction.\n /// @param _auction - Auction to check.\n function _isOnAuction(Auction storage _auction) internal view returns (bool) {\n return (_auction.startedAt > 0);\n }\n\n /// @dev Returns current price of an NFT on auction. Broken into two\n /// functions (this one, that computes the duration from the auction\n /// structure, and the other that does the price computation) so we\n /// can easily test that the price computation works correctly.\n function _currentPrice(Auction storage _auction)\n internal\n view\n returns (uint256)\n {\n uint256 secondsPassed = 0;\n\n // A bit of insurance against negative values (or wraparound).\n // Probably not necessary (since Ethereum guarnatees that the\n // now variable doesn't ever go backwards).\n if (now > _auction.startedAt) {\n secondsPassed = now - _auction.startedAt;\n }\n\n return _computeCurrentPrice(\n _auction.startingPrice,\n _auction.endingPrice,\n _auction.duration,\n secondsPassed\n );\n }\n\n /// @dev Computes the current price of an auction. Factored out\n /// from _currentPrice so we can run extensive unit tests.\n /// When testing, make this function public and turn on\n /// `Current price computation` test suite.\n function _computeCurrentPrice(\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n uint256 _secondsPassed\n )\n internal\n pure\n returns (uint256)\n {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our public functions carefully cap the maximum values for\n // time (at 64-bits) and currency (at 128-bits). _duration is\n // also known to be non-zero (see the require() statement in\n // _addAuction())\n if (_secondsPassed >= _duration) {\n // We've reached the end of the dynamic pricing portion\n // of the auction, just return the end price.\n return _endingPrice;\n } else {\n // Starting price can be higher than ending price (and often is!), so\n // this delta can be negative.\n int256 totalPriceChange = int256(_endingPrice) - int256(_startingPrice);\n\n // This multiplication can't overflow, _secondsPassed will easily fit within\n // 64-bits, and totalPriceChange will easily fit within 128-bits, their product\n // will always fit within 256-bits.\n int256 currentPriceChange = totalPriceChange * int256(_secondsPassed) / int256(_duration);\n\n // currentPriceChange can be negative, but if so, will have a magnitude\n // less that _startingPrice. Thus, this result will always end up positive.\n int256 currentPrice = int256(_startingPrice) + currentPriceChange;\n\n return uint256(currentPrice);\n }\n }\n\n /// @dev Computes owner's cut of a sale.\n /// @param _price - Sale price of NFT.\n function _computeCut(uint256 _price) internal view returns (uint256) {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our entry functions carefully cap the maximum values for\n // currency (at 128-bits), and ownerCut <= 10000 (see the require()\n // statement in the ClockAuction constructor). The result of this\n // function is always guaranteed to be <= _price.\n return _price * ownerCut / 10000;\n }\n\n}\n\n\n\n\n\n\n\n/**\n * @title KittiesPausable\n * @dev Base contract which allows children to implement an emergency stop mechanism.\n */\ncontract KittiesPausable is KittiesOwnable {\n event Pause();\n event Unpause();\n\n bool public paused = false;\n\n\n /**\n\t * @dev modifier to allow actions only when the contract IS paused\n\t */\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /**\n\t * @dev modifier to allow actions only when the contract IS NOT paused\n\t */\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /**\n\t * @dev called by the owner to pause, triggers stopped state\n\t */\n function pause() onlyOwner whenNotPaused returns (bool) {\n paused = true;\n Pause();\n return true;\n }\n\n /**\n\t * @dev called by the owner to unpause, returns to normal state\n\t */\n function unpause() onlyOwner whenPaused returns (bool) {\n paused = false;\n Unpause();\n return true;\n }\n}\n\n\n/// @title Clock auction for non-fungible tokens.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuction is KittiesPausable, ClockAuctionBase {\n\n /// @dev The ERC-165 interface signature for ERC-721.\n /// Ref: https://github.com/ethereum/EIPs/issues/165\n /// Ref: https://github.com/ethereum/EIPs/issues/721\n bytes4 constant InterfaceSignature_ERC721 = bytes4(0x9a20483d);\n\n /// @dev Constructor creates a reference to the NFT ownership contract\n /// and verifies the owner cut is in the valid range.\n /// @param _nftAddress - address of a deployed contract implementing\n /// the Nonfungible Interface.\n /// @param _cut - percent cut the owner takes on each auction, must be\n /// between 0-10,000.\n function ClockAuction(address _nftAddress, uint256 _cut) public {\n require(_cut <= 10000);\n ownerCut = _cut;\n\n KittiesERC721 candidateContract = KittiesERC721(_nftAddress);\n require(candidateContract.supportsInterface(InterfaceSignature_ERC721));\n nonFungibleContract = candidateContract;\n }\n\n /// @dev Remove all Ether from the contract, which is the owner's cuts\n /// as well as any Ether sent directly to the contract address.\n /// Always transfers to the NFT contract, but can be called either by\n /// the owner or the NFT contract.\n function withdrawBalance() external {\n address nftAddress = address(nonFungibleContract);\n\n require(\n msg.sender == owner ||\n msg.sender == nftAddress\n );\n // We are using this boolean method to make sure that even if one fails it will still work\n bool res = nftAddress.send(this.balance);\n }\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of time to move between starting\n /// price and ending price (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n whenNotPaused\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(_owns(msg.sender, _tokenId));\n _escrow(msg.sender, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Bids on an open auction, completing the auction and transferring\n /// ownership of the NFT if enough Ether is supplied.\n /// @param _tokenId - ID of token to bid on.\n function bid(uint256 _tokenId)\n external\n payable\n whenNotPaused\n {\n // _bid will throw if the bid or funds transfer fails\n _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n }\n\n /// @dev Cancels an auction that hasn't been won yet.\n /// Returns the NFT to original owner.\n /// @notice This is a state-modifying function that can\n /// be called while the contract is paused.\n /// @param _tokenId - ID of token on auction\n function cancelAuction(uint256 _tokenId)\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n address seller = auction.seller;\n require(msg.sender == seller);\n _cancelAuction(_tokenId, seller);\n }\n\n /// @dev Cancels an auction when the contract is paused.\n /// Only the owner may do this, and NFTs are returned to\n /// the seller. This should only be used in emergencies.\n /// @param _tokenId - ID of the NFT on auction to cancel.\n function cancelAuctionWhenPaused(uint256 _tokenId)\n whenPaused\n onlyOwner\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n _cancelAuction(_tokenId, auction.seller);\n }\n\n /// @dev Returns auction info for an NFT on auction.\n /// @param _tokenId - ID of NFT on auction.\n function getAuction(uint256 _tokenId)\n external\n view\n returns\n (\n address seller,\n uint256 startingPrice,\n uint256 endingPrice,\n uint256 duration,\n uint256 startedAt\n ) {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return (\n auction.seller,\n auction.startingPrice,\n auction.endingPrice,\n auction.duration,\n auction.startedAt\n );\n }\n\n /// @dev Returns the current price of an auction.\n /// @param _tokenId - ID of the token price we are checking.\n function getCurrentPrice(uint256 _tokenId)\n external\n view\n returns (uint256)\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return _currentPrice(auction);\n }\n\n}\n\n\n/// @title Reverse auction modified for siring\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SiringClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSiringAuctionAddress() call.\n bool public isSiringClockAuction = true;\n\n // Delegate constructor\n function SiringClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction. Since this function is wrapped,\n /// require sender to be KittyCore contract.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Places a bid for siring. Requires the sender\n /// is the KittyCore contract because all bid methods\n /// should be wrapped. Also returns the kitty to the\n /// seller rather than the winner.\n function bid(uint256 _tokenId)\n external\n payable\n {\n require(msg.sender == address(nonFungibleContract));\n address seller = tokenIdToAuction[_tokenId].seller;\n // _bid checks that token ID is valid and will throw if bid fails\n _bid(_tokenId, msg.value);\n // We transfer the kitty back to the seller, the winner will get\n // the offspring\n _transfer(seller, _tokenId);\n }\n\n}\n\n\n\n\n\n/// @title Clock auction modified for sale of kitties\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SaleClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSaleAuctionAddress() call.\n bool public isSaleClockAuction = true;\n\n // Tracks last 5 sale price of gen0 kitty sales\n uint256 public gen0SaleCount;\n uint256[5] public lastGen0SalePrices;\n\n // Delegate constructor\n function SaleClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Updates lastSalePrice if seller is the nft contract\n /// Otherwise, works the same as default bid method.\n function bid(uint256 _tokenId)\n external\n payable\n {\n // _bid verifies token ID size\n address seller = tokenIdToAuction[_tokenId].seller;\n uint256 price = _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n\n // If not a gen0 auction, exit\n if (seller == address(nonFungibleContract)) {\n // Track gen0 sale prices\n lastGen0SalePrices[gen0SaleCount % 5] = price;\n gen0SaleCount++;\n }\n }\n\n function averageGen0SalePrice() external view returns (uint256) {\n uint256 sum = 0;\n for (uint256 i = 0; i < 5; i++) {\n sum += lastGen0SalePrices[i];\n }\n return sum / 5;\n }\n\n}\n\n\n/// @title Handles creating auctions for sale and siring of kitties.\n/// This wrapper of ReverseAuction exists only so that users can create\n/// auctions with only one transaction.\ncontract KittyAuction is KittyBreeding {\n\n // @notice The auction contract variables are defined in KittyBase to allow\n // us to refer to them in KittyOwnership to prevent accidental transfers.\n // `saleAuction` refers to the auction for gen0 and p2p sale of kitties.\n // `siringAuction` refers to the auction for siring rights of kitties.\n\n /// @dev Sets the reference to the sale auction.\n /// @param _address - Address of sale contract.\n function setSaleAuctionAddress(address _address) external onlyCEO {\n SaleClockAuction candidateContract = SaleClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSaleClockAuction());\n\n // Set the new contract address\n saleAuction = candidateContract;\n }\n\n /// @dev Sets the reference to the siring auction.\n /// @param _address - Address of siring contract.\n function setSiringAuctionAddress(address _address) external onlyCEO {\n SiringClockAuction candidateContract = SiringClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSiringClockAuction());\n\n // Set the new contract address\n siringAuction = candidateContract;\n }\n\n /// @dev Put a kitty up for auction.\n /// Does some ownership trickery to create auctions in one tx.\n function createSaleAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n // Ensure the kitty is not pregnant to prevent the auction\n // contract accidentally receiving ownership of the child.\n // NOTE: the kitty IS allowed to be in a cooldown.\n require(!isPregnant(_kittyId));\n _approve(_kittyId, saleAuction);\n // Sale auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n saleAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Put a kitty up for auction to be sire.\n /// Performs checks to ensure the kitty can be sired, then\n /// delegates to reverse auction.\n function createSiringAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n require(isReadyToBreed(_kittyId));\n _approve(_kittyId, siringAuction);\n // Siring auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n siringAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Completes a siring auction by bidding.\n /// Immediately breeds the winning matron with the sire on auction.\n /// @param _sireId - ID of the sire on auction.\n /// @param _matronId - ID of the matron owned by the bidder.\n function bidOnSiringAuction(\n uint256 _sireId,\n uint256 _matronId\n )\n external\n payable\n whenNotPaused\n {\n // Auction contract checks input sizes\n require(_owns(msg.sender, _matronId));\n require(isReadyToBreed(_matronId));\n require(_canBreedWithViaAuction(_matronId, _sireId));\n\n // Define the current price of the auction.\n uint256 currentPrice = siringAuction.getCurrentPrice(_sireId);\n require(msg.value >= currentPrice + autoBirthFee);\n\n // Siring auction will throw if the bid fails.\n siringAuction.bid.value(msg.value - autoBirthFee)(_sireId);\n _breedWith(uint32(_matronId), uint32(_sireId));\n }\n\n /// @dev Transfers the balance of the sale auction contract\n /// to the KittyCore contract. We use two-step withdrawal to\n /// prevent two transfer calls in the auction bid function.\n function withdrawAuctionBalances() external onlyCLevel {\n saleAuction.withdrawBalance();\n siringAuction.withdrawBalance();\n }\n}\n\n\n/// @title all functions related to creating kittens\ncontract KittyMinting is KittyAuction {\n\n // Limits the number of cats the contract owner can ever create.\n uint256 public constant PROMO_CREATION_LIMIT = 5000;\n uint256 public constant GEN0_CREATION_LIMIT = 45000;\n\n // Constants for gen0 auctions.\n uint256 public constant GEN0_STARTING_PRICE = 10 finney;\n uint256 public constant GEN0_AUCTION_DURATION = 1 days;\n\n // Counts the number of cats the contract owner has created.\n uint256 public promoCreatedCount;\n uint256 public gen0CreatedCount;\n\n /// @dev we can create promo kittens, up to a limit. Only callable by COO\n /// @param _genes the encoded genes of the kitten to be created, any value is accepted\n /// @param _owner the future owner of the created kittens. Default to contract COO\n function createPromoKitty(uint256 _genes, address _owner) external onlyCOO {\n address kittyOwner = _owner;\n if (kittyOwner == address(0)) {\n kittyOwner = cooAddress;\n }\n require(promoCreatedCount < PROMO_CREATION_LIMIT);\n\n promoCreatedCount++;\n _createKitty(0, 0, 0, _genes, kittyOwner);\n }\n\n /// @dev Creates a new gen0 kitty with the given genes and\n /// creates an auction for it.\n function createGen0Auction(uint256 _genes) external onlyCOO {\n require(gen0CreatedCount < GEN0_CREATION_LIMIT);\n\n uint256 kittyId = _createKitty(0, 0, 0, _genes, address(this));\n _approve(kittyId, saleAuction);\n\n saleAuction.createAuction(\n kittyId,\n _computeNextGen0Price(),\n 0,\n GEN0_AUCTION_DURATION,\n address(this)\n );\n\n gen0CreatedCount++;\n }\n\n /// @dev Computes the next gen0 auction starting price, given\n /// the average of the past 5 prices + 50%.\n function _computeNextGen0Price() internal view returns (uint256) {\n uint256 avePrice = saleAuction.averageGen0SalePrice();\n\n // Sanity check to ensure we don't overflow arithmetic\n require(avePrice == uint256(uint128(avePrice)));\n\n uint256 nextPrice = avePrice + (avePrice / 2);\n\n // We never auction for less than starting price\n if (nextPrice < GEN0_STARTING_PRICE) {\n nextPrice = GEN0_STARTING_PRICE;\n }\n\n return nextPrice;\n }\n}\n\n\n/// @title CryptoKitties: Collectible, breedable, and oh-so-adorable cats on the Ethereum blockchain.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev The main CryptoKitties contract, keeps track of kittens so they don't wander around and get lost.\ncontract KittyCore is KittyMinting {\n\n // This is the main CryptoKitties contract. In order to keep our code seperated into logical sections,\n // we've broken it up in two ways. First, we have several seperately-instantiated sibling contracts\n // that handle auctions and our super-top-secret genetic combination algorithm. The auctions are\n // seperate since their logic is somewhat complex and there's always a risk of subtle bugs. By keeping\n // them in their own contracts, we can upgrade them without disrupting the main contract that tracks\n // kitty ownership. The genetic combination algorithm is kept seperate so we can open-source all of\n // the rest of our code without making it _too_ easy for folks to figure out how the genetics work.\n // Don't worry, I'm sure someone will reverse engineer it soon enough!\n //\n // Secondly, we break the core contract into multiple files using inheritence, one for each major\n // facet of functionality of CK. This allows us to keep related code bundled together while still\n // avoiding a single giant file with everything in it. The breakdown is as follows:\n //\n // - KittyBase: This is where we define the most fundamental code shared throughout the core\n // functionality. This includes our main data storage, constants and data types, plus\n // internal functions for managing these items.\n //\n // - KittyAccessControl: This contract manages the various addresses and constraints for operations\n // that can be executed only by specific roles. Namely CEO, CFO and COO.\n //\n // - KittyOwnership: This provides the methods required for basic non-fungible token\n // transactions, following the draft ERC-721 spec (https://github.com/ethereum/EIPs/issues/721).\n //\n // - KittyBreeding: This file contains the methods necessary to breed cats together, including\n // keeping track of siring offers, and relies on an external genetic combination contract.\n //\n // - KittyAuctions: Here we have the public methods for auctioning or bidding on cats or siring\n // services. The actual auction functionality is handled in two sibling contracts (one\n // for sales and one for siring), while auction creation and bidding is mostly mediated\n // through this facet of the core contract.\n //\n // - KittyMinting: This final facet contains the functionality we use for creating new gen0 cats.\n // We can make up to 5000 \"promo\" cats that can be given away (especially important when\n // the community is new), and all others can only be created and then immediately put up\n // for auction via an algorithmically determined starting price. Regardless of how they\n // are created, there is a hard limit of 50k gen0 cats. After that, it's all up to the\n // community to breed, breed, breed!\n\n // Set in case the core contract is broken and an upgrade is required\n address public newContractAddress;\n\n /// @notice Creates the main CryptoKitties smart contract instance.\n function KittyCore() public {\n // Starts paused.\n paused = true;\n\n // the creator of the contract is the initial CEO\n ceoAddress = msg.sender;\n\n // the creator of the contract is also the initial COO\n cooAddress = msg.sender;\n\n // start with the mythical kitten 0 - so we don't have generation-0 parent issues\n _createKitty(0, 0, 0, uint256(-1), address(0));\n }\n\n /// @dev Used to mark the smart contract as upgraded, in case there is a serious\n /// breaking bug. This method does nothing but keep track of the new contract and\n /// emit a message indicating that the new address is set. It's up to clients of this\n /// contract to update to the new contract address in that case. (This contract will\n /// be paused indefinitely if such an upgrade takes place.)\n /// @param _v2Address new address\n function setNewAddress(address _v2Address) external onlyCEO whenPaused {\n // See README.md for updgrade plan\n newContractAddress = _v2Address;\n ContractUpgrade(_v2Address);\n }\n\n /// @notice No tipping!\n /// @dev Reject all Ether from being sent here, unless it's from one of the\n /// two auction contracts. (Hopefully, we can prevent user accidents.)\n function() external payable {\n require(\n msg.sender == address(saleAuction) ||\n msg.sender == address(siringAuction)\n );\n }\n\n /// @notice Returns all the relevant information about a specific kitty.\n /// @param _id The ID of the kitty of interest.\n function getKitty(uint256 _id)\n external\n view\n returns (\n bool isGestating,\n bool isReady,\n uint256 cooldownIndex,\n uint256 nextActionAt,\n uint256 siringWithId,\n uint256 birthTime,\n uint256 matronId,\n uint256 sireId,\n uint256 generation,\n uint256 genes\n ) {\n Kitty storage kit = kitties[_id];\n\n // if this variable is 0 then it's not gestating\n isGestating = (kit.siringWithId != 0);\n isReady = (kit.cooldownEndBlock <= block.number);\n cooldownIndex = uint256(kit.cooldownIndex);\n nextActionAt = uint256(kit.cooldownEndBlock);\n siringWithId = uint256(kit.siringWithId);\n birthTime = uint256(kit.birthTime);\n matronId = uint256(kit.matronId);\n sireId = uint256(kit.sireId);\n generation = uint256(kit.generation);\n genes = kit.genes;\n }\n\n /// @dev Override unpause so it requires all external contract addresses\n /// to be set before contract can be unpaused. Also, we can't have\n /// newContractAddress set either, because then the contract was upgraded.\n /// @notice This is public rather than external so we can call super.unpause\n /// without using an expensive CALL.\n function unpause() public onlyCEO whenPaused {\n require(saleAuction != address(0));\n require(siringAuction != address(0));\n require(geneScience != address(0));\n require(newContractAddress == address(0));\n\n // Actually unpause the contract.\n super.unpause();\n }\n\n // @dev Allows the CFO to capture the balance available to the contract.\n function withdrawBalance() external onlyCFO {\n uint256 balance = this.balance;\n // Subtract all the currently pregnant kittens we have, plus 1 of margin.\n uint256 subtractFees = (pregnantKitties + 1) * autoBirthFee;\n\n if (balance > subtractFees) {\n cfoAddress.send(balance - subtractFees);\n }\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "exportedSymbols": { "ClockAuction": [ 8872 @@ -52418,5 +52418,5 @@ }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:47.809Z" + "updatedAt": "2018-10-09T17:45:36.217Z" } \ No newline at end of file diff --git a/artifacts/json/KittyCore.json b/artifacts/json/KittyCore.json index b9094e92..456bf1f5 100644 --- a/artifacts/json/KittyCore.json +++ b/artifacts/json/KittyCore.json @@ -1104,15 +1104,15 @@ "type": "event" } ], - "bytecode": "0x60606040526000600260146101000a81548160ff0219169083151502179055506101c060405190810160405280603c63ffffffff1663ffffffff168152602001607863ffffffff1663ffffffff16815260200161012c63ffffffff1663ffffffff16815260200161025863ffffffff1663ffffffff16815260200161070863ffffffff1663ffffffff168152602001610e1063ffffffff1663ffffffff168152602001611c2063ffffffff1663ffffffff16815260200161384063ffffffff1663ffffffff16815260200161708063ffffffff1663ffffffff16815260200161e10063ffffffff1663ffffffff1681526020016201518063ffffffff1663ffffffff1681526020016202a30063ffffffff1663ffffffff1681526020016205460063ffffffff1663ffffffff16815260200162093a8063ffffffff1663ffffffff16815250600390600e62000156929190620007a8565b50600f60055566071afd498d0000600e5534156200017357600080fd5b6001600260146101000a81548160ff021916908315150217905550336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200025560008060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60006200025c6401000000000262004976176401000000009004565b5062000a00565b6000806200026962000852565b60008863ffffffff16891415156200028057600080fd5b8763ffffffff16881415156200029557600080fd5b8661ffff1687141515620002a857600080fd5b600287811515620002b557fe5b049250600d8361ffff161115620002cb57600d92505b610100604051908101604052808781526020014267ffffffffffffffff168152602001600067ffffffffffffffff1681526020018a63ffffffff1681526020018963ffffffff168152602001600063ffffffff1681526020018461ffff1681526020018861ffff168152509150600160068054806001018281620003509190620008c6565b916000526020600020906002020160008590919091506000820151816000015560208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601c6101000a81548161ffff021916908361ffff16021790555060e082015181600101601e6101000a81548161ffff021916908361ffff16021790555050500390508063ffffffff1681141515620004a357600080fd5b7f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad58582846060015163ffffffff16856080015163ffffffff168660000151604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a162000560600086836200056f6401000000000262004383176401000000009004565b80935050505095945050505050565b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415156200070457600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600a600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556009600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b82600e6007016008900481019282156200083f5791602002820160005b838211156200080b57835183826101000a81548163ffffffff021916908363ffffffff1602179055509260200192600401602081600301049283019260010302620007c5565b80156200083d5782816101000a81549063ffffffff02191690556004016020816003010492830192600103026200080b565b505b5090506200084e9190620008fb565b5090565b6101006040519081016040528060008152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600061ffff168152602001600061ffff1681525090565b815481835581811511620008f657600202816002028360005260206000209182019101620008f5919062000931565b5b505050565b6200092e91905b808211156200092a57600081816101000a81549063ffffffff02191690555060010162000902565b5090565b90565b620009fd91905b80821115620009f9576000808201600090556001820160006101000a81549067ffffffffffffffff02191690556001820160086101000a81549067ffffffffffffffff02191690556001820160106101000a81549063ffffffff02191690556001820160146101000a81549063ffffffff02191690556001820160186101000a81549063ffffffff021916905560018201601c6101000a81549061ffff021916905560018201601e6101000a81549061ffff02191690555060020162000938565b5090565b90565b6153168062000a106000396000f3006060604052600436106102bf576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146103755780630519ce79146103cf5780630560ff441461042457806305e45546146104d457806306fdde03146104fd578063095ea7b31461058b5780630a0f8168146105cd5780630e583df01461062257806314001f4c1461064b57806318160ddd14610684578063183a7947146106ad5780631940a936146106d657806319c2f2011461071157806321717ebf1461073a57806323b872dd1461078f57806324e7a38a146107f057806327d7874c146108295780632ba73c15146108625780633d7d3f5a1461089b5780633f4ba83a146108d957806346116e6f146108ee57806346d22c7014610951578063481af3d3146109955780634ad8c938146109f85780634b85fd5514610a365780634dfff04f14610a595780634e0a337914610a9b5780635612913414610ad45780635663896e14610b165780635c975abb14610b395780635fd8c71014610b665780636352211e14610b7b578063680eba2714610bde5780636af04a5714610c075780636fbde40d14610c5c57806370a0823114610c955780637158798814610ce25780637a7d493714610d1b5780638456cb5914610d445780638462151c14610d5957806388c2a0bf14610de757806391876e5714610e1e57806395d89b4114610e335780639d6fac6f14610ec1578063a45f4bfc14610f04578063a9059cbb14610f67578063b047fb5014610fa9578063b0c35c0514610ffe578063bc4006f514611027578063c3bea9af1461107c578063d3e6f49f1461109f578063defb9584146110da578063e17b25af14611103578063e6cbe3511461113c578063e98b7f4d14611191578063ed60ade61461120f578063f1ca941014611230578063f2b47d5214611259578063f7d8c883146112ae575b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806103685750600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561037357600080fd5b005b341561038057600080fd5b6103b560048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190919050506112cf565b604051808215151515815260200191505060405180910390f35b34156103da57600080fd5b6103e26115e0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561042f57600080fd5b61045960048080359060200190919080359060200190820180359060200191909192905050611606565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561049957808201518184015260208101905061047e565b50505050905090810190601f1680156104c65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156104df57600080fd5b6104e7611771565b6040518082815260200191505060405180910390f35b341561050857600080fd5b610510611777565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610550578082015181840152602081019050610535565b50505050905090810190601f16801561057d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561059657600080fd5b6105cb600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506117b0565b005b34156105d857600080fd5b6105e0611872565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561062d57600080fd5b610635611897565b6040518082815260200191505060405180910390f35b341561065657600080fd5b610682600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506118a2565b005b341561068f57600080fd5b6106976119d9565b6040518082815260200191505060405180910390f35b34156106b857600080fd5b6106c06119e9565b6040518082815260200191505060405180910390f35b34156106e157600080fd5b6106f760048080359060200190919050506119ef565b604051808215151515815260200191505060405180910390f35b341561071c57600080fd5b610724611a41565b6040518082815260200191505060405180910390f35b341561074557600080fd5b61074d611a48565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561079a57600080fd5b6107ee600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611a6e565b005b34156107fb57600080fd5b610827600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611b1f565b005b341561083457600080fd5b610860600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611c56565b005b341561086d57600080fd5b610899600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611d30565b005b34156108a657600080fd5b6108d76004808035906020019091908035906020019091908035906020019091908035906020019091905050611e0b565b005b34156108e457600080fd5b6108ec611f73565b005b34156108f957600080fd5b61090f600480803590602001909190505061216a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561095c57600080fd5b61097b600480803590602001909190803590602001909190505061219d565b604051808215151515815260200191505060405180910390f35b34156109a057600080fd5b6109b66004808035906020019091905050612225565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610a0357600080fd5b610a346004808035906020019091908035906020019091908035906020019091908035906020019091905050612258565b005b3415610a4157600080fd5b610a5760048080359060200190919050506123bf565b005b3415610a6457600080fd5b610a99600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050612425565b005b3415610aa657600080fd5b610ad2600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506124ac565b005b3415610adf57600080fd5b610b14600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612587565b005b3415610b2157600080fd5b610b37600480803590602001909190505061267c565b005b3415610b4457600080fd5b610b4c6127d0565b604051808215151515815260200191505060405180910390f35b3415610b7157600080fd5b610b796127e3565b005b3415610b8657600080fd5b610b9c60048080359060200190919050506128cf565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610be957600080fd5b610bf1612948565b6040518082815260200191505060405180910390f35b3415610c1257600080fd5b610c1a61294e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610c6757600080fd5b610c93600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612974565b005b3415610ca057600080fd5b610ccc600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612aab565b6040518082815260200191505060405180910390f35b3415610ced57600080fd5b610d19600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612af4565b005b3415610d2657600080fd5b610d2e612c11565b6040518082815260200191505060405180910390f35b3415610d4f57600080fd5b610d57612c17565b005b3415610d6457600080fd5b610d90600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612d5b565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610dd3578082015181840152602081019050610db8565b505050509050019250505060405180910390f35b3415610df257600080fd5b610e086004808035906020019091905050612e92565b6040518082815260200191505060405180910390f35b3415610e2957600080fd5b610e316132b1565b005b3415610e3e57600080fd5b610e466134f0565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e86578082015181840152602081019050610e6b565b50505050905090810190601f168015610eb35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610ecc57600080fd5b610ee26004808035906020019091905050613529565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3415610f0f57600080fd5b610f256004808035906020019091905050613558565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610f7257600080fd5b610fa7600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061358b565b005b3415610fb457600080fd5b610fbc6136fc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561100957600080fd5b611011613722565b6040518082815260200191505060405180910390f35b341561103257600080fd5b61103a613728565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561108757600080fd5b61109d600480803590602001909190505061374e565b005b34156110aa57600080fd5b6110c0600480803590602001909190505061390c565b604051808215151515815260200191505060405180910390f35b34156110e557600080fd5b6110ed613a7b565b6040518082815260200191505060405180910390f35b341561110e57600080fd5b61113a600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050613a81565b005b341561114757600080fd5b61114f613b20565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561119c57600080fd5b6111b26004808035906020019091905050613b46565b604051808b1515151581526020018a1515151581526020018981526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019a505050505050505050505060405180910390f35b61122e6004808035906020019091908035906020019091905050613ca7565b005b341561123b57600080fd5b611243613e90565b6040518082815260200191505060405180910390f35b341561126457600080fd5b61126c613e96565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6112cd6004808035906020019091908035906020019091905050613ebc565b005b600060405180807f737570706f727473496e74657266616365286279746573342900000000000000815250601901905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806115d9575060405180807f746f6b656e4d657461646174612875696e743235362c737472696e6729000000815250601d019050604051809103902060405180807f746f6b656e734f664f776e6572286164647265737329000000000000000000008152506016019050604051809103902060405180807f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81526020017f74323536290000000000000000000000000000000000000000000000000000008152506025019050604051809103902060405180807f7472616e7366657228616464726573732c75696e7432353629000000000000008152506019019050604051809103902060405180807f617070726f766528616464726573732c75696e743235362900000000000000008152506018019050604051809103902060405180807f6f776e65724f662875696e7432353629000000000000000000000000000000008152506010019050604051809103902060405180807f62616c616e63654f6628616464726573732900000000000000000000000000008152506012019050604051809103902060405180807f746f74616c537570706c79282900000000000000000000000000000000000000815250600d019050604051809103902060405180807f73796d626f6c28290000000000000000000000000000000000000000000000008152506008019050604051809103902060405180807f6e616d6528290000000000000000000000000000000000000000000000000000815250600601905060405180910390201818181818181818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61160e615125565b611616615139565b60008073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561167557600080fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb4799f2878787600060405160a001526040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180848152602001806020018281038252848482818152602001925080828437820191505094505050505060a060405180830381600087803b151561173057600080fd5b6102c65a03f1151561174157600080fd5b50505060405180608001805190602001604052809250819350505061176682826141fd565b925050509392505050565b60115481565b6040805190810160405280600d81526020017f43727970746f4b6974746965730000000000000000000000000000000000000081525081565b6117ba3382614255565b15156117c557600080fd5b6117cf81836142c1565b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b662386f26fc1000081565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156118ff57600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166376190f8f6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561196e57600080fd5b6102c65a03f1151561197f57600080fd5b50505060405180519050151561199457600080fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600160068054905003905090565b600f5481565b600080821115156119ff57600080fd5b6000600683815481101515611a1057fe5b906000526020600020906002020160010160189054906101000a900463ffffffff1663ffffffff1614159050919050565b6201518081565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611aaa57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611ae557600080fd5b611aef3382614317565b1515611afa57600080fd5b611b048382614255565b1515611b0f57600080fd5b611b1a838383614383565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b7c57600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166354c15b826000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515611beb57600080fd5b6102c65a03f11515611bfc57600080fd5b505050604051805190501515611c1157600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611cb157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611ced57600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611d8b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611dc757600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260149054906101000a900460ff16151515611e2757600080fd5b611e313385614255565b1515611e3c57600080fd5b611e45846119ef565b151515611e5157600080fd5b611e7d84600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166142c1565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a85858585336040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b1515611f5957600080fd5b6102c65a03f11515611f6a57600080fd5b50505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611fce57600080fd5b600260149054906101000a900460ff161515611fe957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561204757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156120a557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561210357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561216057600080fd5b6121686145bb565b565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080851115156121b057600080fd5b6000841115156121bf57600080fd5b6006858154811015156121ce57fe5b906000526020600020906002020191506006848154811015156121ed57fe5b906000526020600020906002020190506122098286838761464e565b801561221b575061221a8486614863565b5b9250505092915050565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff1615151561227457600080fd5b61227e3385614255565b151561228957600080fd5b6122928461390c565b151561229d57600080fd5b6122c984600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166142c1565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a85858585336040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b15156123a557600080fd5b6102c65a03f115156123b657600080fd5b50505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561241b57600080fd5b80600e8190555050565b600260149054906101000a900460ff1615151561244157600080fd5b61244b3382614255565b151561245657600080fd5b81600a600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561250757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561254357600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156125e557600080fd5b819050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561264357600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b61138860115410151561265557600080fd5b60116000815480929190600101919050555061267660008060008685614976565b50505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061272457506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061277c5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561278757600080fd5b60036000600e8110151561279757fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff16811015156127c657600080fd5b8060058190555050565b600260149054906101000a900460ff1681565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561284257600080fd5b3073ffffffffffffffffffffffffffffffffffffffff16319150600e546001600f5401029050808211156128cb57600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8284039081150290604051600060405180830381858888f19350505050505b5050565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561294357600080fd5b919050565b61afc881565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156129d157600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166385b861886000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515612a4057600080fd5b6102c65a03f11515612a5157600080fd5b505050604051805190501515612a6657600080fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612b4f57600080fd5b600260149054906101000a900460ff161515612b6a57600080fd5b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f450db8da6efbe9c22f2347f7c2021231df1fc58d3ae9a2fa75d39fa44619930581604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612cbf57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80612d175750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515612d2257600080fd5b600260149054906101000a900460ff16151515612d3e57600080fd5b6001600260146101000a81548160ff021916908315150217905550565b612d63615164565b6000612d6d615164565b6000806000612d7b87612aab565b94506000851415612dad576000604051805910612d955750595b90808252806020026020018201604052509550612e88565b84604051805910612dbb5750595b90808252806020026020018201604052509350612dd66119d9565b925060009150600190505b8281111515612e84578673ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612e7757808483815181101515612e6057fe5b906020019060200201818152505081806001019250505b8080600101915050612de1565b8395505b5050505050919050565b600080600080600080600080600260149054906101000a900460ff16151515612eba57600080fd5b600689815481101515612ec957fe5b9060005260206000209060020201965060008760010160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1614151515612f0b57600080fd5b613041876101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614c69565b151561304c57600080fd5b8660010160189054906101000a900463ffffffff1663ffffffff16955060068681548110151561307857fe5b9060005260206000209060020201945086600101601e9054906101000a900461ffff16935086600101601e9054906101000a900461ffff1661ffff1685600101601e9054906101000a900461ffff1661ffff1611156130e75784600101601e9054906101000a900461ffff1693505b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d9f5aed8860000154876000015460018b60010160089054906101000a900467ffffffffffffffff16036000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018381526020018267ffffffffffffffff1681526020019350505050602060405180830381600087803b15156131bd57600080fd5b6102c65a03f115156131ce57600080fd5b505050604051805190509250600760008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915061323e898860010160189054906101000a900463ffffffff1663ffffffff166001870161ffff168686614976565b90508660010160186101000a81549063ffffffff0219169055600f60008154809291906001900391905055503373ffffffffffffffffffffffffffffffffffffffff166108fc600e549081150290604051600060405180830381858888f193505050505080975050505050505050919050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061335957506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806133b15750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156133bc57600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b151561344157600080fd5b6102c65a03f1151561345257600080fd5b505050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b15156134da57600080fd5b6102c65a03f115156134eb57600080fd5b505050565b6040805190810160405280600281526020017f434b00000000000000000000000000000000000000000000000000000000000081525081565b600381600e8110151561353857fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff161515156135a757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156135e357600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561361e57600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561367b57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156136d857600080fd5b6136e23382614255565b15156136ed57600080fd5b6136f8338383614383565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156137ac57600080fd5b61afc86012541015156137be57600080fd5b6137cd60008060008530614976565b90506137fb81600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166142c1565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a82613842614ca4565b600062015180306040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b15156138e257600080fd5b6102c65a03f115156138f357600080fd5b5050506012600081548092919060010191905055505050565b60008060008311151561391e57600080fd5b60068381548110151561392d57fe5b90600052602060002090600202019050613a73816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614da7565b915050919050565b61138881565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613adc57600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080600080600080600080600060068c815481101515613b6657fe5b9060005260206000209060020201905060008160010160189054906101000a900463ffffffff1663ffffffff1614159a50438160010160089054906101000a900467ffffffffffffffff1667ffffffffffffffff161115995080600101601c9054906101000a900461ffff1661ffff1698508060010160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1697508060010160189054906101000a900463ffffffff1663ffffffff1696508060010160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1695508060010160109054906101000a900463ffffffff1663ffffffff1694508060010160149054906101000a900463ffffffff1663ffffffff16935080600101601e9054906101000a900461ffff1661ffff16925080600001549150509193959799509193959799565b6000600260149054906101000a900460ff16151515613cc557600080fd5b613ccf3383614255565b1515613cda57600080fd5b613ce38261390c565b1515613cee57600080fd5b613cf88284614de1565b1515613d0357600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c55d0f56846000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515613d9c57600080fd5b6102c65a03f11515613dad57600080fd5b505050604051805190509050600e5481013410151515613dcc57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663454a2ab3600e543403856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808281526020019150506000604051808303818588803b1515613e6057600080fd5b6125ee5a03f11515613e7157600080fd5b50505050613e8b8263ffffffff168463ffffffff16614e3a565b505050565b60125481565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600260149054906101000a900460ff16151515613edb57600080fd5b600e543410151515613eec57600080fd5b613ef63385614255565b1515613f0157600080fd5b613f0b8385614863565b1515613f1657600080fd5b600684815481101515613f2557fe5b9060005260206000209060020201915061406b826101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614da7565b151561407657600080fd5b60068381548110151561408557fe5b906000526020600020906002020190506141cb816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614da7565b15156141d657600080fd5b6141e28285838661464e565b15156141ed57600080fd5b6141f78484614e3a565b50505050565b614205615125565b61420d615125565b6000808460405180591061421e5750595b9080825280601f01601f19166020018201604052509250602083019150859050614249828287615004565b82935050505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff166007600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b806009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008273ffffffffffffffffffffffffffffffffffffffff166009600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151561451757600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600a600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556009600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561461657600080fd5b600260149054906101000a900460ff16151561463157600080fd5b6000600260146101000a81548160ff021916908315150217905550565b600081841415614661576000905061485b565b818560010160109054906101000a900463ffffffff1663ffffffff1614806146a25750818560010160149054906101000a900463ffffffff1663ffffffff16145b156146b0576000905061485b565b838360010160109054906101000a900463ffffffff1663ffffffff1614806146f15750838360010160149054906101000a900463ffffffff1663ffffffff16145b156146ff576000905061485b565b60008360010160109054906101000a900463ffffffff1663ffffffff161480614742575060008560010160109054906101000a900463ffffffff1663ffffffff16145b15614750576001905061485b565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff1614806147c557508460010160149054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff16145b156147d3576000905061485b565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff16148061484857508460010160149054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff16145b15614856576000905061485b565b600190505b949350505050565b60008060006007600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16148061496c57508173ffffffffffffffffffffffffffffffffffffffff16600a600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b9250505092915050565b600080614981615178565b60008863ffffffff168914151561499757600080fd5b8763ffffffff16881415156149ab57600080fd5b8661ffff16871415156149bd57600080fd5b6002878115156149c957fe5b049250600d8361ffff1611156149de57600d92505b610100604051908101604052808781526020014267ffffffffffffffff168152602001600067ffffffffffffffff1681526020018a63ffffffff1681526020018963ffffffff168152602001600063ffffffff1681526020018461ffff1681526020018861ffff168152509150600160068054806001018281614a6191906151ec565b916000526020600020906002020160008590919091506000820151816000015560208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601c6101000a81548161ffff021916908361ffff16021790555060e082015181600101601e6101000a81548161ffff021916908361ffff16021790555050500390508063ffffffff1681141515614bb357600080fd5b7f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad58582846060015163ffffffff16856080015163ffffffff168660000151604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a1614c5a60008683614383565b80935050505095945050505050565b6000808260a0015163ffffffff1614158015614c9d57504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b6000806000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663eac9d94c6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515614d3757600080fd5b6102c65a03f11515614d4857600080fd5b505050604051805190509150816fffffffffffffffffffffffffffffffff1682141515614d7457600080fd5b600282811515614d8057fe5b0482019050662386f26fc10000811015614d9f57662386f26fc1000090505b809250505090565b6000808260a0015163ffffffff16148015614dda57504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b6000806000600685815481101515614df557fe5b90600052602060002090600202019150600684815481101515614e1457fe5b90600052602060002090600202019050614e308286838761464e565b9250505092915050565b600080600683815481101515614e4c57fe5b90600052602060002090600202019150600684815481101515614e6b57fe5b90600052602060002090600202019050828160010160186101000a81548163ffffffff021916908363ffffffff160217905550614ea78261504f565b614eb08161504f565b600a600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600a600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600f600081548092919060010191905055507f241ea03ca20251805084d27d4440371c34a0b85ff108f6bb5611248f73818b806007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685858460010160089054906101000a900467ffffffffffffffff16604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018267ffffffffffffffff16815260200194505050505060405180910390a150505050565b60005b60208210151561502c5782518452602084019350602083019250602082039150615007565b6001826020036101000a0390508019835116818551168181178652505050505050565b43600554600383600101601c9054906101000a900461ffff1661ffff16600e8110151561507857fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff168115156150a357fe5b04018160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600d81600101601c9054906101000a900461ffff1661ffff16101561512257600181600101601c8282829054906101000a900461ffff160192506101000a81548161ffff021916908361ffff1602179055505b50565b602060405190810160405280600081525090565b6080604051908101604052806004905b60008019168152602001906001900390816151495790505090565b602060405190810160405280600081525090565b6101006040519081016040528060008152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600061ffff168152602001600061ffff1681525090565b81548183558181151161521957600202816002028360005260206000209182019101615218919061521e565b5b505050565b6152e791905b808211156152e3576000808201600090556001820160006101000a81549067ffffffffffffffff02191690556001820160086101000a81549067ffffffffffffffff02191690556001820160106101000a81549063ffffffff02191690556001820160146101000a81549063ffffffff02191690556001820160186101000a81549063ffffffff021916905560018201601c6101000a81549061ffff021916905560018201601e6101000a81549061ffff021916905550600201615224565b5090565b905600a165627a7a7230582016f48a5de6bec06f052960f6124165218dafe9590a0d7bd601f001dca0e62e8a0029", - "deployedBytecode": "0x6060604052600436106102bf576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146103755780630519ce79146103cf5780630560ff441461042457806305e45546146104d457806306fdde03146104fd578063095ea7b31461058b5780630a0f8168146105cd5780630e583df01461062257806314001f4c1461064b57806318160ddd14610684578063183a7947146106ad5780631940a936146106d657806319c2f2011461071157806321717ebf1461073a57806323b872dd1461078f57806324e7a38a146107f057806327d7874c146108295780632ba73c15146108625780633d7d3f5a1461089b5780633f4ba83a146108d957806346116e6f146108ee57806346d22c7014610951578063481af3d3146109955780634ad8c938146109f85780634b85fd5514610a365780634dfff04f14610a595780634e0a337914610a9b5780635612913414610ad45780635663896e14610b165780635c975abb14610b395780635fd8c71014610b665780636352211e14610b7b578063680eba2714610bde5780636af04a5714610c075780636fbde40d14610c5c57806370a0823114610c955780637158798814610ce25780637a7d493714610d1b5780638456cb5914610d445780638462151c14610d5957806388c2a0bf14610de757806391876e5714610e1e57806395d89b4114610e335780639d6fac6f14610ec1578063a45f4bfc14610f04578063a9059cbb14610f67578063b047fb5014610fa9578063b0c35c0514610ffe578063bc4006f514611027578063c3bea9af1461107c578063d3e6f49f1461109f578063defb9584146110da578063e17b25af14611103578063e6cbe3511461113c578063e98b7f4d14611191578063ed60ade61461120f578063f1ca941014611230578063f2b47d5214611259578063f7d8c883146112ae575b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806103685750600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561037357600080fd5b005b341561038057600080fd5b6103b560048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190919050506112cf565b604051808215151515815260200191505060405180910390f35b34156103da57600080fd5b6103e26115e0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561042f57600080fd5b61045960048080359060200190919080359060200190820180359060200191909192905050611606565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561049957808201518184015260208101905061047e565b50505050905090810190601f1680156104c65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156104df57600080fd5b6104e7611771565b6040518082815260200191505060405180910390f35b341561050857600080fd5b610510611777565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610550578082015181840152602081019050610535565b50505050905090810190601f16801561057d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561059657600080fd5b6105cb600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506117b0565b005b34156105d857600080fd5b6105e0611872565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561062d57600080fd5b610635611897565b6040518082815260200191505060405180910390f35b341561065657600080fd5b610682600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506118a2565b005b341561068f57600080fd5b6106976119d9565b6040518082815260200191505060405180910390f35b34156106b857600080fd5b6106c06119e9565b6040518082815260200191505060405180910390f35b34156106e157600080fd5b6106f760048080359060200190919050506119ef565b604051808215151515815260200191505060405180910390f35b341561071c57600080fd5b610724611a41565b6040518082815260200191505060405180910390f35b341561074557600080fd5b61074d611a48565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561079a57600080fd5b6107ee600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611a6e565b005b34156107fb57600080fd5b610827600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611b1f565b005b341561083457600080fd5b610860600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611c56565b005b341561086d57600080fd5b610899600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611d30565b005b34156108a657600080fd5b6108d76004808035906020019091908035906020019091908035906020019091908035906020019091905050611e0b565b005b34156108e457600080fd5b6108ec611f73565b005b34156108f957600080fd5b61090f600480803590602001909190505061216a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561095c57600080fd5b61097b600480803590602001909190803590602001909190505061219d565b604051808215151515815260200191505060405180910390f35b34156109a057600080fd5b6109b66004808035906020019091905050612225565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610a0357600080fd5b610a346004808035906020019091908035906020019091908035906020019091908035906020019091905050612258565b005b3415610a4157600080fd5b610a5760048080359060200190919050506123bf565b005b3415610a6457600080fd5b610a99600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050612425565b005b3415610aa657600080fd5b610ad2600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506124ac565b005b3415610adf57600080fd5b610b14600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612587565b005b3415610b2157600080fd5b610b37600480803590602001909190505061267c565b005b3415610b4457600080fd5b610b4c6127d0565b604051808215151515815260200191505060405180910390f35b3415610b7157600080fd5b610b796127e3565b005b3415610b8657600080fd5b610b9c60048080359060200190919050506128cf565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610be957600080fd5b610bf1612948565b6040518082815260200191505060405180910390f35b3415610c1257600080fd5b610c1a61294e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610c6757600080fd5b610c93600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612974565b005b3415610ca057600080fd5b610ccc600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612aab565b6040518082815260200191505060405180910390f35b3415610ced57600080fd5b610d19600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612af4565b005b3415610d2657600080fd5b610d2e612c11565b6040518082815260200191505060405180910390f35b3415610d4f57600080fd5b610d57612c17565b005b3415610d6457600080fd5b610d90600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612d5b565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610dd3578082015181840152602081019050610db8565b505050509050019250505060405180910390f35b3415610df257600080fd5b610e086004808035906020019091905050612e92565b6040518082815260200191505060405180910390f35b3415610e2957600080fd5b610e316132b1565b005b3415610e3e57600080fd5b610e466134f0565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e86578082015181840152602081019050610e6b565b50505050905090810190601f168015610eb35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610ecc57600080fd5b610ee26004808035906020019091905050613529565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3415610f0f57600080fd5b610f256004808035906020019091905050613558565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610f7257600080fd5b610fa7600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061358b565b005b3415610fb457600080fd5b610fbc6136fc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561100957600080fd5b611011613722565b6040518082815260200191505060405180910390f35b341561103257600080fd5b61103a613728565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561108757600080fd5b61109d600480803590602001909190505061374e565b005b34156110aa57600080fd5b6110c0600480803590602001909190505061390c565b604051808215151515815260200191505060405180910390f35b34156110e557600080fd5b6110ed613a7b565b6040518082815260200191505060405180910390f35b341561110e57600080fd5b61113a600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050613a81565b005b341561114757600080fd5b61114f613b20565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561119c57600080fd5b6111b26004808035906020019091905050613b46565b604051808b1515151581526020018a1515151581526020018981526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019a505050505050505050505060405180910390f35b61122e6004808035906020019091908035906020019091905050613ca7565b005b341561123b57600080fd5b611243613e90565b6040518082815260200191505060405180910390f35b341561126457600080fd5b61126c613e96565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6112cd6004808035906020019091908035906020019091905050613ebc565b005b600060405180807f737570706f727473496e74657266616365286279746573342900000000000000815250601901905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806115d9575060405180807f746f6b656e4d657461646174612875696e743235362c737472696e6729000000815250601d019050604051809103902060405180807f746f6b656e734f664f776e6572286164647265737329000000000000000000008152506016019050604051809103902060405180807f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81526020017f74323536290000000000000000000000000000000000000000000000000000008152506025019050604051809103902060405180807f7472616e7366657228616464726573732c75696e7432353629000000000000008152506019019050604051809103902060405180807f617070726f766528616464726573732c75696e743235362900000000000000008152506018019050604051809103902060405180807f6f776e65724f662875696e7432353629000000000000000000000000000000008152506010019050604051809103902060405180807f62616c616e63654f6628616464726573732900000000000000000000000000008152506012019050604051809103902060405180807f746f74616c537570706c79282900000000000000000000000000000000000000815250600d019050604051809103902060405180807f73796d626f6c28290000000000000000000000000000000000000000000000008152506008019050604051809103902060405180807f6e616d6528290000000000000000000000000000000000000000000000000000815250600601905060405180910390201818181818181818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61160e615125565b611616615139565b60008073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561167557600080fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb4799f2878787600060405160a001526040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180848152602001806020018281038252848482818152602001925080828437820191505094505050505060a060405180830381600087803b151561173057600080fd5b6102c65a03f1151561174157600080fd5b50505060405180608001805190602001604052809250819350505061176682826141fd565b925050509392505050565b60115481565b6040805190810160405280600d81526020017f43727970746f4b6974746965730000000000000000000000000000000000000081525081565b6117ba3382614255565b15156117c557600080fd5b6117cf81836142c1565b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b662386f26fc1000081565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156118ff57600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166376190f8f6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561196e57600080fd5b6102c65a03f1151561197f57600080fd5b50505060405180519050151561199457600080fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600160068054905003905090565b600f5481565b600080821115156119ff57600080fd5b6000600683815481101515611a1057fe5b906000526020600020906002020160010160189054906101000a900463ffffffff1663ffffffff1614159050919050565b6201518081565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611aaa57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611ae557600080fd5b611aef3382614317565b1515611afa57600080fd5b611b048382614255565b1515611b0f57600080fd5b611b1a838383614383565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b7c57600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166354c15b826000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515611beb57600080fd5b6102c65a03f11515611bfc57600080fd5b505050604051805190501515611c1157600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611cb157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611ced57600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611d8b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611dc757600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260149054906101000a900460ff16151515611e2757600080fd5b611e313385614255565b1515611e3c57600080fd5b611e45846119ef565b151515611e5157600080fd5b611e7d84600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166142c1565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a85858585336040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b1515611f5957600080fd5b6102c65a03f11515611f6a57600080fd5b50505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611fce57600080fd5b600260149054906101000a900460ff161515611fe957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561204757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156120a557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561210357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561216057600080fd5b6121686145bb565b565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080851115156121b057600080fd5b6000841115156121bf57600080fd5b6006858154811015156121ce57fe5b906000526020600020906002020191506006848154811015156121ed57fe5b906000526020600020906002020190506122098286838761464e565b801561221b575061221a8486614863565b5b9250505092915050565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff1615151561227457600080fd5b61227e3385614255565b151561228957600080fd5b6122928461390c565b151561229d57600080fd5b6122c984600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166142c1565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a85858585336040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b15156123a557600080fd5b6102c65a03f115156123b657600080fd5b50505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561241b57600080fd5b80600e8190555050565b600260149054906101000a900460ff1615151561244157600080fd5b61244b3382614255565b151561245657600080fd5b81600a600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561250757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561254357600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156125e557600080fd5b819050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561264357600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b61138860115410151561265557600080fd5b60116000815480929190600101919050555061267660008060008685614976565b50505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061272457506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061277c5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561278757600080fd5b60036000600e8110151561279757fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff16811015156127c657600080fd5b8060058190555050565b600260149054906101000a900460ff1681565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561284257600080fd5b3073ffffffffffffffffffffffffffffffffffffffff16319150600e546001600f5401029050808211156128cb57600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8284039081150290604051600060405180830381858888f19350505050505b5050565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561294357600080fd5b919050565b61afc881565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156129d157600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166385b861886000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515612a4057600080fd5b6102c65a03f11515612a5157600080fd5b505050604051805190501515612a6657600080fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612b4f57600080fd5b600260149054906101000a900460ff161515612b6a57600080fd5b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f450db8da6efbe9c22f2347f7c2021231df1fc58d3ae9a2fa75d39fa44619930581604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612cbf57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80612d175750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515612d2257600080fd5b600260149054906101000a900460ff16151515612d3e57600080fd5b6001600260146101000a81548160ff021916908315150217905550565b612d63615164565b6000612d6d615164565b6000806000612d7b87612aab565b94506000851415612dad576000604051805910612d955750595b90808252806020026020018201604052509550612e88565b84604051805910612dbb5750595b90808252806020026020018201604052509350612dd66119d9565b925060009150600190505b8281111515612e84578673ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612e7757808483815181101515612e6057fe5b906020019060200201818152505081806001019250505b8080600101915050612de1565b8395505b5050505050919050565b600080600080600080600080600260149054906101000a900460ff16151515612eba57600080fd5b600689815481101515612ec957fe5b9060005260206000209060020201965060008760010160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1614151515612f0b57600080fd5b613041876101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614c69565b151561304c57600080fd5b8660010160189054906101000a900463ffffffff1663ffffffff16955060068681548110151561307857fe5b9060005260206000209060020201945086600101601e9054906101000a900461ffff16935086600101601e9054906101000a900461ffff1661ffff1685600101601e9054906101000a900461ffff1661ffff1611156130e75784600101601e9054906101000a900461ffff1693505b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d9f5aed8860000154876000015460018b60010160089054906101000a900467ffffffffffffffff16036000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018381526020018267ffffffffffffffff1681526020019350505050602060405180830381600087803b15156131bd57600080fd5b6102c65a03f115156131ce57600080fd5b505050604051805190509250600760008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915061323e898860010160189054906101000a900463ffffffff1663ffffffff166001870161ffff168686614976565b90508660010160186101000a81549063ffffffff0219169055600f60008154809291906001900391905055503373ffffffffffffffffffffffffffffffffffffffff166108fc600e549081150290604051600060405180830381858888f193505050505080975050505050505050919050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061335957506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806133b15750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156133bc57600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b151561344157600080fd5b6102c65a03f1151561345257600080fd5b505050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b15156134da57600080fd5b6102c65a03f115156134eb57600080fd5b505050565b6040805190810160405280600281526020017f434b00000000000000000000000000000000000000000000000000000000000081525081565b600381600e8110151561353857fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff161515156135a757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156135e357600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561361e57600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561367b57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156136d857600080fd5b6136e23382614255565b15156136ed57600080fd5b6136f8338383614383565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156137ac57600080fd5b61afc86012541015156137be57600080fd5b6137cd60008060008530614976565b90506137fb81600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166142c1565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a82613842614ca4565b600062015180306040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b15156138e257600080fd5b6102c65a03f115156138f357600080fd5b5050506012600081548092919060010191905055505050565b60008060008311151561391e57600080fd5b60068381548110151561392d57fe5b90600052602060002090600202019050613a73816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614da7565b915050919050565b61138881565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613adc57600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080600080600080600080600060068c815481101515613b6657fe5b9060005260206000209060020201905060008160010160189054906101000a900463ffffffff1663ffffffff1614159a50438160010160089054906101000a900467ffffffffffffffff1667ffffffffffffffff161115995080600101601c9054906101000a900461ffff1661ffff1698508060010160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1697508060010160189054906101000a900463ffffffff1663ffffffff1696508060010160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1695508060010160109054906101000a900463ffffffff1663ffffffff1694508060010160149054906101000a900463ffffffff1663ffffffff16935080600101601e9054906101000a900461ffff1661ffff16925080600001549150509193959799509193959799565b6000600260149054906101000a900460ff16151515613cc557600080fd5b613ccf3383614255565b1515613cda57600080fd5b613ce38261390c565b1515613cee57600080fd5b613cf88284614de1565b1515613d0357600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c55d0f56846000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515613d9c57600080fd5b6102c65a03f11515613dad57600080fd5b505050604051805190509050600e5481013410151515613dcc57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663454a2ab3600e543403856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808281526020019150506000604051808303818588803b1515613e6057600080fd5b6125ee5a03f11515613e7157600080fd5b50505050613e8b8263ffffffff168463ffffffff16614e3a565b505050565b60125481565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600260149054906101000a900460ff16151515613edb57600080fd5b600e543410151515613eec57600080fd5b613ef63385614255565b1515613f0157600080fd5b613f0b8385614863565b1515613f1657600080fd5b600684815481101515613f2557fe5b9060005260206000209060020201915061406b826101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614da7565b151561407657600080fd5b60068381548110151561408557fe5b906000526020600020906002020190506141cb816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614da7565b15156141d657600080fd5b6141e28285838661464e565b15156141ed57600080fd5b6141f78484614e3a565b50505050565b614205615125565b61420d615125565b6000808460405180591061421e5750595b9080825280601f01601f19166020018201604052509250602083019150859050614249828287615004565b82935050505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff166007600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b806009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008273ffffffffffffffffffffffffffffffffffffffff166009600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151561451757600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600a600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556009600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561461657600080fd5b600260149054906101000a900460ff16151561463157600080fd5b6000600260146101000a81548160ff021916908315150217905550565b600081841415614661576000905061485b565b818560010160109054906101000a900463ffffffff1663ffffffff1614806146a25750818560010160149054906101000a900463ffffffff1663ffffffff16145b156146b0576000905061485b565b838360010160109054906101000a900463ffffffff1663ffffffff1614806146f15750838360010160149054906101000a900463ffffffff1663ffffffff16145b156146ff576000905061485b565b60008360010160109054906101000a900463ffffffff1663ffffffff161480614742575060008560010160109054906101000a900463ffffffff1663ffffffff16145b15614750576001905061485b565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff1614806147c557508460010160149054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff16145b156147d3576000905061485b565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff16148061484857508460010160149054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff16145b15614856576000905061485b565b600190505b949350505050565b60008060006007600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16148061496c57508173ffffffffffffffffffffffffffffffffffffffff16600a600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b9250505092915050565b600080614981615178565b60008863ffffffff168914151561499757600080fd5b8763ffffffff16881415156149ab57600080fd5b8661ffff16871415156149bd57600080fd5b6002878115156149c957fe5b049250600d8361ffff1611156149de57600d92505b610100604051908101604052808781526020014267ffffffffffffffff168152602001600067ffffffffffffffff1681526020018a63ffffffff1681526020018963ffffffff168152602001600063ffffffff1681526020018461ffff1681526020018861ffff168152509150600160068054806001018281614a6191906151ec565b916000526020600020906002020160008590919091506000820151816000015560208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601c6101000a81548161ffff021916908361ffff16021790555060e082015181600101601e6101000a81548161ffff021916908361ffff16021790555050500390508063ffffffff1681141515614bb357600080fd5b7f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad58582846060015163ffffffff16856080015163ffffffff168660000151604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a1614c5a60008683614383565b80935050505095945050505050565b6000808260a0015163ffffffff1614158015614c9d57504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b6000806000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663eac9d94c6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515614d3757600080fd5b6102c65a03f11515614d4857600080fd5b505050604051805190509150816fffffffffffffffffffffffffffffffff1682141515614d7457600080fd5b600282811515614d8057fe5b0482019050662386f26fc10000811015614d9f57662386f26fc1000090505b809250505090565b6000808260a0015163ffffffff16148015614dda57504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b6000806000600685815481101515614df557fe5b90600052602060002090600202019150600684815481101515614e1457fe5b90600052602060002090600202019050614e308286838761464e565b9250505092915050565b600080600683815481101515614e4c57fe5b90600052602060002090600202019150600684815481101515614e6b57fe5b90600052602060002090600202019050828160010160186101000a81548163ffffffff021916908363ffffffff160217905550614ea78261504f565b614eb08161504f565b600a600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600a600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600f600081548092919060010191905055507f241ea03ca20251805084d27d4440371c34a0b85ff108f6bb5611248f73818b806007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685858460010160089054906101000a900467ffffffffffffffff16604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018267ffffffffffffffff16815260200194505050505060405180910390a150505050565b60005b60208210151561502c5782518452602084019350602083019250602082039150615007565b6001826020036101000a0390508019835116818551168181178652505050505050565b43600554600383600101601c9054906101000a900461ffff1661ffff16600e8110151561507857fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff168115156150a357fe5b04018160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600d81600101601c9054906101000a900461ffff1661ffff16101561512257600181600101601c8282829054906101000a900461ffff160192506101000a81548161ffff021916908361ffff1602179055505b50565b602060405190810160405280600081525090565b6080604051908101604052806004905b60008019168152602001906001900390816151495790505090565b602060405190810160405280600081525090565b6101006040519081016040528060008152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600061ffff168152602001600061ffff1681525090565b81548183558181151161521957600202816002028360005260206000209182019101615218919061521e565b5b505050565b6152e791905b808211156152e3576000808201600090556001820160006101000a81549067ffffffffffffffff02191690556001820160086101000a81549067ffffffffffffffff02191690556001820160106101000a81549063ffffffff02191690556001820160146101000a81549063ffffffff02191690556001820160186101000a81549063ffffffff021916905560018201601c6101000a81549061ffff021916905560018201601e6101000a81549061ffff021916905550600201615224565b5090565b905600a165627a7a7230582016f48a5de6bec06f052960f6124165218dafe9590a0d7bd601f001dca0e62e8a0029", + "bytecode": "0x60606040526000600260146101000a81548160ff0219169083151502179055506101c060405190810160405280603c63ffffffff1663ffffffff168152602001607863ffffffff1663ffffffff16815260200161012c63ffffffff1663ffffffff16815260200161025863ffffffff1663ffffffff16815260200161070863ffffffff1663ffffffff168152602001610e1063ffffffff1663ffffffff168152602001611c2063ffffffff1663ffffffff16815260200161384063ffffffff1663ffffffff16815260200161708063ffffffff1663ffffffff16815260200161e10063ffffffff1663ffffffff1681526020016201518063ffffffff1663ffffffff1681526020016202a30063ffffffff1663ffffffff1681526020016205460063ffffffff1663ffffffff16815260200162093a8063ffffffff1663ffffffff16815250600390600e62000156929190620007a8565b50600f60055566071afd498d0000600e5534156200017357600080fd5b6001600260146101000a81548160ff021916908315150217905550336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200025560008060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60006200025c6401000000000262004976176401000000009004565b5062000a00565b6000806200026962000852565b60008863ffffffff16891415156200028057600080fd5b8763ffffffff16881415156200029557600080fd5b8661ffff1687141515620002a857600080fd5b600287811515620002b557fe5b049250600d8361ffff161115620002cb57600d92505b610100604051908101604052808781526020014267ffffffffffffffff168152602001600067ffffffffffffffff1681526020018a63ffffffff1681526020018963ffffffff168152602001600063ffffffff1681526020018461ffff1681526020018861ffff168152509150600160068054806001018281620003509190620008c6565b916000526020600020906002020160008590919091506000820151816000015560208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601c6101000a81548161ffff021916908361ffff16021790555060e082015181600101601e6101000a81548161ffff021916908361ffff16021790555050500390508063ffffffff1681141515620004a357600080fd5b7f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad58582846060015163ffffffff16856080015163ffffffff168660000151604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a162000560600086836200056f6401000000000262004383176401000000009004565b80935050505095945050505050565b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415156200070457600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600a600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556009600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b82600e6007016008900481019282156200083f5791602002820160005b838211156200080b57835183826101000a81548163ffffffff021916908363ffffffff1602179055509260200192600401602081600301049283019260010302620007c5565b80156200083d5782816101000a81549063ffffffff02191690556004016020816003010492830192600103026200080b565b505b5090506200084e9190620008fb565b5090565b6101006040519081016040528060008152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600061ffff168152602001600061ffff1681525090565b815481835581811511620008f657600202816002028360005260206000209182019101620008f5919062000931565b5b505050565b6200092e91905b808211156200092a57600081816101000a81549063ffffffff02191690555060010162000902565b5090565b90565b620009fd91905b80821115620009f9576000808201600090556001820160006101000a81549067ffffffffffffffff02191690556001820160086101000a81549067ffffffffffffffff02191690556001820160106101000a81549063ffffffff02191690556001820160146101000a81549063ffffffff02191690556001820160186101000a81549063ffffffff021916905560018201601c6101000a81549061ffff021916905560018201601e6101000a81549061ffff02191690555060020162000938565b5090565b90565b6153168062000a106000396000f3006060604052600436106102bf576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146103755780630519ce79146103cf5780630560ff441461042457806305e45546146104d457806306fdde03146104fd578063095ea7b31461058b5780630a0f8168146105cd5780630e583df01461062257806314001f4c1461064b57806318160ddd14610684578063183a7947146106ad5780631940a936146106d657806319c2f2011461071157806321717ebf1461073a57806323b872dd1461078f57806324e7a38a146107f057806327d7874c146108295780632ba73c15146108625780633d7d3f5a1461089b5780633f4ba83a146108d957806346116e6f146108ee57806346d22c7014610951578063481af3d3146109955780634ad8c938146109f85780634b85fd5514610a365780634dfff04f14610a595780634e0a337914610a9b5780635612913414610ad45780635663896e14610b165780635c975abb14610b395780635fd8c71014610b665780636352211e14610b7b578063680eba2714610bde5780636af04a5714610c075780636fbde40d14610c5c57806370a0823114610c955780637158798814610ce25780637a7d493714610d1b5780638456cb5914610d445780638462151c14610d5957806388c2a0bf14610de757806391876e5714610e1e57806395d89b4114610e335780639d6fac6f14610ec1578063a45f4bfc14610f04578063a9059cbb14610f67578063b047fb5014610fa9578063b0c35c0514610ffe578063bc4006f514611027578063c3bea9af1461107c578063d3e6f49f1461109f578063defb9584146110da578063e17b25af14611103578063e6cbe3511461113c578063e98b7f4d14611191578063ed60ade61461120f578063f1ca941014611230578063f2b47d5214611259578063f7d8c883146112ae575b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806103685750600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561037357600080fd5b005b341561038057600080fd5b6103b560048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190919050506112cf565b604051808215151515815260200191505060405180910390f35b34156103da57600080fd5b6103e26115e0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561042f57600080fd5b61045960048080359060200190919080359060200190820180359060200191909192905050611606565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561049957808201518184015260208101905061047e565b50505050905090810190601f1680156104c65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156104df57600080fd5b6104e7611771565b6040518082815260200191505060405180910390f35b341561050857600080fd5b610510611777565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610550578082015181840152602081019050610535565b50505050905090810190601f16801561057d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561059657600080fd5b6105cb600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506117b0565b005b34156105d857600080fd5b6105e0611872565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561062d57600080fd5b610635611897565b6040518082815260200191505060405180910390f35b341561065657600080fd5b610682600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506118a2565b005b341561068f57600080fd5b6106976119d9565b6040518082815260200191505060405180910390f35b34156106b857600080fd5b6106c06119e9565b6040518082815260200191505060405180910390f35b34156106e157600080fd5b6106f760048080359060200190919050506119ef565b604051808215151515815260200191505060405180910390f35b341561071c57600080fd5b610724611a41565b6040518082815260200191505060405180910390f35b341561074557600080fd5b61074d611a48565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561079a57600080fd5b6107ee600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611a6e565b005b34156107fb57600080fd5b610827600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611b1f565b005b341561083457600080fd5b610860600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611c56565b005b341561086d57600080fd5b610899600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611d30565b005b34156108a657600080fd5b6108d76004808035906020019091908035906020019091908035906020019091908035906020019091905050611e0b565b005b34156108e457600080fd5b6108ec611f73565b005b34156108f957600080fd5b61090f600480803590602001909190505061216a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561095c57600080fd5b61097b600480803590602001909190803590602001909190505061219d565b604051808215151515815260200191505060405180910390f35b34156109a057600080fd5b6109b66004808035906020019091905050612225565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610a0357600080fd5b610a346004808035906020019091908035906020019091908035906020019091908035906020019091905050612258565b005b3415610a4157600080fd5b610a5760048080359060200190919050506123bf565b005b3415610a6457600080fd5b610a99600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050612425565b005b3415610aa657600080fd5b610ad2600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506124ac565b005b3415610adf57600080fd5b610b14600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612587565b005b3415610b2157600080fd5b610b37600480803590602001909190505061267c565b005b3415610b4457600080fd5b610b4c6127d0565b604051808215151515815260200191505060405180910390f35b3415610b7157600080fd5b610b796127e3565b005b3415610b8657600080fd5b610b9c60048080359060200190919050506128cf565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610be957600080fd5b610bf1612948565b6040518082815260200191505060405180910390f35b3415610c1257600080fd5b610c1a61294e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610c6757600080fd5b610c93600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612974565b005b3415610ca057600080fd5b610ccc600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612aab565b6040518082815260200191505060405180910390f35b3415610ced57600080fd5b610d19600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612af4565b005b3415610d2657600080fd5b610d2e612c11565b6040518082815260200191505060405180910390f35b3415610d4f57600080fd5b610d57612c17565b005b3415610d6457600080fd5b610d90600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612d5b565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610dd3578082015181840152602081019050610db8565b505050509050019250505060405180910390f35b3415610df257600080fd5b610e086004808035906020019091905050612e92565b6040518082815260200191505060405180910390f35b3415610e2957600080fd5b610e316132b1565b005b3415610e3e57600080fd5b610e466134f0565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e86578082015181840152602081019050610e6b565b50505050905090810190601f168015610eb35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610ecc57600080fd5b610ee26004808035906020019091905050613529565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3415610f0f57600080fd5b610f256004808035906020019091905050613558565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610f7257600080fd5b610fa7600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061358b565b005b3415610fb457600080fd5b610fbc6136fc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561100957600080fd5b611011613722565b6040518082815260200191505060405180910390f35b341561103257600080fd5b61103a613728565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561108757600080fd5b61109d600480803590602001909190505061374e565b005b34156110aa57600080fd5b6110c0600480803590602001909190505061390c565b604051808215151515815260200191505060405180910390f35b34156110e557600080fd5b6110ed613a7b565b6040518082815260200191505060405180910390f35b341561110e57600080fd5b61113a600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050613a81565b005b341561114757600080fd5b61114f613b20565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561119c57600080fd5b6111b26004808035906020019091905050613b46565b604051808b1515151581526020018a1515151581526020018981526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019a505050505050505050505060405180910390f35b61122e6004808035906020019091908035906020019091905050613ca7565b005b341561123b57600080fd5b611243613e90565b6040518082815260200191505060405180910390f35b341561126457600080fd5b61126c613e96565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6112cd6004808035906020019091908035906020019091905050613ebc565b005b600060405180807f737570706f727473496e74657266616365286279746573342900000000000000815250601901905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806115d9575060405180807f746f6b656e4d657461646174612875696e743235362c737472696e6729000000815250601d019050604051809103902060405180807f746f6b656e734f664f776e6572286164647265737329000000000000000000008152506016019050604051809103902060405180807f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81526020017f74323536290000000000000000000000000000000000000000000000000000008152506025019050604051809103902060405180807f7472616e7366657228616464726573732c75696e7432353629000000000000008152506019019050604051809103902060405180807f617070726f766528616464726573732c75696e743235362900000000000000008152506018019050604051809103902060405180807f6f776e65724f662875696e7432353629000000000000000000000000000000008152506010019050604051809103902060405180807f62616c616e63654f6628616464726573732900000000000000000000000000008152506012019050604051809103902060405180807f746f74616c537570706c79282900000000000000000000000000000000000000815250600d019050604051809103902060405180807f73796d626f6c28290000000000000000000000000000000000000000000000008152506008019050604051809103902060405180807f6e616d6528290000000000000000000000000000000000000000000000000000815250600601905060405180910390201818181818181818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61160e615125565b611616615139565b60008073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561167557600080fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb4799f2878787600060405160a001526040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180848152602001806020018281038252848482818152602001925080828437820191505094505050505060a060405180830381600087803b151561173057600080fd5b6102c65a03f1151561174157600080fd5b50505060405180608001805190602001604052809250819350505061176682826141fd565b925050509392505050565b60115481565b6040805190810160405280600d81526020017f43727970746f4b6974746965730000000000000000000000000000000000000081525081565b6117ba3382614255565b15156117c557600080fd5b6117cf81836142c1565b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b662386f26fc1000081565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156118ff57600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166376190f8f6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561196e57600080fd5b6102c65a03f1151561197f57600080fd5b50505060405180519050151561199457600080fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600160068054905003905090565b600f5481565b600080821115156119ff57600080fd5b6000600683815481101515611a1057fe5b906000526020600020906002020160010160189054906101000a900463ffffffff1663ffffffff1614159050919050565b6201518081565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611aaa57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611ae557600080fd5b611aef3382614317565b1515611afa57600080fd5b611b048382614255565b1515611b0f57600080fd5b611b1a838383614383565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b7c57600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166354c15b826000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515611beb57600080fd5b6102c65a03f11515611bfc57600080fd5b505050604051805190501515611c1157600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611cb157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611ced57600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611d8b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611dc757600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260149054906101000a900460ff16151515611e2757600080fd5b611e313385614255565b1515611e3c57600080fd5b611e45846119ef565b151515611e5157600080fd5b611e7d84600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166142c1565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a85858585336040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b1515611f5957600080fd5b6102c65a03f11515611f6a57600080fd5b50505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611fce57600080fd5b600260149054906101000a900460ff161515611fe957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561204757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156120a557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561210357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561216057600080fd5b6121686145bb565b565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080851115156121b057600080fd5b6000841115156121bf57600080fd5b6006858154811015156121ce57fe5b906000526020600020906002020191506006848154811015156121ed57fe5b906000526020600020906002020190506122098286838761464e565b801561221b575061221a8486614863565b5b9250505092915050565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff1615151561227457600080fd5b61227e3385614255565b151561228957600080fd5b6122928461390c565b151561229d57600080fd5b6122c984600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166142c1565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a85858585336040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b15156123a557600080fd5b6102c65a03f115156123b657600080fd5b50505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561241b57600080fd5b80600e8190555050565b600260149054906101000a900460ff1615151561244157600080fd5b61244b3382614255565b151561245657600080fd5b81600a600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561250757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561254357600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156125e557600080fd5b819050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561264357600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b61138860115410151561265557600080fd5b60116000815480929190600101919050555061267660008060008685614976565b50505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061272457506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061277c5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561278757600080fd5b60036000600e8110151561279757fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff16811015156127c657600080fd5b8060058190555050565b600260149054906101000a900460ff1681565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561284257600080fd5b3073ffffffffffffffffffffffffffffffffffffffff16319150600e546001600f5401029050808211156128cb57600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8284039081150290604051600060405180830381858888f19350505050505b5050565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561294357600080fd5b919050565b61afc881565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156129d157600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166385b861886000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515612a4057600080fd5b6102c65a03f11515612a5157600080fd5b505050604051805190501515612a6657600080fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612b4f57600080fd5b600260149054906101000a900460ff161515612b6a57600080fd5b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f450db8da6efbe9c22f2347f7c2021231df1fc58d3ae9a2fa75d39fa44619930581604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612cbf57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80612d175750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515612d2257600080fd5b600260149054906101000a900460ff16151515612d3e57600080fd5b6001600260146101000a81548160ff021916908315150217905550565b612d63615164565b6000612d6d615164565b6000806000612d7b87612aab565b94506000851415612dad576000604051805910612d955750595b90808252806020026020018201604052509550612e88565b84604051805910612dbb5750595b90808252806020026020018201604052509350612dd66119d9565b925060009150600190505b8281111515612e84578673ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612e7757808483815181101515612e6057fe5b906020019060200201818152505081806001019250505b8080600101915050612de1565b8395505b5050505050919050565b600080600080600080600080600260149054906101000a900460ff16151515612eba57600080fd5b600689815481101515612ec957fe5b9060005260206000209060020201965060008760010160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1614151515612f0b57600080fd5b613041876101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614c69565b151561304c57600080fd5b8660010160189054906101000a900463ffffffff1663ffffffff16955060068681548110151561307857fe5b9060005260206000209060020201945086600101601e9054906101000a900461ffff16935086600101601e9054906101000a900461ffff1661ffff1685600101601e9054906101000a900461ffff1661ffff1611156130e75784600101601e9054906101000a900461ffff1693505b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d9f5aed8860000154876000015460018b60010160089054906101000a900467ffffffffffffffff16036000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018381526020018267ffffffffffffffff1681526020019350505050602060405180830381600087803b15156131bd57600080fd5b6102c65a03f115156131ce57600080fd5b505050604051805190509250600760008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915061323e898860010160189054906101000a900463ffffffff1663ffffffff166001870161ffff168686614976565b90508660010160186101000a81549063ffffffff0219169055600f60008154809291906001900391905055503373ffffffffffffffffffffffffffffffffffffffff166108fc600e549081150290604051600060405180830381858888f193505050505080975050505050505050919050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061335957506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806133b15750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156133bc57600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b151561344157600080fd5b6102c65a03f1151561345257600080fd5b505050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b15156134da57600080fd5b6102c65a03f115156134eb57600080fd5b505050565b6040805190810160405280600281526020017f434b00000000000000000000000000000000000000000000000000000000000081525081565b600381600e8110151561353857fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff161515156135a757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156135e357600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561361e57600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561367b57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156136d857600080fd5b6136e23382614255565b15156136ed57600080fd5b6136f8338383614383565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156137ac57600080fd5b61afc86012541015156137be57600080fd5b6137cd60008060008530614976565b90506137fb81600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166142c1565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a82613842614ca4565b600062015180306040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b15156138e257600080fd5b6102c65a03f115156138f357600080fd5b5050506012600081548092919060010191905055505050565b60008060008311151561391e57600080fd5b60068381548110151561392d57fe5b90600052602060002090600202019050613a73816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614da7565b915050919050565b61138881565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613adc57600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080600080600080600080600060068c815481101515613b6657fe5b9060005260206000209060020201905060008160010160189054906101000a900463ffffffff1663ffffffff1614159a50438160010160089054906101000a900467ffffffffffffffff1667ffffffffffffffff161115995080600101601c9054906101000a900461ffff1661ffff1698508060010160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1697508060010160189054906101000a900463ffffffff1663ffffffff1696508060010160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1695508060010160109054906101000a900463ffffffff1663ffffffff1694508060010160149054906101000a900463ffffffff1663ffffffff16935080600101601e9054906101000a900461ffff1661ffff16925080600001549150509193959799509193959799565b6000600260149054906101000a900460ff16151515613cc557600080fd5b613ccf3383614255565b1515613cda57600080fd5b613ce38261390c565b1515613cee57600080fd5b613cf88284614de1565b1515613d0357600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c55d0f56846000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515613d9c57600080fd5b6102c65a03f11515613dad57600080fd5b505050604051805190509050600e5481013410151515613dcc57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663454a2ab3600e543403856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808281526020019150506000604051808303818588803b1515613e6057600080fd5b6125ee5a03f11515613e7157600080fd5b50505050613e8b8263ffffffff168463ffffffff16614e3a565b505050565b60125481565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600260149054906101000a900460ff16151515613edb57600080fd5b600e543410151515613eec57600080fd5b613ef63385614255565b1515613f0157600080fd5b613f0b8385614863565b1515613f1657600080fd5b600684815481101515613f2557fe5b9060005260206000209060020201915061406b826101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614da7565b151561407657600080fd5b60068381548110151561408557fe5b906000526020600020906002020190506141cb816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614da7565b15156141d657600080fd5b6141e28285838661464e565b15156141ed57600080fd5b6141f78484614e3a565b50505050565b614205615125565b61420d615125565b6000808460405180591061421e5750595b9080825280601f01601f19166020018201604052509250602083019150859050614249828287615004565b82935050505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff166007600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b806009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008273ffffffffffffffffffffffffffffffffffffffff166009600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151561451757600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600a600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556009600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561461657600080fd5b600260149054906101000a900460ff16151561463157600080fd5b6000600260146101000a81548160ff021916908315150217905550565b600081841415614661576000905061485b565b818560010160109054906101000a900463ffffffff1663ffffffff1614806146a25750818560010160149054906101000a900463ffffffff1663ffffffff16145b156146b0576000905061485b565b838360010160109054906101000a900463ffffffff1663ffffffff1614806146f15750838360010160149054906101000a900463ffffffff1663ffffffff16145b156146ff576000905061485b565b60008360010160109054906101000a900463ffffffff1663ffffffff161480614742575060008560010160109054906101000a900463ffffffff1663ffffffff16145b15614750576001905061485b565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff1614806147c557508460010160149054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff16145b156147d3576000905061485b565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff16148061484857508460010160149054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff16145b15614856576000905061485b565b600190505b949350505050565b60008060006007600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16148061496c57508173ffffffffffffffffffffffffffffffffffffffff16600a600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b9250505092915050565b600080614981615178565b60008863ffffffff168914151561499757600080fd5b8763ffffffff16881415156149ab57600080fd5b8661ffff16871415156149bd57600080fd5b6002878115156149c957fe5b049250600d8361ffff1611156149de57600d92505b610100604051908101604052808781526020014267ffffffffffffffff168152602001600067ffffffffffffffff1681526020018a63ffffffff1681526020018963ffffffff168152602001600063ffffffff1681526020018461ffff1681526020018861ffff168152509150600160068054806001018281614a6191906151ec565b916000526020600020906002020160008590919091506000820151816000015560208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601c6101000a81548161ffff021916908361ffff16021790555060e082015181600101601e6101000a81548161ffff021916908361ffff16021790555050500390508063ffffffff1681141515614bb357600080fd5b7f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad58582846060015163ffffffff16856080015163ffffffff168660000151604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a1614c5a60008683614383565b80935050505095945050505050565b6000808260a0015163ffffffff1614158015614c9d57504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b6000806000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663eac9d94c6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515614d3757600080fd5b6102c65a03f11515614d4857600080fd5b505050604051805190509150816fffffffffffffffffffffffffffffffff1682141515614d7457600080fd5b600282811515614d8057fe5b0482019050662386f26fc10000811015614d9f57662386f26fc1000090505b809250505090565b6000808260a0015163ffffffff16148015614dda57504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b6000806000600685815481101515614df557fe5b90600052602060002090600202019150600684815481101515614e1457fe5b90600052602060002090600202019050614e308286838761464e565b9250505092915050565b600080600683815481101515614e4c57fe5b90600052602060002090600202019150600684815481101515614e6b57fe5b90600052602060002090600202019050828160010160186101000a81548163ffffffff021916908363ffffffff160217905550614ea78261504f565b614eb08161504f565b600a600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600a600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600f600081548092919060010191905055507f241ea03ca20251805084d27d4440371c34a0b85ff108f6bb5611248f73818b806007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685858460010160089054906101000a900467ffffffffffffffff16604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018267ffffffffffffffff16815260200194505050505060405180910390a150505050565b60005b60208210151561502c5782518452602084019350602083019250602082039150615007565b6001826020036101000a0390508019835116818551168181178652505050505050565b43600554600383600101601c9054906101000a900461ffff1661ffff16600e8110151561507857fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff168115156150a357fe5b04018160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600d81600101601c9054906101000a900461ffff1661ffff16101561512257600181600101601c8282829054906101000a900461ffff160192506101000a81548161ffff021916908361ffff1602179055505b50565b602060405190810160405280600081525090565b6080604051908101604052806004905b60008019168152602001906001900390816151495790505090565b602060405190810160405280600081525090565b6101006040519081016040528060008152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600061ffff168152602001600061ffff1681525090565b81548183558181151161521957600202816002028360005260206000209182019101615218919061521e565b5b505050565b6152e791905b808211156152e3576000808201600090556001820160006101000a81549067ffffffffffffffff02191690556001820160086101000a81549067ffffffffffffffff02191690556001820160106101000a81549063ffffffff02191690556001820160146101000a81549063ffffffff02191690556001820160186101000a81549063ffffffff021916905560018201601c6101000a81549061ffff021916905560018201601e6101000a81549061ffff021916905550600201615224565b5090565b905600a165627a7a7230582050f78557fd249f103d4560680752c81acc85f1ce7e1a3b0c48f75d38529cc1a70029", + "deployedBytecode": "0x6060604052600436106102bf576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146103755780630519ce79146103cf5780630560ff441461042457806305e45546146104d457806306fdde03146104fd578063095ea7b31461058b5780630a0f8168146105cd5780630e583df01461062257806314001f4c1461064b57806318160ddd14610684578063183a7947146106ad5780631940a936146106d657806319c2f2011461071157806321717ebf1461073a57806323b872dd1461078f57806324e7a38a146107f057806327d7874c146108295780632ba73c15146108625780633d7d3f5a1461089b5780633f4ba83a146108d957806346116e6f146108ee57806346d22c7014610951578063481af3d3146109955780634ad8c938146109f85780634b85fd5514610a365780634dfff04f14610a595780634e0a337914610a9b5780635612913414610ad45780635663896e14610b165780635c975abb14610b395780635fd8c71014610b665780636352211e14610b7b578063680eba2714610bde5780636af04a5714610c075780636fbde40d14610c5c57806370a0823114610c955780637158798814610ce25780637a7d493714610d1b5780638456cb5914610d445780638462151c14610d5957806388c2a0bf14610de757806391876e5714610e1e57806395d89b4114610e335780639d6fac6f14610ec1578063a45f4bfc14610f04578063a9059cbb14610f67578063b047fb5014610fa9578063b0c35c0514610ffe578063bc4006f514611027578063c3bea9af1461107c578063d3e6f49f1461109f578063defb9584146110da578063e17b25af14611103578063e6cbe3511461113c578063e98b7f4d14611191578063ed60ade61461120f578063f1ca941014611230578063f2b47d5214611259578063f7d8c883146112ae575b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806103685750600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561037357600080fd5b005b341561038057600080fd5b6103b560048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190919050506112cf565b604051808215151515815260200191505060405180910390f35b34156103da57600080fd5b6103e26115e0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561042f57600080fd5b61045960048080359060200190919080359060200190820180359060200191909192905050611606565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561049957808201518184015260208101905061047e565b50505050905090810190601f1680156104c65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156104df57600080fd5b6104e7611771565b6040518082815260200191505060405180910390f35b341561050857600080fd5b610510611777565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610550578082015181840152602081019050610535565b50505050905090810190601f16801561057d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561059657600080fd5b6105cb600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506117b0565b005b34156105d857600080fd5b6105e0611872565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561062d57600080fd5b610635611897565b6040518082815260200191505060405180910390f35b341561065657600080fd5b610682600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506118a2565b005b341561068f57600080fd5b6106976119d9565b6040518082815260200191505060405180910390f35b34156106b857600080fd5b6106c06119e9565b6040518082815260200191505060405180910390f35b34156106e157600080fd5b6106f760048080359060200190919050506119ef565b604051808215151515815260200191505060405180910390f35b341561071c57600080fd5b610724611a41565b6040518082815260200191505060405180910390f35b341561074557600080fd5b61074d611a48565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561079a57600080fd5b6107ee600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611a6e565b005b34156107fb57600080fd5b610827600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611b1f565b005b341561083457600080fd5b610860600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611c56565b005b341561086d57600080fd5b610899600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611d30565b005b34156108a657600080fd5b6108d76004808035906020019091908035906020019091908035906020019091908035906020019091905050611e0b565b005b34156108e457600080fd5b6108ec611f73565b005b34156108f957600080fd5b61090f600480803590602001909190505061216a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561095c57600080fd5b61097b600480803590602001909190803590602001909190505061219d565b604051808215151515815260200191505060405180910390f35b34156109a057600080fd5b6109b66004808035906020019091905050612225565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610a0357600080fd5b610a346004808035906020019091908035906020019091908035906020019091908035906020019091905050612258565b005b3415610a4157600080fd5b610a5760048080359060200190919050506123bf565b005b3415610a6457600080fd5b610a99600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050612425565b005b3415610aa657600080fd5b610ad2600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506124ac565b005b3415610adf57600080fd5b610b14600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612587565b005b3415610b2157600080fd5b610b37600480803590602001909190505061267c565b005b3415610b4457600080fd5b610b4c6127d0565b604051808215151515815260200191505060405180910390f35b3415610b7157600080fd5b610b796127e3565b005b3415610b8657600080fd5b610b9c60048080359060200190919050506128cf565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610be957600080fd5b610bf1612948565b6040518082815260200191505060405180910390f35b3415610c1257600080fd5b610c1a61294e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610c6757600080fd5b610c93600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612974565b005b3415610ca057600080fd5b610ccc600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612aab565b6040518082815260200191505060405180910390f35b3415610ced57600080fd5b610d19600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612af4565b005b3415610d2657600080fd5b610d2e612c11565b6040518082815260200191505060405180910390f35b3415610d4f57600080fd5b610d57612c17565b005b3415610d6457600080fd5b610d90600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612d5b565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610dd3578082015181840152602081019050610db8565b505050509050019250505060405180910390f35b3415610df257600080fd5b610e086004808035906020019091905050612e92565b6040518082815260200191505060405180910390f35b3415610e2957600080fd5b610e316132b1565b005b3415610e3e57600080fd5b610e466134f0565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e86578082015181840152602081019050610e6b565b50505050905090810190601f168015610eb35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610ecc57600080fd5b610ee26004808035906020019091905050613529565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3415610f0f57600080fd5b610f256004808035906020019091905050613558565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610f7257600080fd5b610fa7600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061358b565b005b3415610fb457600080fd5b610fbc6136fc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561100957600080fd5b611011613722565b6040518082815260200191505060405180910390f35b341561103257600080fd5b61103a613728565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561108757600080fd5b61109d600480803590602001909190505061374e565b005b34156110aa57600080fd5b6110c0600480803590602001909190505061390c565b604051808215151515815260200191505060405180910390f35b34156110e557600080fd5b6110ed613a7b565b6040518082815260200191505060405180910390f35b341561110e57600080fd5b61113a600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050613a81565b005b341561114757600080fd5b61114f613b20565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561119c57600080fd5b6111b26004808035906020019091905050613b46565b604051808b1515151581526020018a1515151581526020018981526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019a505050505050505050505060405180910390f35b61122e6004808035906020019091908035906020019091905050613ca7565b005b341561123b57600080fd5b611243613e90565b6040518082815260200191505060405180910390f35b341561126457600080fd5b61126c613e96565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6112cd6004808035906020019091908035906020019091905050613ebc565b005b600060405180807f737570706f727473496e74657266616365286279746573342900000000000000815250601901905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806115d9575060405180807f746f6b656e4d657461646174612875696e743235362c737472696e6729000000815250601d019050604051809103902060405180807f746f6b656e734f664f776e6572286164647265737329000000000000000000008152506016019050604051809103902060405180807f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81526020017f74323536290000000000000000000000000000000000000000000000000000008152506025019050604051809103902060405180807f7472616e7366657228616464726573732c75696e7432353629000000000000008152506019019050604051809103902060405180807f617070726f766528616464726573732c75696e743235362900000000000000008152506018019050604051809103902060405180807f6f776e65724f662875696e7432353629000000000000000000000000000000008152506010019050604051809103902060405180807f62616c616e63654f6628616464726573732900000000000000000000000000008152506012019050604051809103902060405180807f746f74616c537570706c79282900000000000000000000000000000000000000815250600d019050604051809103902060405180807f73796d626f6c28290000000000000000000000000000000000000000000000008152506008019050604051809103902060405180807f6e616d6528290000000000000000000000000000000000000000000000000000815250600601905060405180910390201818181818181818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61160e615125565b611616615139565b60008073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561167557600080fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb4799f2878787600060405160a001526040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180848152602001806020018281038252848482818152602001925080828437820191505094505050505060a060405180830381600087803b151561173057600080fd5b6102c65a03f1151561174157600080fd5b50505060405180608001805190602001604052809250819350505061176682826141fd565b925050509392505050565b60115481565b6040805190810160405280600d81526020017f43727970746f4b6974746965730000000000000000000000000000000000000081525081565b6117ba3382614255565b15156117c557600080fd5b6117cf81836142c1565b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b662386f26fc1000081565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156118ff57600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166376190f8f6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561196e57600080fd5b6102c65a03f1151561197f57600080fd5b50505060405180519050151561199457600080fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600160068054905003905090565b600f5481565b600080821115156119ff57600080fd5b6000600683815481101515611a1057fe5b906000526020600020906002020160010160189054906101000a900463ffffffff1663ffffffff1614159050919050565b6201518081565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611aaa57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611ae557600080fd5b611aef3382614317565b1515611afa57600080fd5b611b048382614255565b1515611b0f57600080fd5b611b1a838383614383565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b7c57600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166354c15b826000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515611beb57600080fd5b6102c65a03f11515611bfc57600080fd5b505050604051805190501515611c1157600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611cb157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611ced57600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611d8b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611dc757600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260149054906101000a900460ff16151515611e2757600080fd5b611e313385614255565b1515611e3c57600080fd5b611e45846119ef565b151515611e5157600080fd5b611e7d84600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166142c1565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a85858585336040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b1515611f5957600080fd5b6102c65a03f11515611f6a57600080fd5b50505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611fce57600080fd5b600260149054906101000a900460ff161515611fe957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561204757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156120a557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561210357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561216057600080fd5b6121686145bb565b565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080851115156121b057600080fd5b6000841115156121bf57600080fd5b6006858154811015156121ce57fe5b906000526020600020906002020191506006848154811015156121ed57fe5b906000526020600020906002020190506122098286838761464e565b801561221b575061221a8486614863565b5b9250505092915050565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff1615151561227457600080fd5b61227e3385614255565b151561228957600080fd5b6122928461390c565b151561229d57600080fd5b6122c984600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166142c1565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a85858585336040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b15156123a557600080fd5b6102c65a03f115156123b657600080fd5b50505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561241b57600080fd5b80600e8190555050565b600260149054906101000a900460ff1615151561244157600080fd5b61244b3382614255565b151561245657600080fd5b81600a600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561250757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561254357600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156125e557600080fd5b819050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561264357600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b61138860115410151561265557600080fd5b60116000815480929190600101919050555061267660008060008685614976565b50505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061272457506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061277c5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561278757600080fd5b60036000600e8110151561279757fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff16811015156127c657600080fd5b8060058190555050565b600260149054906101000a900460ff1681565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561284257600080fd5b3073ffffffffffffffffffffffffffffffffffffffff16319150600e546001600f5401029050808211156128cb57600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8284039081150290604051600060405180830381858888f19350505050505b5050565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561294357600080fd5b919050565b61afc881565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156129d157600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166385b861886000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515612a4057600080fd5b6102c65a03f11515612a5157600080fd5b505050604051805190501515612a6657600080fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612b4f57600080fd5b600260149054906101000a900460ff161515612b6a57600080fd5b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f450db8da6efbe9c22f2347f7c2021231df1fc58d3ae9a2fa75d39fa44619930581604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612cbf57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80612d175750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515612d2257600080fd5b600260149054906101000a900460ff16151515612d3e57600080fd5b6001600260146101000a81548160ff021916908315150217905550565b612d63615164565b6000612d6d615164565b6000806000612d7b87612aab565b94506000851415612dad576000604051805910612d955750595b90808252806020026020018201604052509550612e88565b84604051805910612dbb5750595b90808252806020026020018201604052509350612dd66119d9565b925060009150600190505b8281111515612e84578673ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612e7757808483815181101515612e6057fe5b906020019060200201818152505081806001019250505b8080600101915050612de1565b8395505b5050505050919050565b600080600080600080600080600260149054906101000a900460ff16151515612eba57600080fd5b600689815481101515612ec957fe5b9060005260206000209060020201965060008760010160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1614151515612f0b57600080fd5b613041876101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614c69565b151561304c57600080fd5b8660010160189054906101000a900463ffffffff1663ffffffff16955060068681548110151561307857fe5b9060005260206000209060020201945086600101601e9054906101000a900461ffff16935086600101601e9054906101000a900461ffff1661ffff1685600101601e9054906101000a900461ffff1661ffff1611156130e75784600101601e9054906101000a900461ffff1693505b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d9f5aed8860000154876000015460018b60010160089054906101000a900467ffffffffffffffff16036000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018381526020018267ffffffffffffffff1681526020019350505050602060405180830381600087803b15156131bd57600080fd5b6102c65a03f115156131ce57600080fd5b505050604051805190509250600760008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915061323e898860010160189054906101000a900463ffffffff1663ffffffff166001870161ffff168686614976565b90508660010160186101000a81549063ffffffff0219169055600f60008154809291906001900391905055503373ffffffffffffffffffffffffffffffffffffffff166108fc600e549081150290604051600060405180830381858888f193505050505080975050505050505050919050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061335957506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806133b15750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156133bc57600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b151561344157600080fd5b6102c65a03f1151561345257600080fd5b505050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b15156134da57600080fd5b6102c65a03f115156134eb57600080fd5b505050565b6040805190810160405280600281526020017f434b00000000000000000000000000000000000000000000000000000000000081525081565b600381600e8110151561353857fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff161515156135a757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156135e357600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561361e57600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561367b57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156136d857600080fd5b6136e23382614255565b15156136ed57600080fd5b6136f8338383614383565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156137ac57600080fd5b61afc86012541015156137be57600080fd5b6137cd60008060008530614976565b90506137fb81600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166142c1565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a82613842614ca4565b600062015180306040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b15156138e257600080fd5b6102c65a03f115156138f357600080fd5b5050506012600081548092919060010191905055505050565b60008060008311151561391e57600080fd5b60068381548110151561392d57fe5b90600052602060002090600202019050613a73816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614da7565b915050919050565b61138881565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613adc57600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080600080600080600080600060068c815481101515613b6657fe5b9060005260206000209060020201905060008160010160189054906101000a900463ffffffff1663ffffffff1614159a50438160010160089054906101000a900467ffffffffffffffff1667ffffffffffffffff161115995080600101601c9054906101000a900461ffff1661ffff1698508060010160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1697508060010160189054906101000a900463ffffffff1663ffffffff1696508060010160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1695508060010160109054906101000a900463ffffffff1663ffffffff1694508060010160149054906101000a900463ffffffff1663ffffffff16935080600101601e9054906101000a900461ffff1661ffff16925080600001549150509193959799509193959799565b6000600260149054906101000a900460ff16151515613cc557600080fd5b613ccf3383614255565b1515613cda57600080fd5b613ce38261390c565b1515613cee57600080fd5b613cf88284614de1565b1515613d0357600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c55d0f56846000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515613d9c57600080fd5b6102c65a03f11515613dad57600080fd5b505050604051805190509050600e5481013410151515613dcc57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663454a2ab3600e543403856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808281526020019150506000604051808303818588803b1515613e6057600080fd5b6125ee5a03f11515613e7157600080fd5b50505050613e8b8263ffffffff168463ffffffff16614e3a565b505050565b60125481565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600260149054906101000a900460ff16151515613edb57600080fd5b600e543410151515613eec57600080fd5b613ef63385614255565b1515613f0157600080fd5b613f0b8385614863565b1515613f1657600080fd5b600684815481101515613f2557fe5b9060005260206000209060020201915061406b826101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614da7565b151561407657600080fd5b60068381548110151561408557fe5b906000526020600020906002020190506141cb816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614da7565b15156141d657600080fd5b6141e28285838661464e565b15156141ed57600080fd5b6141f78484614e3a565b50505050565b614205615125565b61420d615125565b6000808460405180591061421e5750595b9080825280601f01601f19166020018201604052509250602083019150859050614249828287615004565b82935050505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff166007600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b806009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008273ffffffffffffffffffffffffffffffffffffffff166009600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151561451757600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600a600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556009600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561461657600080fd5b600260149054906101000a900460ff16151561463157600080fd5b6000600260146101000a81548160ff021916908315150217905550565b600081841415614661576000905061485b565b818560010160109054906101000a900463ffffffff1663ffffffff1614806146a25750818560010160149054906101000a900463ffffffff1663ffffffff16145b156146b0576000905061485b565b838360010160109054906101000a900463ffffffff1663ffffffff1614806146f15750838360010160149054906101000a900463ffffffff1663ffffffff16145b156146ff576000905061485b565b60008360010160109054906101000a900463ffffffff1663ffffffff161480614742575060008560010160109054906101000a900463ffffffff1663ffffffff16145b15614750576001905061485b565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff1614806147c557508460010160149054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff16145b156147d3576000905061485b565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff16148061484857508460010160149054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff16145b15614856576000905061485b565b600190505b949350505050565b60008060006007600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16148061496c57508173ffffffffffffffffffffffffffffffffffffffff16600a600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b9250505092915050565b600080614981615178565b60008863ffffffff168914151561499757600080fd5b8763ffffffff16881415156149ab57600080fd5b8661ffff16871415156149bd57600080fd5b6002878115156149c957fe5b049250600d8361ffff1611156149de57600d92505b610100604051908101604052808781526020014267ffffffffffffffff168152602001600067ffffffffffffffff1681526020018a63ffffffff1681526020018963ffffffff168152602001600063ffffffff1681526020018461ffff1681526020018861ffff168152509150600160068054806001018281614a6191906151ec565b916000526020600020906002020160008590919091506000820151816000015560208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601c6101000a81548161ffff021916908361ffff16021790555060e082015181600101601e6101000a81548161ffff021916908361ffff16021790555050500390508063ffffffff1681141515614bb357600080fd5b7f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad58582846060015163ffffffff16856080015163ffffffff168660000151604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a1614c5a60008683614383565b80935050505095945050505050565b6000808260a0015163ffffffff1614158015614c9d57504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b6000806000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663eac9d94c6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515614d3757600080fd5b6102c65a03f11515614d4857600080fd5b505050604051805190509150816fffffffffffffffffffffffffffffffff1682141515614d7457600080fd5b600282811515614d8057fe5b0482019050662386f26fc10000811015614d9f57662386f26fc1000090505b809250505090565b6000808260a0015163ffffffff16148015614dda57504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b6000806000600685815481101515614df557fe5b90600052602060002090600202019150600684815481101515614e1457fe5b90600052602060002090600202019050614e308286838761464e565b9250505092915050565b600080600683815481101515614e4c57fe5b90600052602060002090600202019150600684815481101515614e6b57fe5b90600052602060002090600202019050828160010160186101000a81548163ffffffff021916908363ffffffff160217905550614ea78261504f565b614eb08161504f565b600a600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600a600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600f600081548092919060010191905055507f241ea03ca20251805084d27d4440371c34a0b85ff108f6bb5611248f73818b806007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685858460010160089054906101000a900467ffffffffffffffff16604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018267ffffffffffffffff16815260200194505050505060405180910390a150505050565b60005b60208210151561502c5782518452602084019350602083019250602082039150615007565b6001826020036101000a0390508019835116818551168181178652505050505050565b43600554600383600101601c9054906101000a900461ffff1661ffff16600e8110151561507857fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff168115156150a357fe5b04018160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600d81600101601c9054906101000a900461ffff1661ffff16101561512257600181600101601c8282829054906101000a900461ffff160192506101000a81548161ffff021916908361ffff1602179055505b50565b602060405190810160405280600081525090565b6080604051908101604052806004905b60008019168152602001906001900390816151495790505090565b602060405190810160405280600081525090565b6101006040519081016040528060008152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600061ffff168152602001600061ffff1681525090565b81548183558181151161521957600202816002028360005260206000209182019101615218919061521e565b5b505050565b6152e791905b808211156152e3576000808201600090556001820160006101000a81549067ffffffffffffffff02191690556001820160086101000a81549067ffffffffffffffff02191690556001820160106101000a81549063ffffffff02191690556001820160146101000a81549063ffffffff02191690556001820160186101000a81549063ffffffff021916905560018201601c6101000a81549061ffff021916905560018201601e6101000a81549061ffff021916905550600201615224565b5090565b905600a165627a7a7230582050f78557fd249f103d4560680752c81acc85f1ce7e1a3b0c48f75d38529cc1a70029", "sourceMap": "73435:6774:18:-;;;5032:5;5011:26;;;;;;;;;;;;;;;;;;;;11384:339;;;;;;;;;11427:9;11384:339;;;;;;;;11450:9;11384:339;;;;;;;;11473:9;11384:339;;;;;;;;11496:10;11384:339;;;;;;;;11520:10;11384:339;;;;;;;;11544:7;11384:339;;;;;;;;11565:7;11384:339;;;;;;;;11586:7;11384:339;;;;;;;;11607:7;11384:339;;;;;;;;11628:8;11384:339;;;;;;;;11650:6;11384:339;;;;;;;;11670:6;11384:339;;;;;;;;11690:6;11384:339;;;;;;;;11710:6;11384:339;;;;;;;;;;;;;;;:::i;:::-;;11840:2;11807:35;;30582:8;30552:38;;76645:420;;;;;;;;76718:4;76709:6;;:13;;;;;;;;;;;;;;;;;;76804:10;76791;;:23;;;;;;;;;;;;;;;;;;76901:10;76888;;:23;;;;;;;;;;;;;;;;;;77012:46;77025:1;77028;77031;77042:2;77055:1;77012:12;;;;;:46;;;:::i;:::-;;73435:6774;;15381:1876;15564:4;16148:20;16281:19;;:::i;:::-;16624;15942:9;15927:26;;15914:9;:39;15906:48;;;;;;;;15998:7;15983:24;;15972:7;:35;15964:44;;;;;;;;16056:11;16041:28;;16026:11;:43;16018:52;;;;;;;;16192:1;16178:11;:15;;;;;;;;16148:46;;16224:2;16208:13;:18;;;16204:67;;;16258:2;16242:18;;16204:67;16303:311;;;;;;;;;16330:6;16303:311;;;;16368:3;16303:311;;;;;;16404:1;16303:311;;;;;;16436:9;16303:311;;;;;;16475:7;16303:311;;;;;;16511:1;16303:311;;;;;;16541:13;16303:311;;;;;;16587:11;16303:311;;;;;16281:333;;16669:1;16646:7;:20;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;16659:6;16646:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:24;16624:46;;16857:11;16842:28;;16827:11;:43;16819:52;;;;;;;;16914:160;16933:6;16953:11;16986:6;:15;;;16978:24;;17024:6;:13;;;17016:22;;17052:6;:12;;;16914:160;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17188:33;17198:1;17201:6;17209:11;17188:9;;;;;:33;;;:::i;:::-;17239:11;17232:18;;15381:1876;;;;;;;;;;:::o;13965:758::-;14129:19;:24;14149:3;14129:24;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;14225:3;14195:17;:27;14213:8;14195:27;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;14345:1;14328:19;;:5;:19;;;;14324:317;;;14363:19;:26;14383:5;14363:26;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;14485:20;:30;14506:8;14485:30;;;;;;;;;;;;14478:37;;;;;;;;;;;14600:20;:30;14621:8;14600:30;;;;;;;;;;;;14593:37;;;;;;;;;;;14324:317;14686:30;14695:5;14702:3;14707:8;14686:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13965:758;;;:::o;73435:6774::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;", "deployedSourceMap": "73435:6774:18:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77997:11;;;;;;;;;;;77975:34;;:10;:34;;;:86;;;;78047:13;;;;;;;;;;;78025:36;;:10;:36;;;77975:86;77954:117;;;;;;;;73435:6774;19989:327;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4848:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29456:346;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71323:32:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18924:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24204:395:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4817:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71136:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66994:477;;;;;;;;;;;;;;;;;;;;;;;;;;;;25978:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30647:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35349:235;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71197:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13853:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25066:784;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31057:470;;;;;;;;;;;;;;;;;;;;;;;;;;;;5800:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;6346;;;;;;;;;;;;;;;;;;;;;;;;;;;;67586:978;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79475:305;;;;;;;;;;;;;;13283:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38051:388;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12965:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68725:796;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34379:90;;;;;;;;;;;;;;;;;;;;;;;;;;33972:189;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6073:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;71655:346;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17342:139;;;;;;;;;;;;;;;;;;;;;;;;;;5011:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79863:344;;;;;;;;;;;;;;26205:180;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71042:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76533:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66412:467;;;;;;;;;;;;;;;;;;;;;;;;;;;;22243:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77527:199;;;;;;;;;;;;;;;;;;;;;;;;;;;;11807:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6990:81;;;;;;;;;;;;;;26841:853;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;42595:1586:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70671:142;;;;;;;;;;;;;;18975:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11384:339:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12465:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22790:990;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4879:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30552:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19070:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72106:447;;;;;;;;;;;;;;;;;;;;;;;;;;34991:207;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70985:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20416:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;13564:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78213:904;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69769:703;;;;;;;;;;;;;;;;;;;;;;;;;;71361:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30817:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40000:1958;;;;;;;;;;;;;;;;;;;;;;;;;;19989:327;20060:4;19175:38;;;;;;;;;;;;;;;;;;;20219:41;;;:12;:41;;;;20218:90;;;;19697:42;;;;;;;;;;;;;;;;;;;19647:35;;;;;;;;;;;;;;;;;;;19582:50;;;;;;;;;;;;;;;;;;;;;;;;19529:38;;;;;;;;;;;;;;;;;;;19477:37;;;;;;;;;;;;;;;;;;;19433:29;;;;;;;;;;;;;;;;;;;19387:31;;;;;;;;;;;;;;;;;;;19346:26;;;;;;;;;;;;;;;;;;;19310:21;;;;;;;;;;;;;;;;;;;19276:19;;;;;;;;;;;;;;;;;;;19269:63;:104;:150;:194;:246;:299;:364;:414;:471;20266:41;;;:12;:41;;;;20218:90;20210:99;;19989:327;;;:::o;4848:25::-;;;;;;;;;;;;;:::o;29456:346::-;29548:14;;:::i;:::-;29621:24;;:::i;:::-;29655:13;29608:1;29582:28;;:14;;;;;;;;;;;:28;;;;29574:37;;;;;;;;29696:14;;;;;;;;;;;:26;;;29723:8;29733:19;;29696:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29678:75;;;;;;;;29771:24;29781:6;29789:5;29771:9;:24::i;:::-;29764:31;;29456:346;;;;;;;:::o;71323:32::-;;;;:::o;18924:45::-;;;;;;;;;;;;;;;;;;;;:::o;24204:395::-;24384:27;24390:10;24402:8;24384:5;:27::i;:::-;24376:36;;;;;;;;24491:23;24500:8;24510:3;24491:8;:23::i;:::-;24557:35;24566:10;24578:3;24583:8;24557:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24204:395;;:::o;4817:25::-;;;;;;;;;;;;;:::o;71136:55::-;71182:9;71136:55;:::o;66994:477::-;67072:36;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;67130:8;67072:67;;67339:17;:38;;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67331:49;;;;;;;;67447:17;67431:13;;:33;;;;;;;;;;;;;;;;;;66994:477;;:::o;25978:92::-;26022:4;26062:1;26045:7;:14;;;;:18;26038:25;;25978:92;:::o;30647:30::-;;;;:::o;35349:235::-;35420:4;35459:1;35448:8;:12;35440:21;;;;;;;;35576:1;35542:7;35550:8;35542:17;;;;;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;:35;;;;35535:42;;35349:235;;;:::o;71197:54::-;71245:6;71197:54;:::o;13853:39::-;;;;;;;;;;;;;:::o;25066:784::-;25305:1;25290:17;;:3;:17;;;;25282:26;;;;;;;;25563:4;25548:20;;:3;:20;;;;25540:29;;;;;;;;25637:34;25650:10;25662:8;25637:12;:34::i;:::-;25629:43;;;;;;;;25690:22;25696:5;25703:8;25690:5;:22::i;:::-;25682:31;;;;;;;;25812;25822:5;25829:3;25834:8;25812:9;:31::i;:::-;25066:784;;;:::o;31057:470::-;31133:38;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;31195:8;31133:71;;31404:17;:31;;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31396:42;;;;;;;;31503:17;31489:11;;:31;;;;;;;;;;;;;;;;;;31057:470;;:::o;5800:128::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;5887:1;5868:21;;:7;:21;;;;5860:30;;;;;;;;5914:7;5901:10;;:20;;;;;;;;;;;;;;;;;;5800:128;:::o;6346:::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;6433:1;6414:21;;:7;:21;;;;6406:30;;;;;;;;6460:7;6447:10;;:20;;;;;;;;;;;;;;;;;;6346:128;:::o;67586:978::-;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;67958:27;67964:10;67976:8;67958:5;:27::i;:::-;67950:36;;;;;;;;68198:20;68209:8;68198:10;:20::i;:::-;68197:21;68189:30;;;;;;;;68229:31;68238:8;68248:11;;;;;;;;;;;68229:8;:31::i;:::-;68399:11;;;;;;;;;;;:25;;;68438:8;68460:14;68488:12;68514:9;68537:10;68399:158;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67586:978;;;;:::o;79475:305::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;6812:6;;;;;;;;;;;6804:15;;;;;;;;79561:1;79538:25;;:11;;;;;;;;;;;:25;;;;79530:34;;;;;;;;79607:1;79582:27;;:13;;;;;;;;;;;:27;;;;79574:36;;;;;;;;79651:1;79628:25;;:11;;;;;;;;;;;:25;;;;79620:34;;;;;;;;79702:1;79672:32;;:18;;;;;;;;;;;:32;;;79664:41;;;;;;;;79758:15;:13;:15::i;:::-;79475:305::o;13283:56::-;;;;;;;;;;;;;;;;;;;;;;:::o;38051:388::-;38143:4;38225:20;38276:18;38183:1;38171:9;:13;38163:22;;;;;;;;38213:1;38203:7;:11;38195:20;;;;;;;;38248:7;38256:9;38248:18;;;;;;;;;;;;;;;;;;;;38225:41;;38297:7;38305;38297:16;;;;;;;;;;;;;;;;;;;;38276:37;;38330:52;38349:6;38357:9;38368:4;38374:7;38330:18;:52::i;:::-;:102;;;;;38394:38;38413:7;38422:9;38394:18;:38::i;:::-;38330:102;38323:109;;38051:388;;;;;;:::o;12965:56::-;;;;;;;;;;;;;;;;;;;;;;:::o;68725:796::-;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;69099:27;69105:10;69117:8;69099:5;:27::i;:::-;69091:36;;;;;;;;69145:24;69160:8;69145:14;:24::i;:::-;69137:33;;;;;;;;69180;69189:8;69199:13;;;;;;;;;;;69180:8;:33::i;:::-;69354:13;;;;;;;;;;;:27;;;69395:8;69417:14;69445:12;69471:9;69494:10;69354:160;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68725:796;;;;:::o;34379:90::-;5435:10;;;;;;;;;;;5421:24;;:10;:24;;;5413:33;;;;;;;;34459:3;34444:12;:18;;;;34379:90;:::o;33972:189::-;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;34080:26;34086:10;34098:7;34080:5;:26::i;:::-;34072:35;;;;;;;;34149:5;34117:20;:29;34138:7;34117:29;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;33972:189;;:::o;6073:128::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;6160:1;6141:21;;:7;:21;;;;6133:30;;;;;;;;6187:7;6174:10;;:20;;;;;;;;;;;;;;;;;;6073:128;:::o;71655:346::-;71740:18;5435:10;;;;;;;;;;;5421:24;;:10;:24;;;5413:33;;;;;;;;71761:6;71740:27;;71803:1;71781:24;;:10;:24;;;71777:78;;;71834:10;;;;;;;;;;;71821:23;;71777:78;71032:4;71872:17;;:40;71864:49;;;;;;;;71924:17;;:19;;;;;;;;;;;;;71953:41;71966:1;71969;71972;71975:6;71983:10;71953:12;:41::i;:::-;;71655:346;;;:::o;17342:139::-;5537:10;;;;;;;;;;;5523:24;;:10;:24;;;:64;;;;5577:10;;;;;;;;;;;5563:24;;:10;:24;;;5523:64;:104;;;;5617:10;;;;;;;;;;;5603:24;;:10;:24;;;5523:104;5502:135;;;;;;;;17429:9;17439:1;17429:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17422:19;;:4;:19;17414:28;;;;;;;;17470:4;17452:15;:22;;;;17342:139;:::o;5011:26::-;;;;;;;;;;;;;:::o;79863:344::-;79917:15;80039:20;5293:10;;;;;;;;;;;5279:24;;:10;:24;;;5271:33;;;;;;;;79935:4;:12;;;79917:30;;80086:12;;80081:1;80063:15;;:19;80062:36;80039:59;;80123:12;80113:7;:22;80109:92;;;80151:10;;;;;;;;;;;:15;;:39;80177:12;80167:7;:22;80151:39;;;;;;;;;;;;;;;;;;;;;;;;80109:92;79863:344;;:::o;26205:180::-;26275:13;26312:17;:27;26330:8;26312:27;;;;;;;;;;;;;;;;;;;;;26304:35;;26375:1;26358:19;;:5;:19;;;;26350:28;;;;;;;;26205:180;;;:::o;71042:51::-;71088:5;71042:51;:::o;76533:33::-;;;;;;;;;;;;;:::o;66412:467::-;66488:34;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;66542:8;66488:63;;66751:17;:36;;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66743:47;;;;;;;;66855:17;66841:11;;:31;;;;;;;;;;;;;;;;;;66412:467;;:::o;22243:122::-;22299:13;22331:19;:27;22351:6;22331:27;;;;;;;;;;;;;;;;22324:34;;22243:122;;;:::o;77527:199::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;6812:6;;;;;;;;;;;6804:15;;;;;;;;77672:10;77651:18;;:31;;;;;;;;;;;;;;;;;;77692:27;77708:10;77692:27;;;;;;;;;;;;;;;;;;;;;;77527:199;:::o;11807:35::-;;;;:::o;6990:81::-;5537:10;;;;;;;;;;;5523:24;;:10;:24;;;:64;;;;5577:10;;;;;;;;;;;5563:24;;:10;:24;;;5523:64;:104;;;;5617:10;;;;;;;;;;;5603:24;;:10;:24;;;5523:104;5502:135;;;;;;;;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;7060:4;7051:6;;:13;;;;;;;;;;;;;;;;;;6990:81::o;26841:853::-;26902:21;;:::i;:::-;26935:18;27110:23;;:::i;:::-;27175:17;27222:19;27402:13;26956:17;26966:6;26956:9;:17::i;:::-;26935:38;;27002:1;26988:10;:15;26984:704;;;27077:1;27063:16;;;;;;;;;;;;;;;;;;;;;;;;27056:23;;;;26984:704;27150:10;27136:25;;;;;;;;;;;;;;;;;;;;;;;;27110:51;;27195:13;:11;:13::i;:::-;27175:33;;27244:1;27222:23;;27443:1;27435:9;;27430:220;27455:9;27446:5;:18;;27430:220;;;27525:6;27497:34;;:17;:24;27515:5;27497:24;;;;;;;;;;;;;;;;;;;;;:34;;;27493:143;;;27577:5;27555:6;27562:11;27555:19;;;;;;;;;;;;;;;;;:27;;;;;27604:13;;;;;;;27493:143;27466:7;;;;;;;27430:220;;;27671:6;27664:13;;26841:853;;;;;;;;;:::o;42595:1586::-;42676:7;42753:20;43068:14;43114:18;43230:16;43436:18;43575:13;43629:16;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;42776:7;42784:9;42776:18;;;;;;;;;;;;;;;;;;;;42753:41;;42882:1;42862:6;:16;;;;;;;;;;;;:21;;;;42854:30;;;;;;;;42977:27;42997:6;42977:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:19;:27::i;:::-;42969:36;;;;;;;;43085:6;:19;;;;;;;;;;;;43068:36;;;;43135:7;43143:6;43135:15;;;;;;;;;;;;;;;;;;;;43114:36;;43249:6;:17;;;;;;;;;;;;43230:36;;43298:6;:17;;;;;;;;;;;;43280:35;;:4;:15;;;;;;;;;;;;:35;;;43276:93;;;43343:4;:15;;;;;;;;;;;;43331:27;;43276:93;43457:11;;;;;;;;;;;:20;;;43478:6;:12;;;43492:4;:10;;;43530:1;43504:6;:23;;;;;;;;;;;;:27;43457:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43436:96;;43591:17;:28;43609:9;43591:28;;;;;;;;;;;;;;;;;;;;;43575:44;;43648:78;43661:9;43672:6;:19;;;;;;;;;;;;43648:78;;43705:1;43693:9;:13;43648:78;;43708:10;43720:5;43648:12;:78::i;:::-;43629:97;;43888:6;:19;;;43881:26;;;;;;;;;;;43984:15;;:17;;;;;;;;;;;;;;44081:10;:15;;:29;44097:12;;44081:29;;;;;;;;;;;;;;;;;;;;;;;;44166:8;44159:15;;42595:1586;;;;;;;;;;:::o;70671:142::-;5537:10;;;;;;;;;;;5523:24;;:10;:24;;;:64;;;;5577:10;;;;;;;;;;;5563:24;;:10;:24;;;5523:64;:104;;;;5617:10;;;;;;;;;;;5603:24;;:10;:24;;;5523:104;5502:135;;;;;;;;70736:11;;;;;;;;;;;:27;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70775:13;;;;;;;;;;;:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70671:142::o;18975:36::-;;;;;;;;;;;;;;;;;;;;:::o;11384:339::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;12465:53::-;;;;;;;;;;;;;;;;;;;;;;:::o;22790:990::-;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;22999:1;22984:17;;:3;:17;;;;22976:26;;;;;;;;23257:4;23242:20;;:3;:20;;;;23234:29;;;;;;;;23498:11;;;;;;;;;;;23483:27;;:3;:27;;;;23475:36;;;;;;;;23544:13;;;;;;;;;;;23529:29;;:3;:29;;;;23521:38;;;;;;;;23621:27;23627:10;23639:8;23621:5;:27::i;:::-;23613:36;;;;;;;;23737;23747:10;23759:3;23764:8;23737:9;:36::i;:::-;22790:990;;:::o;4879:25::-;;;;;;;;;;;;;:::o;30552:38::-;;;;:::o;19070:43::-;;;;;;;;;;;;;:::o;72106:447::-;72234:15;5435:10;;;;;;;;;;;5421:24;;:10;:24;;;5413:33;;;;;;;;71088:5;72184:16;;:38;72176:47;;;;;;;;72252:44;72265:1;72268;72271;72274:6;72290:4;72252:12;:44::i;:::-;72234:62;;72306:30;72315:7;72324:11;;;;;;;;;;;72306:8;:30::i;:::-;72347:11;;;;;;;;;;;:25;;;72386:7;72407:23;:21;:23::i;:::-;72444:1;71245:6;72502:4;72347:170;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72528:16;;:18;;;;;;;;;;;;;72106:447;;:::o;34991:207::-;35066:4;35117:17;35105:1;35094:8;:12;35086:21;;;;;;;;35137:7;35145:8;35137:17;;;;;;;;;;;;;;;;;;;;35117:37;;35171:20;35187:3;35171:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:15;:20::i;:::-;35164:27;;34991:207;;;;:::o;70985:51::-;71032:4;70985:51;:::o;20416:142::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;20534:16;20495:14;;:56;;;;;;;;;;;;;;;;;;20416:142;:::o;13564:35::-;;;;;;;;;;;;;:::o;78213:904::-;78288:16;78314:12;78336:21;78367:20;78397;78427:17;78454:16;78480:14;78504:18;78532:13;78562:17;78582:7;78590:3;78582:12;;;;;;;;;;;;;;;;;;;;78562:32;;78697:1;78677:3;:16;;;;;;;;;;;;:21;;;;78662:37;;78744:12;78720:3;:20;;;;;;;;;;;;:36;;;;78709:48;;78791:3;:17;;;;;;;;;;;;78783:26;;78767:42;;78842:3;:20;;;;;;;;;;;;78834:29;;78819:44;;78896:3;:16;;;;;;;;;;;;78888:25;;78873:40;;78943:3;:13;;;;;;;;;;;;78935:22;;78923:34;;78986:3;:12;;;;;;;;;;;;78978:21;;78967:32;;79026:3;:10;;;;;;;;;;;;79018:19;;79009:28;;79068:3;:14;;;;;;;;;;;;79060:23;;79047:36;;79101:3;:9;;;79093:17;;78213:904;;;;;;;;;;;;:::o;69769:703::-;70165:20;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;69967:28;69973:10;69985:9;69967:5;:28::i;:::-;69959:37;;;;;;;;70014:25;70029:9;70014:14;:25::i;:::-;70006:34;;;;;;;;70058:43;70082:9;70093:7;70058:23;:43::i;:::-;70050:52;;;;;;;;70188:13;;;;;;;;;;;:29;;;70218:7;70188:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70165:61;;70272:12;;70257;:27;70244:9;:40;;70236:49;;;;;;;;70351:13;;;;;;;;;;;:17;;;70387:12;;70375:9;:24;70401:7;70351:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70419:46;70437:9;70419:46;;70456:7;70419:46;;:10;:46::i;:::-;69769:703;;;:::o;71361:31::-;;;;:::o;30817:39::-;;;;;;;;;;;;;:::o;40000:1958::-;41267:20;41494:18;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;40168:12;;40155:9;:25;;40147:34;;;;;;;;40239:28;40245:10;40257:9;40239:5;:28::i;:::-;40231:37;;;;;;;;41165:38;41184:7;41193:9;41165:18;:38::i;:::-;41157:47;;;;;;;;41290:7;41298:9;41290:18;;;;;;;;;;;;;;;;;;;;41267:41;;41409:23;41425:6;41409:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:15;:23::i;:::-;41401:32;;;;;;;;41515:7;41523;41515:16;;;;;;;;;;;;;;;;;;;;41494:37;;41630:21;41646:4;41630:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:15;:21::i;:::-;41622:30;;;;;;;;41728:130;41764:6;41788:9;41815:4;41837:7;41728:18;:130::i;:::-;41720:139;;;;;;;;41921:30;41932:9;41943:7;41921:10;:30::i;:::-;40000:1958;;;;:::o;28808:403::-;28894:6;;:::i;:::-;28912:16;;:::i;:::-;28966:17;28993:16;28942:13;28931:25;;;;;;;;;;;;;;;;;;;;;;;;;;;28912:44;;29074:2;29060:12;29056:3;29043:34;;29102:9;29090:21;;29131:43;29139:9;29150:8;29160:13;29131:7;:43::i;:::-;29192:12;29185:19;;28808:403;;;;;;;:::o;20967:145::-;21042:4;21096:9;21065:40;;:17;:27;21083:8;21065:27;;;;;;;;;;;;;;;;;;;;;:40;;;21058:47;;20967:145;;;;:::o;21944:123::-;22051:9;22018:20;:30;22039:8;22018:30;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;21944:123;;:::o;21346:155::-;21428:4;21485:9;21451:43;;:20;:30;21472:8;21451:30;;;;;;;;;;;;;;;;;;;;;:43;;;21444:50;;21346:155;;;;:::o;13965:758::-;14129:19;:24;14149:3;14129:24;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;14225:3;14195:17;:27;14213:8;14195:27;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;14345:1;14328:19;;:5;:19;;;;14324:317;;;14363:19;:26;14383:5;14363:26;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;14485:20;:30;14506:8;14485:30;;;;;;;;;;;;14478:37;;;;;;;;;;;14600:20;:30;14621:8;14600:30;;;;;;;;;;;;14593:37;;;;;;;;;;;14324:317;14686:30;14695:5;14702:3;14707:8;14686:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13965:758;;;:::o;7359:126::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;6812:6;;;;;;;;;;;6804:15;;;;;;;;7473:5;7464:6;;:14;;;;;;;;;;;;;;;;;;7359:126::o;35986:1169::-;36165:4;36246:7;36233:9;:20;36229:63;;;36276:5;36269:12;;;;36229:63;36377:7;36357;:16;;;;;;;;;;;;:27;;;:56;;;;36406:7;36388;:14;;;;;;;;;;;;:25;;;36357:56;36353:99;;;36436:5;36429:12;;;;36353:99;36483:9;36465:5;:14;;;;;;;;;;;;:27;;;:56;;;;36512:9;36496:5;:12;;;;;;;;;;;;:25;;;36465:56;36461:99;;;36544:5;36537:12;;;;36461:99;36714:1;36696:5;:14;;;;;;;;;;;;:19;;;:44;;;;36739:1;36719:7;:16;;;;;;;;;;;;:21;;;36696:44;36692:86;;;36763:4;36756:11;;;;36692:86;36869:7;:16;;;;;;;;;;;;36851:34;;:5;:14;;;;;;;;;;;;:34;;;:70;;;;36907:7;:14;;;;;;;;;;;;36889:32;;:5;:14;;;;;;;;;;;;:32;;;36851:70;36847:113;;;36944:5;36937:12;;;;36847:113;36989:7;:16;;;;;;;;;;;;36973:32;;:5;:12;;;;;;;;;;;;:32;;;:66;;;;37025:7;:14;;;;;;;;;;;;37009:30;;:5;:12;;;;;;;;;;;;:30;;;36973:66;36969:109;;;37062:5;37055:12;;;;36969:109;37144:4;37137:11;;35986:1169;;;;;;;:::o;32350:441::-;32437:4;32453:19;32513:17;32475;:28;32493:9;32475:28;;;;;;;;;;;;;;;;;;;;;32453:50;;32533:17;:26;32551:7;32533:26;;;;;;;;;;;;;;;;;;;;;32513:46;;32726:9;32711:24;;:11;:24;;;:72;;;;32772:11;32739:44;;:20;:29;32760:7;32739:29;;;;;;;;;;;;;;;;;;;;;:44;;;32711:72;32703:81;;32350:441;;;;;;:::o;15381:1876::-;15564:4;16148:20;16281:19;;:::i;:::-;16624;15942:9;15927:26;;15914:9;:39;15906:48;;;;;;;;15998:7;15983:24;;15972:7;:35;15964:44;;;;;;;;16056:11;16041:28;;16026:11;:43;16018:52;;;;;;;;16192:1;16178:11;:15;;;;;;;;16148:46;;16224:2;16208:13;:18;;;16204:67;;;16258:2;16242:18;;16204:67;16303:311;;;;;;;;;16330:6;16303:311;;;;16368:3;16303:311;;;;;;16404:1;16303:311;;;;;;16436:9;16303:311;;;;;;16475:7;16303:311;;;;;;16511:1;16303:311;;;;;;16541:13;16303:311;;;;;;16587:11;16303:311;;;;;16281:333;;16669:1;16646:7;:20;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;16659:6;16646:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:24;16624:46;;16857:11;16842:28;;16827:11;:43;16819:52;;;;;;;;16914:160;16933:6;16953:11;16986:6;:15;;;16978:24;;17024:6;:13;;;17016:22;;17052:6;:12;;;16914:160;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17188:33;17198:1;17201:6;17209:11;17188:9;:33::i;:::-;17239:11;17232:18;;15381:1876;;;;;;;;;;:::o;34588:177::-;34654:4;34702:1;34678:7;:20;;;:25;;;;34677:81;;;;;34744:12;34709:48;;:7;:24;;;:48;;;;34677:81;34670:88;;34588:177;;;:::o;72674:499::-;72730:7;72749:16;72934:17;72768:11;;;;;;;;;;;:32;;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72749:53;;72912:8;72896:26;;72884:8;:38;72876:47;;;;;;;;72977:1;72966:8;:12;;;;;;;;72954:8;:25;72934:45;;71182:9;73051;:31;73047:93;;;71182:9;73098:31;;73047:93;73157:9;73150:16;;72674:499;;;:::o;31720:397::-;31780:4;32057:1;32036:4;:17;;;:22;;;32035:75;;;;;32096:12;32064:45;;:4;:21;;;:45;;;;32035:75;32028:82;;31720:397;;;:::o;37332:288::-;37436:4;37456:20;37507:18;37479:7;37487:9;37479:18;;;;;;;;;;;;;;;;;;;;37456:41;;37528:7;37536;37528:16;;;;;;;;;;;;;;;;;;;;37507:37;;37561:52;37580:6;37588:9;37599:4;37605:7;37561:18;:52::i;:::-;37554:59;;37332:288;;;;;;:::o;38573:924::-;38705:18;38752:20;38726:7;38734;38726:16;;;;;;;;;;;;;;;;;;;;38705:37;;38775:7;38783:9;38775:18;;;;;;;;;;;;;;;;;;;;38752:41;;38907:7;38878:6;:19;;;:37;;;;;;;;;;;;;;;;;;38976:22;38993:4;38976:16;:22::i;:::-;39008:24;39025:6;39008:16;:24::i;:::-;39185:20;:31;39206:9;39185:31;;;;;;;;;;;;39178:38;;;;;;;;;;;39233:20;:29;39254:7;39233:29;;;;;;;;;;;;39226:36;;;;;;;;;;;39342:15;;:17;;;;;;;;;;;;;39407:83;39416:17;:28;39434:9;39416:28;;;;;;;;;;;;;;;;;;;;;39446:9;39457:7;39466:6;:23;;;;;;;;;;;;39407:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38573:924;;;;:::o;27965:565::-;28301:12;28089:170;28103:2;28095:4;:10;;28089:170;;;28180:4;28174:5;28167;28160:6;28222:2;28213:11;;;;28246:2;28238:10;;;;28115:2;28107:10;;;;28089:170;;;28337:1;28329:4;28324:2;:9;28316:3;:18;:22;28301:37;;28407:4;28403:3;28396:4;28390:5;28386:3;28460:4;28452:5;28446;28442:3;28505:7;28495:8;28492:2;28485:5;28478:6;28357:167;;;;;;:::o;33053:596::-;33306:12;33287:15;;33254:9;33264:7;:21;;;;;;;;;;;;33254:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:48;;;;;;;;;;33253:65;33219:7;:24;;;:100;;;;;;;;;;;;;;;;;;33588:2;33564:7;:21;;;;;;;;;;;;:26;;;33560:83;;;33631:1;33606:7;:21;;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33560:83;33053:596;:::o;73435:6774::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", "source": "pragma solidity 0.4.18;\n\n/**\n The following contract code, titled KittyCore, was written by Cryptokitties and published\n and retrieved from https://etherscan.io/address/0x06012c8cf97bead5deae237070f9587f8e7a266d#code.\n\n It is included in the current project for test purposes, to ensure that our collateralizer can\n handle ERC721 tokens created by the KittyCore contract.\n*/\n\n/**\n * @title KittiesOwnable\n * @dev The KittiesOwnable contract has an owner address, and provides basic authorization control\n * functions, this simplifies the implementation of \"user permissions\".\n */\ncontract KittiesOwnable {\n address public owner;\n\n\n /**\n\t * @dev The KittiesOwnable constructor sets the original `owner` of the contract to the sender\n\t * account.\n\t */\n function KittiesOwnable() {\n owner = msg.sender;\n }\n\n\n /**\n\t * @dev Throws if called by any account other than the owner.\n\t */\n modifier onlyOwner() {\n require(msg.sender == owner);\n _;\n }\n\n\n /**\n\t * @dev Allows the current owner to transfer control of the contract to a newOwner.\n\t * @param newOwner The address to transfer ownership to.\n\t */\n function transferOwnership(address newOwner) onlyOwner {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n\n}\n\n\n\n/// @title Interface for contracts conforming to ERC-721: Non-Fungible Tokens\n/// @author Dieter Shirley (https://github.com/dete)\ncontract KittiesERC721 {\n // Required methods\n function totalSupply() public view returns (uint256 total);\n function balanceOf(address _owner) public view returns (uint256 balance);\n function ownerOf(uint256 _tokenId) external view returns (address owner);\n function approve(address _to, uint256 _tokenId) external;\n function transfer(address _to, uint256 _tokenId) external;\n function transferFrom(address _from, address _to, uint256 _tokenId) external;\n\n // Events\n event Transfer(address from, address to, uint256 tokenId);\n event Approval(address owner, address approved, uint256 tokenId);\n\n // Optional\n // function name() public view returns (string name);\n // function symbol() public view returns (string symbol);\n // function tokensOfOwner(address _owner) external view returns (uint256[] tokenIds);\n // function tokenMetadata(uint256 _tokenId, string _preferredTransport) public view returns (string infoUrl);\n\n // ERC-165 Compatibility (https://github.com/ethereum/EIPs/issues/165)\n function supportsInterface(bytes4 _interfaceID) external view returns (bool);\n}\n\n\n// // Auction wrapper functions\n\n\n// Auction wrapper functions\n\n\n\n\n\n\n\n/// @title SEKRETOOOO\ncontract GeneScienceInterface {\n /// @dev simply a boolean to indicate this is the contract we expect to be\n function isGeneScience() public pure returns (bool);\n\n /// @dev given genes of kitten 1 & 2, return a genetic combination - may have a random factor\n /// @param genes1 genes of mom\n /// @param genes2 genes of sire\n /// @return the genes that are supposed to be passed down the child\n function mixGenes(uint256 genes1, uint256 genes2, uint256 targetBlock) public returns (uint256);\n}\n\n\n\n\n\n\n\n/// @title A facet of KittyCore that manages special access privileges.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyAccessControl {\n // This facet controls access control for CryptoKitties. There are four roles managed here:\n //\n // - The CEO: The CEO can reassign other roles and change the addresses of our dependent smart\n // contracts. It is also the only role that can unpause the smart contract. It is initially\n // set to the address that created the smart contract in the KittyCore constructor.\n //\n // - The CFO: The CFO can withdraw funds from KittyCore and its auction contracts.\n //\n // - The COO: The COO can release gen0 kitties to auction, and mint promo cats.\n //\n // It should be noted that these roles are distinct without overlap in their access abilities, the\n // abilities listed for each role above are exhaustive. In particular, while the CEO can assign any\n // address to any role, the CEO address itself doesn't have the ability to act in those roles. This\n // restriction is intentional so that we aren't tempted to use the CEO address frequently out of\n // convenience. The less we use an address, the less likely it is that we somehow compromise the\n // account.\n\n /// @dev Emited when contract is upgraded - See README.md for updgrade plan\n event ContractUpgrade(address newContract);\n\n // The addresses of the accounts (or contracts) that can execute actions within each roles.\n address public ceoAddress;\n address public cfoAddress;\n address public cooAddress;\n\n // @dev Keeps track whether the contract is paused. When that is true, most actions are blocked\n bool public paused = false;\n\n /// @dev Access modifier for CEO-only functionality\n modifier onlyCEO() {\n require(msg.sender == ceoAddress);\n _;\n }\n\n /// @dev Access modifier for CFO-only functionality\n modifier onlyCFO() {\n require(msg.sender == cfoAddress);\n _;\n }\n\n /// @dev Access modifier for COO-only functionality\n modifier onlyCOO() {\n require(msg.sender == cooAddress);\n _;\n }\n\n modifier onlyCLevel() {\n require(\n msg.sender == cooAddress ||\n msg.sender == ceoAddress ||\n msg.sender == cfoAddress\n );\n _;\n }\n\n /// @dev Assigns a new address to act as the CEO. Only available to the current CEO.\n /// @param _newCEO The address of the new CEO\n function setCEO(address _newCEO) external onlyCEO {\n require(_newCEO != address(0));\n\n ceoAddress = _newCEO;\n }\n\n /// @dev Assigns a new address to act as the CFO. Only available to the current CEO.\n /// @param _newCFO The address of the new CFO\n function setCFO(address _newCFO) external onlyCEO {\n require(_newCFO != address(0));\n\n cfoAddress = _newCFO;\n }\n\n /// @dev Assigns a new address to act as the COO. Only available to the current CEO.\n /// @param _newCOO The address of the new COO\n function setCOO(address _newCOO) external onlyCEO {\n require(_newCOO != address(0));\n\n cooAddress = _newCOO;\n }\n\n /*** KittiesPausable functionality adapted from OpenZeppelin ***/\n\n /// @dev Modifier to allow actions only when the contract IS NOT paused\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /// @dev Modifier to allow actions only when the contract IS paused\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /// @dev Called by any \"C-level\" role to pause the contract. Used only when\n /// a bug or exploit is detected and we need to limit damage.\n function pause() external onlyCLevel whenNotPaused {\n paused = true;\n }\n\n /// @dev Unpauses the smart contract. Can only be called by the CEO, since\n /// one reason we may pause the contract is when CFO or COO accounts are\n /// compromised.\n /// @notice This is public rather than external so it can be called by\n /// derived contracts.\n function unpause() public onlyCEO whenPaused {\n // can't unpause if contract was upgraded\n paused = false;\n }\n}\n\n\n\n\n/// @title Base contract for CryptoKitties. Holds all common structs, events and base variables.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBase is KittyAccessControl {\n /*** EVENTS ***/\n\n /// @dev The Birth event is fired whenever a new kitten comes into existence. This obviously\n /// includes any time a cat is created through the giveBirth method, but it is also called\n /// when a new gen0 cat is created.\n event Birth(address owner, uint256 kittyId, uint256 matronId, uint256 sireId, uint256 genes);\n\n /// @dev Transfer event as defined in current draft of ERC721. Emitted every time a kitten\n /// ownership is assigned, including births.\n event Transfer(address from, address to, uint256 tokenId);\n\n /*** DATA TYPES ***/\n\n /// @dev The main Kitty struct. Every cat in CryptoKitties is represented by a copy\n /// of this structure, so great care was taken to ensure that it fits neatly into\n /// exactly two 256-bit words. Note that the order of the members in this structure\n /// is important because of the byte-packing rules used by Ethereum.\n /// Ref: http://solidity.readthedocs.io/en/develop/miscellaneous.html\n struct Kitty {\n // The Kitty's genetic code is packed into these 256-bits, the format is\n // sooper-sekret! A cat's genes never change.\n uint256 genes;\n\n // The timestamp from the block when this cat came into existence.\n uint64 birthTime;\n\n // The minimum timestamp after which this cat can engage in breeding\n // activities again. This same timestamp is used for the pregnancy\n // timer (for matrons) as well as the siring cooldown.\n uint64 cooldownEndBlock;\n\n // The ID of the parents of this kitty, set to 0 for gen0 cats.\n // Note that using 32-bit unsigned integers limits us to a \"mere\"\n // 4 billion cats. This number might seem small until you realize\n // that Ethereum currently has a limit of about 500 million\n // transactions per year! So, this definitely won't be a problem\n // for several years (even as Ethereum learns to scale).\n uint32 matronId;\n uint32 sireId;\n\n // Set to the ID of the sire cat for matrons that are pregnant,\n // zero otherwise. A non-zero value here is how we know a cat\n // is pregnant. Used to retrieve the genetic material for the new\n // kitten when the birth transpires.\n uint32 siringWithId;\n\n // Set to the index in the cooldown array (see below) that represents\n // the current cooldown duration for this Kitty. This starts at zero\n // for gen0 cats, and is initialized to floor(generation/2) for others.\n // Incremented by one for each successful breeding action, regardless\n // of whether this cat is acting as matron or sire.\n uint16 cooldownIndex;\n\n // The \"generation number\" of this cat. Cats minted by the CK contract\n // for sale are called \"gen0\" and have a generation number of 0. The\n // generation number of all other cats is the larger of the two generation\n // numbers of their parents, plus one.\n // (i.e. max(matron.generation, sire.generation) + 1)\n uint16 generation;\n }\n\n /*** CONSTANTS ***/\n\n /// @dev A lookup table indicating the cooldown duration after any successful\n /// breeding action, called \"pregnancy time\" for matrons and \"siring cooldown\"\n /// for sires. Designed such that the cooldown roughly doubles each time a cat\n /// is bred, encouraging owners not to just keep breeding the same cat over\n /// and over again. Caps out at one week (a cat can breed an unbounded number\n /// of times, and the maximum cooldown is always seven days).\n uint32[14] public cooldowns = [\n uint32(1 minutes),\n uint32(2 minutes),\n uint32(5 minutes),\n uint32(10 minutes),\n uint32(30 minutes),\n uint32(1 hours),\n uint32(2 hours),\n uint32(4 hours),\n uint32(8 hours),\n uint32(16 hours),\n uint32(1 days),\n uint32(2 days),\n uint32(4 days),\n uint32(7 days)\n ];\n\n // An approximation of currently how many seconds are in between blocks.\n uint256 public secondsPerBlock = 15;\n\n /*** STORAGE ***/\n\n /// @dev An array containing the Kitty struct for all Kitties in existence. The ID\n /// of each cat is actually an index into this array. Note that ID 0 is a negacat,\n /// the unKitty, the mythical beast that is the parent of all gen0 cats. A bizarre\n /// creature that is both matron and sire... to itself! Has an invalid genetic code.\n /// In other words, cat ID 0 is invalid... ;-)\n Kitty[] kitties;\n\n /// @dev A mapping from cat IDs to the address that owns them. All cats have\n /// some valid owner address, even gen0 cats are created with a non-zero owner.\n mapping (uint256 => address) public kittyIndexToOwner;\n\n // @dev A mapping from owner address to count of tokens that address owns.\n // Used internally inside balanceOf() to resolve ownership count.\n mapping (address => uint256) ownershipTokenCount;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to call\n /// transferFrom(). Each Kitty can only have one approved address for transfer\n /// at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public kittyIndexToApproved;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to use\n /// this Kitty for siring via breedWith(). Each Kitty can only have one approved\n /// address for siring at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public sireAllowedToAddress;\n\n /// @dev The address of the ClockAuction contract that handles sales of Kitties. This\n /// same contract handles both peer-to-peer sales as well as the gen0 sales which are\n /// initiated every 15 minutes.\n SaleClockAuction public saleAuction;\n\n /// @dev The address of a custom ClockAuction subclassed contract that handles siring\n /// auctions. Needs to be separate from saleAuction because the actions taken on success\n /// after a sales and siring auction are quite different.\n SiringClockAuction public siringAuction;\n\n /// @dev Assigns ownership of a specific Kitty to an address.\n function _transfer(address _from, address _to, uint256 _tokenId) internal {\n // Since the number of kittens is capped to 2^32 we can't overflow this\n ownershipTokenCount[_to]++;\n // transfer ownership\n kittyIndexToOwner[_tokenId] = _to;\n // When creating new kittens _from is 0x0, but we can't account that address.\n if (_from != address(0)) {\n ownershipTokenCount[_from]--;\n // once the kitten is transferred also clear sire allowances\n delete sireAllowedToAddress[_tokenId];\n // clear any previously approved ownership exchange\n delete kittyIndexToApproved[_tokenId];\n }\n // Emit the transfer event.\n Transfer(_from, _to, _tokenId);\n }\n\n /// @dev An internal method that creates a new kitty and stores it. This\n /// method doesn't do any checking and should only be called when the\n /// input data is known to be valid. Will generate both a Birth event\n /// and a Transfer event.\n /// @param _matronId The kitty ID of the matron of this cat (zero for gen0)\n /// @param _sireId The kitty ID of the sire of this cat (zero for gen0)\n /// @param _generation The generation number of this cat, must be computed by caller.\n /// @param _genes The kitty's genetic code.\n /// @param _owner The inital owner of this cat, must be non-zero (except for the unKitty, ID 0)\n function _createKitty(\n uint256 _matronId,\n uint256 _sireId,\n uint256 _generation,\n uint256 _genes,\n address _owner\n )\n internal\n returns (uint)\n {\n // These requires are not strictly necessary, our calling code should make\n // sure that these conditions are never broken. However! _createKitty() is already\n // an expensive call (for storage), and it doesn't hurt to be especially careful\n // to ensure our data structures are always valid.\n require(_matronId == uint256(uint32(_matronId)));\n require(_sireId == uint256(uint32(_sireId)));\n require(_generation == uint256(uint16(_generation)));\n\n // New kitty starts with the same cooldown as parent gen/2\n uint16 cooldownIndex = uint16(_generation / 2);\n if (cooldownIndex > 13) {\n cooldownIndex = 13;\n }\n\n Kitty memory _kitty = Kitty({\n genes: _genes,\n birthTime: uint64(now),\n cooldownEndBlock: 0,\n matronId: uint32(_matronId),\n sireId: uint32(_sireId),\n siringWithId: 0,\n cooldownIndex: cooldownIndex,\n generation: uint16(_generation)\n });\n uint256 newKittenId = kitties.push(_kitty) - 1;\n\n // It's probably never going to happen, 4 billion cats is A LOT, but\n // let's just be 100% sure we never let this happen.\n require(newKittenId == uint256(uint32(newKittenId)));\n\n // emit the birth event\n Birth(\n _owner,\n newKittenId,\n uint256(_kitty.matronId),\n uint256(_kitty.sireId),\n _kitty.genes\n );\n\n // This will assign ownership, and also emit the Transfer event as\n // per ERC721 draft\n _transfer(0, _owner, newKittenId);\n\n return newKittenId;\n }\n\n // Any C-level can fix how many seconds per blocks are currently observed.\n function setSecondsPerBlock(uint256 secs) external onlyCLevel {\n require(secs < cooldowns[0]);\n secondsPerBlock = secs;\n }\n}\n\n\n\n\n\n/// @title The external contract that is responsible for generating metadata for the kitties,\n/// it has one function that will return the data as bytes.\ncontract KittiesERC721Metadata {\n /// @dev Given a token Id, returns a byte array that is supposed to be converted into string.\n function getMetadata(uint256 _tokenId, string) public view returns (bytes32[4] buffer, uint256 count) {\n if (_tokenId == 1) {\n buffer[0] = \"Hello World! :D\";\n count = 15;\n } else if (_tokenId == 2) {\n buffer[0] = \"I would definitely choose a medi\";\n buffer[1] = \"um length string.\";\n count = 49;\n } else if (_tokenId == 3) {\n buffer[0] = \"Lorem ipsum dolor sit amet, mi e\";\n buffer[1] = \"st accumsan dapibus augue lorem,\";\n buffer[2] = \" tristique vestibulum id, libero\";\n buffer[3] = \" suscipit varius sapien aliquam.\";\n count = 128;\n }\n }\n}\n\n\n/// @title The facet of the CryptoKitties core contract that manages ownership, ERC-721 (draft) compliant.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev Ref: https://github.com/ethereum/EIPs/issues/721\n/// See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyOwnership is KittyBase, KittiesERC721 {\n\n /// @notice Name and symbol of the non fungible token, as defined in ERC721.\n string public constant name = \"CryptoKitties\";\n string public constant symbol = \"CK\";\n\n // The contract that will return kitty metadata\n KittiesERC721Metadata public erc721Metadata;\n\n bytes4 constant InterfaceSignature_ERC165 =\n bytes4(keccak256('supportsInterface(bytes4)'));\n\n bytes4 constant InterfaceSignature_ERC721 =\n bytes4(keccak256('name()')) ^\n bytes4(keccak256('symbol()')) ^\n bytes4(keccak256('totalSupply()')) ^\n bytes4(keccak256('balanceOf(address)')) ^\n bytes4(keccak256('ownerOf(uint256)')) ^\n bytes4(keccak256('approve(address,uint256)')) ^\n bytes4(keccak256('transfer(address,uint256)')) ^\n bytes4(keccak256('transferFrom(address,address,uint256)')) ^\n bytes4(keccak256('tokensOfOwner(address)')) ^\n bytes4(keccak256('tokenMetadata(uint256,string)'));\n\n /// @notice Introspection interface as per ERC-165 (https://github.com/ethereum/EIPs/issues/165).\n /// Returns true for any standardized interfaces implemented by this contract. We implement\n /// ERC-165 (obviously!) and ERC-721.\n function supportsInterface(bytes4 _interfaceID) external view returns (bool)\n {\n // DEBUG ONLY\n //require((InterfaceSignature_ERC165 == 0x01ffc9a7) && (InterfaceSignature_ERC721 == 0x9a20483d));\n\n return ((_interfaceID == InterfaceSignature_ERC165) || (_interfaceID == InterfaceSignature_ERC721));\n }\n\n /// @dev Set the address of the sibling contract that tracks metadata.\n /// CEO only.\n function setMetadataAddress(address _contractAddress) public onlyCEO {\n erc721Metadata = KittiesERC721Metadata(_contractAddress);\n }\n\n // Internal utility functions: These functions all assume that their input arguments\n // are valid. We leave it to public methods to sanitize their inputs and follow\n // the required logic.\n\n /// @dev Checks if a given address is the current owner of a particular Kitty.\n /// @param _claimant the address we are validating against.\n /// @param _tokenId kitten id, only valid when > 0\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToOwner[_tokenId] == _claimant;\n }\n\n /// @dev Checks if a given address currently has transferApproval for a particular Kitty.\n /// @param _claimant the address we are confirming kitten is approved for.\n /// @param _tokenId kitten id, only valid when > 0\n function _approvedFor(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToApproved[_tokenId] == _claimant;\n }\n\n /// @dev Marks an address as being approved for transferFrom(), overwriting any previous\n /// approval. Setting _approved to address(0) clears all transfer approval.\n /// NOTE: _approve() does NOT send the Approval event. This is intentional because\n /// _approve() and transferFrom() are used together for putting Kitties on auction, and\n /// there is no value in spamming the log with Approval events in that case.\n function _approve(uint256 _tokenId, address _approved) internal {\n kittyIndexToApproved[_tokenId] = _approved;\n }\n\n /// @notice Returns the number of Kitties owned by a specific address.\n /// @param _owner The owner address to check.\n /// @dev Required for ERC-721 compliance\n function balanceOf(address _owner) public view returns (uint256 count) {\n return ownershipTokenCount[_owner];\n }\n\n /// @notice Transfers a Kitty to another address. If transferring to a smart\n /// contract be VERY CAREFUL to ensure that it is aware of ERC-721 (or\n /// CryptoKitties specifically) or your Kitty may be lost forever. Seriously.\n /// @param _to The address of the recipient, can be a user or contract.\n /// @param _tokenId The ID of the Kitty to transfer.\n /// @dev Required for ERC-721 compliance.\n function transfer(\n address _to,\n uint256 _tokenId\n )\n external\n whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Disallow transfers to the auction contracts to prevent accidental\n // misuse. Auction contracts should only take ownership of kitties\n // through the allow + transferFrom flow.\n require(_to != address(saleAuction));\n require(_to != address(siringAuction));\n\n // You can only send your own cat.\n require(_owns(msg.sender, _tokenId));\n\n // Reassign ownership, clear pending approvals, emit Transfer event.\n _transfer(msg.sender, _to, _tokenId);\n }\n\n /// @notice Grant another address the right to transfer a specific Kitty via\n /// transferFrom(). This is the preferred flow for transfering NFTs to contracts.\n /// @param _to The address to be granted transfer approval. Pass address(0) to\n /// clear all approvals.\n /// @param _tokenId The ID of the Kitty that can be transferred if this call succeeds.\n /// @dev Required for ERC-721 compliance.\n function approve(\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Only an owner can grant transfer approval.\n require(_owns(msg.sender, _tokenId));\n\n // Register the approval (replacing any previous approval).\n _approve(_tokenId, _to);\n\n // Emit approval event.\n Approval(msg.sender, _to, _tokenId);\n }\n\n /// @notice Transfer a Kitty owned by another address, for which the calling address\n /// has previously been granted transfer approval by the owner.\n /// @param _from The address that owns the Kitty to be transfered.\n /// @param _to The address that should take ownership of the Kitty. Can be any address,\n /// including the caller.\n /// @param _tokenId The ID of the Kitty to be transferred.\n /// @dev Required for ERC-721 compliance.\n function transferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Check for approval and valid ownership\n require(_approvedFor(msg.sender, _tokenId));\n require(_owns(_from, _tokenId));\n\n // Reassign ownership (also clears pending approvals and emits Transfer event).\n _transfer(_from, _to, _tokenId);\n }\n\n /// @notice Returns the total number of Kitties currently in existence.\n /// @dev Required for ERC-721 compliance.\n function totalSupply() public view returns (uint) {\n return kitties.length - 1;\n }\n\n /// @notice Returns the address currently assigned ownership of a given Kitty.\n /// @dev Required for ERC-721 compliance.\n function ownerOf(uint256 _tokenId)\n external\n view\n returns (address owner)\n {\n owner = kittyIndexToOwner[_tokenId];\n\n require(owner != address(0));\n }\n\n /// @notice Returns a list of all Kitty IDs assigned to an address.\n /// @param _owner The owner whose Kitties we are interested in.\n /// @dev This method MUST NEVER be called by smart contract code. First, it's fairly\n /// expensive (it walks the entire Kitty array looking for cats belonging to owner),\n /// but it also returns a dynamic array, which is only supported for web3 calls, and\n /// not contract-to-contract calls.\n function tokensOfOwner(address _owner) external view returns(uint256[] ownerTokens) {\n uint256 tokenCount = balanceOf(_owner);\n\n if (tokenCount == 0) {\n // Return an empty array\n return new uint256[](0);\n } else {\n uint256[] memory result = new uint256[](tokenCount);\n uint256 totalCats = totalSupply();\n uint256 resultIndex = 0;\n\n // We count on the fact that all cats have IDs starting at 1 and increasing\n // sequentially up to the totalCat count.\n uint256 catId;\n\n for (catId = 1; catId <= totalCats; catId++) {\n if (kittyIndexToOwner[catId] == _owner) {\n result[resultIndex] = catId;\n resultIndex++;\n }\n }\n\n return result;\n }\n }\n\n /// @dev Adapted from memcpy() by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _memcpy(uint _dest, uint _src, uint _len) private view {\n // Copy word-length chunks while possible\n for(; _len >= 32; _len -= 32) {\n assembly {\n mstore(_dest, mload(_src))\n }\n _dest += 32;\n _src += 32;\n }\n\n // Copy remaining bytes\n uint256 mask = 256 ** (32 - _len) - 1;\n assembly {\n let srcpart := and(mload(_src), not(mask))\n let destpart := and(mload(_dest), mask)\n mstore(_dest, or(destpart, srcpart))\n }\n }\n\n /// @dev Adapted from toString(slice) by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _toString(bytes32[4] _rawBytes, uint256 _stringLength) private view returns (string) {\n var outputString = new string(_stringLength);\n uint256 outputPtr;\n uint256 bytesPtr;\n\n assembly {\n outputPtr := add(outputString, 32)\n bytesPtr := _rawBytes\n }\n\n _memcpy(outputPtr, bytesPtr, _stringLength);\n\n return outputString;\n }\n\n /// @notice Returns a URI pointing to a metadata package for this token conforming to\n /// ERC-721 (https://github.com/ethereum/EIPs/issues/721)\n /// @param _tokenId The ID number of the Kitty whose metadata should be returned.\n function tokenMetadata(uint256 _tokenId, string _preferredTransport) external view returns (string infoUrl) {\n require(erc721Metadata != address(0));\n bytes32[4] memory buffer;\n uint256 count;\n (buffer, count) = erc721Metadata.getMetadata(_tokenId, _preferredTransport);\n\n return _toString(buffer, count);\n }\n}\n\n\n\n/// @title A facet of KittyCore that manages Kitty siring, gestation, and birth.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBreeding is KittyOwnership {\n\n /// @dev The Pregnant event is fired when two cats successfully breed and the pregnancy\n /// timer begins for the matron.\n event Pregnant(address owner, uint256 matronId, uint256 sireId, uint256 cooldownEndBlock);\n\n /// @notice The minimum payment required to use breedWithAuto(). This fee goes towards\n /// the gas cost paid by whatever calls giveBirth(), and can be dynamically updated by\n /// the COO role as the gas price changes.\n uint256 public autoBirthFee = 2 finney;\n\n // Keeps track of number of pregnant kitties.\n uint256 public pregnantKitties;\n\n /// @dev The address of the sibling contract that is used to implement the sooper-sekret\n /// genetic combination algorithm.\n GeneScienceInterface public geneScience;\n\n /// @dev Update the address of the genetic contract, can only be called by the CEO.\n /// @param _address An address of a GeneScience contract instance to be used from this point forward.\n function setGeneScienceAddress(address _address) external onlyCEO {\n GeneScienceInterface candidateContract = GeneScienceInterface(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isGeneScience());\n\n // Set the new contract address\n geneScience = candidateContract;\n }\n\n /// @dev Checks that a given kitten is able to breed. Requires that the\n /// current cooldown is finished (for sires) and also checks that there is\n /// no pending pregnancy.\n function _isReadyToBreed(Kitty _kit) internal view returns (bool) {\n // In addition to checking the cooldownEndBlock, we also need to check to see if\n // the cat has a pending birth; there can be some period of time between the end\n // of the pregnacy timer and the birth event.\n return (_kit.siringWithId == 0) && (_kit.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @dev Check if a sire has authorized breeding with this matron. True if both sire\n /// and matron have the same owner, or if the sire has given siring permission to\n /// the matron's owner (via approveSiring()).\n function _isSiringPermitted(uint256 _sireId, uint256 _matronId) internal view returns (bool) {\n address matronOwner = kittyIndexToOwner[_matronId];\n address sireOwner = kittyIndexToOwner[_sireId];\n\n // Siring is okay if they have same owner, or if the matron's owner was given\n // permission to breed with this sire.\n return (matronOwner == sireOwner || sireAllowedToAddress[_sireId] == matronOwner);\n }\n\n /// @dev Set the cooldownEndTime for the given Kitty, based on its current cooldownIndex.\n /// Also increments the cooldownIndex (unless it has hit the cap).\n /// @param _kitten A reference to the Kitty in storage which needs its timer started.\n function _triggerCooldown(Kitty storage _kitten) internal {\n // Compute an estimation of the cooldown time in blocks (based on current cooldownIndex).\n _kitten.cooldownEndBlock = uint64((cooldowns[_kitten.cooldownIndex]/secondsPerBlock) + block.number);\n\n // Increment the breeding count, clamping it at 13, which is the length of the\n // cooldowns array. We could check the array size dynamically, but hard-coding\n // this as a constant saves gas. Yay, Solidity!\n if (_kitten.cooldownIndex < 13) {\n _kitten.cooldownIndex += 1;\n }\n }\n\n /// @notice Grants approval to another user to sire with one of your Kitties.\n /// @param _addr The address that will be able to sire with your Kitty. Set to\n /// address(0) to clear all siring approvals for this Kitty.\n /// @param _sireId A Kitty that you own that _addr will now be able to sire with.\n function approveSiring(address _addr, uint256 _sireId)\n external\n whenNotPaused\n {\n require(_owns(msg.sender, _sireId));\n sireAllowedToAddress[_sireId] = _addr;\n }\n\n /// @dev Updates the minimum payment required for calling giveBirthAuto(). Can only\n /// be called by the COO address. (This fee is used to offset the gas cost incurred\n /// by the autobirth daemon).\n function setAutoBirthFee(uint256 val) external onlyCOO {\n autoBirthFee = val;\n }\n\n /// @dev Checks to see if a given Kitty is pregnant and (if so) if the gestation\n /// period has passed.\n function _isReadyToGiveBirth(Kitty _matron) private view returns (bool) {\n return (_matron.siringWithId != 0) && (_matron.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @notice Checks that a given kitten is able to breed (i.e. it is not pregnant or\n /// in the middle of a siring cooldown).\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isReadyToBreed(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n Kitty storage kit = kitties[_kittyId];\n return _isReadyToBreed(kit);\n }\n\n /// @dev Checks whether a kitty is currently pregnant.\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isPregnant(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n // A kitty is pregnant if and only if this field is set\n return kitties[_kittyId].siringWithId != 0;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair. DOES NOT\n /// check ownership permissions (that is up to the caller).\n /// @param _matron A reference to the Kitty struct of the potential matron.\n /// @param _matronId The matron's ID.\n /// @param _sire A reference to the Kitty struct of the potential sire.\n /// @param _sireId The sire's ID\n function _isValidMatingPair(\n Kitty storage _matron,\n uint256 _matronId,\n Kitty storage _sire,\n uint256 _sireId\n )\n private\n view\n returns(bool)\n {\n // A Kitty can't breed with itself!\n if (_matronId == _sireId) {\n return false;\n }\n\n // Kitties can't breed with their parents.\n if (_matron.matronId == _sireId || _matron.sireId == _sireId) {\n return false;\n }\n if (_sire.matronId == _matronId || _sire.sireId == _matronId) {\n return false;\n }\n\n // We can short circuit the sibling check (below) if either cat is\n // gen zero (has a matron ID of zero).\n if (_sire.matronId == 0 || _matron.matronId == 0) {\n return true;\n }\n\n // Kitties can't breed with full or half siblings.\n if (_sire.matronId == _matron.matronId || _sire.matronId == _matron.sireId) {\n return false;\n }\n if (_sire.sireId == _matron.matronId || _sire.sireId == _matron.sireId) {\n return false;\n }\n\n // Everything seems cool! Let's get DTF.\n return true;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair for\n /// breeding via auction (i.e. skips ownership and siring approval checks).\n function _canBreedWithViaAuction(uint256 _matronId, uint256 _sireId)\n internal\n view\n returns (bool)\n {\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId);\n }\n\n /// @notice Checks to see if two cats can breed together, including checks for\n /// ownership and siring approvals. Does NOT check that both cats are ready for\n /// breeding (i.e. breedWith could still fail until the cooldowns are finished).\n /// TODO: Shouldn't this check pregnancy and cooldowns?!?\n /// @param _matronId The ID of the proposed matron.\n /// @param _sireId The ID of the proposed sire.\n function canBreedWith(uint256 _matronId, uint256 _sireId)\n external\n view\n returns(bool)\n {\n require(_matronId > 0);\n require(_sireId > 0);\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId) &&\n _isSiringPermitted(_sireId, _matronId);\n }\n\n /// @dev Internal utility function to initiate breeding, assumes that all breeding\n /// requirements have been checked.\n function _breedWith(uint256 _matronId, uint256 _sireId) internal {\n // Grab a reference to the Kitties from storage.\n Kitty storage sire = kitties[_sireId];\n Kitty storage matron = kitties[_matronId];\n\n // Mark the matron as pregnant, keeping track of who the sire is.\n matron.siringWithId = uint32(_sireId);\n\n // Trigger the cooldown for both parents.\n _triggerCooldown(sire);\n _triggerCooldown(matron);\n\n // Clear siring permission for both parents. This may not be strictly necessary\n // but it's likely to avoid confusion!\n delete sireAllowedToAddress[_matronId];\n delete sireAllowedToAddress[_sireId];\n\n // Every time a kitty gets pregnant, counter is incremented.\n pregnantKitties++;\n\n // Emit the pregnancy event.\n Pregnant(kittyIndexToOwner[_matronId], _matronId, _sireId, matron.cooldownEndBlock);\n }\n\n /// @notice Breed a Kitty you own (as matron) with a sire that you own, or for which you\n /// have previously been given Siring approval. Will either make your cat pregnant, or will\n /// fail entirely. Requires a pre-payment of the fee given out to the first caller of giveBirth()\n /// @param _matronId The ID of the Kitty acting as matron (will end up pregnant if successful)\n /// @param _sireId The ID of the Kitty acting as sire (will begin its siring cooldown if successful)\n function breedWithAuto(uint256 _matronId, uint256 _sireId)\n external\n payable\n whenNotPaused\n {\n // Checks for payment.\n require(msg.value >= autoBirthFee);\n\n // Caller must own the matron.\n require(_owns(msg.sender, _matronId));\n\n // Neither sire nor matron are allowed to be on auction during a normal\n // breeding operation, but we don't need to check that explicitly.\n // For matron: The caller of this function can't be the owner of the matron\n // because the owner of a Kitty on auction is the auction house, and the\n // auction house will never call breedWith().\n // For sire: Similarly, a sire on auction will be owned by the auction house\n // and the act of transferring ownership will have cleared any oustanding\n // siring approval.\n // Thus we don't need to spend gas explicitly checking to see if either cat\n // is on auction.\n\n // Check that matron and sire are both owned by caller, or that the sire\n // has given siring permission to caller (i.e. matron's owner).\n // Will fail for _sireId = 0\n require(_isSiringPermitted(_sireId, _matronId));\n\n // Grab a reference to the potential matron\n Kitty storage matron = kitties[_matronId];\n\n // Make sure matron isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(matron));\n\n // Grab a reference to the potential sire\n Kitty storage sire = kitties[_sireId];\n\n // Make sure sire isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(sire));\n\n // Test that these cats are a valid mating pair.\n require(_isValidMatingPair(\n matron,\n _matronId,\n sire,\n _sireId\n ));\n\n // All checks passed, kitty gets pregnant!\n _breedWith(_matronId, _sireId);\n }\n\n /// @notice Have a pregnant Kitty give birth!\n /// @param _matronId A Kitty ready to give birth.\n /// @return The Kitty ID of the new kitten.\n /// @dev Looks at a given Kitty and, if pregnant and if the gestation period has passed,\n /// combines the genes of the two parents to create a new kitten. The new Kitty is assigned\n /// to the current owner of the matron. Upon successful completion, both the matron and the\n /// new kitten will be ready to breed again. Note that anyone can call this function (if they\n /// are willing to pay the gas!), but the new kitten always goes to the mother's owner.\n function giveBirth(uint256 _matronId)\n external\n whenNotPaused\n returns(uint256)\n {\n // Grab a reference to the matron in storage.\n Kitty storage matron = kitties[_matronId];\n\n // Check that the matron is a valid cat.\n require(matron.birthTime != 0);\n\n // Check that the matron is pregnant, and that its time has come!\n require(_isReadyToGiveBirth(matron));\n\n // Grab a reference to the sire in storage.\n uint256 sireId = matron.siringWithId;\n Kitty storage sire = kitties[sireId];\n\n // Determine the higher generation number of the two parents\n uint16 parentGen = matron.generation;\n if (sire.generation > matron.generation) {\n parentGen = sire.generation;\n }\n\n // Call the sooper-sekret gene mixing operation.\n uint256 childGenes = geneScience.mixGenes(matron.genes, sire.genes, matron.cooldownEndBlock - 1);\n\n // Make the new kitten!\n address owner = kittyIndexToOwner[_matronId];\n uint256 kittenId = _createKitty(_matronId, matron.siringWithId, parentGen + 1, childGenes, owner);\n\n // Clear the reference to sire from the matron (REQUIRED! Having siringWithId\n // set is what marks a matron as being pregnant.)\n delete matron.siringWithId;\n\n // Every time a kitty gives birth counter is decremented.\n pregnantKitties--;\n\n // Send the balance fee to the person who made birth happen.\n msg.sender.send(autoBirthFee);\n\n // return the new kitten's ID\n return kittenId;\n }\n}\n\n\n\n\n\n\n\n\n\n\n/// @title Auction Core\n/// @dev Contains models, variables, and internal methods for the auction.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuctionBase {\n\n // Represents an auction on an NFT\n struct Auction {\n // Current owner of NFT\n address seller;\n // Price (in wei) at beginning of auction\n uint128 startingPrice;\n // Price (in wei) at end of auction\n uint128 endingPrice;\n // Duration (in seconds) of auction\n uint64 duration;\n // Time when auction started\n // NOTE: 0 if this auction has been concluded\n uint64 startedAt;\n }\n\n // Reference to contract tracking NFT ownership\n KittiesERC721 public nonFungibleContract;\n\n // Cut owner takes on each auction, measured in basis points (1/100 of a percent).\n // Values 0-10,000 map to 0%-100%\n uint256 public ownerCut;\n\n // Map from token ID to their corresponding auction.\n mapping (uint256 => Auction) tokenIdToAuction;\n\n event AuctionCreated(uint256 tokenId, uint256 startingPrice, uint256 endingPrice, uint256 duration);\n event AuctionSuccessful(uint256 tokenId, uint256 totalPrice, address winner);\n event AuctionCancelled(uint256 tokenId);\n\n /// @dev Returns true if the claimant owns the token.\n /// @param _claimant - Address claiming to own the token.\n /// @param _tokenId - ID of token whose ownership to verify.\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return (nonFungibleContract.ownerOf(_tokenId) == _claimant);\n }\n\n /// @dev Escrows the NFT, assigning ownership to this contract.\n /// Throws if the escrow fails.\n /// @param _owner - Current owner address of token to escrow.\n /// @param _tokenId - ID of token whose approval to verify.\n function _escrow(address _owner, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transferFrom(_owner, this, _tokenId);\n }\n\n /// @dev Transfers an NFT owned by this contract to another address.\n /// Returns true if the transfer succeeds.\n /// @param _receiver - Address to transfer NFT to.\n /// @param _tokenId - ID of token to transfer.\n function _transfer(address _receiver, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transfer(_receiver, _tokenId);\n }\n\n /// @dev Adds an auction to the list of open auctions. Also fires the\n /// AuctionCreated event.\n /// @param _tokenId The ID of the token to be put on auction.\n /// @param _auction Auction to add.\n function _addAuction(uint256 _tokenId, Auction _auction) internal {\n // Require that all auctions have a duration of\n // at least one minute. (Keeps our math from getting hairy!)\n require(_auction.duration >= 1 minutes);\n\n tokenIdToAuction[_tokenId] = _auction;\n\n AuctionCreated(\n uint256(_tokenId),\n uint256(_auction.startingPrice),\n uint256(_auction.endingPrice),\n uint256(_auction.duration)\n );\n }\n\n /// @dev Cancels an auction unconditionally.\n function _cancelAuction(uint256 _tokenId, address _seller) internal {\n _removeAuction(_tokenId);\n _transfer(_seller, _tokenId);\n AuctionCancelled(_tokenId);\n }\n\n /// @dev Computes the price and transfers winnings.\n /// Does NOT transfer ownership of token.\n function _bid(uint256 _tokenId, uint256 _bidAmount)\n internal\n returns (uint256)\n {\n // Get a reference to the auction struct\n Auction storage auction = tokenIdToAuction[_tokenId];\n\n // Explicitly check that this auction is currently live.\n // (Because of how Ethereum mappings work, we can't just count\n // on the lookup above failing. An invalid _tokenId will just\n // return an auction object that is all zeros.)\n require(_isOnAuction(auction));\n\n // Check that the bid is greater than or equal to the current price\n uint256 price = _currentPrice(auction);\n require(_bidAmount >= price);\n\n // Grab a reference to the seller before the auction struct\n // gets deleted.\n address seller = auction.seller;\n\n // The bid is good! Remove the auction before sending the fees\n // to the sender so we can't have a reentrancy attack.\n _removeAuction(_tokenId);\n\n // Transfer proceeds to seller (if there are any!)\n if (price > 0) {\n // Calculate the auctioneer's cut.\n // (NOTE: _computeCut() is guaranteed to return a\n // value <= price, so this subtraction can't go negative.)\n uint256 auctioneerCut = _computeCut(price);\n uint256 sellerProceeds = price - auctioneerCut;\n\n // NOTE: Doing a transfer() in the middle of a complex\n // method like this is generally discouraged because of\n // reentrancy attacks and DoS attacks if the seller is\n // a contract with an invalid fallback function. We explicitly\n // guard against reentrancy attacks by removing the auction\n // before calling transfer(), and the only thing the seller\n // can DoS is the sale of their own asset! (And if it's an\n // accident, they can call cancelAuction(). )\n seller.transfer(sellerProceeds);\n }\n\n // Calculate any excess funds included with the bid. If the excess\n // is anything worth worrying about, transfer it back to bidder.\n // NOTE: We checked above that the bid amount is greater than or\n // equal to the price so this cannot underflow.\n uint256 bidExcess = _bidAmount - price;\n\n // Return the funds. Similar to the previous transfer, this is\n // not susceptible to a re-entry attack because the auction is\n // removed before any transfers occur.\n msg.sender.transfer(bidExcess);\n\n // Tell the world!\n AuctionSuccessful(_tokenId, price, msg.sender);\n\n return price;\n }\n\n /// @dev Removes an auction from the list of open auctions.\n /// @param _tokenId - ID of NFT on auction.\n function _removeAuction(uint256 _tokenId) internal {\n delete tokenIdToAuction[_tokenId];\n }\n\n /// @dev Returns true if the NFT is on auction.\n /// @param _auction - Auction to check.\n function _isOnAuction(Auction storage _auction) internal view returns (bool) {\n return (_auction.startedAt > 0);\n }\n\n /// @dev Returns current price of an NFT on auction. Broken into two\n /// functions (this one, that computes the duration from the auction\n /// structure, and the other that does the price computation) so we\n /// can easily test that the price computation works correctly.\n function _currentPrice(Auction storage _auction)\n internal\n view\n returns (uint256)\n {\n uint256 secondsPassed = 0;\n\n // A bit of insurance against negative values (or wraparound).\n // Probably not necessary (since Ethereum guarnatees that the\n // now variable doesn't ever go backwards).\n if (now > _auction.startedAt) {\n secondsPassed = now - _auction.startedAt;\n }\n\n return _computeCurrentPrice(\n _auction.startingPrice,\n _auction.endingPrice,\n _auction.duration,\n secondsPassed\n );\n }\n\n /// @dev Computes the current price of an auction. Factored out\n /// from _currentPrice so we can run extensive unit tests.\n /// When testing, make this function public and turn on\n /// `Current price computation` test suite.\n function _computeCurrentPrice(\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n uint256 _secondsPassed\n )\n internal\n pure\n returns (uint256)\n {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our public functions carefully cap the maximum values for\n // time (at 64-bits) and currency (at 128-bits). _duration is\n // also known to be non-zero (see the require() statement in\n // _addAuction())\n if (_secondsPassed >= _duration) {\n // We've reached the end of the dynamic pricing portion\n // of the auction, just return the end price.\n return _endingPrice;\n } else {\n // Starting price can be higher than ending price (and often is!), so\n // this delta can be negative.\n int256 totalPriceChange = int256(_endingPrice) - int256(_startingPrice);\n\n // This multiplication can't overflow, _secondsPassed will easily fit within\n // 64-bits, and totalPriceChange will easily fit within 128-bits, their product\n // will always fit within 256-bits.\n int256 currentPriceChange = totalPriceChange * int256(_secondsPassed) / int256(_duration);\n\n // currentPriceChange can be negative, but if so, will have a magnitude\n // less that _startingPrice. Thus, this result will always end up positive.\n int256 currentPrice = int256(_startingPrice) + currentPriceChange;\n\n return uint256(currentPrice);\n }\n }\n\n /// @dev Computes owner's cut of a sale.\n /// @param _price - Sale price of NFT.\n function _computeCut(uint256 _price) internal view returns (uint256) {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our entry functions carefully cap the maximum values for\n // currency (at 128-bits), and ownerCut <= 10000 (see the require()\n // statement in the ClockAuction constructor). The result of this\n // function is always guaranteed to be <= _price.\n return _price * ownerCut / 10000;\n }\n\n}\n\n\n\n\n\n\n\n/**\n * @title KittiesPausable\n * @dev Base contract which allows children to implement an emergency stop mechanism.\n */\ncontract KittiesPausable is KittiesOwnable {\n event Pause();\n event Unpause();\n\n bool public paused = false;\n\n\n /**\n\t * @dev modifier to allow actions only when the contract IS paused\n\t */\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /**\n\t * @dev modifier to allow actions only when the contract IS NOT paused\n\t */\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /**\n\t * @dev called by the owner to pause, triggers stopped state\n\t */\n function pause() onlyOwner whenNotPaused returns (bool) {\n paused = true;\n Pause();\n return true;\n }\n\n /**\n\t * @dev called by the owner to unpause, returns to normal state\n\t */\n function unpause() onlyOwner whenPaused returns (bool) {\n paused = false;\n Unpause();\n return true;\n }\n}\n\n\n/// @title Clock auction for non-fungible tokens.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuction is KittiesPausable, ClockAuctionBase {\n\n /// @dev The ERC-165 interface signature for ERC-721.\n /// Ref: https://github.com/ethereum/EIPs/issues/165\n /// Ref: https://github.com/ethereum/EIPs/issues/721\n bytes4 constant InterfaceSignature_ERC721 = bytes4(0x9a20483d);\n\n /// @dev Constructor creates a reference to the NFT ownership contract\n /// and verifies the owner cut is in the valid range.\n /// @param _nftAddress - address of a deployed contract implementing\n /// the Nonfungible Interface.\n /// @param _cut - percent cut the owner takes on each auction, must be\n /// between 0-10,000.\n function ClockAuction(address _nftAddress, uint256 _cut) public {\n require(_cut <= 10000);\n ownerCut = _cut;\n\n KittiesERC721 candidateContract = KittiesERC721(_nftAddress);\n require(candidateContract.supportsInterface(InterfaceSignature_ERC721));\n nonFungibleContract = candidateContract;\n }\n\n /// @dev Remove all Ether from the contract, which is the owner's cuts\n /// as well as any Ether sent directly to the contract address.\n /// Always transfers to the NFT contract, but can be called either by\n /// the owner or the NFT contract.\n function withdrawBalance() external {\n address nftAddress = address(nonFungibleContract);\n\n require(\n msg.sender == owner ||\n msg.sender == nftAddress\n );\n // We are using this boolean method to make sure that even if one fails it will still work\n bool res = nftAddress.send(this.balance);\n }\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of time to move between starting\n /// price and ending price (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n whenNotPaused\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(_owns(msg.sender, _tokenId));\n _escrow(msg.sender, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Bids on an open auction, completing the auction and transferring\n /// ownership of the NFT if enough Ether is supplied.\n /// @param _tokenId - ID of token to bid on.\n function bid(uint256 _tokenId)\n external\n payable\n whenNotPaused\n {\n // _bid will throw if the bid or funds transfer fails\n _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n }\n\n /// @dev Cancels an auction that hasn't been won yet.\n /// Returns the NFT to original owner.\n /// @notice This is a state-modifying function that can\n /// be called while the contract is paused.\n /// @param _tokenId - ID of token on auction\n function cancelAuction(uint256 _tokenId)\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n address seller = auction.seller;\n require(msg.sender == seller);\n _cancelAuction(_tokenId, seller);\n }\n\n /// @dev Cancels an auction when the contract is paused.\n /// Only the owner may do this, and NFTs are returned to\n /// the seller. This should only be used in emergencies.\n /// @param _tokenId - ID of the NFT on auction to cancel.\n function cancelAuctionWhenPaused(uint256 _tokenId)\n whenPaused\n onlyOwner\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n _cancelAuction(_tokenId, auction.seller);\n }\n\n /// @dev Returns auction info for an NFT on auction.\n /// @param _tokenId - ID of NFT on auction.\n function getAuction(uint256 _tokenId)\n external\n view\n returns\n (\n address seller,\n uint256 startingPrice,\n uint256 endingPrice,\n uint256 duration,\n uint256 startedAt\n ) {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return (\n auction.seller,\n auction.startingPrice,\n auction.endingPrice,\n auction.duration,\n auction.startedAt\n );\n }\n\n /// @dev Returns the current price of an auction.\n /// @param _tokenId - ID of the token price we are checking.\n function getCurrentPrice(uint256 _tokenId)\n external\n view\n returns (uint256)\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return _currentPrice(auction);\n }\n\n}\n\n\n/// @title Reverse auction modified for siring\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SiringClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSiringAuctionAddress() call.\n bool public isSiringClockAuction = true;\n\n // Delegate constructor\n function SiringClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction. Since this function is wrapped,\n /// require sender to be KittyCore contract.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Places a bid for siring. Requires the sender\n /// is the KittyCore contract because all bid methods\n /// should be wrapped. Also returns the kitty to the\n /// seller rather than the winner.\n function bid(uint256 _tokenId)\n external\n payable\n {\n require(msg.sender == address(nonFungibleContract));\n address seller = tokenIdToAuction[_tokenId].seller;\n // _bid checks that token ID is valid and will throw if bid fails\n _bid(_tokenId, msg.value);\n // We transfer the kitty back to the seller, the winner will get\n // the offspring\n _transfer(seller, _tokenId);\n }\n\n}\n\n\n\n\n\n/// @title Clock auction modified for sale of kitties\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SaleClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSaleAuctionAddress() call.\n bool public isSaleClockAuction = true;\n\n // Tracks last 5 sale price of gen0 kitty sales\n uint256 public gen0SaleCount;\n uint256[5] public lastGen0SalePrices;\n\n // Delegate constructor\n function SaleClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Updates lastSalePrice if seller is the nft contract\n /// Otherwise, works the same as default bid method.\n function bid(uint256 _tokenId)\n external\n payable\n {\n // _bid verifies token ID size\n address seller = tokenIdToAuction[_tokenId].seller;\n uint256 price = _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n\n // If not a gen0 auction, exit\n if (seller == address(nonFungibleContract)) {\n // Track gen0 sale prices\n lastGen0SalePrices[gen0SaleCount % 5] = price;\n gen0SaleCount++;\n }\n }\n\n function averageGen0SalePrice() external view returns (uint256) {\n uint256 sum = 0;\n for (uint256 i = 0; i < 5; i++) {\n sum += lastGen0SalePrices[i];\n }\n return sum / 5;\n }\n\n}\n\n\n/// @title Handles creating auctions for sale and siring of kitties.\n/// This wrapper of ReverseAuction exists only so that users can create\n/// auctions with only one transaction.\ncontract KittyAuction is KittyBreeding {\n\n // @notice The auction contract variables are defined in KittyBase to allow\n // us to refer to them in KittyOwnership to prevent accidental transfers.\n // `saleAuction` refers to the auction for gen0 and p2p sale of kitties.\n // `siringAuction` refers to the auction for siring rights of kitties.\n\n /// @dev Sets the reference to the sale auction.\n /// @param _address - Address of sale contract.\n function setSaleAuctionAddress(address _address) external onlyCEO {\n SaleClockAuction candidateContract = SaleClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSaleClockAuction());\n\n // Set the new contract address\n saleAuction = candidateContract;\n }\n\n /// @dev Sets the reference to the siring auction.\n /// @param _address - Address of siring contract.\n function setSiringAuctionAddress(address _address) external onlyCEO {\n SiringClockAuction candidateContract = SiringClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSiringClockAuction());\n\n // Set the new contract address\n siringAuction = candidateContract;\n }\n\n /// @dev Put a kitty up for auction.\n /// Does some ownership trickery to create auctions in one tx.\n function createSaleAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n // Ensure the kitty is not pregnant to prevent the auction\n // contract accidentally receiving ownership of the child.\n // NOTE: the kitty IS allowed to be in a cooldown.\n require(!isPregnant(_kittyId));\n _approve(_kittyId, saleAuction);\n // Sale auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n saleAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Put a kitty up for auction to be sire.\n /// Performs checks to ensure the kitty can be sired, then\n /// delegates to reverse auction.\n function createSiringAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n require(isReadyToBreed(_kittyId));\n _approve(_kittyId, siringAuction);\n // Siring auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n siringAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Completes a siring auction by bidding.\n /// Immediately breeds the winning matron with the sire on auction.\n /// @param _sireId - ID of the sire on auction.\n /// @param _matronId - ID of the matron owned by the bidder.\n function bidOnSiringAuction(\n uint256 _sireId,\n uint256 _matronId\n )\n external\n payable\n whenNotPaused\n {\n // Auction contract checks input sizes\n require(_owns(msg.sender, _matronId));\n require(isReadyToBreed(_matronId));\n require(_canBreedWithViaAuction(_matronId, _sireId));\n\n // Define the current price of the auction.\n uint256 currentPrice = siringAuction.getCurrentPrice(_sireId);\n require(msg.value >= currentPrice + autoBirthFee);\n\n // Siring auction will throw if the bid fails.\n siringAuction.bid.value(msg.value - autoBirthFee)(_sireId);\n _breedWith(uint32(_matronId), uint32(_sireId));\n }\n\n /// @dev Transfers the balance of the sale auction contract\n /// to the KittyCore contract. We use two-step withdrawal to\n /// prevent two transfer calls in the auction bid function.\n function withdrawAuctionBalances() external onlyCLevel {\n saleAuction.withdrawBalance();\n siringAuction.withdrawBalance();\n }\n}\n\n\n/// @title all functions related to creating kittens\ncontract KittyMinting is KittyAuction {\n\n // Limits the number of cats the contract owner can ever create.\n uint256 public constant PROMO_CREATION_LIMIT = 5000;\n uint256 public constant GEN0_CREATION_LIMIT = 45000;\n\n // Constants for gen0 auctions.\n uint256 public constant GEN0_STARTING_PRICE = 10 finney;\n uint256 public constant GEN0_AUCTION_DURATION = 1 days;\n\n // Counts the number of cats the contract owner has created.\n uint256 public promoCreatedCount;\n uint256 public gen0CreatedCount;\n\n /// @dev we can create promo kittens, up to a limit. Only callable by COO\n /// @param _genes the encoded genes of the kitten to be created, any value is accepted\n /// @param _owner the future owner of the created kittens. Default to contract COO\n function createPromoKitty(uint256 _genes, address _owner) external onlyCOO {\n address kittyOwner = _owner;\n if (kittyOwner == address(0)) {\n kittyOwner = cooAddress;\n }\n require(promoCreatedCount < PROMO_CREATION_LIMIT);\n\n promoCreatedCount++;\n _createKitty(0, 0, 0, _genes, kittyOwner);\n }\n\n /// @dev Creates a new gen0 kitty with the given genes and\n /// creates an auction for it.\n function createGen0Auction(uint256 _genes) external onlyCOO {\n require(gen0CreatedCount < GEN0_CREATION_LIMIT);\n\n uint256 kittyId = _createKitty(0, 0, 0, _genes, address(this));\n _approve(kittyId, saleAuction);\n\n saleAuction.createAuction(\n kittyId,\n _computeNextGen0Price(),\n 0,\n GEN0_AUCTION_DURATION,\n address(this)\n );\n\n gen0CreatedCount++;\n }\n\n /// @dev Computes the next gen0 auction starting price, given\n /// the average of the past 5 prices + 50%.\n function _computeNextGen0Price() internal view returns (uint256) {\n uint256 avePrice = saleAuction.averageGen0SalePrice();\n\n // Sanity check to ensure we don't overflow arithmetic\n require(avePrice == uint256(uint128(avePrice)));\n\n uint256 nextPrice = avePrice + (avePrice / 2);\n\n // We never auction for less than starting price\n if (nextPrice < GEN0_STARTING_PRICE) {\n nextPrice = GEN0_STARTING_PRICE;\n }\n\n return nextPrice;\n }\n}\n\n\n/// @title CryptoKitties: Collectible, breedable, and oh-so-adorable cats on the Ethereum blockchain.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev The main CryptoKitties contract, keeps track of kittens so they don't wander around and get lost.\ncontract KittyCore is KittyMinting {\n\n // This is the main CryptoKitties contract. In order to keep our code seperated into logical sections,\n // we've broken it up in two ways. First, we have several seperately-instantiated sibling contracts\n // that handle auctions and our super-top-secret genetic combination algorithm. The auctions are\n // seperate since their logic is somewhat complex and there's always a risk of subtle bugs. By keeping\n // them in their own contracts, we can upgrade them without disrupting the main contract that tracks\n // kitty ownership. The genetic combination algorithm is kept seperate so we can open-source all of\n // the rest of our code without making it _too_ easy for folks to figure out how the genetics work.\n // Don't worry, I'm sure someone will reverse engineer it soon enough!\n //\n // Secondly, we break the core contract into multiple files using inheritence, one for each major\n // facet of functionality of CK. This allows us to keep related code bundled together while still\n // avoiding a single giant file with everything in it. The breakdown is as follows:\n //\n // - KittyBase: This is where we define the most fundamental code shared throughout the core\n // functionality. This includes our main data storage, constants and data types, plus\n // internal functions for managing these items.\n //\n // - KittyAccessControl: This contract manages the various addresses and constraints for operations\n // that can be executed only by specific roles. Namely CEO, CFO and COO.\n //\n // - KittyOwnership: This provides the methods required for basic non-fungible token\n // transactions, following the draft ERC-721 spec (https://github.com/ethereum/EIPs/issues/721).\n //\n // - KittyBreeding: This file contains the methods necessary to breed cats together, including\n // keeping track of siring offers, and relies on an external genetic combination contract.\n //\n // - KittyAuctions: Here we have the public methods for auctioning or bidding on cats or siring\n // services. The actual auction functionality is handled in two sibling contracts (one\n // for sales and one for siring), while auction creation and bidding is mostly mediated\n // through this facet of the core contract.\n //\n // - KittyMinting: This final facet contains the functionality we use for creating new gen0 cats.\n // We can make up to 5000 \"promo\" cats that can be given away (especially important when\n // the community is new), and all others can only be created and then immediately put up\n // for auction via an algorithmically determined starting price. Regardless of how they\n // are created, there is a hard limit of 50k gen0 cats. After that, it's all up to the\n // community to breed, breed, breed!\n\n // Set in case the core contract is broken and an upgrade is required\n address public newContractAddress;\n\n /// @notice Creates the main CryptoKitties smart contract instance.\n function KittyCore() public {\n // Starts paused.\n paused = true;\n\n // the creator of the contract is the initial CEO\n ceoAddress = msg.sender;\n\n // the creator of the contract is also the initial COO\n cooAddress = msg.sender;\n\n // start with the mythical kitten 0 - so we don't have generation-0 parent issues\n _createKitty(0, 0, 0, uint256(-1), address(0));\n }\n\n /// @dev Used to mark the smart contract as upgraded, in case there is a serious\n /// breaking bug. This method does nothing but keep track of the new contract and\n /// emit a message indicating that the new address is set. It's up to clients of this\n /// contract to update to the new contract address in that case. (This contract will\n /// be paused indefinitely if such an upgrade takes place.)\n /// @param _v2Address new address\n function setNewAddress(address _v2Address) external onlyCEO whenPaused {\n // See README.md for updgrade plan\n newContractAddress = _v2Address;\n ContractUpgrade(_v2Address);\n }\n\n /// @notice No tipping!\n /// @dev Reject all Ether from being sent here, unless it's from one of the\n /// two auction contracts. (Hopefully, we can prevent user accidents.)\n function() external payable {\n require(\n msg.sender == address(saleAuction) ||\n msg.sender == address(siringAuction)\n );\n }\n\n /// @notice Returns all the relevant information about a specific kitty.\n /// @param _id The ID of the kitty of interest.\n function getKitty(uint256 _id)\n external\n view\n returns (\n bool isGestating,\n bool isReady,\n uint256 cooldownIndex,\n uint256 nextActionAt,\n uint256 siringWithId,\n uint256 birthTime,\n uint256 matronId,\n uint256 sireId,\n uint256 generation,\n uint256 genes\n ) {\n Kitty storage kit = kitties[_id];\n\n // if this variable is 0 then it's not gestating\n isGestating = (kit.siringWithId != 0);\n isReady = (kit.cooldownEndBlock <= block.number);\n cooldownIndex = uint256(kit.cooldownIndex);\n nextActionAt = uint256(kit.cooldownEndBlock);\n siringWithId = uint256(kit.siringWithId);\n birthTime = uint256(kit.birthTime);\n matronId = uint256(kit.matronId);\n sireId = uint256(kit.sireId);\n generation = uint256(kit.generation);\n genes = kit.genes;\n }\n\n /// @dev Override unpause so it requires all external contract addresses\n /// to be set before contract can be unpaused. Also, we can't have\n /// newContractAddress set either, because then the contract was upgraded.\n /// @notice This is public rather than external so we can call super.unpause\n /// without using an expensive CALL.\n function unpause() public onlyCEO whenPaused {\n require(saleAuction != address(0));\n require(siringAuction != address(0));\n require(geneScience != address(0));\n require(newContractAddress == address(0));\n\n // Actually unpause the contract.\n super.unpause();\n }\n\n // @dev Allows the CFO to capture the balance available to the contract.\n function withdrawBalance() external onlyCFO {\n uint256 balance = this.balance;\n // Subtract all the currently pregnant kittens we have, plus 1 of margin.\n uint256 subtractFees = (pregnantKitties + 1) * autoBirthFee;\n\n if (balance > subtractFees) {\n cfoAddress.send(balance - subtractFees);\n }\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "exportedSymbols": { "ClockAuction": [ 8872 @@ -52746,7 +52746,7 @@ "42": { "events": {}, "links": {}, - "address": "0xb5da2e05709786b89c6124c7a202dd13de2b8cd8" + "address": "0x116a62dad694e694f17cbccc917739c3f0c51666" }, "70": { "events": {}, @@ -52755,5 +52755,5 @@ } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:16:13.792Z" + "updatedAt": "2018-10-09T17:53:04.937Z" } \ No newline at end of file diff --git a/artifacts/json/KittyMinting.json b/artifacts/json/KittyMinting.json index 05009a34..6af220b7 100644 --- a/artifacts/json/KittyMinting.json +++ b/artifacts/json/KittyMinting.json @@ -1001,15 +1001,15 @@ "type": "event" } ], - "bytecode": "0x60606040526000600260146101000a81548160ff0219169083151502179055506101c060405190810160405280603c63ffffffff1663ffffffff168152602001607863ffffffff1663ffffffff16815260200161012c63ffffffff1663ffffffff16815260200161025863ffffffff1663ffffffff16815260200161070863ffffffff1663ffffffff168152602001610e1063ffffffff1663ffffffff168152602001611c2063ffffffff1663ffffffff16815260200161384063ffffffff1663ffffffff16815260200161708063ffffffff1663ffffffff16815260200161e10063ffffffff1663ffffffff1681526020016201518063ffffffff1663ffffffff1681526020016202a30063ffffffff1663ffffffff1681526020016205460063ffffffff1663ffffffff16815260200162093a8063ffffffff1663ffffffff16815250600390600e6200015692919062000179565b50600f60055566071afd498d0000600e5534156200017357600080fd5b62000259565b82600e600701600890048101928215620002105791602002820160005b83821115620001dc57835183826101000a81548163ffffffff021916908363ffffffff160217905550926020019260040160208160030104928301926001030262000196565b80156200020e5782816101000a81549063ffffffff0219169055600401602081600301049283019260010302620001dc565b505b5090506200021f919062000223565b5090565b6200025691905b808211156200025257600081816101000a81549063ffffffff0219169055506001016200022a565b5090565b90565b614b9180620002696000396000f300606060405260043610610293576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146102985780630519ce79146102f25780630560ff441461034757806305e45546146103f757806306fdde0314610420578063095ea7b3146104ae5780630a0f8168146104f05780630e583df01461054557806314001f4c1461056e57806318160ddd146105a7578063183a7947146105d05780631940a936146105f957806319c2f2011461063457806321717ebf1461065d57806323b872dd146106b257806324e7a38a1461071357806327d7874c1461074c5780632ba73c15146107855780633d7d3f5a146107be5780633f4ba83a146107fc57806346116e6f1461081157806346d22c7014610874578063481af3d3146108b85780634ad8c9381461091b5780634b85fd55146109595780634dfff04f1461097c5780634e0a3379146109be57806356129134146109f75780635663896e14610a395780635c975abb14610a5c5780636352211e14610a89578063680eba2714610aec5780636fbde40d14610b1557806370a0823114610b4e5780637a7d493714610b9b5780638456cb5914610bc45780638462151c14610bd957806388c2a0bf14610c6757806391876e5714610c9e57806395d89b4114610cb35780639d6fac6f14610d41578063a45f4bfc14610d84578063a9059cbb14610de7578063b047fb5014610e29578063b0c35c0514610e7e578063bc4006f514610ea7578063c3bea9af14610efc578063d3e6f49f14610f1f578063defb958414610f5a578063e17b25af14610f83578063e6cbe35114610fbc578063ed60ade614611011578063f1ca941014611032578063f2b47d521461105b578063f7d8c883146110b0575b600080fd5b34156102a357600080fd5b6102d860048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190919050506110d1565b604051808215151515815260200191505060405180910390f35b34156102fd57600080fd5b6103056113e2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561035257600080fd5b61037c60048080359060200190919080359060200190820180359060200191909192905050611408565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103bc5780820151818401526020810190506103a1565b50505050905090810190601f1680156103e95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561040257600080fd5b61040a611573565b6040518082815260200191505060405180910390f35b341561042b57600080fd5b610433611579565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610473578082015181840152602081019050610458565b50505050905090810190601f1680156104a05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156104b957600080fd5b6104ee600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506115b2565b005b34156104fb57600080fd5b610503611674565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561055057600080fd5b610558611699565b6040518082815260200191505060405180910390f35b341561057957600080fd5b6105a5600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506116a4565b005b34156105b257600080fd5b6105ba6117db565b6040518082815260200191505060405180910390f35b34156105db57600080fd5b6105e36117eb565b6040518082815260200191505060405180910390f35b341561060457600080fd5b61061a60048080359060200190919050506117f1565b604051808215151515815260200191505060405180910390f35b341561063f57600080fd5b610647611843565b6040518082815260200191505060405180910390f35b341561066857600080fd5b61067061184a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156106bd57600080fd5b610711600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611870565b005b341561071e57600080fd5b61074a600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611921565b005b341561075757600080fd5b610783600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611a58565b005b341561079057600080fd5b6107bc600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611b32565b005b34156107c957600080fd5b6107fa6004808035906020019091908035906020019091908035906020019091908035906020019091905050611c0d565b005b341561080757600080fd5b61080f611d75565b005b341561081c57600080fd5b6108326004808035906020019091905050611e08565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561087f57600080fd5b61089e6004808035906020019091908035906020019091905050611e3b565b604051808215151515815260200191505060405180910390f35b34156108c357600080fd5b6108d96004808035906020019091905050611ec3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561092657600080fd5b6109576004808035906020019091908035906020019091908035906020019091908035906020019091905050611ef6565b005b341561096457600080fd5b61097a600480803590602001909190505061205d565b005b341561098757600080fd5b6109bc600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506120c3565b005b34156109c957600080fd5b6109f5600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061214a565b005b3415610a0257600080fd5b610a37600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612225565b005b3415610a4457600080fd5b610a5a600480803590602001909190505061231a565b005b3415610a6757600080fd5b610a6f61246e565b604051808215151515815260200191505060405180910390f35b3415610a9457600080fd5b610aaa6004808035906020019091905050612481565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610af757600080fd5b610aff6124fa565b6040518082815260200191505060405180910390f35b3415610b2057600080fd5b610b4c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612500565b005b3415610b5957600080fd5b610b85600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612637565b6040518082815260200191505060405180910390f35b3415610ba657600080fd5b610bae612680565b6040518082815260200191505060405180910390f35b3415610bcf57600080fd5b610bd7612686565b005b3415610be457600080fd5b610c10600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506127ca565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610c53578082015181840152602081019050610c38565b505050509050019250505060405180910390f35b3415610c7257600080fd5b610c886004808035906020019091905050612901565b6040518082815260200191505060405180910390f35b3415610ca957600080fd5b610cb1612d20565b005b3415610cbe57600080fd5b610cc6612f5f565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610d06578082015181840152602081019050610ceb565b50505050905090810190601f168015610d335780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610d4c57600080fd5b610d626004808035906020019091905050612f98565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3415610d8f57600080fd5b610da56004808035906020019091905050612fc7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610df257600080fd5b610e27600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050612ffa565b005b3415610e3457600080fd5b610e3c61316b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610e8957600080fd5b610e91613191565b6040518082815260200191505060405180910390f35b3415610eb257600080fd5b610eba613197565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610f0757600080fd5b610f1d60048080359060200190919050506131bd565b005b3415610f2a57600080fd5b610f40600480803590602001909190505061337b565b604051808215151515815260200191505060405180910390f35b3415610f6557600080fd5b610f6d6134ea565b6040518082815260200191505060405180910390f35b3415610f8e57600080fd5b610fba600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506134f0565b005b3415610fc757600080fd5b610fcf61358f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61103060048080359060200190919080359060200190919050506135b5565b005b341561103d57600080fd5b61104561379e565b6040518082815260200191505060405180910390f35b341561106657600080fd5b61106e6137a4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6110cf60048080359060200190919080359060200190919050506137ca565b005b600060405180807f737570706f727473496e74657266616365286279746573342900000000000000815250601901905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806113db575060405180807f746f6b656e4d657461646174612875696e743235362c737472696e6729000000815250601d019050604051809103902060405180807f746f6b656e734f664f776e6572286164647265737329000000000000000000008152506016019050604051809103902060405180807f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81526020017f74323536290000000000000000000000000000000000000000000000000000008152506025019050604051809103902060405180807f7472616e7366657228616464726573732c75696e7432353629000000000000008152506019019050604051809103902060405180807f617070726f766528616464726573732c75696e743235362900000000000000008152506018019050604051809103902060405180807f6f776e65724f662875696e7432353629000000000000000000000000000000008152506010019050604051809103902060405180807f62616c616e63654f6628616464726573732900000000000000000000000000008152506012019050604051809103902060405180807f746f74616c537570706c79282900000000000000000000000000000000000000815250600d019050604051809103902060405180807f73796d626f6c28290000000000000000000000000000000000000000000000008152506008019050604051809103902060405180807f6e616d6528290000000000000000000000000000000000000000000000000000815250600601905060405180910390201818181818181818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6114106149a0565b6114186149b4565b60008073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561147757600080fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb4799f2878787600060405160a001526040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180848152602001806020018281038252848482818152602001925080828437820191505094505050505060a060405180830381600087803b151561153257600080fd5b6102c65a03f1151561154357600080fd5b5050506040518060800180519060200160405280925081935050506115688282613b0b565b925050509392505050565b60115481565b6040805190810160405280600d81526020017f43727970746f4b6974746965730000000000000000000000000000000000000081525081565b6115bc3382613b63565b15156115c757600080fd5b6115d18183613bcf565b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b662386f26fc1000081565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561170157600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166376190f8f6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561177057600080fd5b6102c65a03f1151561178157600080fd5b50505060405180519050151561179657600080fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600160068054905003905090565b600f5481565b6000808211151561180157600080fd5b600060068381548110151561181257fe5b906000526020600020906002020160010160189054906101000a900463ffffffff1663ffffffff1614159050919050565b6201518081565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156118ac57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156118e757600080fd5b6118f13382613c25565b15156118fc57600080fd5b6119068382613b63565b151561191157600080fd5b61191c838383613c91565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561197e57600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166354c15b826000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156119ed57600080fd5b6102c65a03f115156119fe57600080fd5b505050604051805190501515611a1357600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611ab357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611aef57600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b8d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611bc957600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260149054906101000a900460ff16151515611c2957600080fd5b611c333385613b63565b1515611c3e57600080fd5b611c47846117f1565b151515611c5357600080fd5b611c7f84600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613bcf565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a85858585336040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b1515611d5b57600080fd5b6102c65a03f11515611d6c57600080fd5b50505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611dd057600080fd5b600260149054906101000a900460ff161515611deb57600080fd5b6000600260146101000a81548160ff021916908315150217905550565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008085111515611e4e57600080fd5b600084111515611e5d57600080fd5b600685815481101515611e6c57fe5b90600052602060002090600202019150600684815481101515611e8b57fe5b90600052602060002090600202019050611ea782868387613ec9565b8015611eb95750611eb884866140de565b5b9250505092915050565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff16151515611f1257600080fd5b611f1c3385613b63565b1515611f2757600080fd5b611f308461337b565b1515611f3b57600080fd5b611f6784600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613bcf565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a85858585336040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b151561204357600080fd5b6102c65a03f1151561205457600080fd5b50505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156120b957600080fd5b80600e8190555050565b600260149054906101000a900460ff161515156120df57600080fd5b6120e93382613b63565b15156120f457600080fd5b81600a600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156121a557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156121e157600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561228357600080fd5b819050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156122e157600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b6113886011541015156122f357600080fd5b601160008154809291906001019190505550612314600080600086856141f1565b50505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806123c257506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061241a5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561242557600080fd5b60036000600e8110151561243557fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff168110151561246457600080fd5b8060058190555050565b600260149054906101000a900460ff1681565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156124f557600080fd5b919050565b61afc881565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561255d57600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166385b861886000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156125cc57600080fd5b6102c65a03f115156125dd57600080fd5b5050506040518051905015156125f257600080fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061272e57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806127865750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561279157600080fd5b600260149054906101000a900460ff161515156127ad57600080fd5b6001600260146101000a81548160ff021916908315150217905550565b6127d26149df565b60006127dc6149df565b60008060006127ea87612637565b9450600085141561281c5760006040518059106128045750595b908082528060200260200182016040525095506128f7565b8460405180591061282a5750595b908082528060200260200182016040525093506128456117db565b925060009150600190505b82811115156128f3578673ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156128e6578084838151811015156128cf57fe5b906020019060200201818152505081806001019250505b8080600101915050612850565b8395505b5050505050919050565b600080600080600080600080600260149054906101000a900460ff1615151561292957600080fd5b60068981548110151561293857fe5b9060005260206000209060020201965060008760010160009054906101000a900467ffffffffffffffff1667ffffffffffffffff161415151561297a57600080fd5b612ab0876101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff16815250506144e4565b1515612abb57600080fd5b8660010160189054906101000a900463ffffffff1663ffffffff169550600686815481101515612ae757fe5b9060005260206000209060020201945086600101601e9054906101000a900461ffff16935086600101601e9054906101000a900461ffff1661ffff1685600101601e9054906101000a900461ffff1661ffff161115612b565784600101601e9054906101000a900461ffff1693505b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d9f5aed8860000154876000015460018b60010160089054906101000a900467ffffffffffffffff16036000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018381526020018267ffffffffffffffff1681526020019350505050602060405180830381600087803b1515612c2c57600080fd5b6102c65a03f11515612c3d57600080fd5b505050604051805190509250600760008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150612cad898860010160189054906101000a900463ffffffff1663ffffffff166001870161ffff1686866141f1565b90508660010160186101000a81549063ffffffff0219169055600f60008154809291906001900391905055503373ffffffffffffffffffffffffffffffffffffffff166108fc600e549081150290604051600060405180830381858888f193505050505080975050505050505050919050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612dc857506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80612e205750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515612e2b57600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b1515612eb057600080fd5b6102c65a03f11515612ec157600080fd5b505050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b1515612f4957600080fd5b6102c65a03f11515612f5a57600080fd5b505050565b6040805190810160405280600281526020017f434b00000000000000000000000000000000000000000000000000000000000081525081565b600381600e81101515612fa757fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff1615151561301657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561305257600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561308d57600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156130ea57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561314757600080fd5b6131513382613b63565b151561315c57600080fd5b613167338383613c91565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561321b57600080fd5b61afc860125410151561322d57600080fd5b61323c600080600085306141f1565b905061326a81600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613bcf565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a826132b161451f565b600062015180306040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b151561335157600080fd5b6102c65a03f1151561336257600080fd5b5050506012600081548092919060010191905055505050565b60008060008311151561338d57600080fd5b60068381548110151561339c57fe5b906000526020600020906002020190506134e2816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614622565b915050919050565b61138881565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561354b57600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260149054906101000a900460ff161515156135d357600080fd5b6135dd3383613b63565b15156135e857600080fd5b6135f18261337b565b15156135fc57600080fd5b613606828461465c565b151561361157600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c55d0f56846000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15156136aa57600080fd5b6102c65a03f115156136bb57600080fd5b505050604051805190509050600e54810134101515156136da57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663454a2ab3600e543403856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808281526020019150506000604051808303818588803b151561376e57600080fd5b6125ee5a03f1151561377f57600080fd5b505050506137998263ffffffff168463ffffffff166146b5565b505050565b60125481565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600260149054906101000a900460ff161515156137e957600080fd5b600e5434101515156137fa57600080fd5b6138043385613b63565b151561380f57600080fd5b61381983856140de565b151561382457600080fd5b60068481548110151561383357fe5b90600052602060002090600202019150613979826101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614622565b151561398457600080fd5b60068381548110151561399357fe5b90600052602060002090600202019050613ad9816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614622565b1515613ae457600080fd5b613af082858386613ec9565b1515613afb57600080fd5b613b0584846146b5565b50505050565b613b136149a0565b613b1b6149a0565b60008084604051805910613b2c5750595b9080825280601f01601f19166020018201604052509250602083019150859050613b5782828761487f565b82935050505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff166007600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b806009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008273ffffffffffffffffffffffffffffffffffffffff166009600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515613e2557600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600a600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556009600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b600081841415613edc57600090506140d6565b818560010160109054906101000a900463ffffffff1663ffffffff161480613f1d5750818560010160149054906101000a900463ffffffff1663ffffffff16145b15613f2b57600090506140d6565b838360010160109054906101000a900463ffffffff1663ffffffff161480613f6c5750838360010160149054906101000a900463ffffffff1663ffffffff16145b15613f7a57600090506140d6565b60008360010160109054906101000a900463ffffffff1663ffffffff161480613fbd575060008560010160109054906101000a900463ffffffff1663ffffffff16145b15613fcb57600190506140d6565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff16148061404057508460010160149054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff16145b1561404e57600090506140d6565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff1614806140c357508460010160149054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff16145b156140d157600090506140d6565b600190505b949350505050565b60008060006007600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806141e757508173ffffffffffffffffffffffffffffffffffffffff16600a600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b9250505092915050565b6000806141fc6149f3565b60008863ffffffff168914151561421257600080fd5b8763ffffffff168814151561422657600080fd5b8661ffff168714151561423857600080fd5b60028781151561424457fe5b049250600d8361ffff16111561425957600d92505b610100604051908101604052808781526020014267ffffffffffffffff168152602001600067ffffffffffffffff1681526020018a63ffffffff1681526020018963ffffffff168152602001600063ffffffff1681526020018461ffff1681526020018861ffff1681525091506001600680548060010182816142dc9190614a67565b916000526020600020906002020160008590919091506000820151816000015560208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601c6101000a81548161ffff021916908361ffff16021790555060e082015181600101601e6101000a81548161ffff021916908361ffff16021790555050500390508063ffffffff168114151561442e57600080fd5b7f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad58582846060015163ffffffff16856080015163ffffffff168660000151604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a16144d560008683613c91565b80935050505095945050505050565b6000808260a0015163ffffffff161415801561451857504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b6000806000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663eac9d94c6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156145b257600080fd5b6102c65a03f115156145c357600080fd5b505050604051805190509150816fffffffffffffffffffffffffffffffff16821415156145ef57600080fd5b6002828115156145fb57fe5b0482019050662386f26fc1000081101561461a57662386f26fc1000090505b809250505090565b6000808260a0015163ffffffff1614801561465557504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b600080600060068581548110151561467057fe5b9060005260206000209060020201915060068481548110151561468f57fe5b906000526020600020906002020190506146ab82868387613ec9565b9250505092915050565b6000806006838154811015156146c757fe5b906000526020600020906002020191506006848154811015156146e657fe5b90600052602060002090600202019050828160010160186101000a81548163ffffffff021916908363ffffffff160217905550614722826148ca565b61472b816148ca565b600a600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600a600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600f600081548092919060010191905055507f241ea03ca20251805084d27d4440371c34a0b85ff108f6bb5611248f73818b806007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685858460010160089054906101000a900467ffffffffffffffff16604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018267ffffffffffffffff16815260200194505050505060405180910390a150505050565b60005b6020821015156148a75782518452602084019350602083019250602082039150614882565b6001826020036101000a0390508019835116818551168181178652505050505050565b43600554600383600101601c9054906101000a900461ffff1661ffff16600e811015156148f357fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff1681151561491e57fe5b04018160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600d81600101601c9054906101000a900461ffff1661ffff16101561499d57600181600101601c8282829054906101000a900461ffff160192506101000a81548161ffff021916908361ffff1602179055505b50565b602060405190810160405280600081525090565b6080604051908101604052806004905b60008019168152602001906001900390816149c45790505090565b602060405190810160405280600081525090565b6101006040519081016040528060008152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600061ffff168152602001600061ffff1681525090565b815481835581811511614a9457600202816002028360005260206000209182019101614a939190614a99565b5b505050565b614b6291905b80821115614b5e576000808201600090556001820160006101000a81549067ffffffffffffffff02191690556001820160086101000a81549067ffffffffffffffff02191690556001820160106101000a81549063ffffffff02191690556001820160146101000a81549063ffffffff02191690556001820160186101000a81549063ffffffff021916905560018201601c6101000a81549061ffff021916905560018201601e6101000a81549061ffff021916905550600201614a9f565b5090565b905600a165627a7a72305820eb87229a99a533a2433b22e3391b8381a60f80c64c82bf3a1954747fc8acd7420029", - "deployedBytecode": "0x606060405260043610610293576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146102985780630519ce79146102f25780630560ff441461034757806305e45546146103f757806306fdde0314610420578063095ea7b3146104ae5780630a0f8168146104f05780630e583df01461054557806314001f4c1461056e57806318160ddd146105a7578063183a7947146105d05780631940a936146105f957806319c2f2011461063457806321717ebf1461065d57806323b872dd146106b257806324e7a38a1461071357806327d7874c1461074c5780632ba73c15146107855780633d7d3f5a146107be5780633f4ba83a146107fc57806346116e6f1461081157806346d22c7014610874578063481af3d3146108b85780634ad8c9381461091b5780634b85fd55146109595780634dfff04f1461097c5780634e0a3379146109be57806356129134146109f75780635663896e14610a395780635c975abb14610a5c5780636352211e14610a89578063680eba2714610aec5780636fbde40d14610b1557806370a0823114610b4e5780637a7d493714610b9b5780638456cb5914610bc45780638462151c14610bd957806388c2a0bf14610c6757806391876e5714610c9e57806395d89b4114610cb35780639d6fac6f14610d41578063a45f4bfc14610d84578063a9059cbb14610de7578063b047fb5014610e29578063b0c35c0514610e7e578063bc4006f514610ea7578063c3bea9af14610efc578063d3e6f49f14610f1f578063defb958414610f5a578063e17b25af14610f83578063e6cbe35114610fbc578063ed60ade614611011578063f1ca941014611032578063f2b47d521461105b578063f7d8c883146110b0575b600080fd5b34156102a357600080fd5b6102d860048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190919050506110d1565b604051808215151515815260200191505060405180910390f35b34156102fd57600080fd5b6103056113e2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561035257600080fd5b61037c60048080359060200190919080359060200190820180359060200191909192905050611408565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103bc5780820151818401526020810190506103a1565b50505050905090810190601f1680156103e95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561040257600080fd5b61040a611573565b6040518082815260200191505060405180910390f35b341561042b57600080fd5b610433611579565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610473578082015181840152602081019050610458565b50505050905090810190601f1680156104a05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156104b957600080fd5b6104ee600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506115b2565b005b34156104fb57600080fd5b610503611674565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561055057600080fd5b610558611699565b6040518082815260200191505060405180910390f35b341561057957600080fd5b6105a5600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506116a4565b005b34156105b257600080fd5b6105ba6117db565b6040518082815260200191505060405180910390f35b34156105db57600080fd5b6105e36117eb565b6040518082815260200191505060405180910390f35b341561060457600080fd5b61061a60048080359060200190919050506117f1565b604051808215151515815260200191505060405180910390f35b341561063f57600080fd5b610647611843565b6040518082815260200191505060405180910390f35b341561066857600080fd5b61067061184a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156106bd57600080fd5b610711600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611870565b005b341561071e57600080fd5b61074a600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611921565b005b341561075757600080fd5b610783600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611a58565b005b341561079057600080fd5b6107bc600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611b32565b005b34156107c957600080fd5b6107fa6004808035906020019091908035906020019091908035906020019091908035906020019091905050611c0d565b005b341561080757600080fd5b61080f611d75565b005b341561081c57600080fd5b6108326004808035906020019091905050611e08565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561087f57600080fd5b61089e6004808035906020019091908035906020019091905050611e3b565b604051808215151515815260200191505060405180910390f35b34156108c357600080fd5b6108d96004808035906020019091905050611ec3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561092657600080fd5b6109576004808035906020019091908035906020019091908035906020019091908035906020019091905050611ef6565b005b341561096457600080fd5b61097a600480803590602001909190505061205d565b005b341561098757600080fd5b6109bc600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506120c3565b005b34156109c957600080fd5b6109f5600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061214a565b005b3415610a0257600080fd5b610a37600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612225565b005b3415610a4457600080fd5b610a5a600480803590602001909190505061231a565b005b3415610a6757600080fd5b610a6f61246e565b604051808215151515815260200191505060405180910390f35b3415610a9457600080fd5b610aaa6004808035906020019091905050612481565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610af757600080fd5b610aff6124fa565b6040518082815260200191505060405180910390f35b3415610b2057600080fd5b610b4c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612500565b005b3415610b5957600080fd5b610b85600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612637565b6040518082815260200191505060405180910390f35b3415610ba657600080fd5b610bae612680565b6040518082815260200191505060405180910390f35b3415610bcf57600080fd5b610bd7612686565b005b3415610be457600080fd5b610c10600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506127ca565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610c53578082015181840152602081019050610c38565b505050509050019250505060405180910390f35b3415610c7257600080fd5b610c886004808035906020019091905050612901565b6040518082815260200191505060405180910390f35b3415610ca957600080fd5b610cb1612d20565b005b3415610cbe57600080fd5b610cc6612f5f565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610d06578082015181840152602081019050610ceb565b50505050905090810190601f168015610d335780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610d4c57600080fd5b610d626004808035906020019091905050612f98565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3415610d8f57600080fd5b610da56004808035906020019091905050612fc7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610df257600080fd5b610e27600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050612ffa565b005b3415610e3457600080fd5b610e3c61316b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610e8957600080fd5b610e91613191565b6040518082815260200191505060405180910390f35b3415610eb257600080fd5b610eba613197565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610f0757600080fd5b610f1d60048080359060200190919050506131bd565b005b3415610f2a57600080fd5b610f40600480803590602001909190505061337b565b604051808215151515815260200191505060405180910390f35b3415610f6557600080fd5b610f6d6134ea565b6040518082815260200191505060405180910390f35b3415610f8e57600080fd5b610fba600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506134f0565b005b3415610fc757600080fd5b610fcf61358f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61103060048080359060200190919080359060200190919050506135b5565b005b341561103d57600080fd5b61104561379e565b6040518082815260200191505060405180910390f35b341561106657600080fd5b61106e6137a4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6110cf60048080359060200190919080359060200190919050506137ca565b005b600060405180807f737570706f727473496e74657266616365286279746573342900000000000000815250601901905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806113db575060405180807f746f6b656e4d657461646174612875696e743235362c737472696e6729000000815250601d019050604051809103902060405180807f746f6b656e734f664f776e6572286164647265737329000000000000000000008152506016019050604051809103902060405180807f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81526020017f74323536290000000000000000000000000000000000000000000000000000008152506025019050604051809103902060405180807f7472616e7366657228616464726573732c75696e7432353629000000000000008152506019019050604051809103902060405180807f617070726f766528616464726573732c75696e743235362900000000000000008152506018019050604051809103902060405180807f6f776e65724f662875696e7432353629000000000000000000000000000000008152506010019050604051809103902060405180807f62616c616e63654f6628616464726573732900000000000000000000000000008152506012019050604051809103902060405180807f746f74616c537570706c79282900000000000000000000000000000000000000815250600d019050604051809103902060405180807f73796d626f6c28290000000000000000000000000000000000000000000000008152506008019050604051809103902060405180807f6e616d6528290000000000000000000000000000000000000000000000000000815250600601905060405180910390201818181818181818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6114106149a0565b6114186149b4565b60008073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561147757600080fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb4799f2878787600060405160a001526040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180848152602001806020018281038252848482818152602001925080828437820191505094505050505060a060405180830381600087803b151561153257600080fd5b6102c65a03f1151561154357600080fd5b5050506040518060800180519060200160405280925081935050506115688282613b0b565b925050509392505050565b60115481565b6040805190810160405280600d81526020017f43727970746f4b6974746965730000000000000000000000000000000000000081525081565b6115bc3382613b63565b15156115c757600080fd5b6115d18183613bcf565b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b662386f26fc1000081565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561170157600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166376190f8f6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561177057600080fd5b6102c65a03f1151561178157600080fd5b50505060405180519050151561179657600080fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600160068054905003905090565b600f5481565b6000808211151561180157600080fd5b600060068381548110151561181257fe5b906000526020600020906002020160010160189054906101000a900463ffffffff1663ffffffff1614159050919050565b6201518081565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156118ac57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156118e757600080fd5b6118f13382613c25565b15156118fc57600080fd5b6119068382613b63565b151561191157600080fd5b61191c838383613c91565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561197e57600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166354c15b826000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156119ed57600080fd5b6102c65a03f115156119fe57600080fd5b505050604051805190501515611a1357600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611ab357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611aef57600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b8d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611bc957600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260149054906101000a900460ff16151515611c2957600080fd5b611c333385613b63565b1515611c3e57600080fd5b611c47846117f1565b151515611c5357600080fd5b611c7f84600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613bcf565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a85858585336040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b1515611d5b57600080fd5b6102c65a03f11515611d6c57600080fd5b50505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611dd057600080fd5b600260149054906101000a900460ff161515611deb57600080fd5b6000600260146101000a81548160ff021916908315150217905550565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008085111515611e4e57600080fd5b600084111515611e5d57600080fd5b600685815481101515611e6c57fe5b90600052602060002090600202019150600684815481101515611e8b57fe5b90600052602060002090600202019050611ea782868387613ec9565b8015611eb95750611eb884866140de565b5b9250505092915050565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff16151515611f1257600080fd5b611f1c3385613b63565b1515611f2757600080fd5b611f308461337b565b1515611f3b57600080fd5b611f6784600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613bcf565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a85858585336040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b151561204357600080fd5b6102c65a03f1151561205457600080fd5b50505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156120b957600080fd5b80600e8190555050565b600260149054906101000a900460ff161515156120df57600080fd5b6120e93382613b63565b15156120f457600080fd5b81600a600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156121a557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156121e157600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561228357600080fd5b819050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156122e157600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b6113886011541015156122f357600080fd5b601160008154809291906001019190505550612314600080600086856141f1565b50505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806123c257506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061241a5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561242557600080fd5b60036000600e8110151561243557fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff168110151561246457600080fd5b8060058190555050565b600260149054906101000a900460ff1681565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156124f557600080fd5b919050565b61afc881565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561255d57600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166385b861886000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156125cc57600080fd5b6102c65a03f115156125dd57600080fd5b5050506040518051905015156125f257600080fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061272e57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806127865750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561279157600080fd5b600260149054906101000a900460ff161515156127ad57600080fd5b6001600260146101000a81548160ff021916908315150217905550565b6127d26149df565b60006127dc6149df565b60008060006127ea87612637565b9450600085141561281c5760006040518059106128045750595b908082528060200260200182016040525095506128f7565b8460405180591061282a5750595b908082528060200260200182016040525093506128456117db565b925060009150600190505b82811115156128f3578673ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156128e6578084838151811015156128cf57fe5b906020019060200201818152505081806001019250505b8080600101915050612850565b8395505b5050505050919050565b600080600080600080600080600260149054906101000a900460ff1615151561292957600080fd5b60068981548110151561293857fe5b9060005260206000209060020201965060008760010160009054906101000a900467ffffffffffffffff1667ffffffffffffffff161415151561297a57600080fd5b612ab0876101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff16815250506144e4565b1515612abb57600080fd5b8660010160189054906101000a900463ffffffff1663ffffffff169550600686815481101515612ae757fe5b9060005260206000209060020201945086600101601e9054906101000a900461ffff16935086600101601e9054906101000a900461ffff1661ffff1685600101601e9054906101000a900461ffff1661ffff161115612b565784600101601e9054906101000a900461ffff1693505b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d9f5aed8860000154876000015460018b60010160089054906101000a900467ffffffffffffffff16036000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018381526020018267ffffffffffffffff1681526020019350505050602060405180830381600087803b1515612c2c57600080fd5b6102c65a03f11515612c3d57600080fd5b505050604051805190509250600760008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150612cad898860010160189054906101000a900463ffffffff1663ffffffff166001870161ffff1686866141f1565b90508660010160186101000a81549063ffffffff0219169055600f60008154809291906001900391905055503373ffffffffffffffffffffffffffffffffffffffff166108fc600e549081150290604051600060405180830381858888f193505050505080975050505050505050919050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612dc857506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80612e205750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515612e2b57600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b1515612eb057600080fd5b6102c65a03f11515612ec157600080fd5b505050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b1515612f4957600080fd5b6102c65a03f11515612f5a57600080fd5b505050565b6040805190810160405280600281526020017f434b00000000000000000000000000000000000000000000000000000000000081525081565b600381600e81101515612fa757fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff1615151561301657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561305257600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561308d57600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156130ea57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561314757600080fd5b6131513382613b63565b151561315c57600080fd5b613167338383613c91565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561321b57600080fd5b61afc860125410151561322d57600080fd5b61323c600080600085306141f1565b905061326a81600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613bcf565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a826132b161451f565b600062015180306040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b151561335157600080fd5b6102c65a03f1151561336257600080fd5b5050506012600081548092919060010191905055505050565b60008060008311151561338d57600080fd5b60068381548110151561339c57fe5b906000526020600020906002020190506134e2816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614622565b915050919050565b61138881565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561354b57600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260149054906101000a900460ff161515156135d357600080fd5b6135dd3383613b63565b15156135e857600080fd5b6135f18261337b565b15156135fc57600080fd5b613606828461465c565b151561361157600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c55d0f56846000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15156136aa57600080fd5b6102c65a03f115156136bb57600080fd5b505050604051805190509050600e54810134101515156136da57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663454a2ab3600e543403856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808281526020019150506000604051808303818588803b151561376e57600080fd5b6125ee5a03f1151561377f57600080fd5b505050506137998263ffffffff168463ffffffff166146b5565b505050565b60125481565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600260149054906101000a900460ff161515156137e957600080fd5b600e5434101515156137fa57600080fd5b6138043385613b63565b151561380f57600080fd5b61381983856140de565b151561382457600080fd5b60068481548110151561383357fe5b90600052602060002090600202019150613979826101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614622565b151561398457600080fd5b60068381548110151561399357fe5b90600052602060002090600202019050613ad9816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614622565b1515613ae457600080fd5b613af082858386613ec9565b1515613afb57600080fd5b613b0584846146b5565b50505050565b613b136149a0565b613b1b6149a0565b60008084604051805910613b2c5750595b9080825280601f01601f19166020018201604052509250602083019150859050613b5782828761487f565b82935050505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff166007600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b806009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008273ffffffffffffffffffffffffffffffffffffffff166009600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515613e2557600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600a600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556009600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b600081841415613edc57600090506140d6565b818560010160109054906101000a900463ffffffff1663ffffffff161480613f1d5750818560010160149054906101000a900463ffffffff1663ffffffff16145b15613f2b57600090506140d6565b838360010160109054906101000a900463ffffffff1663ffffffff161480613f6c5750838360010160149054906101000a900463ffffffff1663ffffffff16145b15613f7a57600090506140d6565b60008360010160109054906101000a900463ffffffff1663ffffffff161480613fbd575060008560010160109054906101000a900463ffffffff1663ffffffff16145b15613fcb57600190506140d6565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff16148061404057508460010160149054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff16145b1561404e57600090506140d6565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff1614806140c357508460010160149054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff16145b156140d157600090506140d6565b600190505b949350505050565b60008060006007600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806141e757508173ffffffffffffffffffffffffffffffffffffffff16600a600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b9250505092915050565b6000806141fc6149f3565b60008863ffffffff168914151561421257600080fd5b8763ffffffff168814151561422657600080fd5b8661ffff168714151561423857600080fd5b60028781151561424457fe5b049250600d8361ffff16111561425957600d92505b610100604051908101604052808781526020014267ffffffffffffffff168152602001600067ffffffffffffffff1681526020018a63ffffffff1681526020018963ffffffff168152602001600063ffffffff1681526020018461ffff1681526020018861ffff1681525091506001600680548060010182816142dc9190614a67565b916000526020600020906002020160008590919091506000820151816000015560208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601c6101000a81548161ffff021916908361ffff16021790555060e082015181600101601e6101000a81548161ffff021916908361ffff16021790555050500390508063ffffffff168114151561442e57600080fd5b7f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad58582846060015163ffffffff16856080015163ffffffff168660000151604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a16144d560008683613c91565b80935050505095945050505050565b6000808260a0015163ffffffff161415801561451857504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b6000806000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663eac9d94c6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156145b257600080fd5b6102c65a03f115156145c357600080fd5b505050604051805190509150816fffffffffffffffffffffffffffffffff16821415156145ef57600080fd5b6002828115156145fb57fe5b0482019050662386f26fc1000081101561461a57662386f26fc1000090505b809250505090565b6000808260a0015163ffffffff1614801561465557504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b600080600060068581548110151561467057fe5b9060005260206000209060020201915060068481548110151561468f57fe5b906000526020600020906002020190506146ab82868387613ec9565b9250505092915050565b6000806006838154811015156146c757fe5b906000526020600020906002020191506006848154811015156146e657fe5b90600052602060002090600202019050828160010160186101000a81548163ffffffff021916908363ffffffff160217905550614722826148ca565b61472b816148ca565b600a600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600a600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600f600081548092919060010191905055507f241ea03ca20251805084d27d4440371c34a0b85ff108f6bb5611248f73818b806007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685858460010160089054906101000a900467ffffffffffffffff16604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018267ffffffffffffffff16815260200194505050505060405180910390a150505050565b60005b6020821015156148a75782518452602084019350602083019250602082039150614882565b6001826020036101000a0390508019835116818551168181178652505050505050565b43600554600383600101601c9054906101000a900461ffff1661ffff16600e811015156148f357fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff1681151561491e57fe5b04018160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600d81600101601c9054906101000a900461ffff1661ffff16101561499d57600181600101601c8282829054906101000a900461ffff160192506101000a81548161ffff021916908361ffff1602179055505b50565b602060405190810160405280600081525090565b6080604051908101604052806004905b60008019168152602001906001900390816149c45790505090565b602060405190810160405280600081525090565b6101006040519081016040528060008152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600061ffff168152602001600061ffff1681525090565b815481835581811511614a9457600202816002028360005260206000209182019101614a939190614a99565b5b505050565b614b6291905b80821115614b5e576000808201600090556001820160006101000a81549067ffffffffffffffff02191690556001820160086101000a81549067ffffffffffffffff02191690556001820160106101000a81549063ffffffff02191690556001820160146101000a81549063ffffffff02191690556001820160186101000a81549063ffffffff021916905560018201601c6101000a81549061ffff021916905560018201601e6101000a81549061ffff021916905550600201614a9f565b5090565b905600a165627a7a72305820eb87229a99a533a2433b22e3391b8381a60f80c64c82bf3a1954747fc8acd7420029", + "bytecode": "0x60606040526000600260146101000a81548160ff0219169083151502179055506101c060405190810160405280603c63ffffffff1663ffffffff168152602001607863ffffffff1663ffffffff16815260200161012c63ffffffff1663ffffffff16815260200161025863ffffffff1663ffffffff16815260200161070863ffffffff1663ffffffff168152602001610e1063ffffffff1663ffffffff168152602001611c2063ffffffff1663ffffffff16815260200161384063ffffffff1663ffffffff16815260200161708063ffffffff1663ffffffff16815260200161e10063ffffffff1663ffffffff1681526020016201518063ffffffff1663ffffffff1681526020016202a30063ffffffff1663ffffffff1681526020016205460063ffffffff1663ffffffff16815260200162093a8063ffffffff1663ffffffff16815250600390600e6200015692919062000179565b50600f60055566071afd498d0000600e5534156200017357600080fd5b62000259565b82600e600701600890048101928215620002105791602002820160005b83821115620001dc57835183826101000a81548163ffffffff021916908363ffffffff160217905550926020019260040160208160030104928301926001030262000196565b80156200020e5782816101000a81549063ffffffff0219169055600401602081600301049283019260010302620001dc565b505b5090506200021f919062000223565b5090565b6200025691905b808211156200025257600081816101000a81549063ffffffff0219169055506001016200022a565b5090565b90565b614b9180620002696000396000f300606060405260043610610293576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146102985780630519ce79146102f25780630560ff441461034757806305e45546146103f757806306fdde0314610420578063095ea7b3146104ae5780630a0f8168146104f05780630e583df01461054557806314001f4c1461056e57806318160ddd146105a7578063183a7947146105d05780631940a936146105f957806319c2f2011461063457806321717ebf1461065d57806323b872dd146106b257806324e7a38a1461071357806327d7874c1461074c5780632ba73c15146107855780633d7d3f5a146107be5780633f4ba83a146107fc57806346116e6f1461081157806346d22c7014610874578063481af3d3146108b85780634ad8c9381461091b5780634b85fd55146109595780634dfff04f1461097c5780634e0a3379146109be57806356129134146109f75780635663896e14610a395780635c975abb14610a5c5780636352211e14610a89578063680eba2714610aec5780636fbde40d14610b1557806370a0823114610b4e5780637a7d493714610b9b5780638456cb5914610bc45780638462151c14610bd957806388c2a0bf14610c6757806391876e5714610c9e57806395d89b4114610cb35780639d6fac6f14610d41578063a45f4bfc14610d84578063a9059cbb14610de7578063b047fb5014610e29578063b0c35c0514610e7e578063bc4006f514610ea7578063c3bea9af14610efc578063d3e6f49f14610f1f578063defb958414610f5a578063e17b25af14610f83578063e6cbe35114610fbc578063ed60ade614611011578063f1ca941014611032578063f2b47d521461105b578063f7d8c883146110b0575b600080fd5b34156102a357600080fd5b6102d860048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190919050506110d1565b604051808215151515815260200191505060405180910390f35b34156102fd57600080fd5b6103056113e2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561035257600080fd5b61037c60048080359060200190919080359060200190820180359060200191909192905050611408565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103bc5780820151818401526020810190506103a1565b50505050905090810190601f1680156103e95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561040257600080fd5b61040a611573565b6040518082815260200191505060405180910390f35b341561042b57600080fd5b610433611579565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610473578082015181840152602081019050610458565b50505050905090810190601f1680156104a05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156104b957600080fd5b6104ee600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506115b2565b005b34156104fb57600080fd5b610503611674565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561055057600080fd5b610558611699565b6040518082815260200191505060405180910390f35b341561057957600080fd5b6105a5600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506116a4565b005b34156105b257600080fd5b6105ba6117db565b6040518082815260200191505060405180910390f35b34156105db57600080fd5b6105e36117eb565b6040518082815260200191505060405180910390f35b341561060457600080fd5b61061a60048080359060200190919050506117f1565b604051808215151515815260200191505060405180910390f35b341561063f57600080fd5b610647611843565b6040518082815260200191505060405180910390f35b341561066857600080fd5b61067061184a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156106bd57600080fd5b610711600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611870565b005b341561071e57600080fd5b61074a600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611921565b005b341561075757600080fd5b610783600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611a58565b005b341561079057600080fd5b6107bc600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611b32565b005b34156107c957600080fd5b6107fa6004808035906020019091908035906020019091908035906020019091908035906020019091905050611c0d565b005b341561080757600080fd5b61080f611d75565b005b341561081c57600080fd5b6108326004808035906020019091905050611e08565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561087f57600080fd5b61089e6004808035906020019091908035906020019091905050611e3b565b604051808215151515815260200191505060405180910390f35b34156108c357600080fd5b6108d96004808035906020019091905050611ec3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561092657600080fd5b6109576004808035906020019091908035906020019091908035906020019091908035906020019091905050611ef6565b005b341561096457600080fd5b61097a600480803590602001909190505061205d565b005b341561098757600080fd5b6109bc600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506120c3565b005b34156109c957600080fd5b6109f5600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061214a565b005b3415610a0257600080fd5b610a37600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612225565b005b3415610a4457600080fd5b610a5a600480803590602001909190505061231a565b005b3415610a6757600080fd5b610a6f61246e565b604051808215151515815260200191505060405180910390f35b3415610a9457600080fd5b610aaa6004808035906020019091905050612481565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610af757600080fd5b610aff6124fa565b6040518082815260200191505060405180910390f35b3415610b2057600080fd5b610b4c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612500565b005b3415610b5957600080fd5b610b85600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612637565b6040518082815260200191505060405180910390f35b3415610ba657600080fd5b610bae612680565b6040518082815260200191505060405180910390f35b3415610bcf57600080fd5b610bd7612686565b005b3415610be457600080fd5b610c10600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506127ca565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610c53578082015181840152602081019050610c38565b505050509050019250505060405180910390f35b3415610c7257600080fd5b610c886004808035906020019091905050612901565b6040518082815260200191505060405180910390f35b3415610ca957600080fd5b610cb1612d20565b005b3415610cbe57600080fd5b610cc6612f5f565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610d06578082015181840152602081019050610ceb565b50505050905090810190601f168015610d335780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610d4c57600080fd5b610d626004808035906020019091905050612f98565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3415610d8f57600080fd5b610da56004808035906020019091905050612fc7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610df257600080fd5b610e27600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050612ffa565b005b3415610e3457600080fd5b610e3c61316b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610e8957600080fd5b610e91613191565b6040518082815260200191505060405180910390f35b3415610eb257600080fd5b610eba613197565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610f0757600080fd5b610f1d60048080359060200190919050506131bd565b005b3415610f2a57600080fd5b610f40600480803590602001909190505061337b565b604051808215151515815260200191505060405180910390f35b3415610f6557600080fd5b610f6d6134ea565b6040518082815260200191505060405180910390f35b3415610f8e57600080fd5b610fba600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506134f0565b005b3415610fc757600080fd5b610fcf61358f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61103060048080359060200190919080359060200190919050506135b5565b005b341561103d57600080fd5b61104561379e565b6040518082815260200191505060405180910390f35b341561106657600080fd5b61106e6137a4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6110cf60048080359060200190919080359060200190919050506137ca565b005b600060405180807f737570706f727473496e74657266616365286279746573342900000000000000815250601901905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806113db575060405180807f746f6b656e4d657461646174612875696e743235362c737472696e6729000000815250601d019050604051809103902060405180807f746f6b656e734f664f776e6572286164647265737329000000000000000000008152506016019050604051809103902060405180807f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81526020017f74323536290000000000000000000000000000000000000000000000000000008152506025019050604051809103902060405180807f7472616e7366657228616464726573732c75696e7432353629000000000000008152506019019050604051809103902060405180807f617070726f766528616464726573732c75696e743235362900000000000000008152506018019050604051809103902060405180807f6f776e65724f662875696e7432353629000000000000000000000000000000008152506010019050604051809103902060405180807f62616c616e63654f6628616464726573732900000000000000000000000000008152506012019050604051809103902060405180807f746f74616c537570706c79282900000000000000000000000000000000000000815250600d019050604051809103902060405180807f73796d626f6c28290000000000000000000000000000000000000000000000008152506008019050604051809103902060405180807f6e616d6528290000000000000000000000000000000000000000000000000000815250600601905060405180910390201818181818181818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6114106149a0565b6114186149b4565b60008073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561147757600080fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb4799f2878787600060405160a001526040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180848152602001806020018281038252848482818152602001925080828437820191505094505050505060a060405180830381600087803b151561153257600080fd5b6102c65a03f1151561154357600080fd5b5050506040518060800180519060200160405280925081935050506115688282613b0b565b925050509392505050565b60115481565b6040805190810160405280600d81526020017f43727970746f4b6974746965730000000000000000000000000000000000000081525081565b6115bc3382613b63565b15156115c757600080fd5b6115d18183613bcf565b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b662386f26fc1000081565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561170157600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166376190f8f6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561177057600080fd5b6102c65a03f1151561178157600080fd5b50505060405180519050151561179657600080fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600160068054905003905090565b600f5481565b6000808211151561180157600080fd5b600060068381548110151561181257fe5b906000526020600020906002020160010160189054906101000a900463ffffffff1663ffffffff1614159050919050565b6201518081565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156118ac57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156118e757600080fd5b6118f13382613c25565b15156118fc57600080fd5b6119068382613b63565b151561191157600080fd5b61191c838383613c91565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561197e57600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166354c15b826000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156119ed57600080fd5b6102c65a03f115156119fe57600080fd5b505050604051805190501515611a1357600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611ab357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611aef57600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b8d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611bc957600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260149054906101000a900460ff16151515611c2957600080fd5b611c333385613b63565b1515611c3e57600080fd5b611c47846117f1565b151515611c5357600080fd5b611c7f84600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613bcf565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a85858585336040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b1515611d5b57600080fd5b6102c65a03f11515611d6c57600080fd5b50505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611dd057600080fd5b600260149054906101000a900460ff161515611deb57600080fd5b6000600260146101000a81548160ff021916908315150217905550565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008085111515611e4e57600080fd5b600084111515611e5d57600080fd5b600685815481101515611e6c57fe5b90600052602060002090600202019150600684815481101515611e8b57fe5b90600052602060002090600202019050611ea782868387613ec9565b8015611eb95750611eb884866140de565b5b9250505092915050565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff16151515611f1257600080fd5b611f1c3385613b63565b1515611f2757600080fd5b611f308461337b565b1515611f3b57600080fd5b611f6784600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613bcf565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a85858585336040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b151561204357600080fd5b6102c65a03f1151561205457600080fd5b50505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156120b957600080fd5b80600e8190555050565b600260149054906101000a900460ff161515156120df57600080fd5b6120e93382613b63565b15156120f457600080fd5b81600a600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156121a557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156121e157600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561228357600080fd5b819050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156122e157600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b6113886011541015156122f357600080fd5b601160008154809291906001019190505550612314600080600086856141f1565b50505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806123c257506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061241a5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561242557600080fd5b60036000600e8110151561243557fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff168110151561246457600080fd5b8060058190555050565b600260149054906101000a900460ff1681565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156124f557600080fd5b919050565b61afc881565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561255d57600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166385b861886000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156125cc57600080fd5b6102c65a03f115156125dd57600080fd5b5050506040518051905015156125f257600080fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061272e57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806127865750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561279157600080fd5b600260149054906101000a900460ff161515156127ad57600080fd5b6001600260146101000a81548160ff021916908315150217905550565b6127d26149df565b60006127dc6149df565b60008060006127ea87612637565b9450600085141561281c5760006040518059106128045750595b908082528060200260200182016040525095506128f7565b8460405180591061282a5750595b908082528060200260200182016040525093506128456117db565b925060009150600190505b82811115156128f3578673ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156128e6578084838151811015156128cf57fe5b906020019060200201818152505081806001019250505b8080600101915050612850565b8395505b5050505050919050565b600080600080600080600080600260149054906101000a900460ff1615151561292957600080fd5b60068981548110151561293857fe5b9060005260206000209060020201965060008760010160009054906101000a900467ffffffffffffffff1667ffffffffffffffff161415151561297a57600080fd5b612ab0876101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff16815250506144e4565b1515612abb57600080fd5b8660010160189054906101000a900463ffffffff1663ffffffff169550600686815481101515612ae757fe5b9060005260206000209060020201945086600101601e9054906101000a900461ffff16935086600101601e9054906101000a900461ffff1661ffff1685600101601e9054906101000a900461ffff1661ffff161115612b565784600101601e9054906101000a900461ffff1693505b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d9f5aed8860000154876000015460018b60010160089054906101000a900467ffffffffffffffff16036000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018381526020018267ffffffffffffffff1681526020019350505050602060405180830381600087803b1515612c2c57600080fd5b6102c65a03f11515612c3d57600080fd5b505050604051805190509250600760008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150612cad898860010160189054906101000a900463ffffffff1663ffffffff166001870161ffff1686866141f1565b90508660010160186101000a81549063ffffffff0219169055600f60008154809291906001900391905055503373ffffffffffffffffffffffffffffffffffffffff166108fc600e549081150290604051600060405180830381858888f193505050505080975050505050505050919050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612dc857506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80612e205750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515612e2b57600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b1515612eb057600080fd5b6102c65a03f11515612ec157600080fd5b505050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b1515612f4957600080fd5b6102c65a03f11515612f5a57600080fd5b505050565b6040805190810160405280600281526020017f434b00000000000000000000000000000000000000000000000000000000000081525081565b600381600e81101515612fa757fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff1615151561301657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561305257600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561308d57600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156130ea57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561314757600080fd5b6131513382613b63565b151561315c57600080fd5b613167338383613c91565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561321b57600080fd5b61afc860125410151561322d57600080fd5b61323c600080600085306141f1565b905061326a81600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613bcf565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a826132b161451f565b600062015180306040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b151561335157600080fd5b6102c65a03f1151561336257600080fd5b5050506012600081548092919060010191905055505050565b60008060008311151561338d57600080fd5b60068381548110151561339c57fe5b906000526020600020906002020190506134e2816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614622565b915050919050565b61138881565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561354b57600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260149054906101000a900460ff161515156135d357600080fd5b6135dd3383613b63565b15156135e857600080fd5b6135f18261337b565b15156135fc57600080fd5b613606828461465c565b151561361157600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c55d0f56846000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15156136aa57600080fd5b6102c65a03f115156136bb57600080fd5b505050604051805190509050600e54810134101515156136da57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663454a2ab3600e543403856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808281526020019150506000604051808303818588803b151561376e57600080fd5b6125ee5a03f1151561377f57600080fd5b505050506137998263ffffffff168463ffffffff166146b5565b505050565b60125481565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600260149054906101000a900460ff161515156137e957600080fd5b600e5434101515156137fa57600080fd5b6138043385613b63565b151561380f57600080fd5b61381983856140de565b151561382457600080fd5b60068481548110151561383357fe5b90600052602060002090600202019150613979826101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614622565b151561398457600080fd5b60068381548110151561399357fe5b90600052602060002090600202019050613ad9816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614622565b1515613ae457600080fd5b613af082858386613ec9565b1515613afb57600080fd5b613b0584846146b5565b50505050565b613b136149a0565b613b1b6149a0565b60008084604051805910613b2c5750595b9080825280601f01601f19166020018201604052509250602083019150859050613b5782828761487f565b82935050505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff166007600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b806009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008273ffffffffffffffffffffffffffffffffffffffff166009600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515613e2557600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600a600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556009600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b600081841415613edc57600090506140d6565b818560010160109054906101000a900463ffffffff1663ffffffff161480613f1d5750818560010160149054906101000a900463ffffffff1663ffffffff16145b15613f2b57600090506140d6565b838360010160109054906101000a900463ffffffff1663ffffffff161480613f6c5750838360010160149054906101000a900463ffffffff1663ffffffff16145b15613f7a57600090506140d6565b60008360010160109054906101000a900463ffffffff1663ffffffff161480613fbd575060008560010160109054906101000a900463ffffffff1663ffffffff16145b15613fcb57600190506140d6565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff16148061404057508460010160149054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff16145b1561404e57600090506140d6565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff1614806140c357508460010160149054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff16145b156140d157600090506140d6565b600190505b949350505050565b60008060006007600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806141e757508173ffffffffffffffffffffffffffffffffffffffff16600a600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b9250505092915050565b6000806141fc6149f3565b60008863ffffffff168914151561421257600080fd5b8763ffffffff168814151561422657600080fd5b8661ffff168714151561423857600080fd5b60028781151561424457fe5b049250600d8361ffff16111561425957600d92505b610100604051908101604052808781526020014267ffffffffffffffff168152602001600067ffffffffffffffff1681526020018a63ffffffff1681526020018963ffffffff168152602001600063ffffffff1681526020018461ffff1681526020018861ffff1681525091506001600680548060010182816142dc9190614a67565b916000526020600020906002020160008590919091506000820151816000015560208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601c6101000a81548161ffff021916908361ffff16021790555060e082015181600101601e6101000a81548161ffff021916908361ffff16021790555050500390508063ffffffff168114151561442e57600080fd5b7f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad58582846060015163ffffffff16856080015163ffffffff168660000151604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a16144d560008683613c91565b80935050505095945050505050565b6000808260a0015163ffffffff161415801561451857504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b6000806000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663eac9d94c6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156145b257600080fd5b6102c65a03f115156145c357600080fd5b505050604051805190509150816fffffffffffffffffffffffffffffffff16821415156145ef57600080fd5b6002828115156145fb57fe5b0482019050662386f26fc1000081101561461a57662386f26fc1000090505b809250505090565b6000808260a0015163ffffffff1614801561465557504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b600080600060068581548110151561467057fe5b9060005260206000209060020201915060068481548110151561468f57fe5b906000526020600020906002020190506146ab82868387613ec9565b9250505092915050565b6000806006838154811015156146c757fe5b906000526020600020906002020191506006848154811015156146e657fe5b90600052602060002090600202019050828160010160186101000a81548163ffffffff021916908363ffffffff160217905550614722826148ca565b61472b816148ca565b600a600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600a600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600f600081548092919060010191905055507f241ea03ca20251805084d27d4440371c34a0b85ff108f6bb5611248f73818b806007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685858460010160089054906101000a900467ffffffffffffffff16604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018267ffffffffffffffff16815260200194505050505060405180910390a150505050565b60005b6020821015156148a75782518452602084019350602083019250602082039150614882565b6001826020036101000a0390508019835116818551168181178652505050505050565b43600554600383600101601c9054906101000a900461ffff1661ffff16600e811015156148f357fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff1681151561491e57fe5b04018160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600d81600101601c9054906101000a900461ffff1661ffff16101561499d57600181600101601c8282829054906101000a900461ffff160192506101000a81548161ffff021916908361ffff1602179055505b50565b602060405190810160405280600081525090565b6080604051908101604052806004905b60008019168152602001906001900390816149c45790505090565b602060405190810160405280600081525090565b6101006040519081016040528060008152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600061ffff168152602001600061ffff1681525090565b815481835581811511614a9457600202816002028360005260206000209182019101614a939190614a99565b5b505050565b614b6291905b80821115614b5e576000808201600090556001820160006101000a81549067ffffffffffffffff02191690556001820160086101000a81549067ffffffffffffffff02191690556001820160106101000a81549063ffffffff02191690556001820160146101000a81549063ffffffff02191690556001820160186101000a81549063ffffffff021916905560018201601c6101000a81549061ffff021916905560018201601e6101000a81549061ffff021916905550600201614a9f565b5090565b905600a165627a7a72305820730f57a104c61a4b1492548005ff8f2a716b15b17146ae8e47acc98fbe82815b0029", + "deployedBytecode": "0x606060405260043610610293576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146102985780630519ce79146102f25780630560ff441461034757806305e45546146103f757806306fdde0314610420578063095ea7b3146104ae5780630a0f8168146104f05780630e583df01461054557806314001f4c1461056e57806318160ddd146105a7578063183a7947146105d05780631940a936146105f957806319c2f2011461063457806321717ebf1461065d57806323b872dd146106b257806324e7a38a1461071357806327d7874c1461074c5780632ba73c15146107855780633d7d3f5a146107be5780633f4ba83a146107fc57806346116e6f1461081157806346d22c7014610874578063481af3d3146108b85780634ad8c9381461091b5780634b85fd55146109595780634dfff04f1461097c5780634e0a3379146109be57806356129134146109f75780635663896e14610a395780635c975abb14610a5c5780636352211e14610a89578063680eba2714610aec5780636fbde40d14610b1557806370a0823114610b4e5780637a7d493714610b9b5780638456cb5914610bc45780638462151c14610bd957806388c2a0bf14610c6757806391876e5714610c9e57806395d89b4114610cb35780639d6fac6f14610d41578063a45f4bfc14610d84578063a9059cbb14610de7578063b047fb5014610e29578063b0c35c0514610e7e578063bc4006f514610ea7578063c3bea9af14610efc578063d3e6f49f14610f1f578063defb958414610f5a578063e17b25af14610f83578063e6cbe35114610fbc578063ed60ade614611011578063f1ca941014611032578063f2b47d521461105b578063f7d8c883146110b0575b600080fd5b34156102a357600080fd5b6102d860048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190919050506110d1565b604051808215151515815260200191505060405180910390f35b34156102fd57600080fd5b6103056113e2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561035257600080fd5b61037c60048080359060200190919080359060200190820180359060200191909192905050611408565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103bc5780820151818401526020810190506103a1565b50505050905090810190601f1680156103e95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561040257600080fd5b61040a611573565b6040518082815260200191505060405180910390f35b341561042b57600080fd5b610433611579565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610473578082015181840152602081019050610458565b50505050905090810190601f1680156104a05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156104b957600080fd5b6104ee600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506115b2565b005b34156104fb57600080fd5b610503611674565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561055057600080fd5b610558611699565b6040518082815260200191505060405180910390f35b341561057957600080fd5b6105a5600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506116a4565b005b34156105b257600080fd5b6105ba6117db565b6040518082815260200191505060405180910390f35b34156105db57600080fd5b6105e36117eb565b6040518082815260200191505060405180910390f35b341561060457600080fd5b61061a60048080359060200190919050506117f1565b604051808215151515815260200191505060405180910390f35b341561063f57600080fd5b610647611843565b6040518082815260200191505060405180910390f35b341561066857600080fd5b61067061184a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156106bd57600080fd5b610711600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611870565b005b341561071e57600080fd5b61074a600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611921565b005b341561075757600080fd5b610783600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611a58565b005b341561079057600080fd5b6107bc600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611b32565b005b34156107c957600080fd5b6107fa6004808035906020019091908035906020019091908035906020019091908035906020019091905050611c0d565b005b341561080757600080fd5b61080f611d75565b005b341561081c57600080fd5b6108326004808035906020019091905050611e08565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561087f57600080fd5b61089e6004808035906020019091908035906020019091905050611e3b565b604051808215151515815260200191505060405180910390f35b34156108c357600080fd5b6108d96004808035906020019091905050611ec3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561092657600080fd5b6109576004808035906020019091908035906020019091908035906020019091908035906020019091905050611ef6565b005b341561096457600080fd5b61097a600480803590602001909190505061205d565b005b341561098757600080fd5b6109bc600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506120c3565b005b34156109c957600080fd5b6109f5600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061214a565b005b3415610a0257600080fd5b610a37600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612225565b005b3415610a4457600080fd5b610a5a600480803590602001909190505061231a565b005b3415610a6757600080fd5b610a6f61246e565b604051808215151515815260200191505060405180910390f35b3415610a9457600080fd5b610aaa6004808035906020019091905050612481565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610af757600080fd5b610aff6124fa565b6040518082815260200191505060405180910390f35b3415610b2057600080fd5b610b4c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612500565b005b3415610b5957600080fd5b610b85600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612637565b6040518082815260200191505060405180910390f35b3415610ba657600080fd5b610bae612680565b6040518082815260200191505060405180910390f35b3415610bcf57600080fd5b610bd7612686565b005b3415610be457600080fd5b610c10600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506127ca565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610c53578082015181840152602081019050610c38565b505050509050019250505060405180910390f35b3415610c7257600080fd5b610c886004808035906020019091905050612901565b6040518082815260200191505060405180910390f35b3415610ca957600080fd5b610cb1612d20565b005b3415610cbe57600080fd5b610cc6612f5f565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610d06578082015181840152602081019050610ceb565b50505050905090810190601f168015610d335780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610d4c57600080fd5b610d626004808035906020019091905050612f98565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3415610d8f57600080fd5b610da56004808035906020019091905050612fc7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610df257600080fd5b610e27600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050612ffa565b005b3415610e3457600080fd5b610e3c61316b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610e8957600080fd5b610e91613191565b6040518082815260200191505060405180910390f35b3415610eb257600080fd5b610eba613197565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610f0757600080fd5b610f1d60048080359060200190919050506131bd565b005b3415610f2a57600080fd5b610f40600480803590602001909190505061337b565b604051808215151515815260200191505060405180910390f35b3415610f6557600080fd5b610f6d6134ea565b6040518082815260200191505060405180910390f35b3415610f8e57600080fd5b610fba600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506134f0565b005b3415610fc757600080fd5b610fcf61358f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61103060048080359060200190919080359060200190919050506135b5565b005b341561103d57600080fd5b61104561379e565b6040518082815260200191505060405180910390f35b341561106657600080fd5b61106e6137a4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6110cf60048080359060200190919080359060200190919050506137ca565b005b600060405180807f737570706f727473496e74657266616365286279746573342900000000000000815250601901905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806113db575060405180807f746f6b656e4d657461646174612875696e743235362c737472696e6729000000815250601d019050604051809103902060405180807f746f6b656e734f664f776e6572286164647265737329000000000000000000008152506016019050604051809103902060405180807f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81526020017f74323536290000000000000000000000000000000000000000000000000000008152506025019050604051809103902060405180807f7472616e7366657228616464726573732c75696e7432353629000000000000008152506019019050604051809103902060405180807f617070726f766528616464726573732c75696e743235362900000000000000008152506018019050604051809103902060405180807f6f776e65724f662875696e7432353629000000000000000000000000000000008152506010019050604051809103902060405180807f62616c616e63654f6628616464726573732900000000000000000000000000008152506012019050604051809103902060405180807f746f74616c537570706c79282900000000000000000000000000000000000000815250600d019050604051809103902060405180807f73796d626f6c28290000000000000000000000000000000000000000000000008152506008019050604051809103902060405180807f6e616d6528290000000000000000000000000000000000000000000000000000815250600601905060405180910390201818181818181818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6114106149a0565b6114186149b4565b60008073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561147757600080fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb4799f2878787600060405160a001526040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180848152602001806020018281038252848482818152602001925080828437820191505094505050505060a060405180830381600087803b151561153257600080fd5b6102c65a03f1151561154357600080fd5b5050506040518060800180519060200160405280925081935050506115688282613b0b565b925050509392505050565b60115481565b6040805190810160405280600d81526020017f43727970746f4b6974746965730000000000000000000000000000000000000081525081565b6115bc3382613b63565b15156115c757600080fd5b6115d18183613bcf565b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b662386f26fc1000081565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561170157600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166376190f8f6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561177057600080fd5b6102c65a03f1151561178157600080fd5b50505060405180519050151561179657600080fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600160068054905003905090565b600f5481565b6000808211151561180157600080fd5b600060068381548110151561181257fe5b906000526020600020906002020160010160189054906101000a900463ffffffff1663ffffffff1614159050919050565b6201518081565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156118ac57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156118e757600080fd5b6118f13382613c25565b15156118fc57600080fd5b6119068382613b63565b151561191157600080fd5b61191c838383613c91565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561197e57600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166354c15b826000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156119ed57600080fd5b6102c65a03f115156119fe57600080fd5b505050604051805190501515611a1357600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611ab357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611aef57600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b8d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611bc957600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260149054906101000a900460ff16151515611c2957600080fd5b611c333385613b63565b1515611c3e57600080fd5b611c47846117f1565b151515611c5357600080fd5b611c7f84600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613bcf565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a85858585336040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b1515611d5b57600080fd5b6102c65a03f11515611d6c57600080fd5b50505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611dd057600080fd5b600260149054906101000a900460ff161515611deb57600080fd5b6000600260146101000a81548160ff021916908315150217905550565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008085111515611e4e57600080fd5b600084111515611e5d57600080fd5b600685815481101515611e6c57fe5b90600052602060002090600202019150600684815481101515611e8b57fe5b90600052602060002090600202019050611ea782868387613ec9565b8015611eb95750611eb884866140de565b5b9250505092915050565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff16151515611f1257600080fd5b611f1c3385613b63565b1515611f2757600080fd5b611f308461337b565b1515611f3b57600080fd5b611f6784600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613bcf565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a85858585336040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b151561204357600080fd5b6102c65a03f1151561205457600080fd5b50505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156120b957600080fd5b80600e8190555050565b600260149054906101000a900460ff161515156120df57600080fd5b6120e93382613b63565b15156120f457600080fd5b81600a600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156121a557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156121e157600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561228357600080fd5b819050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156122e157600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b6113886011541015156122f357600080fd5b601160008154809291906001019190505550612314600080600086856141f1565b50505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806123c257506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061241a5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561242557600080fd5b60036000600e8110151561243557fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff168110151561246457600080fd5b8060058190555050565b600260149054906101000a900460ff1681565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156124f557600080fd5b919050565b61afc881565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561255d57600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166385b861886000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156125cc57600080fd5b6102c65a03f115156125dd57600080fd5b5050506040518051905015156125f257600080fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061272e57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806127865750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561279157600080fd5b600260149054906101000a900460ff161515156127ad57600080fd5b6001600260146101000a81548160ff021916908315150217905550565b6127d26149df565b60006127dc6149df565b60008060006127ea87612637565b9450600085141561281c5760006040518059106128045750595b908082528060200260200182016040525095506128f7565b8460405180591061282a5750595b908082528060200260200182016040525093506128456117db565b925060009150600190505b82811115156128f3578673ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156128e6578084838151811015156128cf57fe5b906020019060200201818152505081806001019250505b8080600101915050612850565b8395505b5050505050919050565b600080600080600080600080600260149054906101000a900460ff1615151561292957600080fd5b60068981548110151561293857fe5b9060005260206000209060020201965060008760010160009054906101000a900467ffffffffffffffff1667ffffffffffffffff161415151561297a57600080fd5b612ab0876101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff16815250506144e4565b1515612abb57600080fd5b8660010160189054906101000a900463ffffffff1663ffffffff169550600686815481101515612ae757fe5b9060005260206000209060020201945086600101601e9054906101000a900461ffff16935086600101601e9054906101000a900461ffff1661ffff1685600101601e9054906101000a900461ffff1661ffff161115612b565784600101601e9054906101000a900461ffff1693505b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d9f5aed8860000154876000015460018b60010160089054906101000a900467ffffffffffffffff16036000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018381526020018267ffffffffffffffff1681526020019350505050602060405180830381600087803b1515612c2c57600080fd5b6102c65a03f11515612c3d57600080fd5b505050604051805190509250600760008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150612cad898860010160189054906101000a900463ffffffff1663ffffffff166001870161ffff1686866141f1565b90508660010160186101000a81549063ffffffff0219169055600f60008154809291906001900391905055503373ffffffffffffffffffffffffffffffffffffffff166108fc600e549081150290604051600060405180830381858888f193505050505080975050505050505050919050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612dc857506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80612e205750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515612e2b57600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b1515612eb057600080fd5b6102c65a03f11515612ec157600080fd5b505050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b1515612f4957600080fd5b6102c65a03f11515612f5a57600080fd5b505050565b6040805190810160405280600281526020017f434b00000000000000000000000000000000000000000000000000000000000081525081565b600381600e81101515612fa757fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff1615151561301657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561305257600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561308d57600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156130ea57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561314757600080fd5b6131513382613b63565b151561315c57600080fd5b613167338383613c91565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561321b57600080fd5b61afc860125410151561322d57600080fd5b61323c600080600085306141f1565b905061326a81600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613bcf565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a826132b161451f565b600062015180306040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b151561335157600080fd5b6102c65a03f1151561336257600080fd5b5050506012600081548092919060010191905055505050565b60008060008311151561338d57600080fd5b60068381548110151561339c57fe5b906000526020600020906002020190506134e2816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614622565b915050919050565b61138881565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561354b57600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260149054906101000a900460ff161515156135d357600080fd5b6135dd3383613b63565b15156135e857600080fd5b6135f18261337b565b15156135fc57600080fd5b613606828461465c565b151561361157600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c55d0f56846000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15156136aa57600080fd5b6102c65a03f115156136bb57600080fd5b505050604051805190509050600e54810134101515156136da57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663454a2ab3600e543403856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808281526020019150506000604051808303818588803b151561376e57600080fd5b6125ee5a03f1151561377f57600080fd5b505050506137998263ffffffff168463ffffffff166146b5565b505050565b60125481565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600260149054906101000a900460ff161515156137e957600080fd5b600e5434101515156137fa57600080fd5b6138043385613b63565b151561380f57600080fd5b61381983856140de565b151561382457600080fd5b60068481548110151561383357fe5b90600052602060002090600202019150613979826101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614622565b151561398457600080fd5b60068381548110151561399357fe5b90600052602060002090600202019050613ad9816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614622565b1515613ae457600080fd5b613af082858386613ec9565b1515613afb57600080fd5b613b0584846146b5565b50505050565b613b136149a0565b613b1b6149a0565b60008084604051805910613b2c5750595b9080825280601f01601f19166020018201604052509250602083019150859050613b5782828761487f565b82935050505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff166007600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b806009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008273ffffffffffffffffffffffffffffffffffffffff166009600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515613e2557600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600a600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556009600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b600081841415613edc57600090506140d6565b818560010160109054906101000a900463ffffffff1663ffffffff161480613f1d5750818560010160149054906101000a900463ffffffff1663ffffffff16145b15613f2b57600090506140d6565b838360010160109054906101000a900463ffffffff1663ffffffff161480613f6c5750838360010160149054906101000a900463ffffffff1663ffffffff16145b15613f7a57600090506140d6565b60008360010160109054906101000a900463ffffffff1663ffffffff161480613fbd575060008560010160109054906101000a900463ffffffff1663ffffffff16145b15613fcb57600190506140d6565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff16148061404057508460010160149054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff16145b1561404e57600090506140d6565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff1614806140c357508460010160149054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff16145b156140d157600090506140d6565b600190505b949350505050565b60008060006007600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806141e757508173ffffffffffffffffffffffffffffffffffffffff16600a600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b9250505092915050565b6000806141fc6149f3565b60008863ffffffff168914151561421257600080fd5b8763ffffffff168814151561422657600080fd5b8661ffff168714151561423857600080fd5b60028781151561424457fe5b049250600d8361ffff16111561425957600d92505b610100604051908101604052808781526020014267ffffffffffffffff168152602001600067ffffffffffffffff1681526020018a63ffffffff1681526020018963ffffffff168152602001600063ffffffff1681526020018461ffff1681526020018861ffff1681525091506001600680548060010182816142dc9190614a67565b916000526020600020906002020160008590919091506000820151816000015560208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601c6101000a81548161ffff021916908361ffff16021790555060e082015181600101601e6101000a81548161ffff021916908361ffff16021790555050500390508063ffffffff168114151561442e57600080fd5b7f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad58582846060015163ffffffff16856080015163ffffffff168660000151604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a16144d560008683613c91565b80935050505095945050505050565b6000808260a0015163ffffffff161415801561451857504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b6000806000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663eac9d94c6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156145b257600080fd5b6102c65a03f115156145c357600080fd5b505050604051805190509150816fffffffffffffffffffffffffffffffff16821415156145ef57600080fd5b6002828115156145fb57fe5b0482019050662386f26fc1000081101561461a57662386f26fc1000090505b809250505090565b6000808260a0015163ffffffff1614801561465557504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b600080600060068581548110151561467057fe5b9060005260206000209060020201915060068481548110151561468f57fe5b906000526020600020906002020190506146ab82868387613ec9565b9250505092915050565b6000806006838154811015156146c757fe5b906000526020600020906002020191506006848154811015156146e657fe5b90600052602060002090600202019050828160010160186101000a81548163ffffffff021916908363ffffffff160217905550614722826148ca565b61472b816148ca565b600a600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600a600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600f600081548092919060010191905055507f241ea03ca20251805084d27d4440371c34a0b85ff108f6bb5611248f73818b806007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685858460010160089054906101000a900467ffffffffffffffff16604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018267ffffffffffffffff16815260200194505050505060405180910390a150505050565b60005b6020821015156148a75782518452602084019350602083019250602082039150614882565b6001826020036101000a0390508019835116818551168181178652505050505050565b43600554600383600101601c9054906101000a900461ffff1661ffff16600e811015156148f357fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff1681151561491e57fe5b04018160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600d81600101601c9054906101000a900461ffff1661ffff16101561499d57600181600101601c8282829054906101000a900461ffff160192506101000a81548161ffff021916908361ffff1602179055505b50565b602060405190810160405280600081525090565b6080604051908101604052806004905b60008019168152602001906001900390816149c45790505090565b602060405190810160405280600081525090565b6101006040519081016040528060008152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600061ffff168152602001600061ffff1681525090565b815481835581811511614a9457600202816002028360005260206000209182019101614a939190614a99565b5b505050565b614b6291905b80821115614b5e576000808201600090556001820160006101000a81549067ffffffffffffffff02191690556001820160086101000a81549067ffffffffffffffff02191690556001820160106101000a81549063ffffffff02191690556001820160146101000a81549063ffffffff02191690556001820160186101000a81549063ffffffff021916905560018201601c6101000a81549061ffff021916905560018201601e6101000a81549061ffff021916905550600201614a9f565b5090565b905600a165627a7a72305820730f57a104c61a4b1492548005ff8f2a716b15b17146ae8e47acc98fbe82815b0029", "sourceMap": "70871:2304:18:-;;;5032:5;5011:26;;;;;;;;;;;;;;;;;;;;11384:339;;;;;;;;;11427:9;11384:339;;;;;;;;11450:9;11384:339;;;;;;;;11473:9;11384:339;;;;;;;;11496:10;11384:339;;;;;;;;11520:10;11384:339;;;;;;;;11544:7;11384:339;;;;;;;;11565:7;11384:339;;;;;;;;11586:7;11384:339;;;;;;;;11607:7;11384:339;;;;;;;;11628:8;11384:339;;;;;;;;11650:6;11384:339;;;;;;;;11670:6;11384:339;;;;;;;;11690:6;11384:339;;;;;;;;11710:6;11384:339;;;;;;;;;;;;;;;:::i;:::-;;11840:2;11807:35;;30582:8;30552:38;;70871:2304;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;", "deployedSourceMap": "70871:2304:18:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19989:327;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4848:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29456:346;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71323:32:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18924:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24204:395:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4817:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71136:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66994:477;;;;;;;;;;;;;;;;;;;;;;;;;;;;25978:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30647:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35349:235;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71197:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13853:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25066:784;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31057:470;;;;;;;;;;;;;;;;;;;;;;;;;;;;5800:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;6346;;;;;;;;;;;;;;;;;;;;;;;;;;;;67586:978;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7359:126;;;;;;;;;;;;;;13283:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38051:388;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12965:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68725:796;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34379:90;;;;;;;;;;;;;;;;;;;;;;;;;;33972:189;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6073:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;71655:346;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17342:139;;;;;;;;;;;;;;;;;;;;;;;;;;5011:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26205:180;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71042:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66412:467;;;;;;;;;;;;;;;;;;;;;;;;;;;;22243:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11807:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6990:81;;;;;;;;;;;;;;26841:853;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;42595:1586:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70671:142;;;;;;;;;;;;;;18975:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11384:339:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12465:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22790:990;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4879:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30552:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19070:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72106:447;;;;;;;;;;;;;;;;;;;;;;;;;;34991:207;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70985:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20416:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;13564:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69769:703;;;;;;;;;;;;;;;;;;;;;;;;;;71361:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30817:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40000:1958;;;;;;;;;;;;;;;;;;;;;;;;;;19989:327;20060:4;19175:38;;;;;;;;;;;;;;;;;;;20219:41;;;:12;:41;;;;20218:90;;;;19697:42;;;;;;;;;;;;;;;;;;;19647:35;;;;;;;;;;;;;;;;;;;19582:50;;;;;;;;;;;;;;;;;;;;;;;;19529:38;;;;;;;;;;;;;;;;;;;19477:37;;;;;;;;;;;;;;;;;;;19433:29;;;;;;;;;;;;;;;;;;;19387:31;;;;;;;;;;;;;;;;;;;19346:26;;;;;;;;;;;;;;;;;;;19310:21;;;;;;;;;;;;;;;;;;;19276:19;;;;;;;;;;;;;;;;;;;19269:63;:104;:150;:194;:246;:299;:364;:414;:471;20266:41;;;:12;:41;;;;20218:90;20210:99;;19989:327;;;:::o;4848:25::-;;;;;;;;;;;;;:::o;29456:346::-;29548:14;;:::i;:::-;29621:24;;:::i;:::-;29655:13;29608:1;29582:28;;:14;;;;;;;;;;;:28;;;;29574:37;;;;;;;;29696:14;;;;;;;;;;;:26;;;29723:8;29733:19;;29696:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29678:75;;;;;;;;29771:24;29781:6;29789:5;29771:9;:24::i;:::-;29764:31;;29456:346;;;;;;;:::o;71323:32::-;;;;:::o;18924:45::-;;;;;;;;;;;;;;;;;;;;:::o;24204:395::-;24384:27;24390:10;24402:8;24384:5;:27::i;:::-;24376:36;;;;;;;;24491:23;24500:8;24510:3;24491:8;:23::i;:::-;24557:35;24566:10;24578:3;24583:8;24557:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24204:395;;:::o;4817:25::-;;;;;;;;;;;;;:::o;71136:55::-;71182:9;71136:55;:::o;66994:477::-;67072:36;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;67130:8;67072:67;;67339:17;:38;;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67331:49;;;;;;;;67447:17;67431:13;;:33;;;;;;;;;;;;;;;;;;66994:477;;:::o;25978:92::-;26022:4;26062:1;26045:7;:14;;;;:18;26038:25;;25978:92;:::o;30647:30::-;;;;:::o;35349:235::-;35420:4;35459:1;35448:8;:12;35440:21;;;;;;;;35576:1;35542:7;35550:8;35542:17;;;;;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;:35;;;;35535:42;;35349:235;;;:::o;71197:54::-;71245:6;71197:54;:::o;13853:39::-;;;;;;;;;;;;;:::o;25066:784::-;25305:1;25290:17;;:3;:17;;;;25282:26;;;;;;;;25563:4;25548:20;;:3;:20;;;;25540:29;;;;;;;;25637:34;25650:10;25662:8;25637:12;:34::i;:::-;25629:43;;;;;;;;25690:22;25696:5;25703:8;25690:5;:22::i;:::-;25682:31;;;;;;;;25812;25822:5;25829:3;25834:8;25812:9;:31::i;:::-;25066:784;;;:::o;31057:470::-;31133:38;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;31195:8;31133:71;;31404:17;:31;;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31396:42;;;;;;;;31503:17;31489:11;;:31;;;;;;;;;;;;;;;;;;31057:470;;:::o;5800:128::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;5887:1;5868:21;;:7;:21;;;;5860:30;;;;;;;;5914:7;5901:10;;:20;;;;;;;;;;;;;;;;;;5800:128;:::o;6346:::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;6433:1;6414:21;;:7;:21;;;;6406:30;;;;;;;;6460:7;6447:10;;:20;;;;;;;;;;;;;;;;;;6346:128;:::o;67586:978::-;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;67958:27;67964:10;67976:8;67958:5;:27::i;:::-;67950:36;;;;;;;;68198:20;68209:8;68198:10;:20::i;:::-;68197:21;68189:30;;;;;;;;68229:31;68238:8;68248:11;;;;;;;;;;;68229:8;:31::i;:::-;68399:11;;;;;;;;;;;:25;;;68438:8;68460:14;68488:12;68514:9;68537:10;68399:158;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67586:978;;;;:::o;7359:126::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;6812:6;;;;;;;;;;;6804:15;;;;;;;;7473:5;7464:6;;:14;;;;;;;;;;;;;;;;;;7359:126::o;13283:56::-;;;;;;;;;;;;;;;;;;;;;;:::o;38051:388::-;38143:4;38225:20;38276:18;38183:1;38171:9;:13;38163:22;;;;;;;;38213:1;38203:7;:11;38195:20;;;;;;;;38248:7;38256:9;38248:18;;;;;;;;;;;;;;;;;;;;38225:41;;38297:7;38305;38297:16;;;;;;;;;;;;;;;;;;;;38276:37;;38330:52;38349:6;38357:9;38368:4;38374:7;38330:18;:52::i;:::-;:102;;;;;38394:38;38413:7;38422:9;38394:18;:38::i;:::-;38330:102;38323:109;;38051:388;;;;;;:::o;12965:56::-;;;;;;;;;;;;;;;;;;;;;;:::o;68725:796::-;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;69099:27;69105:10;69117:8;69099:5;:27::i;:::-;69091:36;;;;;;;;69145:24;69160:8;69145:14;:24::i;:::-;69137:33;;;;;;;;69180;69189:8;69199:13;;;;;;;;;;;69180:8;:33::i;:::-;69354:13;;;;;;;;;;;:27;;;69395:8;69417:14;69445:12;69471:9;69494:10;69354:160;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68725:796;;;;:::o;34379:90::-;5435:10;;;;;;;;;;;5421:24;;:10;:24;;;5413:33;;;;;;;;34459:3;34444:12;:18;;;;34379:90;:::o;33972:189::-;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;34080:26;34086:10;34098:7;34080:5;:26::i;:::-;34072:35;;;;;;;;34149:5;34117:20;:29;34138:7;34117:29;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;33972:189;;:::o;6073:128::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;6160:1;6141:21;;:7;:21;;;;6133:30;;;;;;;;6187:7;6174:10;;:20;;;;;;;;;;;;;;;;;;6073:128;:::o;71655:346::-;71740:18;5435:10;;;;;;;;;;;5421:24;;:10;:24;;;5413:33;;;;;;;;71761:6;71740:27;;71803:1;71781:24;;:10;:24;;;71777:78;;;71834:10;;;;;;;;;;;71821:23;;71777:78;71032:4;71872:17;;:40;71864:49;;;;;;;;71924:17;;:19;;;;;;;;;;;;;71953:41;71966:1;71969;71972;71975:6;71983:10;71953:12;:41::i;:::-;;71655:346;;;:::o;17342:139::-;5537:10;;;;;;;;;;;5523:24;;:10;:24;;;:64;;;;5577:10;;;;;;;;;;;5563:24;;:10;:24;;;5523:64;:104;;;;5617:10;;;;;;;;;;;5603:24;;:10;:24;;;5523:104;5502:135;;;;;;;;17429:9;17439:1;17429:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17422:19;;:4;:19;17414:28;;;;;;;;17470:4;17452:15;:22;;;;17342:139;:::o;5011:26::-;;;;;;;;;;;;;:::o;26205:180::-;26275:13;26312:17;:27;26330:8;26312:27;;;;;;;;;;;;;;;;;;;;;26304:35;;26375:1;26358:19;;:5;:19;;;;26350:28;;;;;;;;26205:180;;;:::o;71042:51::-;71088:5;71042:51;:::o;66412:467::-;66488:34;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;66542:8;66488:63;;66751:17;:36;;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66743:47;;;;;;;;66855:17;66841:11;;:31;;;;;;;;;;;;;;;;;;66412:467;;:::o;22243:122::-;22299:13;22331:19;:27;22351:6;22331:27;;;;;;;;;;;;;;;;22324:34;;22243:122;;;:::o;11807:35::-;;;;:::o;6990:81::-;5537:10;;;;;;;;;;;5523:24;;:10;:24;;;:64;;;;5577:10;;;;;;;;;;;5563:24;;:10;:24;;;5523:64;:104;;;;5617:10;;;;;;;;;;;5603:24;;:10;:24;;;5523:104;5502:135;;;;;;;;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;7060:4;7051:6;;:13;;;;;;;;;;;;;;;;;;6990:81::o;26841:853::-;26902:21;;:::i;:::-;26935:18;27110:23;;:::i;:::-;27175:17;27222:19;27402:13;26956:17;26966:6;26956:9;:17::i;:::-;26935:38;;27002:1;26988:10;:15;26984:704;;;27077:1;27063:16;;;;;;;;;;;;;;;;;;;;;;;;27056:23;;;;26984:704;27150:10;27136:25;;;;;;;;;;;;;;;;;;;;;;;;27110:51;;27195:13;:11;:13::i;:::-;27175:33;;27244:1;27222:23;;27443:1;27435:9;;27430:220;27455:9;27446:5;:18;;27430:220;;;27525:6;27497:34;;:17;:24;27515:5;27497:24;;;;;;;;;;;;;;;;;;;;;:34;;;27493:143;;;27577:5;27555:6;27562:11;27555:19;;;;;;;;;;;;;;;;;:27;;;;;27604:13;;;;;;;27493:143;27466:7;;;;;;;27430:220;;;27671:6;27664:13;;26841:853;;;;;;;;;:::o;42595:1586::-;42676:7;42753:20;43068:14;43114:18;43230:16;43436:18;43575:13;43629:16;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;42776:7;42784:9;42776:18;;;;;;;;;;;;;;;;;;;;42753:41;;42882:1;42862:6;:16;;;;;;;;;;;;:21;;;;42854:30;;;;;;;;42977:27;42997:6;42977:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:19;:27::i;:::-;42969:36;;;;;;;;43085:6;:19;;;;;;;;;;;;43068:36;;;;43135:7;43143:6;43135:15;;;;;;;;;;;;;;;;;;;;43114:36;;43249:6;:17;;;;;;;;;;;;43230:36;;43298:6;:17;;;;;;;;;;;;43280:35;;:4;:15;;;;;;;;;;;;:35;;;43276:93;;;43343:4;:15;;;;;;;;;;;;43331:27;;43276:93;43457:11;;;;;;;;;;;:20;;;43478:6;:12;;;43492:4;:10;;;43530:1;43504:6;:23;;;;;;;;;;;;:27;43457:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43436:96;;43591:17;:28;43609:9;43591:28;;;;;;;;;;;;;;;;;;;;;43575:44;;43648:78;43661:9;43672:6;:19;;;;;;;;;;;;43648:78;;43705:1;43693:9;:13;43648:78;;43708:10;43720:5;43648:12;:78::i;:::-;43629:97;;43888:6;:19;;;43881:26;;;;;;;;;;;43984:15;;:17;;;;;;;;;;;;;;44081:10;:15;;:29;44097:12;;44081:29;;;;;;;;;;;;;;;;;;;;;;;;44166:8;44159:15;;42595:1586;;;;;;;;;;:::o;70671:142::-;5537:10;;;;;;;;;;;5523:24;;:10;:24;;;:64;;;;5577:10;;;;;;;;;;;5563:24;;:10;:24;;;5523:64;:104;;;;5617:10;;;;;;;;;;;5603:24;;:10;:24;;;5523:104;5502:135;;;;;;;;70736:11;;;;;;;;;;;:27;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70775:13;;;;;;;;;;;:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70671:142::o;18975:36::-;;;;;;;;;;;;;;;;;;;;:::o;11384:339::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;12465:53::-;;;;;;;;;;;;;;;;;;;;;;:::o;22790:990::-;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;22999:1;22984:17;;:3;:17;;;;22976:26;;;;;;;;23257:4;23242:20;;:3;:20;;;;23234:29;;;;;;;;23498:11;;;;;;;;;;;23483:27;;:3;:27;;;;23475:36;;;;;;;;23544:13;;;;;;;;;;;23529:29;;:3;:29;;;;23521:38;;;;;;;;23621:27;23627:10;23639:8;23621:5;:27::i;:::-;23613:36;;;;;;;;23737;23747:10;23759:3;23764:8;23737:9;:36::i;:::-;22790:990;;:::o;4879:25::-;;;;;;;;;;;;;:::o;30552:38::-;;;;:::o;19070:43::-;;;;;;;;;;;;;:::o;72106:447::-;72234:15;5435:10;;;;;;;;;;;5421:24;;:10;:24;;;5413:33;;;;;;;;71088:5;72184:16;;:38;72176:47;;;;;;;;72252:44;72265:1;72268;72271;72274:6;72290:4;72252:12;:44::i;:::-;72234:62;;72306:30;72315:7;72324:11;;;;;;;;;;;72306:8;:30::i;:::-;72347:11;;;;;;;;;;;:25;;;72386:7;72407:23;:21;:23::i;:::-;72444:1;71245:6;72502:4;72347:170;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72528:16;;:18;;;;;;;;;;;;;72106:447;;:::o;34991:207::-;35066:4;35117:17;35105:1;35094:8;:12;35086:21;;;;;;;;35137:7;35145:8;35137:17;;;;;;;;;;;;;;;;;;;;35117:37;;35171:20;35187:3;35171:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:15;:20::i;:::-;35164:27;;34991:207;;;;:::o;70985:51::-;71032:4;70985:51;:::o;20416:142::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;20534:16;20495:14;;:56;;;;;;;;;;;;;;;;;;20416:142;:::o;13564:35::-;;;;;;;;;;;;;:::o;69769:703::-;70165:20;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;69967:28;69973:10;69985:9;69967:5;:28::i;:::-;69959:37;;;;;;;;70014:25;70029:9;70014:14;:25::i;:::-;70006:34;;;;;;;;70058:43;70082:9;70093:7;70058:23;:43::i;:::-;70050:52;;;;;;;;70188:13;;;;;;;;;;;:29;;;70218:7;70188:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70165:61;;70272:12;;70257;:27;70244:9;:40;;70236:49;;;;;;;;70351:13;;;;;;;;;;;:17;;;70387:12;;70375:9;:24;70401:7;70351:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70419:46;70437:9;70419:46;;70456:7;70419:46;;:10;:46::i;:::-;69769:703;;;:::o;71361:31::-;;;;:::o;30817:39::-;;;;;;;;;;;;;:::o;40000:1958::-;41267:20;41494:18;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;40168:12;;40155:9;:25;;40147:34;;;;;;;;40239:28;40245:10;40257:9;40239:5;:28::i;:::-;40231:37;;;;;;;;41165:38;41184:7;41193:9;41165:18;:38::i;:::-;41157:47;;;;;;;;41290:7;41298:9;41290:18;;;;;;;;;;;;;;;;;;;;41267:41;;41409:23;41425:6;41409:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:15;:23::i;:::-;41401:32;;;;;;;;41515:7;41523;41515:16;;;;;;;;;;;;;;;;;;;;41494:37;;41630:21;41646:4;41630:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:15;:21::i;:::-;41622:30;;;;;;;;41728:130;41764:6;41788:9;41815:4;41837:7;41728:18;:130::i;:::-;41720:139;;;;;;;;41921:30;41932:9;41943:7;41921:10;:30::i;:::-;40000:1958;;;;:::o;28808:403::-;28894:6;;:::i;:::-;28912:16;;:::i;:::-;28966:17;28993:16;28942:13;28931:25;;;;;;;;;;;;;;;;;;;;;;;;;;;28912:44;;29074:2;29060:12;29056:3;29043:34;;29102:9;29090:21;;29131:43;29139:9;29150:8;29160:13;29131:7;:43::i;:::-;29192:12;29185:19;;28808:403;;;;;;;:::o;20967:145::-;21042:4;21096:9;21065:40;;:17;:27;21083:8;21065:27;;;;;;;;;;;;;;;;;;;;;:40;;;21058:47;;20967:145;;;;:::o;21944:123::-;22051:9;22018:20;:30;22039:8;22018:30;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;21944:123;;:::o;21346:155::-;21428:4;21485:9;21451:43;;:20;:30;21472:8;21451:30;;;;;;;;;;;;;;;;;;;;;:43;;;21444:50;;21346:155;;;;:::o;13965:758::-;14129:19;:24;14149:3;14129:24;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;14225:3;14195:17;:27;14213:8;14195:27;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;14345:1;14328:19;;:5;:19;;;;14324:317;;;14363:19;:26;14383:5;14363:26;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;14485:20;:30;14506:8;14485:30;;;;;;;;;;;;14478:37;;;;;;;;;;;14600:20;:30;14621:8;14600:30;;;;;;;;;;;;14593:37;;;;;;;;;;;14324:317;14686:30;14695:5;14702:3;14707:8;14686:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13965:758;;;:::o;35986:1169::-;36165:4;36246:7;36233:9;:20;36229:63;;;36276:5;36269:12;;;;36229:63;36377:7;36357;:16;;;;;;;;;;;;:27;;;:56;;;;36406:7;36388;:14;;;;;;;;;;;;:25;;;36357:56;36353:99;;;36436:5;36429:12;;;;36353:99;36483:9;36465:5;:14;;;;;;;;;;;;:27;;;:56;;;;36512:9;36496:5;:12;;;;;;;;;;;;:25;;;36465:56;36461:99;;;36544:5;36537:12;;;;36461:99;36714:1;36696:5;:14;;;;;;;;;;;;:19;;;:44;;;;36739:1;36719:7;:16;;;;;;;;;;;;:21;;;36696:44;36692:86;;;36763:4;36756:11;;;;36692:86;36869:7;:16;;;;;;;;;;;;36851:34;;:5;:14;;;;;;;;;;;;:34;;;:70;;;;36907:7;:14;;;;;;;;;;;;36889:32;;:5;:14;;;;;;;;;;;;:32;;;36851:70;36847:113;;;36944:5;36937:12;;;;36847:113;36989:7;:16;;;;;;;;;;;;36973:32;;:5;:12;;;;;;;;;;;;:32;;;:66;;;;37025:7;:14;;;;;;;;;;;;37009:30;;:5;:12;;;;;;;;;;;;:30;;;36973:66;36969:109;;;37062:5;37055:12;;;;36969:109;37144:4;37137:11;;35986:1169;;;;;;;:::o;32350:441::-;32437:4;32453:19;32513:17;32475;:28;32493:9;32475:28;;;;;;;;;;;;;;;;;;;;;32453:50;;32533:17;:26;32551:7;32533:26;;;;;;;;;;;;;;;;;;;;;32513:46;;32726:9;32711:24;;:11;:24;;;:72;;;;32772:11;32739:44;;:20;:29;32760:7;32739:29;;;;;;;;;;;;;;;;;;;;;:44;;;32711:72;32703:81;;32350:441;;;;;;:::o;15381:1876::-;15564:4;16148:20;16281:19;;:::i;:::-;16624;15942:9;15927:26;;15914:9;:39;15906:48;;;;;;;;15998:7;15983:24;;15972:7;:35;15964:44;;;;;;;;16056:11;16041:28;;16026:11;:43;16018:52;;;;;;;;16192:1;16178:11;:15;;;;;;;;16148:46;;16224:2;16208:13;:18;;;16204:67;;;16258:2;16242:18;;16204:67;16303:311;;;;;;;;;16330:6;16303:311;;;;16368:3;16303:311;;;;;;16404:1;16303:311;;;;;;16436:9;16303:311;;;;;;16475:7;16303:311;;;;;;16511:1;16303:311;;;;;;16541:13;16303:311;;;;;;16587:11;16303:311;;;;;16281:333;;16669:1;16646:7;:20;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;16659:6;16646:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:24;16624:46;;16857:11;16842:28;;16827:11;:43;16819:52;;;;;;;;16914:160;16933:6;16953:11;16986:6;:15;;;16978:24;;17024:6;:13;;;17016:22;;17052:6;:12;;;16914:160;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17188:33;17198:1;17201:6;17209:11;17188:9;:33::i;:::-;17239:11;17232:18;;15381:1876;;;;;;;;;;:::o;34588:177::-;34654:4;34702:1;34678:7;:20;;;:25;;;;34677:81;;;;;34744:12;34709:48;;:7;:24;;;:48;;;;34677:81;34670:88;;34588:177;;;:::o;72674:499::-;72730:7;72749:16;72934:17;72768:11;;;;;;;;;;;:32;;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72749:53;;72912:8;72896:26;;72884:8;:38;72876:47;;;;;;;;72977:1;72966:8;:12;;;;;;;;72954:8;:25;72934:45;;71182:9;73051;:31;73047:93;;;71182:9;73098:31;;73047:93;73157:9;73150:16;;72674:499;;;:::o;31720:397::-;31780:4;32057:1;32036:4;:17;;;:22;;;32035:75;;;;;32096:12;32064:45;;:4;:21;;;:45;;;;32035:75;32028:82;;31720:397;;;:::o;37332:288::-;37436:4;37456:20;37507:18;37479:7;37487:9;37479:18;;;;;;;;;;;;;;;;;;;;37456:41;;37528:7;37536;37528:16;;;;;;;;;;;;;;;;;;;;37507:37;;37561:52;37580:6;37588:9;37599:4;37605:7;37561:18;:52::i;:::-;37554:59;;37332:288;;;;;;:::o;38573:924::-;38705:18;38752:20;38726:7;38734;38726:16;;;;;;;;;;;;;;;;;;;;38705:37;;38775:7;38783:9;38775:18;;;;;;;;;;;;;;;;;;;;38752:41;;38907:7;38878:6;:19;;;:37;;;;;;;;;;;;;;;;;;38976:22;38993:4;38976:16;:22::i;:::-;39008:24;39025:6;39008:16;:24::i;:::-;39185:20;:31;39206:9;39185:31;;;;;;;;;;;;39178:38;;;;;;;;;;;39233:20;:29;39254:7;39233:29;;;;;;;;;;;;39226:36;;;;;;;;;;;39342:15;;:17;;;;;;;;;;;;;39407:83;39416:17;:28;39434:9;39416:28;;;;;;;;;;;;;;;;;;;;;39446:9;39457:7;39466:6;:23;;;;;;;;;;;;39407:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38573:924;;;;:::o;27965:565::-;28301:12;28089:170;28103:2;28095:4;:10;;28089:170;;;28180:4;28174:5;28167;28160:6;28222:2;28213:11;;;;28246:2;28238:10;;;;28115:2;28107:10;;;;28089:170;;;28337:1;28329:4;28324:2;:9;28316:3;:18;:22;28301:37;;28407:4;28403:3;28396:4;28390:5;28386:3;28460:4;28452:5;28446;28442:3;28505:7;28495:8;28492:2;28485:5;28478:6;28357:167;;;;;;:::o;33053:596::-;33306:12;33287:15;;33254:9;33264:7;:21;;;;;;;;;;;;33254:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:48;;;;;;;;;;33253:65;33219:7;:24;;;:100;;;;;;;;;;;;;;;;;;33588:2;33564:7;:21;;;;;;;;;;;;:26;;;33560:83;;;33631:1;33606:7;:21;;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33560:83;33053:596;:::o;70871:2304::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", "source": "pragma solidity 0.4.18;\n\n/**\n The following contract code, titled KittyCore, was written by Cryptokitties and published\n and retrieved from https://etherscan.io/address/0x06012c8cf97bead5deae237070f9587f8e7a266d#code.\n\n It is included in the current project for test purposes, to ensure that our collateralizer can\n handle ERC721 tokens created by the KittyCore contract.\n*/\n\n/**\n * @title KittiesOwnable\n * @dev The KittiesOwnable contract has an owner address, and provides basic authorization control\n * functions, this simplifies the implementation of \"user permissions\".\n */\ncontract KittiesOwnable {\n address public owner;\n\n\n /**\n\t * @dev The KittiesOwnable constructor sets the original `owner` of the contract to the sender\n\t * account.\n\t */\n function KittiesOwnable() {\n owner = msg.sender;\n }\n\n\n /**\n\t * @dev Throws if called by any account other than the owner.\n\t */\n modifier onlyOwner() {\n require(msg.sender == owner);\n _;\n }\n\n\n /**\n\t * @dev Allows the current owner to transfer control of the contract to a newOwner.\n\t * @param newOwner The address to transfer ownership to.\n\t */\n function transferOwnership(address newOwner) onlyOwner {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n\n}\n\n\n\n/// @title Interface for contracts conforming to ERC-721: Non-Fungible Tokens\n/// @author Dieter Shirley (https://github.com/dete)\ncontract KittiesERC721 {\n // Required methods\n function totalSupply() public view returns (uint256 total);\n function balanceOf(address _owner) public view returns (uint256 balance);\n function ownerOf(uint256 _tokenId) external view returns (address owner);\n function approve(address _to, uint256 _tokenId) external;\n function transfer(address _to, uint256 _tokenId) external;\n function transferFrom(address _from, address _to, uint256 _tokenId) external;\n\n // Events\n event Transfer(address from, address to, uint256 tokenId);\n event Approval(address owner, address approved, uint256 tokenId);\n\n // Optional\n // function name() public view returns (string name);\n // function symbol() public view returns (string symbol);\n // function tokensOfOwner(address _owner) external view returns (uint256[] tokenIds);\n // function tokenMetadata(uint256 _tokenId, string _preferredTransport) public view returns (string infoUrl);\n\n // ERC-165 Compatibility (https://github.com/ethereum/EIPs/issues/165)\n function supportsInterface(bytes4 _interfaceID) external view returns (bool);\n}\n\n\n// // Auction wrapper functions\n\n\n// Auction wrapper functions\n\n\n\n\n\n\n\n/// @title SEKRETOOOO\ncontract GeneScienceInterface {\n /// @dev simply a boolean to indicate this is the contract we expect to be\n function isGeneScience() public pure returns (bool);\n\n /// @dev given genes of kitten 1 & 2, return a genetic combination - may have a random factor\n /// @param genes1 genes of mom\n /// @param genes2 genes of sire\n /// @return the genes that are supposed to be passed down the child\n function mixGenes(uint256 genes1, uint256 genes2, uint256 targetBlock) public returns (uint256);\n}\n\n\n\n\n\n\n\n/// @title A facet of KittyCore that manages special access privileges.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyAccessControl {\n // This facet controls access control for CryptoKitties. There are four roles managed here:\n //\n // - The CEO: The CEO can reassign other roles and change the addresses of our dependent smart\n // contracts. It is also the only role that can unpause the smart contract. It is initially\n // set to the address that created the smart contract in the KittyCore constructor.\n //\n // - The CFO: The CFO can withdraw funds from KittyCore and its auction contracts.\n //\n // - The COO: The COO can release gen0 kitties to auction, and mint promo cats.\n //\n // It should be noted that these roles are distinct without overlap in their access abilities, the\n // abilities listed for each role above are exhaustive. In particular, while the CEO can assign any\n // address to any role, the CEO address itself doesn't have the ability to act in those roles. This\n // restriction is intentional so that we aren't tempted to use the CEO address frequently out of\n // convenience. The less we use an address, the less likely it is that we somehow compromise the\n // account.\n\n /// @dev Emited when contract is upgraded - See README.md for updgrade plan\n event ContractUpgrade(address newContract);\n\n // The addresses of the accounts (or contracts) that can execute actions within each roles.\n address public ceoAddress;\n address public cfoAddress;\n address public cooAddress;\n\n // @dev Keeps track whether the contract is paused. When that is true, most actions are blocked\n bool public paused = false;\n\n /// @dev Access modifier for CEO-only functionality\n modifier onlyCEO() {\n require(msg.sender == ceoAddress);\n _;\n }\n\n /// @dev Access modifier for CFO-only functionality\n modifier onlyCFO() {\n require(msg.sender == cfoAddress);\n _;\n }\n\n /// @dev Access modifier for COO-only functionality\n modifier onlyCOO() {\n require(msg.sender == cooAddress);\n _;\n }\n\n modifier onlyCLevel() {\n require(\n msg.sender == cooAddress ||\n msg.sender == ceoAddress ||\n msg.sender == cfoAddress\n );\n _;\n }\n\n /// @dev Assigns a new address to act as the CEO. Only available to the current CEO.\n /// @param _newCEO The address of the new CEO\n function setCEO(address _newCEO) external onlyCEO {\n require(_newCEO != address(0));\n\n ceoAddress = _newCEO;\n }\n\n /// @dev Assigns a new address to act as the CFO. Only available to the current CEO.\n /// @param _newCFO The address of the new CFO\n function setCFO(address _newCFO) external onlyCEO {\n require(_newCFO != address(0));\n\n cfoAddress = _newCFO;\n }\n\n /// @dev Assigns a new address to act as the COO. Only available to the current CEO.\n /// @param _newCOO The address of the new COO\n function setCOO(address _newCOO) external onlyCEO {\n require(_newCOO != address(0));\n\n cooAddress = _newCOO;\n }\n\n /*** KittiesPausable functionality adapted from OpenZeppelin ***/\n\n /// @dev Modifier to allow actions only when the contract IS NOT paused\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /// @dev Modifier to allow actions only when the contract IS paused\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /// @dev Called by any \"C-level\" role to pause the contract. Used only when\n /// a bug or exploit is detected and we need to limit damage.\n function pause() external onlyCLevel whenNotPaused {\n paused = true;\n }\n\n /// @dev Unpauses the smart contract. Can only be called by the CEO, since\n /// one reason we may pause the contract is when CFO or COO accounts are\n /// compromised.\n /// @notice This is public rather than external so it can be called by\n /// derived contracts.\n function unpause() public onlyCEO whenPaused {\n // can't unpause if contract was upgraded\n paused = false;\n }\n}\n\n\n\n\n/// @title Base contract for CryptoKitties. Holds all common structs, events and base variables.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBase is KittyAccessControl {\n /*** EVENTS ***/\n\n /// @dev The Birth event is fired whenever a new kitten comes into existence. This obviously\n /// includes any time a cat is created through the giveBirth method, but it is also called\n /// when a new gen0 cat is created.\n event Birth(address owner, uint256 kittyId, uint256 matronId, uint256 sireId, uint256 genes);\n\n /// @dev Transfer event as defined in current draft of ERC721. Emitted every time a kitten\n /// ownership is assigned, including births.\n event Transfer(address from, address to, uint256 tokenId);\n\n /*** DATA TYPES ***/\n\n /// @dev The main Kitty struct. Every cat in CryptoKitties is represented by a copy\n /// of this structure, so great care was taken to ensure that it fits neatly into\n /// exactly two 256-bit words. Note that the order of the members in this structure\n /// is important because of the byte-packing rules used by Ethereum.\n /// Ref: http://solidity.readthedocs.io/en/develop/miscellaneous.html\n struct Kitty {\n // The Kitty's genetic code is packed into these 256-bits, the format is\n // sooper-sekret! A cat's genes never change.\n uint256 genes;\n\n // The timestamp from the block when this cat came into existence.\n uint64 birthTime;\n\n // The minimum timestamp after which this cat can engage in breeding\n // activities again. This same timestamp is used for the pregnancy\n // timer (for matrons) as well as the siring cooldown.\n uint64 cooldownEndBlock;\n\n // The ID of the parents of this kitty, set to 0 for gen0 cats.\n // Note that using 32-bit unsigned integers limits us to a \"mere\"\n // 4 billion cats. This number might seem small until you realize\n // that Ethereum currently has a limit of about 500 million\n // transactions per year! So, this definitely won't be a problem\n // for several years (even as Ethereum learns to scale).\n uint32 matronId;\n uint32 sireId;\n\n // Set to the ID of the sire cat for matrons that are pregnant,\n // zero otherwise. A non-zero value here is how we know a cat\n // is pregnant. Used to retrieve the genetic material for the new\n // kitten when the birth transpires.\n uint32 siringWithId;\n\n // Set to the index in the cooldown array (see below) that represents\n // the current cooldown duration for this Kitty. This starts at zero\n // for gen0 cats, and is initialized to floor(generation/2) for others.\n // Incremented by one for each successful breeding action, regardless\n // of whether this cat is acting as matron or sire.\n uint16 cooldownIndex;\n\n // The \"generation number\" of this cat. Cats minted by the CK contract\n // for sale are called \"gen0\" and have a generation number of 0. The\n // generation number of all other cats is the larger of the two generation\n // numbers of their parents, plus one.\n // (i.e. max(matron.generation, sire.generation) + 1)\n uint16 generation;\n }\n\n /*** CONSTANTS ***/\n\n /// @dev A lookup table indicating the cooldown duration after any successful\n /// breeding action, called \"pregnancy time\" for matrons and \"siring cooldown\"\n /// for sires. Designed such that the cooldown roughly doubles each time a cat\n /// is bred, encouraging owners not to just keep breeding the same cat over\n /// and over again. Caps out at one week (a cat can breed an unbounded number\n /// of times, and the maximum cooldown is always seven days).\n uint32[14] public cooldowns = [\n uint32(1 minutes),\n uint32(2 minutes),\n uint32(5 minutes),\n uint32(10 minutes),\n uint32(30 minutes),\n uint32(1 hours),\n uint32(2 hours),\n uint32(4 hours),\n uint32(8 hours),\n uint32(16 hours),\n uint32(1 days),\n uint32(2 days),\n uint32(4 days),\n uint32(7 days)\n ];\n\n // An approximation of currently how many seconds are in between blocks.\n uint256 public secondsPerBlock = 15;\n\n /*** STORAGE ***/\n\n /// @dev An array containing the Kitty struct for all Kitties in existence. The ID\n /// of each cat is actually an index into this array. Note that ID 0 is a negacat,\n /// the unKitty, the mythical beast that is the parent of all gen0 cats. A bizarre\n /// creature that is both matron and sire... to itself! Has an invalid genetic code.\n /// In other words, cat ID 0 is invalid... ;-)\n Kitty[] kitties;\n\n /// @dev A mapping from cat IDs to the address that owns them. All cats have\n /// some valid owner address, even gen0 cats are created with a non-zero owner.\n mapping (uint256 => address) public kittyIndexToOwner;\n\n // @dev A mapping from owner address to count of tokens that address owns.\n // Used internally inside balanceOf() to resolve ownership count.\n mapping (address => uint256) ownershipTokenCount;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to call\n /// transferFrom(). Each Kitty can only have one approved address for transfer\n /// at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public kittyIndexToApproved;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to use\n /// this Kitty for siring via breedWith(). Each Kitty can only have one approved\n /// address for siring at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public sireAllowedToAddress;\n\n /// @dev The address of the ClockAuction contract that handles sales of Kitties. This\n /// same contract handles both peer-to-peer sales as well as the gen0 sales which are\n /// initiated every 15 minutes.\n SaleClockAuction public saleAuction;\n\n /// @dev The address of a custom ClockAuction subclassed contract that handles siring\n /// auctions. Needs to be separate from saleAuction because the actions taken on success\n /// after a sales and siring auction are quite different.\n SiringClockAuction public siringAuction;\n\n /// @dev Assigns ownership of a specific Kitty to an address.\n function _transfer(address _from, address _to, uint256 _tokenId) internal {\n // Since the number of kittens is capped to 2^32 we can't overflow this\n ownershipTokenCount[_to]++;\n // transfer ownership\n kittyIndexToOwner[_tokenId] = _to;\n // When creating new kittens _from is 0x0, but we can't account that address.\n if (_from != address(0)) {\n ownershipTokenCount[_from]--;\n // once the kitten is transferred also clear sire allowances\n delete sireAllowedToAddress[_tokenId];\n // clear any previously approved ownership exchange\n delete kittyIndexToApproved[_tokenId];\n }\n // Emit the transfer event.\n Transfer(_from, _to, _tokenId);\n }\n\n /// @dev An internal method that creates a new kitty and stores it. This\n /// method doesn't do any checking and should only be called when the\n /// input data is known to be valid. Will generate both a Birth event\n /// and a Transfer event.\n /// @param _matronId The kitty ID of the matron of this cat (zero for gen0)\n /// @param _sireId The kitty ID of the sire of this cat (zero for gen0)\n /// @param _generation The generation number of this cat, must be computed by caller.\n /// @param _genes The kitty's genetic code.\n /// @param _owner The inital owner of this cat, must be non-zero (except for the unKitty, ID 0)\n function _createKitty(\n uint256 _matronId,\n uint256 _sireId,\n uint256 _generation,\n uint256 _genes,\n address _owner\n )\n internal\n returns (uint)\n {\n // These requires are not strictly necessary, our calling code should make\n // sure that these conditions are never broken. However! _createKitty() is already\n // an expensive call (for storage), and it doesn't hurt to be especially careful\n // to ensure our data structures are always valid.\n require(_matronId == uint256(uint32(_matronId)));\n require(_sireId == uint256(uint32(_sireId)));\n require(_generation == uint256(uint16(_generation)));\n\n // New kitty starts with the same cooldown as parent gen/2\n uint16 cooldownIndex = uint16(_generation / 2);\n if (cooldownIndex > 13) {\n cooldownIndex = 13;\n }\n\n Kitty memory _kitty = Kitty({\n genes: _genes,\n birthTime: uint64(now),\n cooldownEndBlock: 0,\n matronId: uint32(_matronId),\n sireId: uint32(_sireId),\n siringWithId: 0,\n cooldownIndex: cooldownIndex,\n generation: uint16(_generation)\n });\n uint256 newKittenId = kitties.push(_kitty) - 1;\n\n // It's probably never going to happen, 4 billion cats is A LOT, but\n // let's just be 100% sure we never let this happen.\n require(newKittenId == uint256(uint32(newKittenId)));\n\n // emit the birth event\n Birth(\n _owner,\n newKittenId,\n uint256(_kitty.matronId),\n uint256(_kitty.sireId),\n _kitty.genes\n );\n\n // This will assign ownership, and also emit the Transfer event as\n // per ERC721 draft\n _transfer(0, _owner, newKittenId);\n\n return newKittenId;\n }\n\n // Any C-level can fix how many seconds per blocks are currently observed.\n function setSecondsPerBlock(uint256 secs) external onlyCLevel {\n require(secs < cooldowns[0]);\n secondsPerBlock = secs;\n }\n}\n\n\n\n\n\n/// @title The external contract that is responsible for generating metadata for the kitties,\n/// it has one function that will return the data as bytes.\ncontract KittiesERC721Metadata {\n /// @dev Given a token Id, returns a byte array that is supposed to be converted into string.\n function getMetadata(uint256 _tokenId, string) public view returns (bytes32[4] buffer, uint256 count) {\n if (_tokenId == 1) {\n buffer[0] = \"Hello World! :D\";\n count = 15;\n } else if (_tokenId == 2) {\n buffer[0] = \"I would definitely choose a medi\";\n buffer[1] = \"um length string.\";\n count = 49;\n } else if (_tokenId == 3) {\n buffer[0] = \"Lorem ipsum dolor sit amet, mi e\";\n buffer[1] = \"st accumsan dapibus augue lorem,\";\n buffer[2] = \" tristique vestibulum id, libero\";\n buffer[3] = \" suscipit varius sapien aliquam.\";\n count = 128;\n }\n }\n}\n\n\n/// @title The facet of the CryptoKitties core contract that manages ownership, ERC-721 (draft) compliant.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev Ref: https://github.com/ethereum/EIPs/issues/721\n/// See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyOwnership is KittyBase, KittiesERC721 {\n\n /// @notice Name and symbol of the non fungible token, as defined in ERC721.\n string public constant name = \"CryptoKitties\";\n string public constant symbol = \"CK\";\n\n // The contract that will return kitty metadata\n KittiesERC721Metadata public erc721Metadata;\n\n bytes4 constant InterfaceSignature_ERC165 =\n bytes4(keccak256('supportsInterface(bytes4)'));\n\n bytes4 constant InterfaceSignature_ERC721 =\n bytes4(keccak256('name()')) ^\n bytes4(keccak256('symbol()')) ^\n bytes4(keccak256('totalSupply()')) ^\n bytes4(keccak256('balanceOf(address)')) ^\n bytes4(keccak256('ownerOf(uint256)')) ^\n bytes4(keccak256('approve(address,uint256)')) ^\n bytes4(keccak256('transfer(address,uint256)')) ^\n bytes4(keccak256('transferFrom(address,address,uint256)')) ^\n bytes4(keccak256('tokensOfOwner(address)')) ^\n bytes4(keccak256('tokenMetadata(uint256,string)'));\n\n /// @notice Introspection interface as per ERC-165 (https://github.com/ethereum/EIPs/issues/165).\n /// Returns true for any standardized interfaces implemented by this contract. We implement\n /// ERC-165 (obviously!) and ERC-721.\n function supportsInterface(bytes4 _interfaceID) external view returns (bool)\n {\n // DEBUG ONLY\n //require((InterfaceSignature_ERC165 == 0x01ffc9a7) && (InterfaceSignature_ERC721 == 0x9a20483d));\n\n return ((_interfaceID == InterfaceSignature_ERC165) || (_interfaceID == InterfaceSignature_ERC721));\n }\n\n /// @dev Set the address of the sibling contract that tracks metadata.\n /// CEO only.\n function setMetadataAddress(address _contractAddress) public onlyCEO {\n erc721Metadata = KittiesERC721Metadata(_contractAddress);\n }\n\n // Internal utility functions: These functions all assume that their input arguments\n // are valid. We leave it to public methods to sanitize their inputs and follow\n // the required logic.\n\n /// @dev Checks if a given address is the current owner of a particular Kitty.\n /// @param _claimant the address we are validating against.\n /// @param _tokenId kitten id, only valid when > 0\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToOwner[_tokenId] == _claimant;\n }\n\n /// @dev Checks if a given address currently has transferApproval for a particular Kitty.\n /// @param _claimant the address we are confirming kitten is approved for.\n /// @param _tokenId kitten id, only valid when > 0\n function _approvedFor(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToApproved[_tokenId] == _claimant;\n }\n\n /// @dev Marks an address as being approved for transferFrom(), overwriting any previous\n /// approval. Setting _approved to address(0) clears all transfer approval.\n /// NOTE: _approve() does NOT send the Approval event. This is intentional because\n /// _approve() and transferFrom() are used together for putting Kitties on auction, and\n /// there is no value in spamming the log with Approval events in that case.\n function _approve(uint256 _tokenId, address _approved) internal {\n kittyIndexToApproved[_tokenId] = _approved;\n }\n\n /// @notice Returns the number of Kitties owned by a specific address.\n /// @param _owner The owner address to check.\n /// @dev Required for ERC-721 compliance\n function balanceOf(address _owner) public view returns (uint256 count) {\n return ownershipTokenCount[_owner];\n }\n\n /// @notice Transfers a Kitty to another address. If transferring to a smart\n /// contract be VERY CAREFUL to ensure that it is aware of ERC-721 (or\n /// CryptoKitties specifically) or your Kitty may be lost forever. Seriously.\n /// @param _to The address of the recipient, can be a user or contract.\n /// @param _tokenId The ID of the Kitty to transfer.\n /// @dev Required for ERC-721 compliance.\n function transfer(\n address _to,\n uint256 _tokenId\n )\n external\n whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Disallow transfers to the auction contracts to prevent accidental\n // misuse. Auction contracts should only take ownership of kitties\n // through the allow + transferFrom flow.\n require(_to != address(saleAuction));\n require(_to != address(siringAuction));\n\n // You can only send your own cat.\n require(_owns(msg.sender, _tokenId));\n\n // Reassign ownership, clear pending approvals, emit Transfer event.\n _transfer(msg.sender, _to, _tokenId);\n }\n\n /// @notice Grant another address the right to transfer a specific Kitty via\n /// transferFrom(). This is the preferred flow for transfering NFTs to contracts.\n /// @param _to The address to be granted transfer approval. Pass address(0) to\n /// clear all approvals.\n /// @param _tokenId The ID of the Kitty that can be transferred if this call succeeds.\n /// @dev Required for ERC-721 compliance.\n function approve(\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Only an owner can grant transfer approval.\n require(_owns(msg.sender, _tokenId));\n\n // Register the approval (replacing any previous approval).\n _approve(_tokenId, _to);\n\n // Emit approval event.\n Approval(msg.sender, _to, _tokenId);\n }\n\n /// @notice Transfer a Kitty owned by another address, for which the calling address\n /// has previously been granted transfer approval by the owner.\n /// @param _from The address that owns the Kitty to be transfered.\n /// @param _to The address that should take ownership of the Kitty. Can be any address,\n /// including the caller.\n /// @param _tokenId The ID of the Kitty to be transferred.\n /// @dev Required for ERC-721 compliance.\n function transferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Check for approval and valid ownership\n require(_approvedFor(msg.sender, _tokenId));\n require(_owns(_from, _tokenId));\n\n // Reassign ownership (also clears pending approvals and emits Transfer event).\n _transfer(_from, _to, _tokenId);\n }\n\n /// @notice Returns the total number of Kitties currently in existence.\n /// @dev Required for ERC-721 compliance.\n function totalSupply() public view returns (uint) {\n return kitties.length - 1;\n }\n\n /// @notice Returns the address currently assigned ownership of a given Kitty.\n /// @dev Required for ERC-721 compliance.\n function ownerOf(uint256 _tokenId)\n external\n view\n returns (address owner)\n {\n owner = kittyIndexToOwner[_tokenId];\n\n require(owner != address(0));\n }\n\n /// @notice Returns a list of all Kitty IDs assigned to an address.\n /// @param _owner The owner whose Kitties we are interested in.\n /// @dev This method MUST NEVER be called by smart contract code. First, it's fairly\n /// expensive (it walks the entire Kitty array looking for cats belonging to owner),\n /// but it also returns a dynamic array, which is only supported for web3 calls, and\n /// not contract-to-contract calls.\n function tokensOfOwner(address _owner) external view returns(uint256[] ownerTokens) {\n uint256 tokenCount = balanceOf(_owner);\n\n if (tokenCount == 0) {\n // Return an empty array\n return new uint256[](0);\n } else {\n uint256[] memory result = new uint256[](tokenCount);\n uint256 totalCats = totalSupply();\n uint256 resultIndex = 0;\n\n // We count on the fact that all cats have IDs starting at 1 and increasing\n // sequentially up to the totalCat count.\n uint256 catId;\n\n for (catId = 1; catId <= totalCats; catId++) {\n if (kittyIndexToOwner[catId] == _owner) {\n result[resultIndex] = catId;\n resultIndex++;\n }\n }\n\n return result;\n }\n }\n\n /// @dev Adapted from memcpy() by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _memcpy(uint _dest, uint _src, uint _len) private view {\n // Copy word-length chunks while possible\n for(; _len >= 32; _len -= 32) {\n assembly {\n mstore(_dest, mload(_src))\n }\n _dest += 32;\n _src += 32;\n }\n\n // Copy remaining bytes\n uint256 mask = 256 ** (32 - _len) - 1;\n assembly {\n let srcpart := and(mload(_src), not(mask))\n let destpart := and(mload(_dest), mask)\n mstore(_dest, or(destpart, srcpart))\n }\n }\n\n /// @dev Adapted from toString(slice) by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _toString(bytes32[4] _rawBytes, uint256 _stringLength) private view returns (string) {\n var outputString = new string(_stringLength);\n uint256 outputPtr;\n uint256 bytesPtr;\n\n assembly {\n outputPtr := add(outputString, 32)\n bytesPtr := _rawBytes\n }\n\n _memcpy(outputPtr, bytesPtr, _stringLength);\n\n return outputString;\n }\n\n /// @notice Returns a URI pointing to a metadata package for this token conforming to\n /// ERC-721 (https://github.com/ethereum/EIPs/issues/721)\n /// @param _tokenId The ID number of the Kitty whose metadata should be returned.\n function tokenMetadata(uint256 _tokenId, string _preferredTransport) external view returns (string infoUrl) {\n require(erc721Metadata != address(0));\n bytes32[4] memory buffer;\n uint256 count;\n (buffer, count) = erc721Metadata.getMetadata(_tokenId, _preferredTransport);\n\n return _toString(buffer, count);\n }\n}\n\n\n\n/// @title A facet of KittyCore that manages Kitty siring, gestation, and birth.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBreeding is KittyOwnership {\n\n /// @dev The Pregnant event is fired when two cats successfully breed and the pregnancy\n /// timer begins for the matron.\n event Pregnant(address owner, uint256 matronId, uint256 sireId, uint256 cooldownEndBlock);\n\n /// @notice The minimum payment required to use breedWithAuto(). This fee goes towards\n /// the gas cost paid by whatever calls giveBirth(), and can be dynamically updated by\n /// the COO role as the gas price changes.\n uint256 public autoBirthFee = 2 finney;\n\n // Keeps track of number of pregnant kitties.\n uint256 public pregnantKitties;\n\n /// @dev The address of the sibling contract that is used to implement the sooper-sekret\n /// genetic combination algorithm.\n GeneScienceInterface public geneScience;\n\n /// @dev Update the address of the genetic contract, can only be called by the CEO.\n /// @param _address An address of a GeneScience contract instance to be used from this point forward.\n function setGeneScienceAddress(address _address) external onlyCEO {\n GeneScienceInterface candidateContract = GeneScienceInterface(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isGeneScience());\n\n // Set the new contract address\n geneScience = candidateContract;\n }\n\n /// @dev Checks that a given kitten is able to breed. Requires that the\n /// current cooldown is finished (for sires) and also checks that there is\n /// no pending pregnancy.\n function _isReadyToBreed(Kitty _kit) internal view returns (bool) {\n // In addition to checking the cooldownEndBlock, we also need to check to see if\n // the cat has a pending birth; there can be some period of time between the end\n // of the pregnacy timer and the birth event.\n return (_kit.siringWithId == 0) && (_kit.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @dev Check if a sire has authorized breeding with this matron. True if both sire\n /// and matron have the same owner, or if the sire has given siring permission to\n /// the matron's owner (via approveSiring()).\n function _isSiringPermitted(uint256 _sireId, uint256 _matronId) internal view returns (bool) {\n address matronOwner = kittyIndexToOwner[_matronId];\n address sireOwner = kittyIndexToOwner[_sireId];\n\n // Siring is okay if they have same owner, or if the matron's owner was given\n // permission to breed with this sire.\n return (matronOwner == sireOwner || sireAllowedToAddress[_sireId] == matronOwner);\n }\n\n /// @dev Set the cooldownEndTime for the given Kitty, based on its current cooldownIndex.\n /// Also increments the cooldownIndex (unless it has hit the cap).\n /// @param _kitten A reference to the Kitty in storage which needs its timer started.\n function _triggerCooldown(Kitty storage _kitten) internal {\n // Compute an estimation of the cooldown time in blocks (based on current cooldownIndex).\n _kitten.cooldownEndBlock = uint64((cooldowns[_kitten.cooldownIndex]/secondsPerBlock) + block.number);\n\n // Increment the breeding count, clamping it at 13, which is the length of the\n // cooldowns array. We could check the array size dynamically, but hard-coding\n // this as a constant saves gas. Yay, Solidity!\n if (_kitten.cooldownIndex < 13) {\n _kitten.cooldownIndex += 1;\n }\n }\n\n /// @notice Grants approval to another user to sire with one of your Kitties.\n /// @param _addr The address that will be able to sire with your Kitty. Set to\n /// address(0) to clear all siring approvals for this Kitty.\n /// @param _sireId A Kitty that you own that _addr will now be able to sire with.\n function approveSiring(address _addr, uint256 _sireId)\n external\n whenNotPaused\n {\n require(_owns(msg.sender, _sireId));\n sireAllowedToAddress[_sireId] = _addr;\n }\n\n /// @dev Updates the minimum payment required for calling giveBirthAuto(). Can only\n /// be called by the COO address. (This fee is used to offset the gas cost incurred\n /// by the autobirth daemon).\n function setAutoBirthFee(uint256 val) external onlyCOO {\n autoBirthFee = val;\n }\n\n /// @dev Checks to see if a given Kitty is pregnant and (if so) if the gestation\n /// period has passed.\n function _isReadyToGiveBirth(Kitty _matron) private view returns (bool) {\n return (_matron.siringWithId != 0) && (_matron.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @notice Checks that a given kitten is able to breed (i.e. it is not pregnant or\n /// in the middle of a siring cooldown).\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isReadyToBreed(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n Kitty storage kit = kitties[_kittyId];\n return _isReadyToBreed(kit);\n }\n\n /// @dev Checks whether a kitty is currently pregnant.\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isPregnant(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n // A kitty is pregnant if and only if this field is set\n return kitties[_kittyId].siringWithId != 0;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair. DOES NOT\n /// check ownership permissions (that is up to the caller).\n /// @param _matron A reference to the Kitty struct of the potential matron.\n /// @param _matronId The matron's ID.\n /// @param _sire A reference to the Kitty struct of the potential sire.\n /// @param _sireId The sire's ID\n function _isValidMatingPair(\n Kitty storage _matron,\n uint256 _matronId,\n Kitty storage _sire,\n uint256 _sireId\n )\n private\n view\n returns(bool)\n {\n // A Kitty can't breed with itself!\n if (_matronId == _sireId) {\n return false;\n }\n\n // Kitties can't breed with their parents.\n if (_matron.matronId == _sireId || _matron.sireId == _sireId) {\n return false;\n }\n if (_sire.matronId == _matronId || _sire.sireId == _matronId) {\n return false;\n }\n\n // We can short circuit the sibling check (below) if either cat is\n // gen zero (has a matron ID of zero).\n if (_sire.matronId == 0 || _matron.matronId == 0) {\n return true;\n }\n\n // Kitties can't breed with full or half siblings.\n if (_sire.matronId == _matron.matronId || _sire.matronId == _matron.sireId) {\n return false;\n }\n if (_sire.sireId == _matron.matronId || _sire.sireId == _matron.sireId) {\n return false;\n }\n\n // Everything seems cool! Let's get DTF.\n return true;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair for\n /// breeding via auction (i.e. skips ownership and siring approval checks).\n function _canBreedWithViaAuction(uint256 _matronId, uint256 _sireId)\n internal\n view\n returns (bool)\n {\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId);\n }\n\n /// @notice Checks to see if two cats can breed together, including checks for\n /// ownership and siring approvals. Does NOT check that both cats are ready for\n /// breeding (i.e. breedWith could still fail until the cooldowns are finished).\n /// TODO: Shouldn't this check pregnancy and cooldowns?!?\n /// @param _matronId The ID of the proposed matron.\n /// @param _sireId The ID of the proposed sire.\n function canBreedWith(uint256 _matronId, uint256 _sireId)\n external\n view\n returns(bool)\n {\n require(_matronId > 0);\n require(_sireId > 0);\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId) &&\n _isSiringPermitted(_sireId, _matronId);\n }\n\n /// @dev Internal utility function to initiate breeding, assumes that all breeding\n /// requirements have been checked.\n function _breedWith(uint256 _matronId, uint256 _sireId) internal {\n // Grab a reference to the Kitties from storage.\n Kitty storage sire = kitties[_sireId];\n Kitty storage matron = kitties[_matronId];\n\n // Mark the matron as pregnant, keeping track of who the sire is.\n matron.siringWithId = uint32(_sireId);\n\n // Trigger the cooldown for both parents.\n _triggerCooldown(sire);\n _triggerCooldown(matron);\n\n // Clear siring permission for both parents. This may not be strictly necessary\n // but it's likely to avoid confusion!\n delete sireAllowedToAddress[_matronId];\n delete sireAllowedToAddress[_sireId];\n\n // Every time a kitty gets pregnant, counter is incremented.\n pregnantKitties++;\n\n // Emit the pregnancy event.\n Pregnant(kittyIndexToOwner[_matronId], _matronId, _sireId, matron.cooldownEndBlock);\n }\n\n /// @notice Breed a Kitty you own (as matron) with a sire that you own, or for which you\n /// have previously been given Siring approval. Will either make your cat pregnant, or will\n /// fail entirely. Requires a pre-payment of the fee given out to the first caller of giveBirth()\n /// @param _matronId The ID of the Kitty acting as matron (will end up pregnant if successful)\n /// @param _sireId The ID of the Kitty acting as sire (will begin its siring cooldown if successful)\n function breedWithAuto(uint256 _matronId, uint256 _sireId)\n external\n payable\n whenNotPaused\n {\n // Checks for payment.\n require(msg.value >= autoBirthFee);\n\n // Caller must own the matron.\n require(_owns(msg.sender, _matronId));\n\n // Neither sire nor matron are allowed to be on auction during a normal\n // breeding operation, but we don't need to check that explicitly.\n // For matron: The caller of this function can't be the owner of the matron\n // because the owner of a Kitty on auction is the auction house, and the\n // auction house will never call breedWith().\n // For sire: Similarly, a sire on auction will be owned by the auction house\n // and the act of transferring ownership will have cleared any oustanding\n // siring approval.\n // Thus we don't need to spend gas explicitly checking to see if either cat\n // is on auction.\n\n // Check that matron and sire are both owned by caller, or that the sire\n // has given siring permission to caller (i.e. matron's owner).\n // Will fail for _sireId = 0\n require(_isSiringPermitted(_sireId, _matronId));\n\n // Grab a reference to the potential matron\n Kitty storage matron = kitties[_matronId];\n\n // Make sure matron isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(matron));\n\n // Grab a reference to the potential sire\n Kitty storage sire = kitties[_sireId];\n\n // Make sure sire isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(sire));\n\n // Test that these cats are a valid mating pair.\n require(_isValidMatingPair(\n matron,\n _matronId,\n sire,\n _sireId\n ));\n\n // All checks passed, kitty gets pregnant!\n _breedWith(_matronId, _sireId);\n }\n\n /// @notice Have a pregnant Kitty give birth!\n /// @param _matronId A Kitty ready to give birth.\n /// @return The Kitty ID of the new kitten.\n /// @dev Looks at a given Kitty and, if pregnant and if the gestation period has passed,\n /// combines the genes of the two parents to create a new kitten. The new Kitty is assigned\n /// to the current owner of the matron. Upon successful completion, both the matron and the\n /// new kitten will be ready to breed again. Note that anyone can call this function (if they\n /// are willing to pay the gas!), but the new kitten always goes to the mother's owner.\n function giveBirth(uint256 _matronId)\n external\n whenNotPaused\n returns(uint256)\n {\n // Grab a reference to the matron in storage.\n Kitty storage matron = kitties[_matronId];\n\n // Check that the matron is a valid cat.\n require(matron.birthTime != 0);\n\n // Check that the matron is pregnant, and that its time has come!\n require(_isReadyToGiveBirth(matron));\n\n // Grab a reference to the sire in storage.\n uint256 sireId = matron.siringWithId;\n Kitty storage sire = kitties[sireId];\n\n // Determine the higher generation number of the two parents\n uint16 parentGen = matron.generation;\n if (sire.generation > matron.generation) {\n parentGen = sire.generation;\n }\n\n // Call the sooper-sekret gene mixing operation.\n uint256 childGenes = geneScience.mixGenes(matron.genes, sire.genes, matron.cooldownEndBlock - 1);\n\n // Make the new kitten!\n address owner = kittyIndexToOwner[_matronId];\n uint256 kittenId = _createKitty(_matronId, matron.siringWithId, parentGen + 1, childGenes, owner);\n\n // Clear the reference to sire from the matron (REQUIRED! Having siringWithId\n // set is what marks a matron as being pregnant.)\n delete matron.siringWithId;\n\n // Every time a kitty gives birth counter is decremented.\n pregnantKitties--;\n\n // Send the balance fee to the person who made birth happen.\n msg.sender.send(autoBirthFee);\n\n // return the new kitten's ID\n return kittenId;\n }\n}\n\n\n\n\n\n\n\n\n\n\n/// @title Auction Core\n/// @dev Contains models, variables, and internal methods for the auction.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuctionBase {\n\n // Represents an auction on an NFT\n struct Auction {\n // Current owner of NFT\n address seller;\n // Price (in wei) at beginning of auction\n uint128 startingPrice;\n // Price (in wei) at end of auction\n uint128 endingPrice;\n // Duration (in seconds) of auction\n uint64 duration;\n // Time when auction started\n // NOTE: 0 if this auction has been concluded\n uint64 startedAt;\n }\n\n // Reference to contract tracking NFT ownership\n KittiesERC721 public nonFungibleContract;\n\n // Cut owner takes on each auction, measured in basis points (1/100 of a percent).\n // Values 0-10,000 map to 0%-100%\n uint256 public ownerCut;\n\n // Map from token ID to their corresponding auction.\n mapping (uint256 => Auction) tokenIdToAuction;\n\n event AuctionCreated(uint256 tokenId, uint256 startingPrice, uint256 endingPrice, uint256 duration);\n event AuctionSuccessful(uint256 tokenId, uint256 totalPrice, address winner);\n event AuctionCancelled(uint256 tokenId);\n\n /// @dev Returns true if the claimant owns the token.\n /// @param _claimant - Address claiming to own the token.\n /// @param _tokenId - ID of token whose ownership to verify.\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return (nonFungibleContract.ownerOf(_tokenId) == _claimant);\n }\n\n /// @dev Escrows the NFT, assigning ownership to this contract.\n /// Throws if the escrow fails.\n /// @param _owner - Current owner address of token to escrow.\n /// @param _tokenId - ID of token whose approval to verify.\n function _escrow(address _owner, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transferFrom(_owner, this, _tokenId);\n }\n\n /// @dev Transfers an NFT owned by this contract to another address.\n /// Returns true if the transfer succeeds.\n /// @param _receiver - Address to transfer NFT to.\n /// @param _tokenId - ID of token to transfer.\n function _transfer(address _receiver, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transfer(_receiver, _tokenId);\n }\n\n /// @dev Adds an auction to the list of open auctions. Also fires the\n /// AuctionCreated event.\n /// @param _tokenId The ID of the token to be put on auction.\n /// @param _auction Auction to add.\n function _addAuction(uint256 _tokenId, Auction _auction) internal {\n // Require that all auctions have a duration of\n // at least one minute. (Keeps our math from getting hairy!)\n require(_auction.duration >= 1 minutes);\n\n tokenIdToAuction[_tokenId] = _auction;\n\n AuctionCreated(\n uint256(_tokenId),\n uint256(_auction.startingPrice),\n uint256(_auction.endingPrice),\n uint256(_auction.duration)\n );\n }\n\n /// @dev Cancels an auction unconditionally.\n function _cancelAuction(uint256 _tokenId, address _seller) internal {\n _removeAuction(_tokenId);\n _transfer(_seller, _tokenId);\n AuctionCancelled(_tokenId);\n }\n\n /// @dev Computes the price and transfers winnings.\n /// Does NOT transfer ownership of token.\n function _bid(uint256 _tokenId, uint256 _bidAmount)\n internal\n returns (uint256)\n {\n // Get a reference to the auction struct\n Auction storage auction = tokenIdToAuction[_tokenId];\n\n // Explicitly check that this auction is currently live.\n // (Because of how Ethereum mappings work, we can't just count\n // on the lookup above failing. An invalid _tokenId will just\n // return an auction object that is all zeros.)\n require(_isOnAuction(auction));\n\n // Check that the bid is greater than or equal to the current price\n uint256 price = _currentPrice(auction);\n require(_bidAmount >= price);\n\n // Grab a reference to the seller before the auction struct\n // gets deleted.\n address seller = auction.seller;\n\n // The bid is good! Remove the auction before sending the fees\n // to the sender so we can't have a reentrancy attack.\n _removeAuction(_tokenId);\n\n // Transfer proceeds to seller (if there are any!)\n if (price > 0) {\n // Calculate the auctioneer's cut.\n // (NOTE: _computeCut() is guaranteed to return a\n // value <= price, so this subtraction can't go negative.)\n uint256 auctioneerCut = _computeCut(price);\n uint256 sellerProceeds = price - auctioneerCut;\n\n // NOTE: Doing a transfer() in the middle of a complex\n // method like this is generally discouraged because of\n // reentrancy attacks and DoS attacks if the seller is\n // a contract with an invalid fallback function. We explicitly\n // guard against reentrancy attacks by removing the auction\n // before calling transfer(), and the only thing the seller\n // can DoS is the sale of their own asset! (And if it's an\n // accident, they can call cancelAuction(). )\n seller.transfer(sellerProceeds);\n }\n\n // Calculate any excess funds included with the bid. If the excess\n // is anything worth worrying about, transfer it back to bidder.\n // NOTE: We checked above that the bid amount is greater than or\n // equal to the price so this cannot underflow.\n uint256 bidExcess = _bidAmount - price;\n\n // Return the funds. Similar to the previous transfer, this is\n // not susceptible to a re-entry attack because the auction is\n // removed before any transfers occur.\n msg.sender.transfer(bidExcess);\n\n // Tell the world!\n AuctionSuccessful(_tokenId, price, msg.sender);\n\n return price;\n }\n\n /// @dev Removes an auction from the list of open auctions.\n /// @param _tokenId - ID of NFT on auction.\n function _removeAuction(uint256 _tokenId) internal {\n delete tokenIdToAuction[_tokenId];\n }\n\n /// @dev Returns true if the NFT is on auction.\n /// @param _auction - Auction to check.\n function _isOnAuction(Auction storage _auction) internal view returns (bool) {\n return (_auction.startedAt > 0);\n }\n\n /// @dev Returns current price of an NFT on auction. Broken into two\n /// functions (this one, that computes the duration from the auction\n /// structure, and the other that does the price computation) so we\n /// can easily test that the price computation works correctly.\n function _currentPrice(Auction storage _auction)\n internal\n view\n returns (uint256)\n {\n uint256 secondsPassed = 0;\n\n // A bit of insurance against negative values (or wraparound).\n // Probably not necessary (since Ethereum guarnatees that the\n // now variable doesn't ever go backwards).\n if (now > _auction.startedAt) {\n secondsPassed = now - _auction.startedAt;\n }\n\n return _computeCurrentPrice(\n _auction.startingPrice,\n _auction.endingPrice,\n _auction.duration,\n secondsPassed\n );\n }\n\n /// @dev Computes the current price of an auction. Factored out\n /// from _currentPrice so we can run extensive unit tests.\n /// When testing, make this function public and turn on\n /// `Current price computation` test suite.\n function _computeCurrentPrice(\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n uint256 _secondsPassed\n )\n internal\n pure\n returns (uint256)\n {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our public functions carefully cap the maximum values for\n // time (at 64-bits) and currency (at 128-bits). _duration is\n // also known to be non-zero (see the require() statement in\n // _addAuction())\n if (_secondsPassed >= _duration) {\n // We've reached the end of the dynamic pricing portion\n // of the auction, just return the end price.\n return _endingPrice;\n } else {\n // Starting price can be higher than ending price (and often is!), so\n // this delta can be negative.\n int256 totalPriceChange = int256(_endingPrice) - int256(_startingPrice);\n\n // This multiplication can't overflow, _secondsPassed will easily fit within\n // 64-bits, and totalPriceChange will easily fit within 128-bits, their product\n // will always fit within 256-bits.\n int256 currentPriceChange = totalPriceChange * int256(_secondsPassed) / int256(_duration);\n\n // currentPriceChange can be negative, but if so, will have a magnitude\n // less that _startingPrice. Thus, this result will always end up positive.\n int256 currentPrice = int256(_startingPrice) + currentPriceChange;\n\n return uint256(currentPrice);\n }\n }\n\n /// @dev Computes owner's cut of a sale.\n /// @param _price - Sale price of NFT.\n function _computeCut(uint256 _price) internal view returns (uint256) {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our entry functions carefully cap the maximum values for\n // currency (at 128-bits), and ownerCut <= 10000 (see the require()\n // statement in the ClockAuction constructor). The result of this\n // function is always guaranteed to be <= _price.\n return _price * ownerCut / 10000;\n }\n\n}\n\n\n\n\n\n\n\n/**\n * @title KittiesPausable\n * @dev Base contract which allows children to implement an emergency stop mechanism.\n */\ncontract KittiesPausable is KittiesOwnable {\n event Pause();\n event Unpause();\n\n bool public paused = false;\n\n\n /**\n\t * @dev modifier to allow actions only when the contract IS paused\n\t */\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /**\n\t * @dev modifier to allow actions only when the contract IS NOT paused\n\t */\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /**\n\t * @dev called by the owner to pause, triggers stopped state\n\t */\n function pause() onlyOwner whenNotPaused returns (bool) {\n paused = true;\n Pause();\n return true;\n }\n\n /**\n\t * @dev called by the owner to unpause, returns to normal state\n\t */\n function unpause() onlyOwner whenPaused returns (bool) {\n paused = false;\n Unpause();\n return true;\n }\n}\n\n\n/// @title Clock auction for non-fungible tokens.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuction is KittiesPausable, ClockAuctionBase {\n\n /// @dev The ERC-165 interface signature for ERC-721.\n /// Ref: https://github.com/ethereum/EIPs/issues/165\n /// Ref: https://github.com/ethereum/EIPs/issues/721\n bytes4 constant InterfaceSignature_ERC721 = bytes4(0x9a20483d);\n\n /// @dev Constructor creates a reference to the NFT ownership contract\n /// and verifies the owner cut is in the valid range.\n /// @param _nftAddress - address of a deployed contract implementing\n /// the Nonfungible Interface.\n /// @param _cut - percent cut the owner takes on each auction, must be\n /// between 0-10,000.\n function ClockAuction(address _nftAddress, uint256 _cut) public {\n require(_cut <= 10000);\n ownerCut = _cut;\n\n KittiesERC721 candidateContract = KittiesERC721(_nftAddress);\n require(candidateContract.supportsInterface(InterfaceSignature_ERC721));\n nonFungibleContract = candidateContract;\n }\n\n /// @dev Remove all Ether from the contract, which is the owner's cuts\n /// as well as any Ether sent directly to the contract address.\n /// Always transfers to the NFT contract, but can be called either by\n /// the owner or the NFT contract.\n function withdrawBalance() external {\n address nftAddress = address(nonFungibleContract);\n\n require(\n msg.sender == owner ||\n msg.sender == nftAddress\n );\n // We are using this boolean method to make sure that even if one fails it will still work\n bool res = nftAddress.send(this.balance);\n }\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of time to move between starting\n /// price and ending price (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n whenNotPaused\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(_owns(msg.sender, _tokenId));\n _escrow(msg.sender, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Bids on an open auction, completing the auction and transferring\n /// ownership of the NFT if enough Ether is supplied.\n /// @param _tokenId - ID of token to bid on.\n function bid(uint256 _tokenId)\n external\n payable\n whenNotPaused\n {\n // _bid will throw if the bid or funds transfer fails\n _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n }\n\n /// @dev Cancels an auction that hasn't been won yet.\n /// Returns the NFT to original owner.\n /// @notice This is a state-modifying function that can\n /// be called while the contract is paused.\n /// @param _tokenId - ID of token on auction\n function cancelAuction(uint256 _tokenId)\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n address seller = auction.seller;\n require(msg.sender == seller);\n _cancelAuction(_tokenId, seller);\n }\n\n /// @dev Cancels an auction when the contract is paused.\n /// Only the owner may do this, and NFTs are returned to\n /// the seller. This should only be used in emergencies.\n /// @param _tokenId - ID of the NFT on auction to cancel.\n function cancelAuctionWhenPaused(uint256 _tokenId)\n whenPaused\n onlyOwner\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n _cancelAuction(_tokenId, auction.seller);\n }\n\n /// @dev Returns auction info for an NFT on auction.\n /// @param _tokenId - ID of NFT on auction.\n function getAuction(uint256 _tokenId)\n external\n view\n returns\n (\n address seller,\n uint256 startingPrice,\n uint256 endingPrice,\n uint256 duration,\n uint256 startedAt\n ) {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return (\n auction.seller,\n auction.startingPrice,\n auction.endingPrice,\n auction.duration,\n auction.startedAt\n );\n }\n\n /// @dev Returns the current price of an auction.\n /// @param _tokenId - ID of the token price we are checking.\n function getCurrentPrice(uint256 _tokenId)\n external\n view\n returns (uint256)\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return _currentPrice(auction);\n }\n\n}\n\n\n/// @title Reverse auction modified for siring\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SiringClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSiringAuctionAddress() call.\n bool public isSiringClockAuction = true;\n\n // Delegate constructor\n function SiringClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction. Since this function is wrapped,\n /// require sender to be KittyCore contract.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Places a bid for siring. Requires the sender\n /// is the KittyCore contract because all bid methods\n /// should be wrapped. Also returns the kitty to the\n /// seller rather than the winner.\n function bid(uint256 _tokenId)\n external\n payable\n {\n require(msg.sender == address(nonFungibleContract));\n address seller = tokenIdToAuction[_tokenId].seller;\n // _bid checks that token ID is valid and will throw if bid fails\n _bid(_tokenId, msg.value);\n // We transfer the kitty back to the seller, the winner will get\n // the offspring\n _transfer(seller, _tokenId);\n }\n\n}\n\n\n\n\n\n/// @title Clock auction modified for sale of kitties\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SaleClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSaleAuctionAddress() call.\n bool public isSaleClockAuction = true;\n\n // Tracks last 5 sale price of gen0 kitty sales\n uint256 public gen0SaleCount;\n uint256[5] public lastGen0SalePrices;\n\n // Delegate constructor\n function SaleClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Updates lastSalePrice if seller is the nft contract\n /// Otherwise, works the same as default bid method.\n function bid(uint256 _tokenId)\n external\n payable\n {\n // _bid verifies token ID size\n address seller = tokenIdToAuction[_tokenId].seller;\n uint256 price = _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n\n // If not a gen0 auction, exit\n if (seller == address(nonFungibleContract)) {\n // Track gen0 sale prices\n lastGen0SalePrices[gen0SaleCount % 5] = price;\n gen0SaleCount++;\n }\n }\n\n function averageGen0SalePrice() external view returns (uint256) {\n uint256 sum = 0;\n for (uint256 i = 0; i < 5; i++) {\n sum += lastGen0SalePrices[i];\n }\n return sum / 5;\n }\n\n}\n\n\n/// @title Handles creating auctions for sale and siring of kitties.\n/// This wrapper of ReverseAuction exists only so that users can create\n/// auctions with only one transaction.\ncontract KittyAuction is KittyBreeding {\n\n // @notice The auction contract variables are defined in KittyBase to allow\n // us to refer to them in KittyOwnership to prevent accidental transfers.\n // `saleAuction` refers to the auction for gen0 and p2p sale of kitties.\n // `siringAuction` refers to the auction for siring rights of kitties.\n\n /// @dev Sets the reference to the sale auction.\n /// @param _address - Address of sale contract.\n function setSaleAuctionAddress(address _address) external onlyCEO {\n SaleClockAuction candidateContract = SaleClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSaleClockAuction());\n\n // Set the new contract address\n saleAuction = candidateContract;\n }\n\n /// @dev Sets the reference to the siring auction.\n /// @param _address - Address of siring contract.\n function setSiringAuctionAddress(address _address) external onlyCEO {\n SiringClockAuction candidateContract = SiringClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSiringClockAuction());\n\n // Set the new contract address\n siringAuction = candidateContract;\n }\n\n /// @dev Put a kitty up for auction.\n /// Does some ownership trickery to create auctions in one tx.\n function createSaleAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n // Ensure the kitty is not pregnant to prevent the auction\n // contract accidentally receiving ownership of the child.\n // NOTE: the kitty IS allowed to be in a cooldown.\n require(!isPregnant(_kittyId));\n _approve(_kittyId, saleAuction);\n // Sale auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n saleAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Put a kitty up for auction to be sire.\n /// Performs checks to ensure the kitty can be sired, then\n /// delegates to reverse auction.\n function createSiringAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n require(isReadyToBreed(_kittyId));\n _approve(_kittyId, siringAuction);\n // Siring auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n siringAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Completes a siring auction by bidding.\n /// Immediately breeds the winning matron with the sire on auction.\n /// @param _sireId - ID of the sire on auction.\n /// @param _matronId - ID of the matron owned by the bidder.\n function bidOnSiringAuction(\n uint256 _sireId,\n uint256 _matronId\n )\n external\n payable\n whenNotPaused\n {\n // Auction contract checks input sizes\n require(_owns(msg.sender, _matronId));\n require(isReadyToBreed(_matronId));\n require(_canBreedWithViaAuction(_matronId, _sireId));\n\n // Define the current price of the auction.\n uint256 currentPrice = siringAuction.getCurrentPrice(_sireId);\n require(msg.value >= currentPrice + autoBirthFee);\n\n // Siring auction will throw if the bid fails.\n siringAuction.bid.value(msg.value - autoBirthFee)(_sireId);\n _breedWith(uint32(_matronId), uint32(_sireId));\n }\n\n /// @dev Transfers the balance of the sale auction contract\n /// to the KittyCore contract. We use two-step withdrawal to\n /// prevent two transfer calls in the auction bid function.\n function withdrawAuctionBalances() external onlyCLevel {\n saleAuction.withdrawBalance();\n siringAuction.withdrawBalance();\n }\n}\n\n\n/// @title all functions related to creating kittens\ncontract KittyMinting is KittyAuction {\n\n // Limits the number of cats the contract owner can ever create.\n uint256 public constant PROMO_CREATION_LIMIT = 5000;\n uint256 public constant GEN0_CREATION_LIMIT = 45000;\n\n // Constants for gen0 auctions.\n uint256 public constant GEN0_STARTING_PRICE = 10 finney;\n uint256 public constant GEN0_AUCTION_DURATION = 1 days;\n\n // Counts the number of cats the contract owner has created.\n uint256 public promoCreatedCount;\n uint256 public gen0CreatedCount;\n\n /// @dev we can create promo kittens, up to a limit. Only callable by COO\n /// @param _genes the encoded genes of the kitten to be created, any value is accepted\n /// @param _owner the future owner of the created kittens. Default to contract COO\n function createPromoKitty(uint256 _genes, address _owner) external onlyCOO {\n address kittyOwner = _owner;\n if (kittyOwner == address(0)) {\n kittyOwner = cooAddress;\n }\n require(promoCreatedCount < PROMO_CREATION_LIMIT);\n\n promoCreatedCount++;\n _createKitty(0, 0, 0, _genes, kittyOwner);\n }\n\n /// @dev Creates a new gen0 kitty with the given genes and\n /// creates an auction for it.\n function createGen0Auction(uint256 _genes) external onlyCOO {\n require(gen0CreatedCount < GEN0_CREATION_LIMIT);\n\n uint256 kittyId = _createKitty(0, 0, 0, _genes, address(this));\n _approve(kittyId, saleAuction);\n\n saleAuction.createAuction(\n kittyId,\n _computeNextGen0Price(),\n 0,\n GEN0_AUCTION_DURATION,\n address(this)\n );\n\n gen0CreatedCount++;\n }\n\n /// @dev Computes the next gen0 auction starting price, given\n /// the average of the past 5 prices + 50%.\n function _computeNextGen0Price() internal view returns (uint256) {\n uint256 avePrice = saleAuction.averageGen0SalePrice();\n\n // Sanity check to ensure we don't overflow arithmetic\n require(avePrice == uint256(uint128(avePrice)));\n\n uint256 nextPrice = avePrice + (avePrice / 2);\n\n // We never auction for less than starting price\n if (nextPrice < GEN0_STARTING_PRICE) {\n nextPrice = GEN0_STARTING_PRICE;\n }\n\n return nextPrice;\n }\n}\n\n\n/// @title CryptoKitties: Collectible, breedable, and oh-so-adorable cats on the Ethereum blockchain.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev The main CryptoKitties contract, keeps track of kittens so they don't wander around and get lost.\ncontract KittyCore is KittyMinting {\n\n // This is the main CryptoKitties contract. In order to keep our code seperated into logical sections,\n // we've broken it up in two ways. First, we have several seperately-instantiated sibling contracts\n // that handle auctions and our super-top-secret genetic combination algorithm. The auctions are\n // seperate since their logic is somewhat complex and there's always a risk of subtle bugs. By keeping\n // them in their own contracts, we can upgrade them without disrupting the main contract that tracks\n // kitty ownership. The genetic combination algorithm is kept seperate so we can open-source all of\n // the rest of our code without making it _too_ easy for folks to figure out how the genetics work.\n // Don't worry, I'm sure someone will reverse engineer it soon enough!\n //\n // Secondly, we break the core contract into multiple files using inheritence, one for each major\n // facet of functionality of CK. This allows us to keep related code bundled together while still\n // avoiding a single giant file with everything in it. The breakdown is as follows:\n //\n // - KittyBase: This is where we define the most fundamental code shared throughout the core\n // functionality. This includes our main data storage, constants and data types, plus\n // internal functions for managing these items.\n //\n // - KittyAccessControl: This contract manages the various addresses and constraints for operations\n // that can be executed only by specific roles. Namely CEO, CFO and COO.\n //\n // - KittyOwnership: This provides the methods required for basic non-fungible token\n // transactions, following the draft ERC-721 spec (https://github.com/ethereum/EIPs/issues/721).\n //\n // - KittyBreeding: This file contains the methods necessary to breed cats together, including\n // keeping track of siring offers, and relies on an external genetic combination contract.\n //\n // - KittyAuctions: Here we have the public methods for auctioning or bidding on cats or siring\n // services. The actual auction functionality is handled in two sibling contracts (one\n // for sales and one for siring), while auction creation and bidding is mostly mediated\n // through this facet of the core contract.\n //\n // - KittyMinting: This final facet contains the functionality we use for creating new gen0 cats.\n // We can make up to 5000 \"promo\" cats that can be given away (especially important when\n // the community is new), and all others can only be created and then immediately put up\n // for auction via an algorithmically determined starting price. Regardless of how they\n // are created, there is a hard limit of 50k gen0 cats. After that, it's all up to the\n // community to breed, breed, breed!\n\n // Set in case the core contract is broken and an upgrade is required\n address public newContractAddress;\n\n /// @notice Creates the main CryptoKitties smart contract instance.\n function KittyCore() public {\n // Starts paused.\n paused = true;\n\n // the creator of the contract is the initial CEO\n ceoAddress = msg.sender;\n\n // the creator of the contract is also the initial COO\n cooAddress = msg.sender;\n\n // start with the mythical kitten 0 - so we don't have generation-0 parent issues\n _createKitty(0, 0, 0, uint256(-1), address(0));\n }\n\n /// @dev Used to mark the smart contract as upgraded, in case there is a serious\n /// breaking bug. This method does nothing but keep track of the new contract and\n /// emit a message indicating that the new address is set. It's up to clients of this\n /// contract to update to the new contract address in that case. (This contract will\n /// be paused indefinitely if such an upgrade takes place.)\n /// @param _v2Address new address\n function setNewAddress(address _v2Address) external onlyCEO whenPaused {\n // See README.md for updgrade plan\n newContractAddress = _v2Address;\n ContractUpgrade(_v2Address);\n }\n\n /// @notice No tipping!\n /// @dev Reject all Ether from being sent here, unless it's from one of the\n /// two auction contracts. (Hopefully, we can prevent user accidents.)\n function() external payable {\n require(\n msg.sender == address(saleAuction) ||\n msg.sender == address(siringAuction)\n );\n }\n\n /// @notice Returns all the relevant information about a specific kitty.\n /// @param _id The ID of the kitty of interest.\n function getKitty(uint256 _id)\n external\n view\n returns (\n bool isGestating,\n bool isReady,\n uint256 cooldownIndex,\n uint256 nextActionAt,\n uint256 siringWithId,\n uint256 birthTime,\n uint256 matronId,\n uint256 sireId,\n uint256 generation,\n uint256 genes\n ) {\n Kitty storage kit = kitties[_id];\n\n // if this variable is 0 then it's not gestating\n isGestating = (kit.siringWithId != 0);\n isReady = (kit.cooldownEndBlock <= block.number);\n cooldownIndex = uint256(kit.cooldownIndex);\n nextActionAt = uint256(kit.cooldownEndBlock);\n siringWithId = uint256(kit.siringWithId);\n birthTime = uint256(kit.birthTime);\n matronId = uint256(kit.matronId);\n sireId = uint256(kit.sireId);\n generation = uint256(kit.generation);\n genes = kit.genes;\n }\n\n /// @dev Override unpause so it requires all external contract addresses\n /// to be set before contract can be unpaused. Also, we can't have\n /// newContractAddress set either, because then the contract was upgraded.\n /// @notice This is public rather than external so we can call super.unpause\n /// without using an expensive CALL.\n function unpause() public onlyCEO whenPaused {\n require(saleAuction != address(0));\n require(siringAuction != address(0));\n require(geneScience != address(0));\n require(newContractAddress == address(0));\n\n // Actually unpause the contract.\n super.unpause();\n }\n\n // @dev Allows the CFO to capture the balance available to the contract.\n function withdrawBalance() external onlyCFO {\n uint256 balance = this.balance;\n // Subtract all the currently pregnant kittens we have, plus 1 of margin.\n uint256 subtractFees = (pregnantKitties + 1) * autoBirthFee;\n\n if (balance > subtractFees) {\n cfoAddress.send(balance - subtractFees);\n }\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "exportedSymbols": { "ClockAuction": [ 8872 @@ -52641,5 +52641,5 @@ }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:47.925Z" + "updatedAt": "2018-10-09T17:45:36.305Z" } \ No newline at end of file diff --git a/artifacts/json/KittyOwnership.json b/artifacts/json/KittyOwnership.json index 9ca82f81..5076fd91 100644 --- a/artifacts/json/KittyOwnership.json +++ b/artifacts/json/KittyOwnership.json @@ -565,15 +565,15 @@ "type": "event" } ], - "bytecode": "0x60606040526000600260146101000a81548160ff0219169083151502179055506101c060405190810160405280603c63ffffffff1663ffffffff168152602001607863ffffffff1663ffffffff16815260200161012c63ffffffff1663ffffffff16815260200161025863ffffffff1663ffffffff16815260200161070863ffffffff1663ffffffff168152602001610e1063ffffffff1663ffffffff168152602001611c2063ffffffff1663ffffffff16815260200161384063ffffffff1663ffffffff16815260200161708063ffffffff1663ffffffff16815260200161e10063ffffffff1663ffffffff1681526020016201518063ffffffff1663ffffffff1681526020016202a30063ffffffff1663ffffffff1681526020016205460063ffffffff1663ffffffff16815260200162093a8063ffffffff1663ffffffff16815250600390600e620001569291906200016e565b50600f60055534156200016857600080fd5b6200024e565b82600e600701600890048101928215620002055791602002820160005b83821115620001d157835183826101000a81548163ffffffff021916908363ffffffff16021790555092602001926004016020816003010492830192600103026200018b565b8015620002035782816101000a81549063ffffffff0219169055600401602081600301049283019260010302620001d1565b505b50905062000214919062000218565b5090565b6200024b91905b808211156200024757600081816101000a81549063ffffffff0219169055506001016200021f565b5090565b90565b612169806200025e6000396000f300606060405260043610610180576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146101855780630519ce79146101df5780630560ff441461023457806306fdde03146102e4578063095ea7b3146103725780630a0f8168146103b457806318160ddd1461040957806321717ebf1461043257806323b872dd1461048757806327d7874c146104e85780632ba73c15146105215780633f4ba83a1461055a57806346116e6f1461056f578063481af3d3146105d25780634e0a3379146106355780635663896e1461066e5780635c975abb146106915780636352211e146106be57806370a08231146107215780637a7d49371461076e5780638456cb59146107975780638462151c146107ac57806395d89b411461083a5780639d6fac6f146108c8578063a45f4bfc1461090b578063a9059cbb1461096e578063b047fb50146109b0578063bc4006f514610a05578063e17b25af14610a5a578063e6cbe35114610a93575b600080fd5b341561019057600080fd5b6101c560048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050610ae8565b604051808215151515815260200191505060405180910390f35b34156101ea57600080fd5b6101f2610df9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561023f57600080fd5b61026960048080359060200190919080359060200190820180359060200191909192905050610e1f565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102a957808201518184015260208101905061028e565b50505050905090810190601f1680156102d65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156102ef57600080fd5b6102f7610f8a565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561033757808201518184015260208101905061031c565b50505050905090810190601f1680156103645780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561037d57600080fd5b6103b2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610fc3565b005b34156103bf57600080fd5b6103c7611085565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561041457600080fd5b61041c6110aa565b6040518082815260200191505060405180910390f35b341561043d57600080fd5b6104456110ba565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561049257600080fd5b6104e6600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506110e0565b005b34156104f357600080fd5b61051f600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611191565b005b341561052c57600080fd5b610558600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061126b565b005b341561056557600080fd5b61056d611346565b005b341561057a57600080fd5b61059060048080359060200190919050506113d9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156105dd57600080fd5b6105f3600480803590602001909190505061140c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561064057600080fd5b61066c600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061143f565b005b341561067957600080fd5b61068f600480803590602001909190505061151a565b005b341561069c57600080fd5b6106a461166e565b604051808215151515815260200191505060405180910390f35b34156106c957600080fd5b6106df6004808035906020019091905050611681565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561072c57600080fd5b610758600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506116fa565b6040518082815260200191505060405180910390f35b341561077957600080fd5b610781611743565b6040518082815260200191505060405180910390f35b34156107a257600080fd5b6107aa611749565b005b34156107b757600080fd5b6107e3600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061188d565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561082657808201518184015260208101905061080b565b505050509050019250505060405180910390f35b341561084557600080fd5b61084d6119c4565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561088d578082015181840152602081019050610872565b50505050905090810190601f1680156108ba5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156108d357600080fd5b6108e960048080359060200190919050506119fd565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b341561091657600080fd5b61092c6004808035906020019091905050611a2c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561097957600080fd5b6109ae600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611a5f565b005b34156109bb57600080fd5b6109c3611bd0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610a1057600080fd5b610a18611bf6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610a6557600080fd5b610a91600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611c1c565b005b3415610a9e57600080fd5b610aa6611cbb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600060405180807f737570706f727473496e74657266616365286279746573342900000000000000815250601901905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610df2575060405180807f746f6b656e4d657461646174612875696e743235362c737472696e6729000000815250601d019050604051809103902060405180807f746f6b656e734f664f776e6572286164647265737329000000000000000000008152506016019050604051809103902060405180807f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81526020017f74323536290000000000000000000000000000000000000000000000000000008152506025019050604051809103902060405180807f7472616e7366657228616464726573732c75696e7432353629000000000000008152506019019050604051809103902060405180807f617070726f766528616464726573732c75696e743235362900000000000000008152506018019050604051809103902060405180807f6f776e65724f662875696e7432353629000000000000000000000000000000008152506010019050604051809103902060405180807f62616c616e63654f6628616464726573732900000000000000000000000000008152506012019050604051809103902060405180807f746f74616c537570706c79282900000000000000000000000000000000000000815250600d019050604051809103902060405180807f73796d626f6c28290000000000000000000000000000000000000000000000008152506008019050604051809103902060405180807f6e616d6528290000000000000000000000000000000000000000000000000000815250600601905060405180910390201818181818181818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610e276120ea565b610e2f6120fe565b60008073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515610e8e57600080fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb4799f2878787600060405160a001526040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180848152602001806020018281038252848482818152602001925080828437820191505094505050505060a060405180830381600087803b1515610f4957600080fd5b6102c65a03f11515610f5a57600080fd5b505050604051806080018051906020016040528092508193505050610f7f8282611ce1565b925050509392505050565b6040805190810160405280600d81526020017f43727970746f4b6974746965730000000000000000000000000000000000000081525081565b610fcd3382611d39565b1515610fd857600080fd5b610fe28183611da5565b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160068054905003905090565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561111c57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561115757600080fd5b6111613382611dfb565b151561116c57600080fd5b6111768382611d39565b151561118157600080fd5b61118c838383611e67565b505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156111ec57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561122857600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156112c657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561130257600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156113a157600080fd5b600260149054906101000a900460ff1615156113bc57600080fd5b6000600260146101000a81548160ff021916908315150217905550565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561149a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156114d657600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806115c257506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061161a5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561162557600080fd5b60036000600e8110151561163557fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff168110151561166457600080fd5b8060058190555050565b600260149054906101000a900460ff1681565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156116f557600080fd5b919050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806117f157506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806118495750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561185457600080fd5b600260149054906101000a900460ff1615151561187057600080fd5b6001600260146101000a81548160ff021916908315150217905550565b611895612129565b600061189f612129565b60008060006118ad876116fa565b945060008514156118df5760006040518059106118c75750595b908082528060200260200182016040525095506119ba565b846040518059106118ed5750595b908082528060200260200182016040525093506119086110aa565b925060009150600190505b82811115156119b6578673ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156119a95780848381518110151561199257fe5b906020019060200201818152505081806001019250505b8080600101915050611913565b8395505b5050505050919050565b6040805190810160405280600281526020017f434b00000000000000000000000000000000000000000000000000000000000081525081565b600381600e81101515611a0c57fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff16151515611a7b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611ab757600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611af257600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611b4f57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611bac57600080fd5b611bb63382611d39565b1515611bc157600080fd5b611bcc338383611e67565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c7757600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611ce96120ea565b611cf16120ea565b60008084604051805910611d025750595b9080825280601f01601f19166020018201604052509250602083019150859050611d2d82828761209f565b82935050505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff166007600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b806009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008273ffffffffffffffffffffffffffffffffffffffff166009600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515611ffb57600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600a600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556009600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b60005b6020821015156120c757825184526020840193506020830192506020820391506120a2565b6001826020036101000a0390508019835116818551168181178652505050505050565b602060405190810160405280600081525090565b6080604051908101604052806004905b600080191681526020019060019003908161210e5790505090565b6020604051908101604052806000815250905600a165627a7a723058201657a79c569c1b3a76b7b88753d73519a63d8b4e5f5e5bfb939d5d7c7550c39f0029", - "deployedBytecode": "0x606060405260043610610180576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146101855780630519ce79146101df5780630560ff441461023457806306fdde03146102e4578063095ea7b3146103725780630a0f8168146103b457806318160ddd1461040957806321717ebf1461043257806323b872dd1461048757806327d7874c146104e85780632ba73c15146105215780633f4ba83a1461055a57806346116e6f1461056f578063481af3d3146105d25780634e0a3379146106355780635663896e1461066e5780635c975abb146106915780636352211e146106be57806370a08231146107215780637a7d49371461076e5780638456cb59146107975780638462151c146107ac57806395d89b411461083a5780639d6fac6f146108c8578063a45f4bfc1461090b578063a9059cbb1461096e578063b047fb50146109b0578063bc4006f514610a05578063e17b25af14610a5a578063e6cbe35114610a93575b600080fd5b341561019057600080fd5b6101c560048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050610ae8565b604051808215151515815260200191505060405180910390f35b34156101ea57600080fd5b6101f2610df9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561023f57600080fd5b61026960048080359060200190919080359060200190820180359060200191909192905050610e1f565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102a957808201518184015260208101905061028e565b50505050905090810190601f1680156102d65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156102ef57600080fd5b6102f7610f8a565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561033757808201518184015260208101905061031c565b50505050905090810190601f1680156103645780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561037d57600080fd5b6103b2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610fc3565b005b34156103bf57600080fd5b6103c7611085565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561041457600080fd5b61041c6110aa565b6040518082815260200191505060405180910390f35b341561043d57600080fd5b6104456110ba565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561049257600080fd5b6104e6600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506110e0565b005b34156104f357600080fd5b61051f600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611191565b005b341561052c57600080fd5b610558600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061126b565b005b341561056557600080fd5b61056d611346565b005b341561057a57600080fd5b61059060048080359060200190919050506113d9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156105dd57600080fd5b6105f3600480803590602001909190505061140c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561064057600080fd5b61066c600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061143f565b005b341561067957600080fd5b61068f600480803590602001909190505061151a565b005b341561069c57600080fd5b6106a461166e565b604051808215151515815260200191505060405180910390f35b34156106c957600080fd5b6106df6004808035906020019091905050611681565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561072c57600080fd5b610758600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506116fa565b6040518082815260200191505060405180910390f35b341561077957600080fd5b610781611743565b6040518082815260200191505060405180910390f35b34156107a257600080fd5b6107aa611749565b005b34156107b757600080fd5b6107e3600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061188d565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561082657808201518184015260208101905061080b565b505050509050019250505060405180910390f35b341561084557600080fd5b61084d6119c4565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561088d578082015181840152602081019050610872565b50505050905090810190601f1680156108ba5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156108d357600080fd5b6108e960048080359060200190919050506119fd565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b341561091657600080fd5b61092c6004808035906020019091905050611a2c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561097957600080fd5b6109ae600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611a5f565b005b34156109bb57600080fd5b6109c3611bd0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610a1057600080fd5b610a18611bf6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610a6557600080fd5b610a91600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611c1c565b005b3415610a9e57600080fd5b610aa6611cbb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600060405180807f737570706f727473496e74657266616365286279746573342900000000000000815250601901905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610df2575060405180807f746f6b656e4d657461646174612875696e743235362c737472696e6729000000815250601d019050604051809103902060405180807f746f6b656e734f664f776e6572286164647265737329000000000000000000008152506016019050604051809103902060405180807f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81526020017f74323536290000000000000000000000000000000000000000000000000000008152506025019050604051809103902060405180807f7472616e7366657228616464726573732c75696e7432353629000000000000008152506019019050604051809103902060405180807f617070726f766528616464726573732c75696e743235362900000000000000008152506018019050604051809103902060405180807f6f776e65724f662875696e7432353629000000000000000000000000000000008152506010019050604051809103902060405180807f62616c616e63654f6628616464726573732900000000000000000000000000008152506012019050604051809103902060405180807f746f74616c537570706c79282900000000000000000000000000000000000000815250600d019050604051809103902060405180807f73796d626f6c28290000000000000000000000000000000000000000000000008152506008019050604051809103902060405180807f6e616d6528290000000000000000000000000000000000000000000000000000815250600601905060405180910390201818181818181818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610e276120ea565b610e2f6120fe565b60008073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515610e8e57600080fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb4799f2878787600060405160a001526040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180848152602001806020018281038252848482818152602001925080828437820191505094505050505060a060405180830381600087803b1515610f4957600080fd5b6102c65a03f11515610f5a57600080fd5b505050604051806080018051906020016040528092508193505050610f7f8282611ce1565b925050509392505050565b6040805190810160405280600d81526020017f43727970746f4b6974746965730000000000000000000000000000000000000081525081565b610fcd3382611d39565b1515610fd857600080fd5b610fe28183611da5565b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160068054905003905090565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561111c57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561115757600080fd5b6111613382611dfb565b151561116c57600080fd5b6111768382611d39565b151561118157600080fd5b61118c838383611e67565b505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156111ec57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561122857600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156112c657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561130257600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156113a157600080fd5b600260149054906101000a900460ff1615156113bc57600080fd5b6000600260146101000a81548160ff021916908315150217905550565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561149a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156114d657600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806115c257506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061161a5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561162557600080fd5b60036000600e8110151561163557fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff168110151561166457600080fd5b8060058190555050565b600260149054906101000a900460ff1681565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156116f557600080fd5b919050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806117f157506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806118495750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561185457600080fd5b600260149054906101000a900460ff1615151561187057600080fd5b6001600260146101000a81548160ff021916908315150217905550565b611895612129565b600061189f612129565b60008060006118ad876116fa565b945060008514156118df5760006040518059106118c75750595b908082528060200260200182016040525095506119ba565b846040518059106118ed5750595b908082528060200260200182016040525093506119086110aa565b925060009150600190505b82811115156119b6578673ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156119a95780848381518110151561199257fe5b906020019060200201818152505081806001019250505b8080600101915050611913565b8395505b5050505050919050565b6040805190810160405280600281526020017f434b00000000000000000000000000000000000000000000000000000000000081525081565b600381600e81101515611a0c57fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff16151515611a7b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611ab757600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611af257600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611b4f57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611bac57600080fd5b611bb63382611d39565b1515611bc157600080fd5b611bcc338383611e67565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c7757600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611ce96120ea565b611cf16120ea565b60008084604051805910611d025750595b9080825280601f01601f19166020018201604052509250602083019150859050611d2d82828761209f565b82935050505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff166007600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b806009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008273ffffffffffffffffffffffffffffffffffffffff166009600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515611ffb57600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600a600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556009600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b60005b6020821015156120c757825184526020840193506020830192506020820391506120a2565b6001826020036101000a0390508019835116818551168181178652505050505050565b602060405190810160405280600081525090565b6080604051908101604052806004905b600080191681526020019060019003908161210e5790505090565b6020604051908101604052806000815250905600a165627a7a723058201657a79c569c1b3a76b7b88753d73519a63d8b4e5f5e5bfb939d5d7c7550c39f0029", + "bytecode": "0x60606040526000600260146101000a81548160ff0219169083151502179055506101c060405190810160405280603c63ffffffff1663ffffffff168152602001607863ffffffff1663ffffffff16815260200161012c63ffffffff1663ffffffff16815260200161025863ffffffff1663ffffffff16815260200161070863ffffffff1663ffffffff168152602001610e1063ffffffff1663ffffffff168152602001611c2063ffffffff1663ffffffff16815260200161384063ffffffff1663ffffffff16815260200161708063ffffffff1663ffffffff16815260200161e10063ffffffff1663ffffffff1681526020016201518063ffffffff1663ffffffff1681526020016202a30063ffffffff1663ffffffff1681526020016205460063ffffffff1663ffffffff16815260200162093a8063ffffffff1663ffffffff16815250600390600e620001569291906200016e565b50600f60055534156200016857600080fd5b6200024e565b82600e600701600890048101928215620002055791602002820160005b83821115620001d157835183826101000a81548163ffffffff021916908363ffffffff16021790555092602001926004016020816003010492830192600103026200018b565b8015620002035782816101000a81549063ffffffff0219169055600401602081600301049283019260010302620001d1565b505b50905062000214919062000218565b5090565b6200024b91905b808211156200024757600081816101000a81549063ffffffff0219169055506001016200021f565b5090565b90565b612169806200025e6000396000f300606060405260043610610180576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146101855780630519ce79146101df5780630560ff441461023457806306fdde03146102e4578063095ea7b3146103725780630a0f8168146103b457806318160ddd1461040957806321717ebf1461043257806323b872dd1461048757806327d7874c146104e85780632ba73c15146105215780633f4ba83a1461055a57806346116e6f1461056f578063481af3d3146105d25780634e0a3379146106355780635663896e1461066e5780635c975abb146106915780636352211e146106be57806370a08231146107215780637a7d49371461076e5780638456cb59146107975780638462151c146107ac57806395d89b411461083a5780639d6fac6f146108c8578063a45f4bfc1461090b578063a9059cbb1461096e578063b047fb50146109b0578063bc4006f514610a05578063e17b25af14610a5a578063e6cbe35114610a93575b600080fd5b341561019057600080fd5b6101c560048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050610ae8565b604051808215151515815260200191505060405180910390f35b34156101ea57600080fd5b6101f2610df9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561023f57600080fd5b61026960048080359060200190919080359060200190820180359060200191909192905050610e1f565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102a957808201518184015260208101905061028e565b50505050905090810190601f1680156102d65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156102ef57600080fd5b6102f7610f8a565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561033757808201518184015260208101905061031c565b50505050905090810190601f1680156103645780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561037d57600080fd5b6103b2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610fc3565b005b34156103bf57600080fd5b6103c7611085565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561041457600080fd5b61041c6110aa565b6040518082815260200191505060405180910390f35b341561043d57600080fd5b6104456110ba565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561049257600080fd5b6104e6600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506110e0565b005b34156104f357600080fd5b61051f600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611191565b005b341561052c57600080fd5b610558600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061126b565b005b341561056557600080fd5b61056d611346565b005b341561057a57600080fd5b61059060048080359060200190919050506113d9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156105dd57600080fd5b6105f3600480803590602001909190505061140c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561064057600080fd5b61066c600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061143f565b005b341561067957600080fd5b61068f600480803590602001909190505061151a565b005b341561069c57600080fd5b6106a461166e565b604051808215151515815260200191505060405180910390f35b34156106c957600080fd5b6106df6004808035906020019091905050611681565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561072c57600080fd5b610758600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506116fa565b6040518082815260200191505060405180910390f35b341561077957600080fd5b610781611743565b6040518082815260200191505060405180910390f35b34156107a257600080fd5b6107aa611749565b005b34156107b757600080fd5b6107e3600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061188d565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561082657808201518184015260208101905061080b565b505050509050019250505060405180910390f35b341561084557600080fd5b61084d6119c4565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561088d578082015181840152602081019050610872565b50505050905090810190601f1680156108ba5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156108d357600080fd5b6108e960048080359060200190919050506119fd565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b341561091657600080fd5b61092c6004808035906020019091905050611a2c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561097957600080fd5b6109ae600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611a5f565b005b34156109bb57600080fd5b6109c3611bd0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610a1057600080fd5b610a18611bf6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610a6557600080fd5b610a91600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611c1c565b005b3415610a9e57600080fd5b610aa6611cbb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600060405180807f737570706f727473496e74657266616365286279746573342900000000000000815250601901905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610df2575060405180807f746f6b656e4d657461646174612875696e743235362c737472696e6729000000815250601d019050604051809103902060405180807f746f6b656e734f664f776e6572286164647265737329000000000000000000008152506016019050604051809103902060405180807f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81526020017f74323536290000000000000000000000000000000000000000000000000000008152506025019050604051809103902060405180807f7472616e7366657228616464726573732c75696e7432353629000000000000008152506019019050604051809103902060405180807f617070726f766528616464726573732c75696e743235362900000000000000008152506018019050604051809103902060405180807f6f776e65724f662875696e7432353629000000000000000000000000000000008152506010019050604051809103902060405180807f62616c616e63654f6628616464726573732900000000000000000000000000008152506012019050604051809103902060405180807f746f74616c537570706c79282900000000000000000000000000000000000000815250600d019050604051809103902060405180807f73796d626f6c28290000000000000000000000000000000000000000000000008152506008019050604051809103902060405180807f6e616d6528290000000000000000000000000000000000000000000000000000815250600601905060405180910390201818181818181818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610e276120ea565b610e2f6120fe565b60008073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515610e8e57600080fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb4799f2878787600060405160a001526040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180848152602001806020018281038252848482818152602001925080828437820191505094505050505060a060405180830381600087803b1515610f4957600080fd5b6102c65a03f11515610f5a57600080fd5b505050604051806080018051906020016040528092508193505050610f7f8282611ce1565b925050509392505050565b6040805190810160405280600d81526020017f43727970746f4b6974746965730000000000000000000000000000000000000081525081565b610fcd3382611d39565b1515610fd857600080fd5b610fe28183611da5565b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160068054905003905090565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561111c57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561115757600080fd5b6111613382611dfb565b151561116c57600080fd5b6111768382611d39565b151561118157600080fd5b61118c838383611e67565b505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156111ec57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561122857600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156112c657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561130257600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156113a157600080fd5b600260149054906101000a900460ff1615156113bc57600080fd5b6000600260146101000a81548160ff021916908315150217905550565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561149a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156114d657600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806115c257506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061161a5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561162557600080fd5b60036000600e8110151561163557fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff168110151561166457600080fd5b8060058190555050565b600260149054906101000a900460ff1681565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156116f557600080fd5b919050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806117f157506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806118495750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561185457600080fd5b600260149054906101000a900460ff1615151561187057600080fd5b6001600260146101000a81548160ff021916908315150217905550565b611895612129565b600061189f612129565b60008060006118ad876116fa565b945060008514156118df5760006040518059106118c75750595b908082528060200260200182016040525095506119ba565b846040518059106118ed5750595b908082528060200260200182016040525093506119086110aa565b925060009150600190505b82811115156119b6578673ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156119a95780848381518110151561199257fe5b906020019060200201818152505081806001019250505b8080600101915050611913565b8395505b5050505050919050565b6040805190810160405280600281526020017f434b00000000000000000000000000000000000000000000000000000000000081525081565b600381600e81101515611a0c57fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff16151515611a7b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611ab757600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611af257600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611b4f57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611bac57600080fd5b611bb63382611d39565b1515611bc157600080fd5b611bcc338383611e67565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c7757600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611ce96120ea565b611cf16120ea565b60008084604051805910611d025750595b9080825280601f01601f19166020018201604052509250602083019150859050611d2d82828761209f565b82935050505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff166007600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b806009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008273ffffffffffffffffffffffffffffffffffffffff166009600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515611ffb57600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600a600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556009600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b60005b6020821015156120c757825184526020840193506020830192506020820391506120a2565b6001826020036101000a0390508019835116818551168181178652505050505050565b602060405190810160405280600081525090565b6080604051908101604052806004905b600080191681526020019060019003908161210e5790505090565b6020604051908101604052806000815250905600a165627a7a723058201cb9c25105af52f6034968cb66f70979e661f324fc8a83c5e49fbef038a11cdf0029", + "deployedBytecode": "0x606060405260043610610180576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146101855780630519ce79146101df5780630560ff441461023457806306fdde03146102e4578063095ea7b3146103725780630a0f8168146103b457806318160ddd1461040957806321717ebf1461043257806323b872dd1461048757806327d7874c146104e85780632ba73c15146105215780633f4ba83a1461055a57806346116e6f1461056f578063481af3d3146105d25780634e0a3379146106355780635663896e1461066e5780635c975abb146106915780636352211e146106be57806370a08231146107215780637a7d49371461076e5780638456cb59146107975780638462151c146107ac57806395d89b411461083a5780639d6fac6f146108c8578063a45f4bfc1461090b578063a9059cbb1461096e578063b047fb50146109b0578063bc4006f514610a05578063e17b25af14610a5a578063e6cbe35114610a93575b600080fd5b341561019057600080fd5b6101c560048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050610ae8565b604051808215151515815260200191505060405180910390f35b34156101ea57600080fd5b6101f2610df9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561023f57600080fd5b61026960048080359060200190919080359060200190820180359060200191909192905050610e1f565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102a957808201518184015260208101905061028e565b50505050905090810190601f1680156102d65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156102ef57600080fd5b6102f7610f8a565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561033757808201518184015260208101905061031c565b50505050905090810190601f1680156103645780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561037d57600080fd5b6103b2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610fc3565b005b34156103bf57600080fd5b6103c7611085565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561041457600080fd5b61041c6110aa565b6040518082815260200191505060405180910390f35b341561043d57600080fd5b6104456110ba565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561049257600080fd5b6104e6600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506110e0565b005b34156104f357600080fd5b61051f600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611191565b005b341561052c57600080fd5b610558600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061126b565b005b341561056557600080fd5b61056d611346565b005b341561057a57600080fd5b61059060048080359060200190919050506113d9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156105dd57600080fd5b6105f3600480803590602001909190505061140c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561064057600080fd5b61066c600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061143f565b005b341561067957600080fd5b61068f600480803590602001909190505061151a565b005b341561069c57600080fd5b6106a461166e565b604051808215151515815260200191505060405180910390f35b34156106c957600080fd5b6106df6004808035906020019091905050611681565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561072c57600080fd5b610758600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506116fa565b6040518082815260200191505060405180910390f35b341561077957600080fd5b610781611743565b6040518082815260200191505060405180910390f35b34156107a257600080fd5b6107aa611749565b005b34156107b757600080fd5b6107e3600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061188d565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561082657808201518184015260208101905061080b565b505050509050019250505060405180910390f35b341561084557600080fd5b61084d6119c4565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561088d578082015181840152602081019050610872565b50505050905090810190601f1680156108ba5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156108d357600080fd5b6108e960048080359060200190919050506119fd565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b341561091657600080fd5b61092c6004808035906020019091905050611a2c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561097957600080fd5b6109ae600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611a5f565b005b34156109bb57600080fd5b6109c3611bd0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610a1057600080fd5b610a18611bf6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610a6557600080fd5b610a91600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611c1c565b005b3415610a9e57600080fd5b610aa6611cbb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600060405180807f737570706f727473496e74657266616365286279746573342900000000000000815250601901905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610df2575060405180807f746f6b656e4d657461646174612875696e743235362c737472696e6729000000815250601d019050604051809103902060405180807f746f6b656e734f664f776e6572286164647265737329000000000000000000008152506016019050604051809103902060405180807f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81526020017f74323536290000000000000000000000000000000000000000000000000000008152506025019050604051809103902060405180807f7472616e7366657228616464726573732c75696e7432353629000000000000008152506019019050604051809103902060405180807f617070726f766528616464726573732c75696e743235362900000000000000008152506018019050604051809103902060405180807f6f776e65724f662875696e7432353629000000000000000000000000000000008152506010019050604051809103902060405180807f62616c616e63654f6628616464726573732900000000000000000000000000008152506012019050604051809103902060405180807f746f74616c537570706c79282900000000000000000000000000000000000000815250600d019050604051809103902060405180807f73796d626f6c28290000000000000000000000000000000000000000000000008152506008019050604051809103902060405180807f6e616d6528290000000000000000000000000000000000000000000000000000815250600601905060405180910390201818181818181818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610e276120ea565b610e2f6120fe565b60008073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515610e8e57600080fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb4799f2878787600060405160a001526040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180848152602001806020018281038252848482818152602001925080828437820191505094505050505060a060405180830381600087803b1515610f4957600080fd5b6102c65a03f11515610f5a57600080fd5b505050604051806080018051906020016040528092508193505050610f7f8282611ce1565b925050509392505050565b6040805190810160405280600d81526020017f43727970746f4b6974746965730000000000000000000000000000000000000081525081565b610fcd3382611d39565b1515610fd857600080fd5b610fe28183611da5565b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160068054905003905090565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561111c57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561115757600080fd5b6111613382611dfb565b151561116c57600080fd5b6111768382611d39565b151561118157600080fd5b61118c838383611e67565b505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156111ec57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561122857600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156112c657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561130257600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156113a157600080fd5b600260149054906101000a900460ff1615156113bc57600080fd5b6000600260146101000a81548160ff021916908315150217905550565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561149a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156114d657600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806115c257506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061161a5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561162557600080fd5b60036000600e8110151561163557fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff168110151561166457600080fd5b8060058190555050565b600260149054906101000a900460ff1681565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156116f557600080fd5b919050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806117f157506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806118495750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561185457600080fd5b600260149054906101000a900460ff1615151561187057600080fd5b6001600260146101000a81548160ff021916908315150217905550565b611895612129565b600061189f612129565b60008060006118ad876116fa565b945060008514156118df5760006040518059106118c75750595b908082528060200260200182016040525095506119ba565b846040518059106118ed5750595b908082528060200260200182016040525093506119086110aa565b925060009150600190505b82811115156119b6578673ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156119a95780848381518110151561199257fe5b906020019060200201818152505081806001019250505b8080600101915050611913565b8395505b5050505050919050565b6040805190810160405280600281526020017f434b00000000000000000000000000000000000000000000000000000000000081525081565b600381600e81101515611a0c57fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff16151515611a7b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611ab757600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611af257600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611b4f57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611bac57600080fd5b611bb63382611d39565b1515611bc157600080fd5b611bcc338383611e67565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c7757600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611ce96120ea565b611cf16120ea565b60008084604051805910611d025750595b9080825280601f01601f19166020018201604052509250602083019150859050611d2d82828761209f565b82935050505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff166007600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b806009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008273ffffffffffffffffffffffffffffffffffffffff166009600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515611ffb57600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600a600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556009600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b60005b6020821015156120c757825184526020840193506020830192506020820391506120a2565b6001826020036101000a0390508019835116818551168181178652505050505050565b602060405190810160405280600081525090565b6080604051908101604052806004905b600080191681526020019060019003908161210e5790505090565b6020604051908101604052806000815250905600a165627a7a723058201cb9c25105af52f6034968cb66f70979e661f324fc8a83c5e49fbef038a11cdf0029", "sourceMap": "18784:11020:18:-;;;5032:5;5011:26;;;;;;;;;;;;;;;;;;;;11384:339;;;;;;;;;11427:9;11384:339;;;;;;;;11450:9;11384:339;;;;;;;;11473:9;11384:339;;;;;;;;11496:10;11384:339;;;;;;;;11520:10;11384:339;;;;;;;;11544:7;11384:339;;;;;;;;11565:7;11384:339;;;;;;;;11586:7;11384:339;;;;;;;;11607:7;11384:339;;;;;;;;11628:8;11384:339;;;;;;;;11650:6;11384:339;;;;;;;;11670:6;11384:339;;;;;;;;11690:6;11384:339;;;;;;;;11710:6;11384:339;;;;;;;;;;;;;;;:::i;:::-;;11840:2;11807:35;;18784:11020;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;", "deployedSourceMap": "18784:11020:18:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19989:327;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4848:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29456:346;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18924:45:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24204:395:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4817:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25978:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13853:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25066:784;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5800:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;6346;;;;;;;;;;;;;;;;;;;;;;;;;;;;7359:126;;;;;;;;;;;;;;13283:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12965;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6073:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;17342:139;;;;;;;;;;;;;;;;;;;;;;;;;;5011:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26205:180;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22243:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11807:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6990:81;;;;;;;;;;;;;;26841:853;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;18975:36:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11384:339:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12465:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22790:990;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4879:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19070:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20416:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;13564:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19989:327;20060:4;19175:38;;;;;;;;;;;;;;;;;;;20219:41;;;:12;:41;;;;20218:90;;;;19697:42;;;;;;;;;;;;;;;;;;;19647:35;;;;;;;;;;;;;;;;;;;19582:50;;;;;;;;;;;;;;;;;;;;;;;;19529:38;;;;;;;;;;;;;;;;;;;19477:37;;;;;;;;;;;;;;;;;;;19433:29;;;;;;;;;;;;;;;;;;;19387:31;;;;;;;;;;;;;;;;;;;19346:26;;;;;;;;;;;;;;;;;;;19310:21;;;;;;;;;;;;;;;;;;;19276:19;;;;;;;;;;;;;;;;;;;19269:63;:104;:150;:194;:246;:299;:364;:414;:471;20266:41;;;:12;:41;;;;20218:90;20210:99;;19989:327;;;:::o;4848:25::-;;;;;;;;;;;;;:::o;29456:346::-;29548:14;;:::i;:::-;29621:24;;:::i;:::-;29655:13;29608:1;29582:28;;:14;;;;;;;;;;;:28;;;;29574:37;;;;;;;;29696:14;;;;;;;;;;;:26;;;29723:8;29733:19;;29696:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29678:75;;;;;;;;29771:24;29781:6;29789:5;29771:9;:24::i;:::-;29764:31;;29456:346;;;;;;;:::o;18924:45::-;;;;;;;;;;;;;;;;;;;;:::o;24204:395::-;24384:27;24390:10;24402:8;24384:5;:27::i;:::-;24376:36;;;;;;;;24491:23;24500:8;24510:3;24491:8;:23::i;:::-;24557:35;24566:10;24578:3;24583:8;24557:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24204:395;;:::o;4817:25::-;;;;;;;;;;;;;:::o;25978:92::-;26022:4;26062:1;26045:7;:14;;;;:18;26038:25;;25978:92;:::o;13853:39::-;;;;;;;;;;;;;:::o;25066:784::-;25305:1;25290:17;;:3;:17;;;;25282:26;;;;;;;;25563:4;25548:20;;:3;:20;;;;25540:29;;;;;;;;25637:34;25650:10;25662:8;25637:12;:34::i;:::-;25629:43;;;;;;;;25690:22;25696:5;25703:8;25690:5;:22::i;:::-;25682:31;;;;;;;;25812;25822:5;25829:3;25834:8;25812:9;:31::i;:::-;25066:784;;;:::o;5800:128::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;5887:1;5868:21;;:7;:21;;;;5860:30;;;;;;;;5914:7;5901:10;;:20;;;;;;;;;;;;;;;;;;5800:128;:::o;6346:::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;6433:1;6414:21;;:7;:21;;;;6406:30;;;;;;;;6460:7;6447:10;;:20;;;;;;;;;;;;;;;;;;6346:128;:::o;7359:126::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;6812:6;;;;;;;;;;;6804:15;;;;;;;;7473:5;7464:6;;:14;;;;;;;;;;;;;;;;;;7359:126::o;13283:56::-;;;;;;;;;;;;;;;;;;;;;;:::o;12965:::-;;;;;;;;;;;;;;;;;;;;;;:::o;6073:128::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;6160:1;6141:21;;:7;:21;;;;6133:30;;;;;;;;6187:7;6174:10;;:20;;;;;;;;;;;;;;;;;;6073:128;:::o;17342:139::-;5537:10;;;;;;;;;;;5523:24;;:10;:24;;;:64;;;;5577:10;;;;;;;;;;;5563:24;;:10;:24;;;5523:64;:104;;;;5617:10;;;;;;;;;;;5603:24;;:10;:24;;;5523:104;5502:135;;;;;;;;17429:9;17439:1;17429:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17422:19;;:4;:19;17414:28;;;;;;;;17470:4;17452:15;:22;;;;17342:139;:::o;5011:26::-;;;;;;;;;;;;;:::o;26205:180::-;26275:13;26312:17;:27;26330:8;26312:27;;;;;;;;;;;;;;;;;;;;;26304:35;;26375:1;26358:19;;:5;:19;;;;26350:28;;;;;;;;26205:180;;;:::o;22243:122::-;22299:13;22331:19;:27;22351:6;22331:27;;;;;;;;;;;;;;;;22324:34;;22243:122;;;:::o;11807:35::-;;;;:::o;6990:81::-;5537:10;;;;;;;;;;;5523:24;;:10;:24;;;:64;;;;5577:10;;;;;;;;;;;5563:24;;:10;:24;;;5523:64;:104;;;;5617:10;;;;;;;;;;;5603:24;;:10;:24;;;5523:104;5502:135;;;;;;;;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;7060:4;7051:6;;:13;;;;;;;;;;;;;;;;;;6990:81::o;26841:853::-;26902:21;;:::i;:::-;26935:18;27110:23;;:::i;:::-;27175:17;27222:19;27402:13;26956:17;26966:6;26956:9;:17::i;:::-;26935:38;;27002:1;26988:10;:15;26984:704;;;27077:1;27063:16;;;;;;;;;;;;;;;;;;;;;;;;27056:23;;;;26984:704;27150:10;27136:25;;;;;;;;;;;;;;;;;;;;;;;;27110:51;;27195:13;:11;:13::i;:::-;27175:33;;27244:1;27222:23;;27443:1;27435:9;;27430:220;27455:9;27446:5;:18;;27430:220;;;27525:6;27497:34;;:17;:24;27515:5;27497:24;;;;;;;;;;;;;;;;;;;;;:34;;;27493:143;;;27577:5;27555:6;27562:11;27555:19;;;;;;;;;;;;;;;;;:27;;;;;27604:13;;;;;;;27493:143;27466:7;;;;;;;27430:220;;;27671:6;27664:13;;26841:853;;;;;;;;;:::o;18975:36::-;;;;;;;;;;;;;;;;;;;;:::o;11384:339::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;12465:53::-;;;;;;;;;;;;;;;;;;;;;;:::o;22790:990::-;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;22999:1;22984:17;;:3;:17;;;;22976:26;;;;;;;;23257:4;23242:20;;:3;:20;;;;23234:29;;;;;;;;23498:11;;;;;;;;;;;23483:27;;:3;:27;;;;23475:36;;;;;;;;23544:13;;;;;;;;;;;23529:29;;:3;:29;;;;23521:38;;;;;;;;23621:27;23627:10;23639:8;23621:5;:27::i;:::-;23613:36;;;;;;;;23737;23747:10;23759:3;23764:8;23737:9;:36::i;:::-;22790:990;;:::o;4879:25::-;;;;;;;;;;;;;:::o;19070:43::-;;;;;;;;;;;;;:::o;20416:142::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;20534:16;20495:14;;:56;;;;;;;;;;;;;;;;;;20416:142;:::o;13564:35::-;;;;;;;;;;;;;:::o;28808:403::-;28894:6;;:::i;:::-;28912:16;;:::i;:::-;28966:17;28993:16;28942:13;28931:25;;;;;;;;;;;;;;;;;;;;;;;;;;;28912:44;;29074:2;29060:12;29056:3;29043:34;;29102:9;29090:21;;29131:43;29139:9;29150:8;29160:13;29131:7;:43::i;:::-;29192:12;29185:19;;28808:403;;;;;;;:::o;20967:145::-;21042:4;21096:9;21065:40;;:17;:27;21083:8;21065:27;;;;;;;;;;;;;;;;;;;;;:40;;;21058:47;;20967:145;;;;:::o;21944:123::-;22051:9;22018:20;:30;22039:8;22018:30;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;21944:123;;:::o;21346:155::-;21428:4;21485:9;21451:43;;:20;:30;21472:8;21451:30;;;;;;;;;;;;;;;;;;;;;:43;;;21444:50;;21346:155;;;;:::o;13965:758::-;14129:19;:24;14149:3;14129:24;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;14225:3;14195:17;:27;14213:8;14195:27;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;14345:1;14328:19;;:5;:19;;;;14324:317;;;14363:19;:26;14383:5;14363:26;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;14485:20;:30;14506:8;14485:30;;;;;;;;;;;;14478:37;;;;;;;;;;;14600:20;:30;14621:8;14600:30;;;;;;;;;;;;14593:37;;;;;;;;;;;14324:317;14686:30;14695:5;14702:3;14707:8;14686:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13965:758;;;:::o;27965:565::-;28301:12;28089:170;28103:2;28095:4;:10;;28089:170;;;28180:4;28174:5;28167;28160:6;28222:2;28213:11;;;;28246:2;28238:10;;;;28115:2;28107:10;;;;28089:170;;;28337:1;28329:4;28324:2;:9;28316:3;:18;:22;28301:37;;28407:4;28403:3;28396:4;28390:5;28386:3;28460:4;28452:5;28446;28442:3;28505:7;28495:8;28492:2;28485:5;28478:6;28357:167;;;;;;:::o;18784:11020::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o", "source": "pragma solidity 0.4.18;\n\n/**\n The following contract code, titled KittyCore, was written by Cryptokitties and published\n and retrieved from https://etherscan.io/address/0x06012c8cf97bead5deae237070f9587f8e7a266d#code.\n\n It is included in the current project for test purposes, to ensure that our collateralizer can\n handle ERC721 tokens created by the KittyCore contract.\n*/\n\n/**\n * @title KittiesOwnable\n * @dev The KittiesOwnable contract has an owner address, and provides basic authorization control\n * functions, this simplifies the implementation of \"user permissions\".\n */\ncontract KittiesOwnable {\n address public owner;\n\n\n /**\n\t * @dev The KittiesOwnable constructor sets the original `owner` of the contract to the sender\n\t * account.\n\t */\n function KittiesOwnable() {\n owner = msg.sender;\n }\n\n\n /**\n\t * @dev Throws if called by any account other than the owner.\n\t */\n modifier onlyOwner() {\n require(msg.sender == owner);\n _;\n }\n\n\n /**\n\t * @dev Allows the current owner to transfer control of the contract to a newOwner.\n\t * @param newOwner The address to transfer ownership to.\n\t */\n function transferOwnership(address newOwner) onlyOwner {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n\n}\n\n\n\n/// @title Interface for contracts conforming to ERC-721: Non-Fungible Tokens\n/// @author Dieter Shirley (https://github.com/dete)\ncontract KittiesERC721 {\n // Required methods\n function totalSupply() public view returns (uint256 total);\n function balanceOf(address _owner) public view returns (uint256 balance);\n function ownerOf(uint256 _tokenId) external view returns (address owner);\n function approve(address _to, uint256 _tokenId) external;\n function transfer(address _to, uint256 _tokenId) external;\n function transferFrom(address _from, address _to, uint256 _tokenId) external;\n\n // Events\n event Transfer(address from, address to, uint256 tokenId);\n event Approval(address owner, address approved, uint256 tokenId);\n\n // Optional\n // function name() public view returns (string name);\n // function symbol() public view returns (string symbol);\n // function tokensOfOwner(address _owner) external view returns (uint256[] tokenIds);\n // function tokenMetadata(uint256 _tokenId, string _preferredTransport) public view returns (string infoUrl);\n\n // ERC-165 Compatibility (https://github.com/ethereum/EIPs/issues/165)\n function supportsInterface(bytes4 _interfaceID) external view returns (bool);\n}\n\n\n// // Auction wrapper functions\n\n\n// Auction wrapper functions\n\n\n\n\n\n\n\n/// @title SEKRETOOOO\ncontract GeneScienceInterface {\n /// @dev simply a boolean to indicate this is the contract we expect to be\n function isGeneScience() public pure returns (bool);\n\n /// @dev given genes of kitten 1 & 2, return a genetic combination - may have a random factor\n /// @param genes1 genes of mom\n /// @param genes2 genes of sire\n /// @return the genes that are supposed to be passed down the child\n function mixGenes(uint256 genes1, uint256 genes2, uint256 targetBlock) public returns (uint256);\n}\n\n\n\n\n\n\n\n/// @title A facet of KittyCore that manages special access privileges.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyAccessControl {\n // This facet controls access control for CryptoKitties. There are four roles managed here:\n //\n // - The CEO: The CEO can reassign other roles and change the addresses of our dependent smart\n // contracts. It is also the only role that can unpause the smart contract. It is initially\n // set to the address that created the smart contract in the KittyCore constructor.\n //\n // - The CFO: The CFO can withdraw funds from KittyCore and its auction contracts.\n //\n // - The COO: The COO can release gen0 kitties to auction, and mint promo cats.\n //\n // It should be noted that these roles are distinct without overlap in their access abilities, the\n // abilities listed for each role above are exhaustive. In particular, while the CEO can assign any\n // address to any role, the CEO address itself doesn't have the ability to act in those roles. This\n // restriction is intentional so that we aren't tempted to use the CEO address frequently out of\n // convenience. The less we use an address, the less likely it is that we somehow compromise the\n // account.\n\n /// @dev Emited when contract is upgraded - See README.md for updgrade plan\n event ContractUpgrade(address newContract);\n\n // The addresses of the accounts (or contracts) that can execute actions within each roles.\n address public ceoAddress;\n address public cfoAddress;\n address public cooAddress;\n\n // @dev Keeps track whether the contract is paused. When that is true, most actions are blocked\n bool public paused = false;\n\n /// @dev Access modifier for CEO-only functionality\n modifier onlyCEO() {\n require(msg.sender == ceoAddress);\n _;\n }\n\n /// @dev Access modifier for CFO-only functionality\n modifier onlyCFO() {\n require(msg.sender == cfoAddress);\n _;\n }\n\n /// @dev Access modifier for COO-only functionality\n modifier onlyCOO() {\n require(msg.sender == cooAddress);\n _;\n }\n\n modifier onlyCLevel() {\n require(\n msg.sender == cooAddress ||\n msg.sender == ceoAddress ||\n msg.sender == cfoAddress\n );\n _;\n }\n\n /// @dev Assigns a new address to act as the CEO. Only available to the current CEO.\n /// @param _newCEO The address of the new CEO\n function setCEO(address _newCEO) external onlyCEO {\n require(_newCEO != address(0));\n\n ceoAddress = _newCEO;\n }\n\n /// @dev Assigns a new address to act as the CFO. Only available to the current CEO.\n /// @param _newCFO The address of the new CFO\n function setCFO(address _newCFO) external onlyCEO {\n require(_newCFO != address(0));\n\n cfoAddress = _newCFO;\n }\n\n /// @dev Assigns a new address to act as the COO. Only available to the current CEO.\n /// @param _newCOO The address of the new COO\n function setCOO(address _newCOO) external onlyCEO {\n require(_newCOO != address(0));\n\n cooAddress = _newCOO;\n }\n\n /*** KittiesPausable functionality adapted from OpenZeppelin ***/\n\n /// @dev Modifier to allow actions only when the contract IS NOT paused\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /// @dev Modifier to allow actions only when the contract IS paused\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /// @dev Called by any \"C-level\" role to pause the contract. Used only when\n /// a bug or exploit is detected and we need to limit damage.\n function pause() external onlyCLevel whenNotPaused {\n paused = true;\n }\n\n /// @dev Unpauses the smart contract. Can only be called by the CEO, since\n /// one reason we may pause the contract is when CFO or COO accounts are\n /// compromised.\n /// @notice This is public rather than external so it can be called by\n /// derived contracts.\n function unpause() public onlyCEO whenPaused {\n // can't unpause if contract was upgraded\n paused = false;\n }\n}\n\n\n\n\n/// @title Base contract for CryptoKitties. Holds all common structs, events and base variables.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBase is KittyAccessControl {\n /*** EVENTS ***/\n\n /// @dev The Birth event is fired whenever a new kitten comes into existence. This obviously\n /// includes any time a cat is created through the giveBirth method, but it is also called\n /// when a new gen0 cat is created.\n event Birth(address owner, uint256 kittyId, uint256 matronId, uint256 sireId, uint256 genes);\n\n /// @dev Transfer event as defined in current draft of ERC721. Emitted every time a kitten\n /// ownership is assigned, including births.\n event Transfer(address from, address to, uint256 tokenId);\n\n /*** DATA TYPES ***/\n\n /// @dev The main Kitty struct. Every cat in CryptoKitties is represented by a copy\n /// of this structure, so great care was taken to ensure that it fits neatly into\n /// exactly two 256-bit words. Note that the order of the members in this structure\n /// is important because of the byte-packing rules used by Ethereum.\n /// Ref: http://solidity.readthedocs.io/en/develop/miscellaneous.html\n struct Kitty {\n // The Kitty's genetic code is packed into these 256-bits, the format is\n // sooper-sekret! A cat's genes never change.\n uint256 genes;\n\n // The timestamp from the block when this cat came into existence.\n uint64 birthTime;\n\n // The minimum timestamp after which this cat can engage in breeding\n // activities again. This same timestamp is used for the pregnancy\n // timer (for matrons) as well as the siring cooldown.\n uint64 cooldownEndBlock;\n\n // The ID of the parents of this kitty, set to 0 for gen0 cats.\n // Note that using 32-bit unsigned integers limits us to a \"mere\"\n // 4 billion cats. This number might seem small until you realize\n // that Ethereum currently has a limit of about 500 million\n // transactions per year! So, this definitely won't be a problem\n // for several years (even as Ethereum learns to scale).\n uint32 matronId;\n uint32 sireId;\n\n // Set to the ID of the sire cat for matrons that are pregnant,\n // zero otherwise. A non-zero value here is how we know a cat\n // is pregnant. Used to retrieve the genetic material for the new\n // kitten when the birth transpires.\n uint32 siringWithId;\n\n // Set to the index in the cooldown array (see below) that represents\n // the current cooldown duration for this Kitty. This starts at zero\n // for gen0 cats, and is initialized to floor(generation/2) for others.\n // Incremented by one for each successful breeding action, regardless\n // of whether this cat is acting as matron or sire.\n uint16 cooldownIndex;\n\n // The \"generation number\" of this cat. Cats minted by the CK contract\n // for sale are called \"gen0\" and have a generation number of 0. The\n // generation number of all other cats is the larger of the two generation\n // numbers of their parents, plus one.\n // (i.e. max(matron.generation, sire.generation) + 1)\n uint16 generation;\n }\n\n /*** CONSTANTS ***/\n\n /// @dev A lookup table indicating the cooldown duration after any successful\n /// breeding action, called \"pregnancy time\" for matrons and \"siring cooldown\"\n /// for sires. Designed such that the cooldown roughly doubles each time a cat\n /// is bred, encouraging owners not to just keep breeding the same cat over\n /// and over again. Caps out at one week (a cat can breed an unbounded number\n /// of times, and the maximum cooldown is always seven days).\n uint32[14] public cooldowns = [\n uint32(1 minutes),\n uint32(2 minutes),\n uint32(5 minutes),\n uint32(10 minutes),\n uint32(30 minutes),\n uint32(1 hours),\n uint32(2 hours),\n uint32(4 hours),\n uint32(8 hours),\n uint32(16 hours),\n uint32(1 days),\n uint32(2 days),\n uint32(4 days),\n uint32(7 days)\n ];\n\n // An approximation of currently how many seconds are in between blocks.\n uint256 public secondsPerBlock = 15;\n\n /*** STORAGE ***/\n\n /// @dev An array containing the Kitty struct for all Kitties in existence. The ID\n /// of each cat is actually an index into this array. Note that ID 0 is a negacat,\n /// the unKitty, the mythical beast that is the parent of all gen0 cats. A bizarre\n /// creature that is both matron and sire... to itself! Has an invalid genetic code.\n /// In other words, cat ID 0 is invalid... ;-)\n Kitty[] kitties;\n\n /// @dev A mapping from cat IDs to the address that owns them. All cats have\n /// some valid owner address, even gen0 cats are created with a non-zero owner.\n mapping (uint256 => address) public kittyIndexToOwner;\n\n // @dev A mapping from owner address to count of tokens that address owns.\n // Used internally inside balanceOf() to resolve ownership count.\n mapping (address => uint256) ownershipTokenCount;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to call\n /// transferFrom(). Each Kitty can only have one approved address for transfer\n /// at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public kittyIndexToApproved;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to use\n /// this Kitty for siring via breedWith(). Each Kitty can only have one approved\n /// address for siring at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public sireAllowedToAddress;\n\n /// @dev The address of the ClockAuction contract that handles sales of Kitties. This\n /// same contract handles both peer-to-peer sales as well as the gen0 sales which are\n /// initiated every 15 minutes.\n SaleClockAuction public saleAuction;\n\n /// @dev The address of a custom ClockAuction subclassed contract that handles siring\n /// auctions. Needs to be separate from saleAuction because the actions taken on success\n /// after a sales and siring auction are quite different.\n SiringClockAuction public siringAuction;\n\n /// @dev Assigns ownership of a specific Kitty to an address.\n function _transfer(address _from, address _to, uint256 _tokenId) internal {\n // Since the number of kittens is capped to 2^32 we can't overflow this\n ownershipTokenCount[_to]++;\n // transfer ownership\n kittyIndexToOwner[_tokenId] = _to;\n // When creating new kittens _from is 0x0, but we can't account that address.\n if (_from != address(0)) {\n ownershipTokenCount[_from]--;\n // once the kitten is transferred also clear sire allowances\n delete sireAllowedToAddress[_tokenId];\n // clear any previously approved ownership exchange\n delete kittyIndexToApproved[_tokenId];\n }\n // Emit the transfer event.\n Transfer(_from, _to, _tokenId);\n }\n\n /// @dev An internal method that creates a new kitty and stores it. This\n /// method doesn't do any checking and should only be called when the\n /// input data is known to be valid. Will generate both a Birth event\n /// and a Transfer event.\n /// @param _matronId The kitty ID of the matron of this cat (zero for gen0)\n /// @param _sireId The kitty ID of the sire of this cat (zero for gen0)\n /// @param _generation The generation number of this cat, must be computed by caller.\n /// @param _genes The kitty's genetic code.\n /// @param _owner The inital owner of this cat, must be non-zero (except for the unKitty, ID 0)\n function _createKitty(\n uint256 _matronId,\n uint256 _sireId,\n uint256 _generation,\n uint256 _genes,\n address _owner\n )\n internal\n returns (uint)\n {\n // These requires are not strictly necessary, our calling code should make\n // sure that these conditions are never broken. However! _createKitty() is already\n // an expensive call (for storage), and it doesn't hurt to be especially careful\n // to ensure our data structures are always valid.\n require(_matronId == uint256(uint32(_matronId)));\n require(_sireId == uint256(uint32(_sireId)));\n require(_generation == uint256(uint16(_generation)));\n\n // New kitty starts with the same cooldown as parent gen/2\n uint16 cooldownIndex = uint16(_generation / 2);\n if (cooldownIndex > 13) {\n cooldownIndex = 13;\n }\n\n Kitty memory _kitty = Kitty({\n genes: _genes,\n birthTime: uint64(now),\n cooldownEndBlock: 0,\n matronId: uint32(_matronId),\n sireId: uint32(_sireId),\n siringWithId: 0,\n cooldownIndex: cooldownIndex,\n generation: uint16(_generation)\n });\n uint256 newKittenId = kitties.push(_kitty) - 1;\n\n // It's probably never going to happen, 4 billion cats is A LOT, but\n // let's just be 100% sure we never let this happen.\n require(newKittenId == uint256(uint32(newKittenId)));\n\n // emit the birth event\n Birth(\n _owner,\n newKittenId,\n uint256(_kitty.matronId),\n uint256(_kitty.sireId),\n _kitty.genes\n );\n\n // This will assign ownership, and also emit the Transfer event as\n // per ERC721 draft\n _transfer(0, _owner, newKittenId);\n\n return newKittenId;\n }\n\n // Any C-level can fix how many seconds per blocks are currently observed.\n function setSecondsPerBlock(uint256 secs) external onlyCLevel {\n require(secs < cooldowns[0]);\n secondsPerBlock = secs;\n }\n}\n\n\n\n\n\n/// @title The external contract that is responsible for generating metadata for the kitties,\n/// it has one function that will return the data as bytes.\ncontract KittiesERC721Metadata {\n /// @dev Given a token Id, returns a byte array that is supposed to be converted into string.\n function getMetadata(uint256 _tokenId, string) public view returns (bytes32[4] buffer, uint256 count) {\n if (_tokenId == 1) {\n buffer[0] = \"Hello World! :D\";\n count = 15;\n } else if (_tokenId == 2) {\n buffer[0] = \"I would definitely choose a medi\";\n buffer[1] = \"um length string.\";\n count = 49;\n } else if (_tokenId == 3) {\n buffer[0] = \"Lorem ipsum dolor sit amet, mi e\";\n buffer[1] = \"st accumsan dapibus augue lorem,\";\n buffer[2] = \" tristique vestibulum id, libero\";\n buffer[3] = \" suscipit varius sapien aliquam.\";\n count = 128;\n }\n }\n}\n\n\n/// @title The facet of the CryptoKitties core contract that manages ownership, ERC-721 (draft) compliant.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev Ref: https://github.com/ethereum/EIPs/issues/721\n/// See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyOwnership is KittyBase, KittiesERC721 {\n\n /// @notice Name and symbol of the non fungible token, as defined in ERC721.\n string public constant name = \"CryptoKitties\";\n string public constant symbol = \"CK\";\n\n // The contract that will return kitty metadata\n KittiesERC721Metadata public erc721Metadata;\n\n bytes4 constant InterfaceSignature_ERC165 =\n bytes4(keccak256('supportsInterface(bytes4)'));\n\n bytes4 constant InterfaceSignature_ERC721 =\n bytes4(keccak256('name()')) ^\n bytes4(keccak256('symbol()')) ^\n bytes4(keccak256('totalSupply()')) ^\n bytes4(keccak256('balanceOf(address)')) ^\n bytes4(keccak256('ownerOf(uint256)')) ^\n bytes4(keccak256('approve(address,uint256)')) ^\n bytes4(keccak256('transfer(address,uint256)')) ^\n bytes4(keccak256('transferFrom(address,address,uint256)')) ^\n bytes4(keccak256('tokensOfOwner(address)')) ^\n bytes4(keccak256('tokenMetadata(uint256,string)'));\n\n /// @notice Introspection interface as per ERC-165 (https://github.com/ethereum/EIPs/issues/165).\n /// Returns true for any standardized interfaces implemented by this contract. We implement\n /// ERC-165 (obviously!) and ERC-721.\n function supportsInterface(bytes4 _interfaceID) external view returns (bool)\n {\n // DEBUG ONLY\n //require((InterfaceSignature_ERC165 == 0x01ffc9a7) && (InterfaceSignature_ERC721 == 0x9a20483d));\n\n return ((_interfaceID == InterfaceSignature_ERC165) || (_interfaceID == InterfaceSignature_ERC721));\n }\n\n /// @dev Set the address of the sibling contract that tracks metadata.\n /// CEO only.\n function setMetadataAddress(address _contractAddress) public onlyCEO {\n erc721Metadata = KittiesERC721Metadata(_contractAddress);\n }\n\n // Internal utility functions: These functions all assume that their input arguments\n // are valid. We leave it to public methods to sanitize their inputs and follow\n // the required logic.\n\n /// @dev Checks if a given address is the current owner of a particular Kitty.\n /// @param _claimant the address we are validating against.\n /// @param _tokenId kitten id, only valid when > 0\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToOwner[_tokenId] == _claimant;\n }\n\n /// @dev Checks if a given address currently has transferApproval for a particular Kitty.\n /// @param _claimant the address we are confirming kitten is approved for.\n /// @param _tokenId kitten id, only valid when > 0\n function _approvedFor(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToApproved[_tokenId] == _claimant;\n }\n\n /// @dev Marks an address as being approved for transferFrom(), overwriting any previous\n /// approval. Setting _approved to address(0) clears all transfer approval.\n /// NOTE: _approve() does NOT send the Approval event. This is intentional because\n /// _approve() and transferFrom() are used together for putting Kitties on auction, and\n /// there is no value in spamming the log with Approval events in that case.\n function _approve(uint256 _tokenId, address _approved) internal {\n kittyIndexToApproved[_tokenId] = _approved;\n }\n\n /// @notice Returns the number of Kitties owned by a specific address.\n /// @param _owner The owner address to check.\n /// @dev Required for ERC-721 compliance\n function balanceOf(address _owner) public view returns (uint256 count) {\n return ownershipTokenCount[_owner];\n }\n\n /// @notice Transfers a Kitty to another address. If transferring to a smart\n /// contract be VERY CAREFUL to ensure that it is aware of ERC-721 (or\n /// CryptoKitties specifically) or your Kitty may be lost forever. Seriously.\n /// @param _to The address of the recipient, can be a user or contract.\n /// @param _tokenId The ID of the Kitty to transfer.\n /// @dev Required for ERC-721 compliance.\n function transfer(\n address _to,\n uint256 _tokenId\n )\n external\n whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Disallow transfers to the auction contracts to prevent accidental\n // misuse. Auction contracts should only take ownership of kitties\n // through the allow + transferFrom flow.\n require(_to != address(saleAuction));\n require(_to != address(siringAuction));\n\n // You can only send your own cat.\n require(_owns(msg.sender, _tokenId));\n\n // Reassign ownership, clear pending approvals, emit Transfer event.\n _transfer(msg.sender, _to, _tokenId);\n }\n\n /// @notice Grant another address the right to transfer a specific Kitty via\n /// transferFrom(). This is the preferred flow for transfering NFTs to contracts.\n /// @param _to The address to be granted transfer approval. Pass address(0) to\n /// clear all approvals.\n /// @param _tokenId The ID of the Kitty that can be transferred if this call succeeds.\n /// @dev Required for ERC-721 compliance.\n function approve(\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Only an owner can grant transfer approval.\n require(_owns(msg.sender, _tokenId));\n\n // Register the approval (replacing any previous approval).\n _approve(_tokenId, _to);\n\n // Emit approval event.\n Approval(msg.sender, _to, _tokenId);\n }\n\n /// @notice Transfer a Kitty owned by another address, for which the calling address\n /// has previously been granted transfer approval by the owner.\n /// @param _from The address that owns the Kitty to be transfered.\n /// @param _to The address that should take ownership of the Kitty. Can be any address,\n /// including the caller.\n /// @param _tokenId The ID of the Kitty to be transferred.\n /// @dev Required for ERC-721 compliance.\n function transferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Check for approval and valid ownership\n require(_approvedFor(msg.sender, _tokenId));\n require(_owns(_from, _tokenId));\n\n // Reassign ownership (also clears pending approvals and emits Transfer event).\n _transfer(_from, _to, _tokenId);\n }\n\n /// @notice Returns the total number of Kitties currently in existence.\n /// @dev Required for ERC-721 compliance.\n function totalSupply() public view returns (uint) {\n return kitties.length - 1;\n }\n\n /// @notice Returns the address currently assigned ownership of a given Kitty.\n /// @dev Required for ERC-721 compliance.\n function ownerOf(uint256 _tokenId)\n external\n view\n returns (address owner)\n {\n owner = kittyIndexToOwner[_tokenId];\n\n require(owner != address(0));\n }\n\n /// @notice Returns a list of all Kitty IDs assigned to an address.\n /// @param _owner The owner whose Kitties we are interested in.\n /// @dev This method MUST NEVER be called by smart contract code. First, it's fairly\n /// expensive (it walks the entire Kitty array looking for cats belonging to owner),\n /// but it also returns a dynamic array, which is only supported for web3 calls, and\n /// not contract-to-contract calls.\n function tokensOfOwner(address _owner) external view returns(uint256[] ownerTokens) {\n uint256 tokenCount = balanceOf(_owner);\n\n if (tokenCount == 0) {\n // Return an empty array\n return new uint256[](0);\n } else {\n uint256[] memory result = new uint256[](tokenCount);\n uint256 totalCats = totalSupply();\n uint256 resultIndex = 0;\n\n // We count on the fact that all cats have IDs starting at 1 and increasing\n // sequentially up to the totalCat count.\n uint256 catId;\n\n for (catId = 1; catId <= totalCats; catId++) {\n if (kittyIndexToOwner[catId] == _owner) {\n result[resultIndex] = catId;\n resultIndex++;\n }\n }\n\n return result;\n }\n }\n\n /// @dev Adapted from memcpy() by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _memcpy(uint _dest, uint _src, uint _len) private view {\n // Copy word-length chunks while possible\n for(; _len >= 32; _len -= 32) {\n assembly {\n mstore(_dest, mload(_src))\n }\n _dest += 32;\n _src += 32;\n }\n\n // Copy remaining bytes\n uint256 mask = 256 ** (32 - _len) - 1;\n assembly {\n let srcpart := and(mload(_src), not(mask))\n let destpart := and(mload(_dest), mask)\n mstore(_dest, or(destpart, srcpart))\n }\n }\n\n /// @dev Adapted from toString(slice) by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _toString(bytes32[4] _rawBytes, uint256 _stringLength) private view returns (string) {\n var outputString = new string(_stringLength);\n uint256 outputPtr;\n uint256 bytesPtr;\n\n assembly {\n outputPtr := add(outputString, 32)\n bytesPtr := _rawBytes\n }\n\n _memcpy(outputPtr, bytesPtr, _stringLength);\n\n return outputString;\n }\n\n /// @notice Returns a URI pointing to a metadata package for this token conforming to\n /// ERC-721 (https://github.com/ethereum/EIPs/issues/721)\n /// @param _tokenId The ID number of the Kitty whose metadata should be returned.\n function tokenMetadata(uint256 _tokenId, string _preferredTransport) external view returns (string infoUrl) {\n require(erc721Metadata != address(0));\n bytes32[4] memory buffer;\n uint256 count;\n (buffer, count) = erc721Metadata.getMetadata(_tokenId, _preferredTransport);\n\n return _toString(buffer, count);\n }\n}\n\n\n\n/// @title A facet of KittyCore that manages Kitty siring, gestation, and birth.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBreeding is KittyOwnership {\n\n /// @dev The Pregnant event is fired when two cats successfully breed and the pregnancy\n /// timer begins for the matron.\n event Pregnant(address owner, uint256 matronId, uint256 sireId, uint256 cooldownEndBlock);\n\n /// @notice The minimum payment required to use breedWithAuto(). This fee goes towards\n /// the gas cost paid by whatever calls giveBirth(), and can be dynamically updated by\n /// the COO role as the gas price changes.\n uint256 public autoBirthFee = 2 finney;\n\n // Keeps track of number of pregnant kitties.\n uint256 public pregnantKitties;\n\n /// @dev The address of the sibling contract that is used to implement the sooper-sekret\n /// genetic combination algorithm.\n GeneScienceInterface public geneScience;\n\n /// @dev Update the address of the genetic contract, can only be called by the CEO.\n /// @param _address An address of a GeneScience contract instance to be used from this point forward.\n function setGeneScienceAddress(address _address) external onlyCEO {\n GeneScienceInterface candidateContract = GeneScienceInterface(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isGeneScience());\n\n // Set the new contract address\n geneScience = candidateContract;\n }\n\n /// @dev Checks that a given kitten is able to breed. Requires that the\n /// current cooldown is finished (for sires) and also checks that there is\n /// no pending pregnancy.\n function _isReadyToBreed(Kitty _kit) internal view returns (bool) {\n // In addition to checking the cooldownEndBlock, we also need to check to see if\n // the cat has a pending birth; there can be some period of time between the end\n // of the pregnacy timer and the birth event.\n return (_kit.siringWithId == 0) && (_kit.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @dev Check if a sire has authorized breeding with this matron. True if both sire\n /// and matron have the same owner, or if the sire has given siring permission to\n /// the matron's owner (via approveSiring()).\n function _isSiringPermitted(uint256 _sireId, uint256 _matronId) internal view returns (bool) {\n address matronOwner = kittyIndexToOwner[_matronId];\n address sireOwner = kittyIndexToOwner[_sireId];\n\n // Siring is okay if they have same owner, or if the matron's owner was given\n // permission to breed with this sire.\n return (matronOwner == sireOwner || sireAllowedToAddress[_sireId] == matronOwner);\n }\n\n /// @dev Set the cooldownEndTime for the given Kitty, based on its current cooldownIndex.\n /// Also increments the cooldownIndex (unless it has hit the cap).\n /// @param _kitten A reference to the Kitty in storage which needs its timer started.\n function _triggerCooldown(Kitty storage _kitten) internal {\n // Compute an estimation of the cooldown time in blocks (based on current cooldownIndex).\n _kitten.cooldownEndBlock = uint64((cooldowns[_kitten.cooldownIndex]/secondsPerBlock) + block.number);\n\n // Increment the breeding count, clamping it at 13, which is the length of the\n // cooldowns array. We could check the array size dynamically, but hard-coding\n // this as a constant saves gas. Yay, Solidity!\n if (_kitten.cooldownIndex < 13) {\n _kitten.cooldownIndex += 1;\n }\n }\n\n /// @notice Grants approval to another user to sire with one of your Kitties.\n /// @param _addr The address that will be able to sire with your Kitty. Set to\n /// address(0) to clear all siring approvals for this Kitty.\n /// @param _sireId A Kitty that you own that _addr will now be able to sire with.\n function approveSiring(address _addr, uint256 _sireId)\n external\n whenNotPaused\n {\n require(_owns(msg.sender, _sireId));\n sireAllowedToAddress[_sireId] = _addr;\n }\n\n /// @dev Updates the minimum payment required for calling giveBirthAuto(). Can only\n /// be called by the COO address. (This fee is used to offset the gas cost incurred\n /// by the autobirth daemon).\n function setAutoBirthFee(uint256 val) external onlyCOO {\n autoBirthFee = val;\n }\n\n /// @dev Checks to see if a given Kitty is pregnant and (if so) if the gestation\n /// period has passed.\n function _isReadyToGiveBirth(Kitty _matron) private view returns (bool) {\n return (_matron.siringWithId != 0) && (_matron.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @notice Checks that a given kitten is able to breed (i.e. it is not pregnant or\n /// in the middle of a siring cooldown).\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isReadyToBreed(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n Kitty storage kit = kitties[_kittyId];\n return _isReadyToBreed(kit);\n }\n\n /// @dev Checks whether a kitty is currently pregnant.\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isPregnant(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n // A kitty is pregnant if and only if this field is set\n return kitties[_kittyId].siringWithId != 0;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair. DOES NOT\n /// check ownership permissions (that is up to the caller).\n /// @param _matron A reference to the Kitty struct of the potential matron.\n /// @param _matronId The matron's ID.\n /// @param _sire A reference to the Kitty struct of the potential sire.\n /// @param _sireId The sire's ID\n function _isValidMatingPair(\n Kitty storage _matron,\n uint256 _matronId,\n Kitty storage _sire,\n uint256 _sireId\n )\n private\n view\n returns(bool)\n {\n // A Kitty can't breed with itself!\n if (_matronId == _sireId) {\n return false;\n }\n\n // Kitties can't breed with their parents.\n if (_matron.matronId == _sireId || _matron.sireId == _sireId) {\n return false;\n }\n if (_sire.matronId == _matronId || _sire.sireId == _matronId) {\n return false;\n }\n\n // We can short circuit the sibling check (below) if either cat is\n // gen zero (has a matron ID of zero).\n if (_sire.matronId == 0 || _matron.matronId == 0) {\n return true;\n }\n\n // Kitties can't breed with full or half siblings.\n if (_sire.matronId == _matron.matronId || _sire.matronId == _matron.sireId) {\n return false;\n }\n if (_sire.sireId == _matron.matronId || _sire.sireId == _matron.sireId) {\n return false;\n }\n\n // Everything seems cool! Let's get DTF.\n return true;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair for\n /// breeding via auction (i.e. skips ownership and siring approval checks).\n function _canBreedWithViaAuction(uint256 _matronId, uint256 _sireId)\n internal\n view\n returns (bool)\n {\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId);\n }\n\n /// @notice Checks to see if two cats can breed together, including checks for\n /// ownership and siring approvals. Does NOT check that both cats are ready for\n /// breeding (i.e. breedWith could still fail until the cooldowns are finished).\n /// TODO: Shouldn't this check pregnancy and cooldowns?!?\n /// @param _matronId The ID of the proposed matron.\n /// @param _sireId The ID of the proposed sire.\n function canBreedWith(uint256 _matronId, uint256 _sireId)\n external\n view\n returns(bool)\n {\n require(_matronId > 0);\n require(_sireId > 0);\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId) &&\n _isSiringPermitted(_sireId, _matronId);\n }\n\n /// @dev Internal utility function to initiate breeding, assumes that all breeding\n /// requirements have been checked.\n function _breedWith(uint256 _matronId, uint256 _sireId) internal {\n // Grab a reference to the Kitties from storage.\n Kitty storage sire = kitties[_sireId];\n Kitty storage matron = kitties[_matronId];\n\n // Mark the matron as pregnant, keeping track of who the sire is.\n matron.siringWithId = uint32(_sireId);\n\n // Trigger the cooldown for both parents.\n _triggerCooldown(sire);\n _triggerCooldown(matron);\n\n // Clear siring permission for both parents. This may not be strictly necessary\n // but it's likely to avoid confusion!\n delete sireAllowedToAddress[_matronId];\n delete sireAllowedToAddress[_sireId];\n\n // Every time a kitty gets pregnant, counter is incremented.\n pregnantKitties++;\n\n // Emit the pregnancy event.\n Pregnant(kittyIndexToOwner[_matronId], _matronId, _sireId, matron.cooldownEndBlock);\n }\n\n /// @notice Breed a Kitty you own (as matron) with a sire that you own, or for which you\n /// have previously been given Siring approval. Will either make your cat pregnant, or will\n /// fail entirely. Requires a pre-payment of the fee given out to the first caller of giveBirth()\n /// @param _matronId The ID of the Kitty acting as matron (will end up pregnant if successful)\n /// @param _sireId The ID of the Kitty acting as sire (will begin its siring cooldown if successful)\n function breedWithAuto(uint256 _matronId, uint256 _sireId)\n external\n payable\n whenNotPaused\n {\n // Checks for payment.\n require(msg.value >= autoBirthFee);\n\n // Caller must own the matron.\n require(_owns(msg.sender, _matronId));\n\n // Neither sire nor matron are allowed to be on auction during a normal\n // breeding operation, but we don't need to check that explicitly.\n // For matron: The caller of this function can't be the owner of the matron\n // because the owner of a Kitty on auction is the auction house, and the\n // auction house will never call breedWith().\n // For sire: Similarly, a sire on auction will be owned by the auction house\n // and the act of transferring ownership will have cleared any oustanding\n // siring approval.\n // Thus we don't need to spend gas explicitly checking to see if either cat\n // is on auction.\n\n // Check that matron and sire are both owned by caller, or that the sire\n // has given siring permission to caller (i.e. matron's owner).\n // Will fail for _sireId = 0\n require(_isSiringPermitted(_sireId, _matronId));\n\n // Grab a reference to the potential matron\n Kitty storage matron = kitties[_matronId];\n\n // Make sure matron isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(matron));\n\n // Grab a reference to the potential sire\n Kitty storage sire = kitties[_sireId];\n\n // Make sure sire isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(sire));\n\n // Test that these cats are a valid mating pair.\n require(_isValidMatingPair(\n matron,\n _matronId,\n sire,\n _sireId\n ));\n\n // All checks passed, kitty gets pregnant!\n _breedWith(_matronId, _sireId);\n }\n\n /// @notice Have a pregnant Kitty give birth!\n /// @param _matronId A Kitty ready to give birth.\n /// @return The Kitty ID of the new kitten.\n /// @dev Looks at a given Kitty and, if pregnant and if the gestation period has passed,\n /// combines the genes of the two parents to create a new kitten. The new Kitty is assigned\n /// to the current owner of the matron. Upon successful completion, both the matron and the\n /// new kitten will be ready to breed again. Note that anyone can call this function (if they\n /// are willing to pay the gas!), but the new kitten always goes to the mother's owner.\n function giveBirth(uint256 _matronId)\n external\n whenNotPaused\n returns(uint256)\n {\n // Grab a reference to the matron in storage.\n Kitty storage matron = kitties[_matronId];\n\n // Check that the matron is a valid cat.\n require(matron.birthTime != 0);\n\n // Check that the matron is pregnant, and that its time has come!\n require(_isReadyToGiveBirth(matron));\n\n // Grab a reference to the sire in storage.\n uint256 sireId = matron.siringWithId;\n Kitty storage sire = kitties[sireId];\n\n // Determine the higher generation number of the two parents\n uint16 parentGen = matron.generation;\n if (sire.generation > matron.generation) {\n parentGen = sire.generation;\n }\n\n // Call the sooper-sekret gene mixing operation.\n uint256 childGenes = geneScience.mixGenes(matron.genes, sire.genes, matron.cooldownEndBlock - 1);\n\n // Make the new kitten!\n address owner = kittyIndexToOwner[_matronId];\n uint256 kittenId = _createKitty(_matronId, matron.siringWithId, parentGen + 1, childGenes, owner);\n\n // Clear the reference to sire from the matron (REQUIRED! Having siringWithId\n // set is what marks a matron as being pregnant.)\n delete matron.siringWithId;\n\n // Every time a kitty gives birth counter is decremented.\n pregnantKitties--;\n\n // Send the balance fee to the person who made birth happen.\n msg.sender.send(autoBirthFee);\n\n // return the new kitten's ID\n return kittenId;\n }\n}\n\n\n\n\n\n\n\n\n\n\n/// @title Auction Core\n/// @dev Contains models, variables, and internal methods for the auction.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuctionBase {\n\n // Represents an auction on an NFT\n struct Auction {\n // Current owner of NFT\n address seller;\n // Price (in wei) at beginning of auction\n uint128 startingPrice;\n // Price (in wei) at end of auction\n uint128 endingPrice;\n // Duration (in seconds) of auction\n uint64 duration;\n // Time when auction started\n // NOTE: 0 if this auction has been concluded\n uint64 startedAt;\n }\n\n // Reference to contract tracking NFT ownership\n KittiesERC721 public nonFungibleContract;\n\n // Cut owner takes on each auction, measured in basis points (1/100 of a percent).\n // Values 0-10,000 map to 0%-100%\n uint256 public ownerCut;\n\n // Map from token ID to their corresponding auction.\n mapping (uint256 => Auction) tokenIdToAuction;\n\n event AuctionCreated(uint256 tokenId, uint256 startingPrice, uint256 endingPrice, uint256 duration);\n event AuctionSuccessful(uint256 tokenId, uint256 totalPrice, address winner);\n event AuctionCancelled(uint256 tokenId);\n\n /// @dev Returns true if the claimant owns the token.\n /// @param _claimant - Address claiming to own the token.\n /// @param _tokenId - ID of token whose ownership to verify.\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return (nonFungibleContract.ownerOf(_tokenId) == _claimant);\n }\n\n /// @dev Escrows the NFT, assigning ownership to this contract.\n /// Throws if the escrow fails.\n /// @param _owner - Current owner address of token to escrow.\n /// @param _tokenId - ID of token whose approval to verify.\n function _escrow(address _owner, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transferFrom(_owner, this, _tokenId);\n }\n\n /// @dev Transfers an NFT owned by this contract to another address.\n /// Returns true if the transfer succeeds.\n /// @param _receiver - Address to transfer NFT to.\n /// @param _tokenId - ID of token to transfer.\n function _transfer(address _receiver, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transfer(_receiver, _tokenId);\n }\n\n /// @dev Adds an auction to the list of open auctions. Also fires the\n /// AuctionCreated event.\n /// @param _tokenId The ID of the token to be put on auction.\n /// @param _auction Auction to add.\n function _addAuction(uint256 _tokenId, Auction _auction) internal {\n // Require that all auctions have a duration of\n // at least one minute. (Keeps our math from getting hairy!)\n require(_auction.duration >= 1 minutes);\n\n tokenIdToAuction[_tokenId] = _auction;\n\n AuctionCreated(\n uint256(_tokenId),\n uint256(_auction.startingPrice),\n uint256(_auction.endingPrice),\n uint256(_auction.duration)\n );\n }\n\n /// @dev Cancels an auction unconditionally.\n function _cancelAuction(uint256 _tokenId, address _seller) internal {\n _removeAuction(_tokenId);\n _transfer(_seller, _tokenId);\n AuctionCancelled(_tokenId);\n }\n\n /// @dev Computes the price and transfers winnings.\n /// Does NOT transfer ownership of token.\n function _bid(uint256 _tokenId, uint256 _bidAmount)\n internal\n returns (uint256)\n {\n // Get a reference to the auction struct\n Auction storage auction = tokenIdToAuction[_tokenId];\n\n // Explicitly check that this auction is currently live.\n // (Because of how Ethereum mappings work, we can't just count\n // on the lookup above failing. An invalid _tokenId will just\n // return an auction object that is all zeros.)\n require(_isOnAuction(auction));\n\n // Check that the bid is greater than or equal to the current price\n uint256 price = _currentPrice(auction);\n require(_bidAmount >= price);\n\n // Grab a reference to the seller before the auction struct\n // gets deleted.\n address seller = auction.seller;\n\n // The bid is good! Remove the auction before sending the fees\n // to the sender so we can't have a reentrancy attack.\n _removeAuction(_tokenId);\n\n // Transfer proceeds to seller (if there are any!)\n if (price > 0) {\n // Calculate the auctioneer's cut.\n // (NOTE: _computeCut() is guaranteed to return a\n // value <= price, so this subtraction can't go negative.)\n uint256 auctioneerCut = _computeCut(price);\n uint256 sellerProceeds = price - auctioneerCut;\n\n // NOTE: Doing a transfer() in the middle of a complex\n // method like this is generally discouraged because of\n // reentrancy attacks and DoS attacks if the seller is\n // a contract with an invalid fallback function. We explicitly\n // guard against reentrancy attacks by removing the auction\n // before calling transfer(), and the only thing the seller\n // can DoS is the sale of their own asset! (And if it's an\n // accident, they can call cancelAuction(). )\n seller.transfer(sellerProceeds);\n }\n\n // Calculate any excess funds included with the bid. If the excess\n // is anything worth worrying about, transfer it back to bidder.\n // NOTE: We checked above that the bid amount is greater than or\n // equal to the price so this cannot underflow.\n uint256 bidExcess = _bidAmount - price;\n\n // Return the funds. Similar to the previous transfer, this is\n // not susceptible to a re-entry attack because the auction is\n // removed before any transfers occur.\n msg.sender.transfer(bidExcess);\n\n // Tell the world!\n AuctionSuccessful(_tokenId, price, msg.sender);\n\n return price;\n }\n\n /// @dev Removes an auction from the list of open auctions.\n /// @param _tokenId - ID of NFT on auction.\n function _removeAuction(uint256 _tokenId) internal {\n delete tokenIdToAuction[_tokenId];\n }\n\n /// @dev Returns true if the NFT is on auction.\n /// @param _auction - Auction to check.\n function _isOnAuction(Auction storage _auction) internal view returns (bool) {\n return (_auction.startedAt > 0);\n }\n\n /// @dev Returns current price of an NFT on auction. Broken into two\n /// functions (this one, that computes the duration from the auction\n /// structure, and the other that does the price computation) so we\n /// can easily test that the price computation works correctly.\n function _currentPrice(Auction storage _auction)\n internal\n view\n returns (uint256)\n {\n uint256 secondsPassed = 0;\n\n // A bit of insurance against negative values (or wraparound).\n // Probably not necessary (since Ethereum guarnatees that the\n // now variable doesn't ever go backwards).\n if (now > _auction.startedAt) {\n secondsPassed = now - _auction.startedAt;\n }\n\n return _computeCurrentPrice(\n _auction.startingPrice,\n _auction.endingPrice,\n _auction.duration,\n secondsPassed\n );\n }\n\n /// @dev Computes the current price of an auction. Factored out\n /// from _currentPrice so we can run extensive unit tests.\n /// When testing, make this function public and turn on\n /// `Current price computation` test suite.\n function _computeCurrentPrice(\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n uint256 _secondsPassed\n )\n internal\n pure\n returns (uint256)\n {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our public functions carefully cap the maximum values for\n // time (at 64-bits) and currency (at 128-bits). _duration is\n // also known to be non-zero (see the require() statement in\n // _addAuction())\n if (_secondsPassed >= _duration) {\n // We've reached the end of the dynamic pricing portion\n // of the auction, just return the end price.\n return _endingPrice;\n } else {\n // Starting price can be higher than ending price (and often is!), so\n // this delta can be negative.\n int256 totalPriceChange = int256(_endingPrice) - int256(_startingPrice);\n\n // This multiplication can't overflow, _secondsPassed will easily fit within\n // 64-bits, and totalPriceChange will easily fit within 128-bits, their product\n // will always fit within 256-bits.\n int256 currentPriceChange = totalPriceChange * int256(_secondsPassed) / int256(_duration);\n\n // currentPriceChange can be negative, but if so, will have a magnitude\n // less that _startingPrice. Thus, this result will always end up positive.\n int256 currentPrice = int256(_startingPrice) + currentPriceChange;\n\n return uint256(currentPrice);\n }\n }\n\n /// @dev Computes owner's cut of a sale.\n /// @param _price - Sale price of NFT.\n function _computeCut(uint256 _price) internal view returns (uint256) {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our entry functions carefully cap the maximum values for\n // currency (at 128-bits), and ownerCut <= 10000 (see the require()\n // statement in the ClockAuction constructor). The result of this\n // function is always guaranteed to be <= _price.\n return _price * ownerCut / 10000;\n }\n\n}\n\n\n\n\n\n\n\n/**\n * @title KittiesPausable\n * @dev Base contract which allows children to implement an emergency stop mechanism.\n */\ncontract KittiesPausable is KittiesOwnable {\n event Pause();\n event Unpause();\n\n bool public paused = false;\n\n\n /**\n\t * @dev modifier to allow actions only when the contract IS paused\n\t */\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /**\n\t * @dev modifier to allow actions only when the contract IS NOT paused\n\t */\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /**\n\t * @dev called by the owner to pause, triggers stopped state\n\t */\n function pause() onlyOwner whenNotPaused returns (bool) {\n paused = true;\n Pause();\n return true;\n }\n\n /**\n\t * @dev called by the owner to unpause, returns to normal state\n\t */\n function unpause() onlyOwner whenPaused returns (bool) {\n paused = false;\n Unpause();\n return true;\n }\n}\n\n\n/// @title Clock auction for non-fungible tokens.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuction is KittiesPausable, ClockAuctionBase {\n\n /// @dev The ERC-165 interface signature for ERC-721.\n /// Ref: https://github.com/ethereum/EIPs/issues/165\n /// Ref: https://github.com/ethereum/EIPs/issues/721\n bytes4 constant InterfaceSignature_ERC721 = bytes4(0x9a20483d);\n\n /// @dev Constructor creates a reference to the NFT ownership contract\n /// and verifies the owner cut is in the valid range.\n /// @param _nftAddress - address of a deployed contract implementing\n /// the Nonfungible Interface.\n /// @param _cut - percent cut the owner takes on each auction, must be\n /// between 0-10,000.\n function ClockAuction(address _nftAddress, uint256 _cut) public {\n require(_cut <= 10000);\n ownerCut = _cut;\n\n KittiesERC721 candidateContract = KittiesERC721(_nftAddress);\n require(candidateContract.supportsInterface(InterfaceSignature_ERC721));\n nonFungibleContract = candidateContract;\n }\n\n /// @dev Remove all Ether from the contract, which is the owner's cuts\n /// as well as any Ether sent directly to the contract address.\n /// Always transfers to the NFT contract, but can be called either by\n /// the owner or the NFT contract.\n function withdrawBalance() external {\n address nftAddress = address(nonFungibleContract);\n\n require(\n msg.sender == owner ||\n msg.sender == nftAddress\n );\n // We are using this boolean method to make sure that even if one fails it will still work\n bool res = nftAddress.send(this.balance);\n }\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of time to move between starting\n /// price and ending price (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n whenNotPaused\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(_owns(msg.sender, _tokenId));\n _escrow(msg.sender, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Bids on an open auction, completing the auction and transferring\n /// ownership of the NFT if enough Ether is supplied.\n /// @param _tokenId - ID of token to bid on.\n function bid(uint256 _tokenId)\n external\n payable\n whenNotPaused\n {\n // _bid will throw if the bid or funds transfer fails\n _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n }\n\n /// @dev Cancels an auction that hasn't been won yet.\n /// Returns the NFT to original owner.\n /// @notice This is a state-modifying function that can\n /// be called while the contract is paused.\n /// @param _tokenId - ID of token on auction\n function cancelAuction(uint256 _tokenId)\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n address seller = auction.seller;\n require(msg.sender == seller);\n _cancelAuction(_tokenId, seller);\n }\n\n /// @dev Cancels an auction when the contract is paused.\n /// Only the owner may do this, and NFTs are returned to\n /// the seller. This should only be used in emergencies.\n /// @param _tokenId - ID of the NFT on auction to cancel.\n function cancelAuctionWhenPaused(uint256 _tokenId)\n whenPaused\n onlyOwner\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n _cancelAuction(_tokenId, auction.seller);\n }\n\n /// @dev Returns auction info for an NFT on auction.\n /// @param _tokenId - ID of NFT on auction.\n function getAuction(uint256 _tokenId)\n external\n view\n returns\n (\n address seller,\n uint256 startingPrice,\n uint256 endingPrice,\n uint256 duration,\n uint256 startedAt\n ) {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return (\n auction.seller,\n auction.startingPrice,\n auction.endingPrice,\n auction.duration,\n auction.startedAt\n );\n }\n\n /// @dev Returns the current price of an auction.\n /// @param _tokenId - ID of the token price we are checking.\n function getCurrentPrice(uint256 _tokenId)\n external\n view\n returns (uint256)\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return _currentPrice(auction);\n }\n\n}\n\n\n/// @title Reverse auction modified for siring\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SiringClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSiringAuctionAddress() call.\n bool public isSiringClockAuction = true;\n\n // Delegate constructor\n function SiringClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction. Since this function is wrapped,\n /// require sender to be KittyCore contract.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Places a bid for siring. Requires the sender\n /// is the KittyCore contract because all bid methods\n /// should be wrapped. Also returns the kitty to the\n /// seller rather than the winner.\n function bid(uint256 _tokenId)\n external\n payable\n {\n require(msg.sender == address(nonFungibleContract));\n address seller = tokenIdToAuction[_tokenId].seller;\n // _bid checks that token ID is valid and will throw if bid fails\n _bid(_tokenId, msg.value);\n // We transfer the kitty back to the seller, the winner will get\n // the offspring\n _transfer(seller, _tokenId);\n }\n\n}\n\n\n\n\n\n/// @title Clock auction modified for sale of kitties\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SaleClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSaleAuctionAddress() call.\n bool public isSaleClockAuction = true;\n\n // Tracks last 5 sale price of gen0 kitty sales\n uint256 public gen0SaleCount;\n uint256[5] public lastGen0SalePrices;\n\n // Delegate constructor\n function SaleClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Updates lastSalePrice if seller is the nft contract\n /// Otherwise, works the same as default bid method.\n function bid(uint256 _tokenId)\n external\n payable\n {\n // _bid verifies token ID size\n address seller = tokenIdToAuction[_tokenId].seller;\n uint256 price = _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n\n // If not a gen0 auction, exit\n if (seller == address(nonFungibleContract)) {\n // Track gen0 sale prices\n lastGen0SalePrices[gen0SaleCount % 5] = price;\n gen0SaleCount++;\n }\n }\n\n function averageGen0SalePrice() external view returns (uint256) {\n uint256 sum = 0;\n for (uint256 i = 0; i < 5; i++) {\n sum += lastGen0SalePrices[i];\n }\n return sum / 5;\n }\n\n}\n\n\n/// @title Handles creating auctions for sale and siring of kitties.\n/// This wrapper of ReverseAuction exists only so that users can create\n/// auctions with only one transaction.\ncontract KittyAuction is KittyBreeding {\n\n // @notice The auction contract variables are defined in KittyBase to allow\n // us to refer to them in KittyOwnership to prevent accidental transfers.\n // `saleAuction` refers to the auction for gen0 and p2p sale of kitties.\n // `siringAuction` refers to the auction for siring rights of kitties.\n\n /// @dev Sets the reference to the sale auction.\n /// @param _address - Address of sale contract.\n function setSaleAuctionAddress(address _address) external onlyCEO {\n SaleClockAuction candidateContract = SaleClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSaleClockAuction());\n\n // Set the new contract address\n saleAuction = candidateContract;\n }\n\n /// @dev Sets the reference to the siring auction.\n /// @param _address - Address of siring contract.\n function setSiringAuctionAddress(address _address) external onlyCEO {\n SiringClockAuction candidateContract = SiringClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSiringClockAuction());\n\n // Set the new contract address\n siringAuction = candidateContract;\n }\n\n /// @dev Put a kitty up for auction.\n /// Does some ownership trickery to create auctions in one tx.\n function createSaleAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n // Ensure the kitty is not pregnant to prevent the auction\n // contract accidentally receiving ownership of the child.\n // NOTE: the kitty IS allowed to be in a cooldown.\n require(!isPregnant(_kittyId));\n _approve(_kittyId, saleAuction);\n // Sale auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n saleAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Put a kitty up for auction to be sire.\n /// Performs checks to ensure the kitty can be sired, then\n /// delegates to reverse auction.\n function createSiringAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n require(isReadyToBreed(_kittyId));\n _approve(_kittyId, siringAuction);\n // Siring auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n siringAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Completes a siring auction by bidding.\n /// Immediately breeds the winning matron with the sire on auction.\n /// @param _sireId - ID of the sire on auction.\n /// @param _matronId - ID of the matron owned by the bidder.\n function bidOnSiringAuction(\n uint256 _sireId,\n uint256 _matronId\n )\n external\n payable\n whenNotPaused\n {\n // Auction contract checks input sizes\n require(_owns(msg.sender, _matronId));\n require(isReadyToBreed(_matronId));\n require(_canBreedWithViaAuction(_matronId, _sireId));\n\n // Define the current price of the auction.\n uint256 currentPrice = siringAuction.getCurrentPrice(_sireId);\n require(msg.value >= currentPrice + autoBirthFee);\n\n // Siring auction will throw if the bid fails.\n siringAuction.bid.value(msg.value - autoBirthFee)(_sireId);\n _breedWith(uint32(_matronId), uint32(_sireId));\n }\n\n /// @dev Transfers the balance of the sale auction contract\n /// to the KittyCore contract. We use two-step withdrawal to\n /// prevent two transfer calls in the auction bid function.\n function withdrawAuctionBalances() external onlyCLevel {\n saleAuction.withdrawBalance();\n siringAuction.withdrawBalance();\n }\n}\n\n\n/// @title all functions related to creating kittens\ncontract KittyMinting is KittyAuction {\n\n // Limits the number of cats the contract owner can ever create.\n uint256 public constant PROMO_CREATION_LIMIT = 5000;\n uint256 public constant GEN0_CREATION_LIMIT = 45000;\n\n // Constants for gen0 auctions.\n uint256 public constant GEN0_STARTING_PRICE = 10 finney;\n uint256 public constant GEN0_AUCTION_DURATION = 1 days;\n\n // Counts the number of cats the contract owner has created.\n uint256 public promoCreatedCount;\n uint256 public gen0CreatedCount;\n\n /// @dev we can create promo kittens, up to a limit. Only callable by COO\n /// @param _genes the encoded genes of the kitten to be created, any value is accepted\n /// @param _owner the future owner of the created kittens. Default to contract COO\n function createPromoKitty(uint256 _genes, address _owner) external onlyCOO {\n address kittyOwner = _owner;\n if (kittyOwner == address(0)) {\n kittyOwner = cooAddress;\n }\n require(promoCreatedCount < PROMO_CREATION_LIMIT);\n\n promoCreatedCount++;\n _createKitty(0, 0, 0, _genes, kittyOwner);\n }\n\n /// @dev Creates a new gen0 kitty with the given genes and\n /// creates an auction for it.\n function createGen0Auction(uint256 _genes) external onlyCOO {\n require(gen0CreatedCount < GEN0_CREATION_LIMIT);\n\n uint256 kittyId = _createKitty(0, 0, 0, _genes, address(this));\n _approve(kittyId, saleAuction);\n\n saleAuction.createAuction(\n kittyId,\n _computeNextGen0Price(),\n 0,\n GEN0_AUCTION_DURATION,\n address(this)\n );\n\n gen0CreatedCount++;\n }\n\n /// @dev Computes the next gen0 auction starting price, given\n /// the average of the past 5 prices + 50%.\n function _computeNextGen0Price() internal view returns (uint256) {\n uint256 avePrice = saleAuction.averageGen0SalePrice();\n\n // Sanity check to ensure we don't overflow arithmetic\n require(avePrice == uint256(uint128(avePrice)));\n\n uint256 nextPrice = avePrice + (avePrice / 2);\n\n // We never auction for less than starting price\n if (nextPrice < GEN0_STARTING_PRICE) {\n nextPrice = GEN0_STARTING_PRICE;\n }\n\n return nextPrice;\n }\n}\n\n\n/// @title CryptoKitties: Collectible, breedable, and oh-so-adorable cats on the Ethereum blockchain.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev The main CryptoKitties contract, keeps track of kittens so they don't wander around and get lost.\ncontract KittyCore is KittyMinting {\n\n // This is the main CryptoKitties contract. In order to keep our code seperated into logical sections,\n // we've broken it up in two ways. First, we have several seperately-instantiated sibling contracts\n // that handle auctions and our super-top-secret genetic combination algorithm. The auctions are\n // seperate since their logic is somewhat complex and there's always a risk of subtle bugs. By keeping\n // them in their own contracts, we can upgrade them without disrupting the main contract that tracks\n // kitty ownership. The genetic combination algorithm is kept seperate so we can open-source all of\n // the rest of our code without making it _too_ easy for folks to figure out how the genetics work.\n // Don't worry, I'm sure someone will reverse engineer it soon enough!\n //\n // Secondly, we break the core contract into multiple files using inheritence, one for each major\n // facet of functionality of CK. This allows us to keep related code bundled together while still\n // avoiding a single giant file with everything in it. The breakdown is as follows:\n //\n // - KittyBase: This is where we define the most fundamental code shared throughout the core\n // functionality. This includes our main data storage, constants and data types, plus\n // internal functions for managing these items.\n //\n // - KittyAccessControl: This contract manages the various addresses and constraints for operations\n // that can be executed only by specific roles. Namely CEO, CFO and COO.\n //\n // - KittyOwnership: This provides the methods required for basic non-fungible token\n // transactions, following the draft ERC-721 spec (https://github.com/ethereum/EIPs/issues/721).\n //\n // - KittyBreeding: This file contains the methods necessary to breed cats together, including\n // keeping track of siring offers, and relies on an external genetic combination contract.\n //\n // - KittyAuctions: Here we have the public methods for auctioning or bidding on cats or siring\n // services. The actual auction functionality is handled in two sibling contracts (one\n // for sales and one for siring), while auction creation and bidding is mostly mediated\n // through this facet of the core contract.\n //\n // - KittyMinting: This final facet contains the functionality we use for creating new gen0 cats.\n // We can make up to 5000 \"promo\" cats that can be given away (especially important when\n // the community is new), and all others can only be created and then immediately put up\n // for auction via an algorithmically determined starting price. Regardless of how they\n // are created, there is a hard limit of 50k gen0 cats. After that, it's all up to the\n // community to breed, breed, breed!\n\n // Set in case the core contract is broken and an upgrade is required\n address public newContractAddress;\n\n /// @notice Creates the main CryptoKitties smart contract instance.\n function KittyCore() public {\n // Starts paused.\n paused = true;\n\n // the creator of the contract is the initial CEO\n ceoAddress = msg.sender;\n\n // the creator of the contract is also the initial COO\n cooAddress = msg.sender;\n\n // start with the mythical kitten 0 - so we don't have generation-0 parent issues\n _createKitty(0, 0, 0, uint256(-1), address(0));\n }\n\n /// @dev Used to mark the smart contract as upgraded, in case there is a serious\n /// breaking bug. This method does nothing but keep track of the new contract and\n /// emit a message indicating that the new address is set. It's up to clients of this\n /// contract to update to the new contract address in that case. (This contract will\n /// be paused indefinitely if such an upgrade takes place.)\n /// @param _v2Address new address\n function setNewAddress(address _v2Address) external onlyCEO whenPaused {\n // See README.md for updgrade plan\n newContractAddress = _v2Address;\n ContractUpgrade(_v2Address);\n }\n\n /// @notice No tipping!\n /// @dev Reject all Ether from being sent here, unless it's from one of the\n /// two auction contracts. (Hopefully, we can prevent user accidents.)\n function() external payable {\n require(\n msg.sender == address(saleAuction) ||\n msg.sender == address(siringAuction)\n );\n }\n\n /// @notice Returns all the relevant information about a specific kitty.\n /// @param _id The ID of the kitty of interest.\n function getKitty(uint256 _id)\n external\n view\n returns (\n bool isGestating,\n bool isReady,\n uint256 cooldownIndex,\n uint256 nextActionAt,\n uint256 siringWithId,\n uint256 birthTime,\n uint256 matronId,\n uint256 sireId,\n uint256 generation,\n uint256 genes\n ) {\n Kitty storage kit = kitties[_id];\n\n // if this variable is 0 then it's not gestating\n isGestating = (kit.siringWithId != 0);\n isReady = (kit.cooldownEndBlock <= block.number);\n cooldownIndex = uint256(kit.cooldownIndex);\n nextActionAt = uint256(kit.cooldownEndBlock);\n siringWithId = uint256(kit.siringWithId);\n birthTime = uint256(kit.birthTime);\n matronId = uint256(kit.matronId);\n sireId = uint256(kit.sireId);\n generation = uint256(kit.generation);\n genes = kit.genes;\n }\n\n /// @dev Override unpause so it requires all external contract addresses\n /// to be set before contract can be unpaused. Also, we can't have\n /// newContractAddress set either, because then the contract was upgraded.\n /// @notice This is public rather than external so we can call super.unpause\n /// without using an expensive CALL.\n function unpause() public onlyCEO whenPaused {\n require(saleAuction != address(0));\n require(siringAuction != address(0));\n require(geneScience != address(0));\n require(newContractAddress == address(0));\n\n // Actually unpause the contract.\n super.unpause();\n }\n\n // @dev Allows the CFO to capture the balance available to the contract.\n function withdrawBalance() external onlyCFO {\n uint256 balance = this.balance;\n // Subtract all the currently pregnant kittens we have, plus 1 of margin.\n uint256 subtractFees = (pregnantKitties + 1) * autoBirthFee;\n\n if (balance > subtractFees) {\n cfoAddress.send(balance - subtractFees);\n }\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "exportedSymbols": { "ClockAuction": [ 8872 @@ -52205,5 +52205,5 @@ }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:47.947Z" + "updatedAt": "2018-10-09T17:45:36.421Z" } \ No newline at end of file diff --git a/artifacts/json/Migrations.json b/artifacts/json/Migrations.json index 878d5fd4..63dd4fc7 100644 --- a/artifacts/json/Migrations.json +++ b/artifacts/json/Migrations.json @@ -64,15 +64,15 @@ "type": "constructor" } ], - "bytecode": "0x6060604052341561000f57600080fd5b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506102db8061005e6000396000f300606060405260043610610062576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630900f01014610067578063445df0ac146100a05780638da5cb5b146100c9578063fdacd5761461011e575b600080fd5b341561007257600080fd5b61009e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610141565b005b34156100ab57600080fd5b6100b3610224565b6040518082815260200191505060405180910390f35b34156100d457600080fd5b6100dc61022a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561012957600080fd5b61013f600480803590602001909190505061024f565b005b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415610220578190508073ffffffffffffffffffffffffffffffffffffffff1663fdacd5766001546040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b151561020b57600080fd5b6102c65a03f1151561021c57600080fd5b5050505b5050565b60015481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156102ac57806001819055505b505600a165627a7a72305820c7e7b6c42b77e11556d6c62893608c94e6061da7086e349e40976d7895e94deb0029", - "deployedBytecode": "0x606060405260043610610062576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630900f01014610067578063445df0ac146100a05780638da5cb5b146100c9578063fdacd5761461011e575b600080fd5b341561007257600080fd5b61009e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610141565b005b34156100ab57600080fd5b6100b3610224565b6040518082815260200191505060405180910390f35b34156100d457600080fd5b6100dc61022a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561012957600080fd5b61013f600480803590602001909190505061024f565b005b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415610220578190508073ffffffffffffffffffffffffffffffffffffffff1663fdacd5766001546040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b151561020b57600080fd5b6102c65a03f1151561021c57600080fd5b5050505b5050565b60015481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156102ac57806001819055505b505600a165627a7a72305820c7e7b6c42b77e11556d6c62893608c94e6061da7086e349e40976d7895e94deb0029", + "bytecode": "0x6060604052341561000f57600080fd5b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506102db8061005e6000396000f300606060405260043610610062576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630900f01014610067578063445df0ac146100a05780638da5cb5b146100c9578063fdacd5761461011e575b600080fd5b341561007257600080fd5b61009e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610141565b005b34156100ab57600080fd5b6100b3610224565b6040518082815260200191505060405180910390f35b34156100d457600080fd5b6100dc61022a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561012957600080fd5b61013f600480803590602001909190505061024f565b005b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415610220578190508073ffffffffffffffffffffffffffffffffffffffff1663fdacd5766001546040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b151561020b57600080fd5b6102c65a03f1151561021c57600080fd5b5050505b5050565b60015481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156102ac57806001819055505b505600a165627a7a72305820ea9eb696e985730f91dd444a372e2e3d7d38ebd8744bc8533d4c5515c99910520029", + "deployedBytecode": "0x606060405260043610610062576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630900f01014610067578063445df0ac146100a05780638da5cb5b146100c9578063fdacd5761461011e575b600080fd5b341561007257600080fd5b61009e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610141565b005b34156100ab57600080fd5b6100b3610224565b6040518082815260200191505060405180910390f35b34156100d457600080fd5b6100dc61022a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561012957600080fd5b61013f600480803590602001909190505061024f565b005b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415610220578190508073ffffffffffffffffffffffffffffffffffffffff1663fdacd5766001546040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b151561020b57600080fd5b6102c65a03f1151561021c57600080fd5b5050505b5050565b60015481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156102ac57806001819055505b505600a165627a7a72305820ea9eb696e985730f91dd444a372e2e3d7d38ebd8744bc8533d4c5515c99910520029", "sourceMap": "26:579:9:-;;;245:64;;;;;;;;292:10;284:5;;:18;;;;;;;;;;;;;;;;;;26:579;;;;;;", "deployedSourceMap": "26:579:9:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;430:173;;;;;;;;;;;;;;;;;;;;;;;;;;;;131:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;315:109;;;;;;;;;;;;;;;;;;;;;;;;;;430:173;495:19;224:5;;;;;;;;;;;210:19;;:10;:19;;;206:26;;;528:10;495:44;;549:8;:21;;;571:24;;549:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;206:26;430:173;;:::o;131:36::-;;;;:::o;52:20::-;;;;;;;;;;;;;:::o;315:109::-;224:5;;;;;;;;;;;210:19;;:10;:19;;;206:26;;;408:9;381:24;:36;;;;206:26;315:109;:::o", "source": "pragma solidity 0.4.18;\n\n\ncontract Migrations {\n address public owner;\n\n // solhint-disable-next-line var-name-mixedcase\n uint public last_completed_migration;\n\n modifier restricted() {\n if (msg.sender == owner) _;\n }\n\n function Migrations() public {\n owner = msg.sender;\n }\n\n function setCompleted(uint completed) public restricted {\n last_completed_migration = completed;\n }\n\n function upgrade(address newAddress) public restricted {\n Migrations upgraded = Migrations(newAddress);\n upgraded.setCompleted(last_completed_migration);\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/Migrations.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/Migrations.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/Migrations.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/Migrations.sol", "exportedSymbols": { "Migrations": [ 4514 @@ -818,7 +818,7 @@ "42": { "events": {}, "links": {}, - "address": "0xf44e598f6ad5115151c1c331f5b2f8b02b06bb47" + "address": "0x4c4bd0258c47645a61a55c66c40168e61dcb19b2" }, "70": { "events": {}, @@ -827,5 +827,5 @@ } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:16:36.720Z" + "updatedAt": "2018-10-09T17:53:24.835Z" } \ No newline at end of file diff --git a/artifacts/json/MintableERC721Token.json b/artifacts/json/MintableERC721Token.json index e4f769fb..5fadf4e7 100644 --- a/artifacts/json/MintableERC721Token.json +++ b/artifacts/json/MintableERC721Token.json @@ -437,15 +437,15 @@ "type": "event" } ], - "bytecode": "0x606060405234156200001057600080fd5b6040805190810160405280601381526020017f4d696e7461626c65455243373231546f6b656e000000000000000000000000008152506040805190810160405280600381526020017f4d45540000000000000000000000000000000000000000000000000000000000815250816004908051906020019062000094929190620000b6565b508060059080519060200190620000ad929190620000b6565b50505062000165565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620000f957805160ff19168380011785556200012a565b828001600101855582156200012a579182015b82811115620001295782518255916020019190600101906200010c565b5b5090506200013991906200013d565b5090565b6200016291905b808211156200015e57600081600090555060010162000144565b5090565b90565b611d7180620001756000396000f300606060405260043610610107576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a71461010c57806306fdde0314610166578063081812fc146101f4578063095ea7b31461025757806318160ddd1461029957806323b872dd146102c25780632f745c591461032357806340c10f191461037957806342842e0e146103bb5780634f558e791461041c5780634f6ccce7146104575780636352211e1461048e57806370a08231146104f157806395d89b411461053e578063a22cb465146105cc578063a9059cbb14610610578063b88d4fde14610652578063c87b56dd146106f6578063e985e9c514610792575b600080fd5b341561011757600080fd5b61014c60048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050610802565b604051808215151515815260200191505060405180910390f35b341561017157600080fd5b610179610850565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101b957808201518184015260208101905061019e565b50505050905090810190601f1680156101e65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101ff57600080fd5b61021560048080359060200190919050506108f8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561026257600080fd5b610297600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610935565b005b34156102a457600080fd5b6102ac610afb565b6040518082815260200191505060405180910390f35b34156102cd57600080fd5b610321600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610b08565b005b341561032e57600080fd5b610363600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610c1f565b6040518082815260200191505060405180910390f35b341561038457600080fd5b6103b9600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610c97565b005b34156103c657600080fd5b61041a600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610ca5565b005b341561042757600080fd5b61043d6004808035906020019091905050610cdd565b604051808215151515815260200191505060405180910390f35b341561046257600080fd5b6104786004808035906020019091905050610d4e565b6040518082815260200191505060405180910390f35b341561049957600080fd5b6104af6004808035906020019091905050610d87565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104fc57600080fd5b610528600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610e04565b6040518082815260200191505060405180910390f35b341561054957600080fd5b610551610e88565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610591578082015181840152602081019050610576565b50505050905090810190601f1680156105be5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156105d757600080fd5b61060e600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080351515906020019091905050610f30565b005b341561061b57600080fd5b610650600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061106c565b005b341561065d57600080fd5b6106f4600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190505061107b565b005b341561070157600080fd5b61071760048080359060200190919050506110ba565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561075757808201518184015260208101905061073c565b50505050905090810190601f1680156107845780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561079d57600080fd5b6107e8600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611189565b604051808215151515815260200191505060405180910390f35b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610858611cb4565b60048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156108ee5780601f106108c3576101008083540402835291602001916108ee565b820191906000526020600020905b8154815290600101906020018083116108d157829003601f168201915b5050505050905090565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061094082610d87565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561097d57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806109bd57506109bc8133611189565b5b15156109c857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166109e9836108f8565b73ffffffffffffffffffffffffffffffffffffffff16141580610a395750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b15610af657826001600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a35b505050565b6000600880549050905090565b80610b13338261121d565b1515610b1e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614151515610b5a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515610b9657600080fd5b610ba084836112b2565b610baa848361141b565b610bb48383611636565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a350505050565b6000610c2a83610e04565b82101515610c3757600080fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515610c8357fe5b906000526020600020900154905092915050565b610ca1828261170a565b5050565b80610cb0338261121d565b1515610cbb57600080fd5b610cd7848484602060405190810160405280600081525061107b565b50505050565b60008060008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b6000610d58610afb565b82101515610d6557600080fd5b600882815481101515610d7457fe5b9060005260206000209001549050919050565b60008060008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610dfb57600080fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515610e4157600080fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e90611cb4565b60058054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f265780601f10610efb57610100808354040283529160200191610f26565b820191906000526020600020905b815481529060010190602001808311610f0957829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515610f6b57600080fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b611077338383610ca5565b5050565b81611086338261121d565b151561109157600080fd5b61109c858585610b08565b6110a88585858561175e565b15156110b357600080fd5b5050505050565b6110c2611cb4565b6110cb82610cdd565b15156110d657600080fd5b600a60008381526020019081526020016000208054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561117d5780601f106111525761010080835404028352916020019161117d565b820191906000526020600020905b81548152906001019060200180831161116057829003601f168201915b50505050509050919050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60008061122983610d87565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061129857508373ffffffffffffffffffffffffffffffffffffffff16611280846108f8565b73ffffffffffffffffffffffffffffffffffffffff16145b806112a957506112a88185611189565b5b91505092915050565b8173ffffffffffffffffffffffffffffffffffffffff166112d282610d87565b73ffffffffffffffffffffffffffffffffffffffff161415156112f457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156114175760006001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a35b5050565b600080600061142a8585611934565b600760008581526020019081526020016000205492506114966001600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050611a6290919063ffffffff16565b9150600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811015156114e457fe5b906000526020600020900154905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208481548110151561153f57fe5b9060005260206000209001819055506000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110151561159c57fe5b906000526020600020900181905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054809190600190036115fd9190611cc8565b50600060076000868152602001908152602001600020819055508260076000838152602001908152602001600020819055505050505050565b60006116428383611a7b565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060010182816116d89190611cf4565b916000526020600020900160008490919091505550806007600084815260200190815260200160002081905550505050565b6117148282611bd3565b6008805490506009600083815260200190815260200160002081905550600880548060010182816117459190611cf4565b9160005260206000209001600083909190915055505050565b6000806117808573ffffffffffffffffffffffffffffffffffffffff16611c83565b151561178f576001915061192b565b8473ffffffffffffffffffffffffffffffffffffffff1663f0b9e5ba8786866000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561185a57808201518184015260208101905061183f565b50505050905090810190601f1680156118875780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15156118a757600080fd5b6102c65a03f115156118b857600080fd5b50505060405180519050905063f0b9e5ba7c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505b50949350505050565b8173ffffffffffffffffffffffffffffffffffffffff1661195482610d87565b73ffffffffffffffffffffffffffffffffffffffff1614151561197657600080fd5b6119c96001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a6290919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600080600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000828211151515611a7057fe5b818303905092915050565b600073ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515611ae857600080fd5b8160008083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611b8c6001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c9690919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611c0f57600080fd5b611c198282611636565b8173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600080823b905060008111915050919050565b6000808284019050838110151515611caa57fe5b8091505092915050565b602060405190810160405280600081525090565b815481835581811511611cef57818360005260206000209182019101611cee9190611d20565b5b505050565b815481835581811511611d1b57818360005260206000209182019101611d1a9190611d20565b5b505050565b611d4291905b80821115611d3e576000816000905550600101611d26565b5090565b905600a165627a7a72305820b14cd1499e1ebff6b2f4fb7df78f1c7923b8f66681403cfd5f3a4a11912fd1550029", - "deployedBytecode": "0x606060405260043610610107576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a71461010c57806306fdde0314610166578063081812fc146101f4578063095ea7b31461025757806318160ddd1461029957806323b872dd146102c25780632f745c591461032357806340c10f191461037957806342842e0e146103bb5780634f558e791461041c5780634f6ccce7146104575780636352211e1461048e57806370a08231146104f157806395d89b411461053e578063a22cb465146105cc578063a9059cbb14610610578063b88d4fde14610652578063c87b56dd146106f6578063e985e9c514610792575b600080fd5b341561011757600080fd5b61014c60048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050610802565b604051808215151515815260200191505060405180910390f35b341561017157600080fd5b610179610850565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101b957808201518184015260208101905061019e565b50505050905090810190601f1680156101e65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101ff57600080fd5b61021560048080359060200190919050506108f8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561026257600080fd5b610297600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610935565b005b34156102a457600080fd5b6102ac610afb565b6040518082815260200191505060405180910390f35b34156102cd57600080fd5b610321600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610b08565b005b341561032e57600080fd5b610363600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610c1f565b6040518082815260200191505060405180910390f35b341561038457600080fd5b6103b9600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610c97565b005b34156103c657600080fd5b61041a600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610ca5565b005b341561042757600080fd5b61043d6004808035906020019091905050610cdd565b604051808215151515815260200191505060405180910390f35b341561046257600080fd5b6104786004808035906020019091905050610d4e565b6040518082815260200191505060405180910390f35b341561049957600080fd5b6104af6004808035906020019091905050610d87565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104fc57600080fd5b610528600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610e04565b6040518082815260200191505060405180910390f35b341561054957600080fd5b610551610e88565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610591578082015181840152602081019050610576565b50505050905090810190601f1680156105be5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156105d757600080fd5b61060e600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080351515906020019091905050610f30565b005b341561061b57600080fd5b610650600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061106c565b005b341561065d57600080fd5b6106f4600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190505061107b565b005b341561070157600080fd5b61071760048080359060200190919050506110ba565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561075757808201518184015260208101905061073c565b50505050905090810190601f1680156107845780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561079d57600080fd5b6107e8600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611189565b604051808215151515815260200191505060405180910390f35b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610858611cb4565b60048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156108ee5780601f106108c3576101008083540402835291602001916108ee565b820191906000526020600020905b8154815290600101906020018083116108d157829003601f168201915b5050505050905090565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061094082610d87565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561097d57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806109bd57506109bc8133611189565b5b15156109c857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166109e9836108f8565b73ffffffffffffffffffffffffffffffffffffffff16141580610a395750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b15610af657826001600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a35b505050565b6000600880549050905090565b80610b13338261121d565b1515610b1e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614151515610b5a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515610b9657600080fd5b610ba084836112b2565b610baa848361141b565b610bb48383611636565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a350505050565b6000610c2a83610e04565b82101515610c3757600080fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515610c8357fe5b906000526020600020900154905092915050565b610ca1828261170a565b5050565b80610cb0338261121d565b1515610cbb57600080fd5b610cd7848484602060405190810160405280600081525061107b565b50505050565b60008060008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b6000610d58610afb565b82101515610d6557600080fd5b600882815481101515610d7457fe5b9060005260206000209001549050919050565b60008060008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610dfb57600080fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515610e4157600080fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e90611cb4565b60058054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f265780601f10610efb57610100808354040283529160200191610f26565b820191906000526020600020905b815481529060010190602001808311610f0957829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515610f6b57600080fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b611077338383610ca5565b5050565b81611086338261121d565b151561109157600080fd5b61109c858585610b08565b6110a88585858561175e565b15156110b357600080fd5b5050505050565b6110c2611cb4565b6110cb82610cdd565b15156110d657600080fd5b600a60008381526020019081526020016000208054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561117d5780601f106111525761010080835404028352916020019161117d565b820191906000526020600020905b81548152906001019060200180831161116057829003601f168201915b50505050509050919050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60008061122983610d87565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061129857508373ffffffffffffffffffffffffffffffffffffffff16611280846108f8565b73ffffffffffffffffffffffffffffffffffffffff16145b806112a957506112a88185611189565b5b91505092915050565b8173ffffffffffffffffffffffffffffffffffffffff166112d282610d87565b73ffffffffffffffffffffffffffffffffffffffff161415156112f457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156114175760006001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a35b5050565b600080600061142a8585611934565b600760008581526020019081526020016000205492506114966001600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050611a6290919063ffffffff16565b9150600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811015156114e457fe5b906000526020600020900154905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208481548110151561153f57fe5b9060005260206000209001819055506000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110151561159c57fe5b906000526020600020900181905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054809190600190036115fd9190611cc8565b50600060076000868152602001908152602001600020819055508260076000838152602001908152602001600020819055505050505050565b60006116428383611a7b565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060010182816116d89190611cf4565b916000526020600020900160008490919091505550806007600084815260200190815260200160002081905550505050565b6117148282611bd3565b6008805490506009600083815260200190815260200160002081905550600880548060010182816117459190611cf4565b9160005260206000209001600083909190915055505050565b6000806117808573ffffffffffffffffffffffffffffffffffffffff16611c83565b151561178f576001915061192b565b8473ffffffffffffffffffffffffffffffffffffffff1663f0b9e5ba8786866000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561185a57808201518184015260208101905061183f565b50505050905090810190601f1680156118875780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15156118a757600080fd5b6102c65a03f115156118b857600080fd5b50505060405180519050905063f0b9e5ba7c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505b50949350505050565b8173ffffffffffffffffffffffffffffffffffffffff1661195482610d87565b73ffffffffffffffffffffffffffffffffffffffff1614151561197657600080fd5b6119c96001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a6290919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600080600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000828211151515611a7057fe5b818303905092915050565b600073ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515611ae857600080fd5b8160008083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611b8c6001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c9690919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611c0f57600080fd5b611c198282611636565b8173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600080823b905060008111915050919050565b6000808284019050838110151515611caa57fe5b8091505092915050565b602060405190810160405280600081525090565b815481835581811511611cef57818360005260206000209182019101611cee9190611d20565b5b505050565b815481835581811511611d1b57818360005260206000209182019101611d1a9190611d20565b5b505050565b611d4291905b80821115611d3e576000816000905550600101611d26565b5090565b905600a165627a7a72305820b14cd1499e1ebff6b2f4fb7df78f1c7923b8f66681403cfd5f3a4a11912fd1550029", + "bytecode": "0x606060405234156200001057600080fd5b6040805190810160405280601381526020017f4d696e7461626c65455243373231546f6b656e000000000000000000000000008152506040805190810160405280600381526020017f4d45540000000000000000000000000000000000000000000000000000000000815250816004908051906020019062000094929190620000b6565b508060059080519060200190620000ad929190620000b6565b50505062000165565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620000f957805160ff19168380011785556200012a565b828001600101855582156200012a579182015b82811115620001295782518255916020019190600101906200010c565b5b5090506200013991906200013d565b5090565b6200016291905b808211156200015e57600081600090555060010162000144565b5090565b90565b611d7180620001756000396000f300606060405260043610610107576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a71461010c57806306fdde0314610166578063081812fc146101f4578063095ea7b31461025757806318160ddd1461029957806323b872dd146102c25780632f745c591461032357806340c10f191461037957806342842e0e146103bb5780634f558e791461041c5780634f6ccce7146104575780636352211e1461048e57806370a08231146104f157806395d89b411461053e578063a22cb465146105cc578063a9059cbb14610610578063b88d4fde14610652578063c87b56dd146106f6578063e985e9c514610792575b600080fd5b341561011757600080fd5b61014c60048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050610802565b604051808215151515815260200191505060405180910390f35b341561017157600080fd5b610179610850565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101b957808201518184015260208101905061019e565b50505050905090810190601f1680156101e65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101ff57600080fd5b61021560048080359060200190919050506108f8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561026257600080fd5b610297600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610935565b005b34156102a457600080fd5b6102ac610afb565b6040518082815260200191505060405180910390f35b34156102cd57600080fd5b610321600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610b08565b005b341561032e57600080fd5b610363600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610c1f565b6040518082815260200191505060405180910390f35b341561038457600080fd5b6103b9600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610c97565b005b34156103c657600080fd5b61041a600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610ca5565b005b341561042757600080fd5b61043d6004808035906020019091905050610cdd565b604051808215151515815260200191505060405180910390f35b341561046257600080fd5b6104786004808035906020019091905050610d4e565b6040518082815260200191505060405180910390f35b341561049957600080fd5b6104af6004808035906020019091905050610d87565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104fc57600080fd5b610528600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610e04565b6040518082815260200191505060405180910390f35b341561054957600080fd5b610551610e88565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610591578082015181840152602081019050610576565b50505050905090810190601f1680156105be5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156105d757600080fd5b61060e600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080351515906020019091905050610f30565b005b341561061b57600080fd5b610650600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061106c565b005b341561065d57600080fd5b6106f4600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190505061107b565b005b341561070157600080fd5b61071760048080359060200190919050506110ba565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561075757808201518184015260208101905061073c565b50505050905090810190601f1680156107845780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561079d57600080fd5b6107e8600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611189565b604051808215151515815260200191505060405180910390f35b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610858611cb4565b60048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156108ee5780601f106108c3576101008083540402835291602001916108ee565b820191906000526020600020905b8154815290600101906020018083116108d157829003601f168201915b5050505050905090565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061094082610d87565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561097d57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806109bd57506109bc8133611189565b5b15156109c857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166109e9836108f8565b73ffffffffffffffffffffffffffffffffffffffff16141580610a395750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b15610af657826001600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a35b505050565b6000600880549050905090565b80610b13338261121d565b1515610b1e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614151515610b5a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515610b9657600080fd5b610ba084836112b2565b610baa848361141b565b610bb48383611636565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a350505050565b6000610c2a83610e04565b82101515610c3757600080fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515610c8357fe5b906000526020600020900154905092915050565b610ca1828261170a565b5050565b80610cb0338261121d565b1515610cbb57600080fd5b610cd7848484602060405190810160405280600081525061107b565b50505050565b60008060008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b6000610d58610afb565b82101515610d6557600080fd5b600882815481101515610d7457fe5b9060005260206000209001549050919050565b60008060008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610dfb57600080fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515610e4157600080fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e90611cb4565b60058054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f265780601f10610efb57610100808354040283529160200191610f26565b820191906000526020600020905b815481529060010190602001808311610f0957829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515610f6b57600080fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b611077338383610ca5565b5050565b81611086338261121d565b151561109157600080fd5b61109c858585610b08565b6110a88585858561175e565b15156110b357600080fd5b5050505050565b6110c2611cb4565b6110cb82610cdd565b15156110d657600080fd5b600a60008381526020019081526020016000208054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561117d5780601f106111525761010080835404028352916020019161117d565b820191906000526020600020905b81548152906001019060200180831161116057829003601f168201915b50505050509050919050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60008061122983610d87565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061129857508373ffffffffffffffffffffffffffffffffffffffff16611280846108f8565b73ffffffffffffffffffffffffffffffffffffffff16145b806112a957506112a88185611189565b5b91505092915050565b8173ffffffffffffffffffffffffffffffffffffffff166112d282610d87565b73ffffffffffffffffffffffffffffffffffffffff161415156112f457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156114175760006001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a35b5050565b600080600061142a8585611934565b600760008581526020019081526020016000205492506114966001600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050611a6290919063ffffffff16565b9150600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811015156114e457fe5b906000526020600020900154905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208481548110151561153f57fe5b9060005260206000209001819055506000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110151561159c57fe5b906000526020600020900181905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054809190600190036115fd9190611cc8565b50600060076000868152602001908152602001600020819055508260076000838152602001908152602001600020819055505050505050565b60006116428383611a7b565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060010182816116d89190611cf4565b916000526020600020900160008490919091505550806007600084815260200190815260200160002081905550505050565b6117148282611bd3565b6008805490506009600083815260200190815260200160002081905550600880548060010182816117459190611cf4565b9160005260206000209001600083909190915055505050565b6000806117808573ffffffffffffffffffffffffffffffffffffffff16611c83565b151561178f576001915061192b565b8473ffffffffffffffffffffffffffffffffffffffff1663f0b9e5ba8786866000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561185a57808201518184015260208101905061183f565b50505050905090810190601f1680156118875780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15156118a757600080fd5b6102c65a03f115156118b857600080fd5b50505060405180519050905063f0b9e5ba7c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505b50949350505050565b8173ffffffffffffffffffffffffffffffffffffffff1661195482610d87565b73ffffffffffffffffffffffffffffffffffffffff1614151561197657600080fd5b6119c96001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a6290919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600080600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000828211151515611a7057fe5b818303905092915050565b600073ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515611ae857600080fd5b8160008083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611b8c6001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c9690919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611c0f57600080fd5b611c198282611636565b8173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600080823b905060008111915050919050565b6000808284019050838110151515611caa57fe5b8091505092915050565b602060405190810160405280600081525090565b815481835581811511611cef57818360005260206000209182019101611cee9190611d20565b5b505050565b815481835581811511611d1b57818360005260206000209182019101611d1a9190611d20565b5b505050565b611d4291905b80821115611d3e576000816000905550600101611d26565b5090565b905600a165627a7a723058207ea6816917c58ff763036e5a75d9579ff5daa72f6184bb234c0f45eca9abf0ed0029", + "deployedBytecode": "0x606060405260043610610107576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a71461010c57806306fdde0314610166578063081812fc146101f4578063095ea7b31461025757806318160ddd1461029957806323b872dd146102c25780632f745c591461032357806340c10f191461037957806342842e0e146103bb5780634f558e791461041c5780634f6ccce7146104575780636352211e1461048e57806370a08231146104f157806395d89b411461053e578063a22cb465146105cc578063a9059cbb14610610578063b88d4fde14610652578063c87b56dd146106f6578063e985e9c514610792575b600080fd5b341561011757600080fd5b61014c60048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050610802565b604051808215151515815260200191505060405180910390f35b341561017157600080fd5b610179610850565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101b957808201518184015260208101905061019e565b50505050905090810190601f1680156101e65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101ff57600080fd5b61021560048080359060200190919050506108f8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561026257600080fd5b610297600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610935565b005b34156102a457600080fd5b6102ac610afb565b6040518082815260200191505060405180910390f35b34156102cd57600080fd5b610321600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610b08565b005b341561032e57600080fd5b610363600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610c1f565b6040518082815260200191505060405180910390f35b341561038457600080fd5b6103b9600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610c97565b005b34156103c657600080fd5b61041a600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610ca5565b005b341561042757600080fd5b61043d6004808035906020019091905050610cdd565b604051808215151515815260200191505060405180910390f35b341561046257600080fd5b6104786004808035906020019091905050610d4e565b6040518082815260200191505060405180910390f35b341561049957600080fd5b6104af6004808035906020019091905050610d87565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104fc57600080fd5b610528600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610e04565b6040518082815260200191505060405180910390f35b341561054957600080fd5b610551610e88565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610591578082015181840152602081019050610576565b50505050905090810190601f1680156105be5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156105d757600080fd5b61060e600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080351515906020019091905050610f30565b005b341561061b57600080fd5b610650600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061106c565b005b341561065d57600080fd5b6106f4600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190505061107b565b005b341561070157600080fd5b61071760048080359060200190919050506110ba565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561075757808201518184015260208101905061073c565b50505050905090810190601f1680156107845780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561079d57600080fd5b6107e8600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611189565b604051808215151515815260200191505060405180910390f35b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610858611cb4565b60048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156108ee5780601f106108c3576101008083540402835291602001916108ee565b820191906000526020600020905b8154815290600101906020018083116108d157829003601f168201915b5050505050905090565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061094082610d87565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561097d57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806109bd57506109bc8133611189565b5b15156109c857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166109e9836108f8565b73ffffffffffffffffffffffffffffffffffffffff16141580610a395750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b15610af657826001600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a35b505050565b6000600880549050905090565b80610b13338261121d565b1515610b1e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614151515610b5a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515610b9657600080fd5b610ba084836112b2565b610baa848361141b565b610bb48383611636565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a350505050565b6000610c2a83610e04565b82101515610c3757600080fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515610c8357fe5b906000526020600020900154905092915050565b610ca1828261170a565b5050565b80610cb0338261121d565b1515610cbb57600080fd5b610cd7848484602060405190810160405280600081525061107b565b50505050565b60008060008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b6000610d58610afb565b82101515610d6557600080fd5b600882815481101515610d7457fe5b9060005260206000209001549050919050565b60008060008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610dfb57600080fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515610e4157600080fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e90611cb4565b60058054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f265780601f10610efb57610100808354040283529160200191610f26565b820191906000526020600020905b815481529060010190602001808311610f0957829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515610f6b57600080fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b611077338383610ca5565b5050565b81611086338261121d565b151561109157600080fd5b61109c858585610b08565b6110a88585858561175e565b15156110b357600080fd5b5050505050565b6110c2611cb4565b6110cb82610cdd565b15156110d657600080fd5b600a60008381526020019081526020016000208054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561117d5780601f106111525761010080835404028352916020019161117d565b820191906000526020600020905b81548152906001019060200180831161116057829003601f168201915b50505050509050919050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60008061122983610d87565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061129857508373ffffffffffffffffffffffffffffffffffffffff16611280846108f8565b73ffffffffffffffffffffffffffffffffffffffff16145b806112a957506112a88185611189565b5b91505092915050565b8173ffffffffffffffffffffffffffffffffffffffff166112d282610d87565b73ffffffffffffffffffffffffffffffffffffffff161415156112f457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156114175760006001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a35b5050565b600080600061142a8585611934565b600760008581526020019081526020016000205492506114966001600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050611a6290919063ffffffff16565b9150600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811015156114e457fe5b906000526020600020900154905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208481548110151561153f57fe5b9060005260206000209001819055506000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110151561159c57fe5b906000526020600020900181905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054809190600190036115fd9190611cc8565b50600060076000868152602001908152602001600020819055508260076000838152602001908152602001600020819055505050505050565b60006116428383611a7b565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060010182816116d89190611cf4565b916000526020600020900160008490919091505550806007600084815260200190815260200160002081905550505050565b6117148282611bd3565b6008805490506009600083815260200190815260200160002081905550600880548060010182816117459190611cf4565b9160005260206000209001600083909190915055505050565b6000806117808573ffffffffffffffffffffffffffffffffffffffff16611c83565b151561178f576001915061192b565b8473ffffffffffffffffffffffffffffffffffffffff1663f0b9e5ba8786866000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561185a57808201518184015260208101905061183f565b50505050905090810190601f1680156118875780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15156118a757600080fd5b6102c65a03f115156118b857600080fd5b50505060405180519050905063f0b9e5ba7c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505b50949350505050565b8173ffffffffffffffffffffffffffffffffffffffff1661195482610d87565b73ffffffffffffffffffffffffffffffffffffffff1614151561197657600080fd5b6119c96001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a6290919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600080600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000828211151515611a7057fe5b818303905092915050565b600073ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515611ae857600080fd5b8160008083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611b8c6001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c9690919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611c0f57600080fd5b611c198282611636565b8173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600080823b905060008111915050919050565b6000808284019050838110151515611caa57fe5b8091505092915050565b602060405190810160405280600081525090565b815481835581811511611cef57818360005260206000209182019101611cee9190611d20565b5b505050565b815481835581811511611d1b57818360005260206000209182019101611d1a9190611d20565b5b505050565b611d4291905b80821115611d3e576000816000905550600101611d26565b5090565b905600a165627a7a723058207ea6816917c58ff763036e5a75d9579ff5daa72f6184bb234c0f45eca9abf0ed0029", "sourceMap": "285:684:20:-;;;343:82;;;;;;;;1107:105:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1179:5;1171;:13;;;;;;;;;;;;:::i;:::-;;1200:7;1190;:17;;;;;;;;;;;;:::i;:::-;;1107:105;;285:684:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;", "deployedSourceMap": "285:684:20:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;612:176;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1303:68:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3577:111:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2998:350;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2887:87:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5042:315:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2571:177:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;431:86:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5964:154:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2445:140;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3298::50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2107:164:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1756:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1466:72:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3969:200:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;850:117:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6794:227:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1727:133:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4478:142:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;612:176:20;706:17;761:10;746:25;;:11;:25;;;;739:32;;612:176;;;:::o;1303:68:50:-;1340:6;;:::i;:::-;1361:5;1354:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1303:68;:::o;3577:111:48:-;3637:7;3659:14;:24;3674:8;3659:24;;;;;;;;;;;;;;;;;;;;;3652:31;;3577:111;;;:::o;2998:350::-;3059:13;3075:17;3083:8;3075:7;:17::i;:::-;3059:33;;3113:5;3106:12;;:3;:12;;;;3098:21;;;;;;;;3147:5;3133:19;;:10;:19;;;:58;;;;3156:35;3173:5;3180:10;3156:16;:35::i;:::-;3133:58;3125:67;;;;;;;;3236:1;3203:35;;:21;3215:8;3203:11;:21::i;:::-;:35;;;;:56;;;;3257:1;3242:17;;:3;:17;;;;3203:56;3199:145;;;3296:3;3269:14;:24;3284:8;3269:24;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;3323:3;3307:30;;3316:5;3307:30;;;3328:8;3307:30;;;;;;;;;;;;;;;;;;3199:145;2998:350;;;:::o;2887:87:50:-;2931:7;2953:9;:16;;;;2946:23;;2887:87;:::o;5042:315:48:-;5129:8;1516:39;1534:10;1546:8;1516:17;:39::i;:::-;1508:48;;;;;;;;5170:1;5153:19;;:5;:19;;;;5145:28;;;;;;;;5202:1;5187:17;;:3;:17;;;;5179:26;;;;;;;;5212:30;5226:5;5233:8;5212:13;:30::i;:::-;5248:32;5264:5;5271:8;5248:15;:32::i;:::-;5286:25;5297:3;5302:8;5286:10;:25::i;:::-;5338:3;5322:30;;5331:5;5322:30;;;5343:8;5322:30;;;;;;;;;;;;;;;;;;5042:315;;;;:::o;2571:177:50:-;2653:7;2685:17;2695:6;2685:9;:17::i;:::-;2676:6;:26;2668:35;;;;;;;;2716:11;:19;2728:6;2716:19;;;;;;;;;;;;;;;2736:6;2716:27;;;;;;;;;;;;;;;;;;;2709:34;;2571:177;;;;:::o;431:86:20:-;490:20;496:3;501:8;490:5;:20::i;:::-;431:86;;:::o;5964:154:48:-;6055:8;1516:39;1534:10;1546:8;1516:17;:39::i;:::-;1508:48;;;;;;;;6071:42;6088:5;6095:3;6100:8;6071:42;;;;;;;;;;;;;:16;:42::i;:::-;5964:154;;;;:::o;2445:140::-;2500:4;2512:13;2528:10;:20;2539:8;2528:20;;;;;;;;;;;;;;;;;;;;;2512:36;;2578:1;2561:19;;:5;:19;;;;2554:26;;2445:140;;;;:::o;3298::50:-;3357:7;3389:13;:11;:13::i;:::-;3380:6;:22;3372:31;;;;;;;;3416:9;3426:6;3416:17;;;;;;;;;;;;;;;;;;;3409:24;;3298:140;;;:::o;2107:164:48:-;2163:7;2178:13;2194:10;:20;2205:8;2194:20;;;;;;;;;;;;;;;;;;;;;2178:36;;2245:1;2228:19;;:5;:19;;;;2220:28;;;;;;;;2261:5;2254:12;;2107:164;;;;:::o;1756:142::-;1812:7;1853:1;1835:20;;:6;:20;;;;1827:29;;;;;;;;1869:16;:24;1886:6;1869:24;;;;;;;;;;;;;;;;1862:31;;1756:142;;;:::o;1466:72:50:-;1505:6;;:::i;:::-;1526:7;1519:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1466:72;:::o;3969:200:48:-;4053:10;4046:17;;:3;:17;;;;4038:26;;;;;;;;4107:9;4070:17;:29;4088:10;4070:29;;;;;;;;;;;;;;;:34;4100:3;4070:34;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;4149:3;4122:42;;4137:10;4122:42;;;4154:9;4122:42;;;;;;;;;;;;;;;;;;;;;;3969:200;;:::o;850:117:20:-;917:43;934:10;946:3;951:8;917:16;:43::i;:::-;850:117;;:::o;6794:227:48:-;6898:8;1516:39;1534:10;1546:8;1516:17;:39::i;:::-;1508:48;;;;;;;;6914:34;6927:5;6934:3;6939:8;6914:12;:34::i;:::-;6962:53;6987:5;6994:3;6999:8;7009:5;6962:24;:53::i;:::-;6954:62;;;;;;;;6794:227;;;;;:::o;1727:133:50:-;1784:6;;:::i;:::-;1806:16;1813:8;1806:6;:16::i;:::-;1798:25;;;;;;;;1836:9;:19;1846:8;1836:19;;;;;;;;;;;1829:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1727:133;;;:::o;4478:142:48:-;4560:4;4579:17;:25;4597:6;4579:25;;;;;;;;;;;;;;;:36;4605:9;4579:36;;;;;;;;;;;;;;;;;;;;;;;;;4572:43;;4478:142;;;;:::o;7368:240::-;7454:4;7466:13;7482:17;7490:8;7482:7;:17::i;:::-;7466:33;;7524:5;7512:17;;:8;:17;;;:54;;;;7558:8;7533:33;;:21;7545:8;7533:11;:21::i;:::-;:33;;;7512:54;:91;;;;7570:33;7587:5;7594:8;7570:16;:33::i;:::-;7512:91;7505:98;;7368:240;;;;;:::o;8653:260::-;8754:6;8733:27;;:17;8741:8;8733:7;:17::i;:::-;:27;;;8725:36;;;;;;;;8807:1;8771:38;;:14;:24;8786:8;8771:24;;;;;;;;;;;;;;;;;;;;;:38;;;;8767:142;;;8854:1;8819:14;:24;8834:8;8819:24;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;8889:1;8864:38;;8873:6;8864:38;;;8893:8;8864:38;;;;;;;;;;;;;;;;;;8767:142;8653:260;;:::o;4198:856:50:-;4316:18;4369:22;4432:17;4271:38;4293:5;4300:8;4271:21;:38::i;:::-;4337:16;:26;4354:8;4337:26;;;;;;;;;;;;4316:47;;4394:32;4424:1;4394:11;:18;4406:5;4394:18;;;;;;;;;;;;;;;:25;;;;:29;;:32;;;;:::i;:::-;4369:57;;4452:11;:18;4464:5;4452:18;;;;;;;;;;;;;;;4471:14;4452:34;;;;;;;;;;;;;;;;;;;4432:54;;4526:9;4493:11;:18;4505:5;4493:18;;;;;;;;;;;;;;;4512:10;4493:30;;;;;;;;;;;;;;;;;;:42;;;;4578:1;4541:11;:18;4553:5;4541:18;;;;;;;;;;;;;;;4560:14;4541:34;;;;;;;;;;;;;;;;;;:38;;;;4940:11;:18;4952:5;4940:18;;;;;;;;;;;;;;;:27;;;;;;;;;;;;:::i;:::-;;5002:1;4973:16;:26;4990:8;4973:26;;;;;;;;;;;:30;;;;5039:10;5009:16;:27;5026:9;5009:27;;;;;;;;;;;:40;;;;4198:856;;;;;:::o;3697:226::-;3800:14;3763:31;3780:3;3785:8;3763:16;:31::i;:::-;3817:11;:16;3829:3;3817:16;;;;;;;;;;;;;;;:23;;;;3800:40;;3846:11;:16;3858:3;3846:16;;;;;;;;;;;;;;;:31;;;;;;;;;;;:::i;:::-;;;;;;;;;;3868:8;3846:31;;;;;;;3912:6;3883:16;:26;3900:8;3883:26;;;;;;;;;;;:35;;;;3697:226;;;:::o;5315:176::-;5376:26;5388:3;5393:8;5376:11;:26::i;:::-;5440:9;:16;;;;5413:14;:24;5428:8;5413:24;;;;;;;;;;;:43;;;;5462:9;:24;;;;;;;;;;;:::i;:::-;;;;;;;;;;5477:8;5462:24;;;;;;;5315:176;;:::o;10368:298:48:-;10479:4;10545:13;10496:16;:3;:14;;;:16::i;:::-;10495:17;10491:49;;;10529:4;10522:11;;;;10491:49;10576:3;10561:36;;;10598:5;10605:8;10615:5;10561:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10545:76:48;;605:10;10645:15;;10635:25;;;:6;:25;;;;10627:34;;10368:298;;;;;;;;:::o;9651:214::-;9753:5;9732:26;;:17;9740:8;9732:7;:17::i;:::-;:26;;;9724:35;;;;;;;;9791:30;9819:1;9791:16;:23;9808:5;9791:23;;;;;;;;;;;;;;;;:27;;:30;;;;:::i;:::-;9765:16;:23;9782:5;9765:23;;;;;;;;;;;;;;;:56;;;;9858:1;9827:10;:20;9838:8;9827:20;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;9651:214;;:::o;835:110:38:-;893:7;920:1;915;:6;;908:14;;;;;;939:1;935;:5;928:12;;835:110;;;;:::o;9172:204:48:-;9278:1;9246:34;;:10;:20;9257:8;9246:20;;;;;;;;;;;;;;;;;;;;;:34;;;9238:43;;;;;;;;9310:3;9287:10;:20;9298:8;9287:20;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;9343:28;9369:1;9343:16;:21;9360:3;9343:21;;;;;;;;;;;;;;;;:25;;:28;;;;:::i;:::-;9319:16;:21;9336:3;9319:21;;;;;;;;;;;;;;;:52;;;;9172:204;;:::o;7857:164::-;7941:1;7926:17;;:3;:17;;;;7918:26;;;;;;;;7950:25;7961:3;7966:8;7950:10;:25::i;:::-;8002:3;7981:35;;7998:1;7981:35;;;8007:8;7981:35;;;;;;;;;;;;;;;;;;7857:164;;:::o;451:150:36:-;508:4;520:12;569:4;557:11;549:25;;595:1;588:4;:8;581:15;;451:150;;;;:::o;1007:129:38:-;1065:7;1080:9;1096:1;1092;:5;1080:17;;1115:1;1110;:6;;1103:14;;;;;;1130:1;1123:8;;1007:129;;;;;:::o;285:684:20:-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", "source": "pragma solidity 0.4.18;\n\nimport \"zeppelin-solidity/contracts/token/ERC721/ERC721Token.sol\";\nimport \"../ERC165.sol\";\n\n/**\n * This implementation of the ERC721 standard allows us to deploy a test ERC721 contract and mint\n * non-fungible tokens that we can use in a test environment.\n */\ncontract MintableERC721Token is ERC721Token, ERC165 {\n function MintableERC721Token() public ERC721Token(\"MintableERC721Token\", \"MET\") {}\n\n function mint(address _to, uint _tokenId) public {\n _mint(_to, _tokenId);\n }\n\n /**\n * ERC165 interface.\n * Returns true for ERC721, false otherwise\n */\n function supportsInterface(bytes4 interfaceID)\n external\n view\n returns (bool _isSupported)\n {\n return interfaceID == 0x80ac58cd; // ERC721\n }\n\n /**\n * Support deprecated ERC721 method\n */\n function transfer(address _to, uint _tokenId) public\n {\n safeTransferFrom(msg.sender, _to, _tokenId);\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/MintableERC721Token.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/MintableERC721Token.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/MintableERC721Token.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/MintableERC721Token.sol", "exportedSymbols": { "MintableERC721Token": [ 9992 @@ -483,7 +483,7 @@ { "attributes": { "SourceUnit": 3551, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/ERC165.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/ERC165.sol", "file": "../ERC165.sol", "scope": 9993, "symbolAliases": [ @@ -1236,7 +1236,7 @@ "42": { "events": {}, "links": {}, - "address": "0x1db2f4774e0b0c84047a97e6c129abe7f9ed0d18" + "address": "0x67b0b219faf38b7a862c480213b2860e645c264f" }, "70": { "events": {}, @@ -1245,5 +1245,5 @@ } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:16:13.730Z" + "updatedAt": "2018-10-09T17:53:04.860Z" } \ No newline at end of file diff --git a/artifacts/json/MintableToken.json b/artifacts/json/MintableToken.json index ef59e821..094955f6 100644 --- a/artifacts/json/MintableToken.json +++ b/artifacts/json/MintableToken.json @@ -1664,5 +1664,5 @@ }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:48.049Z" + "updatedAt": "2018-10-09T17:45:35.471Z" } \ No newline at end of file diff --git a/artifacts/json/MockCollateralizedTermsContract.json b/artifacts/json/MockCollateralizedTermsContract.json index e4ecef18..b61d4fd3 100644 --- a/artifacts/json/MockCollateralizedTermsContract.json +++ b/artifacts/json/MockCollateralizedTermsContract.json @@ -341,15 +341,15 @@ "type": "function" } ], - "bytecode": "0x6060604052341561000f57600080fd5b6117398061001e6000396000f3006060604052600436106100e6576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a896a1146100eb57806304aa85fa1461012657806306e9d7cd1461014b578063131018581461017b5780632762dd8c146102015780635f0280ba1461023c5780636dcea718146102e15780637f8601a11461034657806380da20d4146103eb578063977a5e641461046257806399114d84146104c0578063b433022f14610504578063c45d83ef14610534578063c73e02b014610592578063d826f88f146105cb578063ed3c7d40146105e0575b600080fd5b34156100f657600080fd5b610110600480803560001916906020019091905050610607565b6040518082815260200191505060405180910390f35b341561013157600080fd5b6101496004808035151590602001909190505061062c565b005b341561015657600080fd5b610179600480803560001916906020019091908035906020019091905050610686565b005b341561018657600080fd5b6101e3600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091908035600019169060200190919050506106aa565b60405180826000191660001916815260200191505060405180910390f35b341561020c57600080fd5b610226600480803560001916906020019091905050610739565b6040518082815260200191505060405180910390f35b341561024757600080fd5b6102c760048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061075e565b604051808215151515815260200191505060405180910390f35b34156102ec57600080fd5b610344600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506108e8565b005b341561035157600080fd5b6103d160048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506109c2565b604051808215151515815260200191505060405180910390f35b34156103f657600080fd5b610460600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080356000191690602001909190803560001916906020019091905050610afc565b005b341561046d57600080fd5b6104a660048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610c26565b604051808215151515815260200191505060405180910390f35b34156104cb57600080fd5b6104ee600480803560001916906020019091908035906020019091905050610d7b565b6040518082815260200191505060405180910390f35b341561050f57600080fd5b610532600480803560001916906020019091908035906020019091905050610e18565b005b341561053f57600080fd5b61057860048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610e3c565b604051808215151515815260200191505060405180910390f35b341561059d57600080fd5b6105c9600480803560001916906020019091908035906020019091908035906020019091905050610ee5565b005b34156105d657600080fd5b6105de610fca565b005b34156105eb57600080fd5b6106056004808035600019169060200190919050506112c1565b005b6000600360008360001916600019168152602001908152602001600020549050919050565b6106836040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525060006001028361067957600060010261067e565b600180025b610afc565b50565b80600360008460001916600019168152602001908152602001600020819055505050565b60006001836040518082805190602001908083835b6020831015156106e457805182526020820191506020810190506020830392506106bf565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b6000600760008360001916600019168152602001908152602001600020549050919050565b600061088d6040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525087878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401955050505050506040518091039020611331565b60018002600019166108d86040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525060006001026106aa565b6000191614905095945050505050565b60008390508073ffffffffffffffffffffffffffffffffffffffff1663649404bd84846000604051602001526040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b15156109a057600080fd5b6102c65a03f115156109b157600080fd5b505050604051805190505050505050565b6000610af16040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525087878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140195505050505050604051809103902061146a565b905095945050505050565b6000836040518082805190602001908083835b602083101515610b345780518252602082019150602081019050602083039250610b0f565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281610b799190611644565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b602083101515610bcd5780518252602082019150602081019050602083039250610ba8565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b6000610cc76040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525084846040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040518091039020611331565b6001800260001916610d6e6040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525085856040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019250505060405180910390206106aa565b6000191614905092915050565b600080600080600091505b6005821015610de05760056000876000191660001916815260200190815260200160002082600581101515610db757fe5b01549050848111158015610dca57508281115b15610dd3578092505b8180600101925050610d86565b600460008760001916600019168152602001908152602001600020600084815260200190815260200160002054935050505092915050565b80600760008460001916600019168152602001908152602001600020819055505050565b6000610edd6040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525084846040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140192505050604051809103902061146a565b905092915050565b6000806004600086600019166000191681526020019081526020016000206000858152602001908152602001600020541415610f93576006600085600019166000191681526020019081526020016000205490508260056000866000191660001916815260200190815260200160002082600581101515610f6257fe5b0181905550600660008560001916600019168152602001908152602001600020600081548092919060010191905055505b8160046000866000191660001916815260200190815260200160002060008581526020019081526020016000208190555050505050565b6000610fd4611670565b600080600093505b600a8410156112bb57610fed611506565b84600a81101515610ffa57fe5b60200201519250600083511415156112ae57600091505b6000836040518082805190602001908083835b6020831015156110495780518252602082019150602081019050602083039250611024565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015611236576000836040518082805190602001908083835b6020831015156110bf578051825260208201915060208101905060208303925061109a565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020828154811015156110ff57fe5b90600052602060002090015490506002836040518082805190602001908083835b6020831015156111455780518252602082019150602081019050602083039250611120565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b6020831015156111d957805182526020820191506020810190506020830392506111b4565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050611011565b6000836040518082805190602001908083835b60208310151561126e5780518252602082019150602081019050602083039250611249565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006112ad9190611684565b5b8380600101945050610fdc565b50505050565b60008090505b600581101561130c576000600560008460001916600019168152602001908152602001600020826005811015156112fa57fe5b018190555080806001019150506112c7565b6000600660008460001916600019168152602001908152602001600020819055505050565b60016002836040518082805190602001908083835b60208310151561136b5780518252602082019150602081019050602083039250611346565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b60208310151561140657805182526020820191506020810190506020830392506113e1565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020805480600101828161144b9190611644565b9160005260206000209001600083909190915090600019169055505050565b60006002836040518082805190602001908083835b6020831015156114a4578051825260208201915060208101905060208303925061147f565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b61150e6116a5565b610140604051908101604052806040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525081526020016040805190810160405280601181526020017f72656769737465725465726d53746172740000000000000000000000000000008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b81548183558181151161166b5781836000526020600020918201910161166a91906116d4565b5b505050565b602060405190810160405280600081525090565b50805460008255906000526020600020908101906116a291906116d4565b50565b61014060405190810160405280600a905b6116be6116f9565b8152602001906001900390816116b65790505090565b6116f691905b808211156116f25760008160009055506001016116da565b5090565b90565b6020604051908101604052806000815250905600a165627a7a723058202e19f86cb1f1d650392a03abbae08539ee4b1d9b92b6dbada3b2aea4ea42b26c0029", - "deployedBytecode": "0x6060604052600436106100e6576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a896a1146100eb57806304aa85fa1461012657806306e9d7cd1461014b578063131018581461017b5780632762dd8c146102015780635f0280ba1461023c5780636dcea718146102e15780637f8601a11461034657806380da20d4146103eb578063977a5e641461046257806399114d84146104c0578063b433022f14610504578063c45d83ef14610534578063c73e02b014610592578063d826f88f146105cb578063ed3c7d40146105e0575b600080fd5b34156100f657600080fd5b610110600480803560001916906020019091905050610607565b6040518082815260200191505060405180910390f35b341561013157600080fd5b6101496004808035151590602001909190505061062c565b005b341561015657600080fd5b610179600480803560001916906020019091908035906020019091905050610686565b005b341561018657600080fd5b6101e3600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091908035600019169060200190919050506106aa565b60405180826000191660001916815260200191505060405180910390f35b341561020c57600080fd5b610226600480803560001916906020019091905050610739565b6040518082815260200191505060405180910390f35b341561024757600080fd5b6102c760048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061075e565b604051808215151515815260200191505060405180910390f35b34156102ec57600080fd5b610344600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506108e8565b005b341561035157600080fd5b6103d160048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506109c2565b604051808215151515815260200191505060405180910390f35b34156103f657600080fd5b610460600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080356000191690602001909190803560001916906020019091905050610afc565b005b341561046d57600080fd5b6104a660048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610c26565b604051808215151515815260200191505060405180910390f35b34156104cb57600080fd5b6104ee600480803560001916906020019091908035906020019091905050610d7b565b6040518082815260200191505060405180910390f35b341561050f57600080fd5b610532600480803560001916906020019091908035906020019091905050610e18565b005b341561053f57600080fd5b61057860048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610e3c565b604051808215151515815260200191505060405180910390f35b341561059d57600080fd5b6105c9600480803560001916906020019091908035906020019091908035906020019091905050610ee5565b005b34156105d657600080fd5b6105de610fca565b005b34156105eb57600080fd5b6106056004808035600019169060200190919050506112c1565b005b6000600360008360001916600019168152602001908152602001600020549050919050565b6106836040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525060006001028361067957600060010261067e565b600180025b610afc565b50565b80600360008460001916600019168152602001908152602001600020819055505050565b60006001836040518082805190602001908083835b6020831015156106e457805182526020820191506020810190506020830392506106bf565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b6000600760008360001916600019168152602001908152602001600020549050919050565b600061088d6040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525087878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401955050505050506040518091039020611331565b60018002600019166108d86040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525060006001026106aa565b6000191614905095945050505050565b60008390508073ffffffffffffffffffffffffffffffffffffffff1663649404bd84846000604051602001526040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b15156109a057600080fd5b6102c65a03f115156109b157600080fd5b505050604051805190505050505050565b6000610af16040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525087878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140195505050505050604051809103902061146a565b905095945050505050565b6000836040518082805190602001908083835b602083101515610b345780518252602082019150602081019050602083039250610b0f565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281610b799190611644565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b602083101515610bcd5780518252602082019150602081019050602083039250610ba8565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b6000610cc76040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525084846040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040518091039020611331565b6001800260001916610d6e6040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525085856040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019250505060405180910390206106aa565b6000191614905092915050565b600080600080600091505b6005821015610de05760056000876000191660001916815260200190815260200160002082600581101515610db757fe5b01549050848111158015610dca57508281115b15610dd3578092505b8180600101925050610d86565b600460008760001916600019168152602001908152602001600020600084815260200190815260200160002054935050505092915050565b80600760008460001916600019168152602001908152602001600020819055505050565b6000610edd6040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525084846040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140192505050604051809103902061146a565b905092915050565b6000806004600086600019166000191681526020019081526020016000206000858152602001908152602001600020541415610f93576006600085600019166000191681526020019081526020016000205490508260056000866000191660001916815260200190815260200160002082600581101515610f6257fe5b0181905550600660008560001916600019168152602001908152602001600020600081548092919060010191905055505b8160046000866000191660001916815260200190815260200160002060008581526020019081526020016000208190555050505050565b6000610fd4611670565b600080600093505b600a8410156112bb57610fed611506565b84600a81101515610ffa57fe5b60200201519250600083511415156112ae57600091505b6000836040518082805190602001908083835b6020831015156110495780518252602082019150602081019050602083039250611024565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015611236576000836040518082805190602001908083835b6020831015156110bf578051825260208201915060208101905060208303925061109a565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020828154811015156110ff57fe5b90600052602060002090015490506002836040518082805190602001908083835b6020831015156111455780518252602082019150602081019050602083039250611120565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b6020831015156111d957805182526020820191506020810190506020830392506111b4565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050611011565b6000836040518082805190602001908083835b60208310151561126e5780518252602082019150602081019050602083039250611249565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006112ad9190611684565b5b8380600101945050610fdc565b50505050565b60008090505b600581101561130c576000600560008460001916600019168152602001908152602001600020826005811015156112fa57fe5b018190555080806001019150506112c7565b6000600660008460001916600019168152602001908152602001600020819055505050565b60016002836040518082805190602001908083835b60208310151561136b5780518252602082019150602081019050602083039250611346565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b60208310151561140657805182526020820191506020810190506020830392506113e1565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020805480600101828161144b9190611644565b9160005260206000209001600083909190915090600019169055505050565b60006002836040518082805190602001908083835b6020831015156114a4578051825260208201915060208101905060208303925061147f565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b61150e6116a5565b610140604051908101604052806040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525081526020016040805190810160405280601181526020017f72656769737465725465726d53746172740000000000000000000000000000008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b81548183558181151161166b5781836000526020600020918201910161166a91906116d4565b5b505050565b602060405190810160405280600081525090565b50805460008255906000526020600020908101906116a291906116d4565b50565b61014060405190810160405280600a905b6116be6116f9565b8152602001906001900390816116b65790505090565b6116f691905b808211156116f25760008160009055506001016116da565b5090565b90565b6020604051908101604052806000815250905600a165627a7a723058202e19f86cb1f1d650392a03abbae08539ee4b1d9b92b6dbada3b2aea4ea42b26c0029", + "bytecode": "0x6060604052341561000f57600080fd5b6117398061001e6000396000f3006060604052600436106100e6576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a896a1146100eb57806304aa85fa1461012657806306e9d7cd1461014b578063131018581461017b5780632762dd8c146102015780635f0280ba1461023c5780636dcea718146102e15780637f8601a11461034657806380da20d4146103eb578063977a5e641461046257806399114d84146104c0578063b433022f14610504578063c45d83ef14610534578063c73e02b014610592578063d826f88f146105cb578063ed3c7d40146105e0575b600080fd5b34156100f657600080fd5b610110600480803560001916906020019091905050610607565b6040518082815260200191505060405180910390f35b341561013157600080fd5b6101496004808035151590602001909190505061062c565b005b341561015657600080fd5b610179600480803560001916906020019091908035906020019091905050610686565b005b341561018657600080fd5b6101e3600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091908035600019169060200190919050506106aa565b60405180826000191660001916815260200191505060405180910390f35b341561020c57600080fd5b610226600480803560001916906020019091905050610739565b6040518082815260200191505060405180910390f35b341561024757600080fd5b6102c760048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061075e565b604051808215151515815260200191505060405180910390f35b34156102ec57600080fd5b610344600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506108e8565b005b341561035157600080fd5b6103d160048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506109c2565b604051808215151515815260200191505060405180910390f35b34156103f657600080fd5b610460600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080356000191690602001909190803560001916906020019091905050610afc565b005b341561046d57600080fd5b6104a660048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610c26565b604051808215151515815260200191505060405180910390f35b34156104cb57600080fd5b6104ee600480803560001916906020019091908035906020019091905050610d7b565b6040518082815260200191505060405180910390f35b341561050f57600080fd5b610532600480803560001916906020019091908035906020019091905050610e18565b005b341561053f57600080fd5b61057860048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610e3c565b604051808215151515815260200191505060405180910390f35b341561059d57600080fd5b6105c9600480803560001916906020019091908035906020019091908035906020019091905050610ee5565b005b34156105d657600080fd5b6105de610fca565b005b34156105eb57600080fd5b6106056004808035600019169060200190919050506112c1565b005b6000600360008360001916600019168152602001908152602001600020549050919050565b6106836040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525060006001028361067957600060010261067e565b600180025b610afc565b50565b80600360008460001916600019168152602001908152602001600020819055505050565b60006001836040518082805190602001908083835b6020831015156106e457805182526020820191506020810190506020830392506106bf565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b6000600760008360001916600019168152602001908152602001600020549050919050565b600061088d6040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525087878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401955050505050506040518091039020611331565b60018002600019166108d86040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525060006001026106aa565b6000191614905095945050505050565b60008390508073ffffffffffffffffffffffffffffffffffffffff1663649404bd84846000604051602001526040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b15156109a057600080fd5b6102c65a03f115156109b157600080fd5b505050604051805190505050505050565b6000610af16040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525087878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140195505050505050604051809103902061146a565b905095945050505050565b6000836040518082805190602001908083835b602083101515610b345780518252602082019150602081019050602083039250610b0f565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281610b799190611644565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b602083101515610bcd5780518252602082019150602081019050602083039250610ba8565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b6000610cc76040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525084846040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040518091039020611331565b6001800260001916610d6e6040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525085856040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019250505060405180910390206106aa565b6000191614905092915050565b600080600080600091505b6005821015610de05760056000876000191660001916815260200190815260200160002082600581101515610db757fe5b01549050848111158015610dca57508281115b15610dd3578092505b8180600101925050610d86565b600460008760001916600019168152602001908152602001600020600084815260200190815260200160002054935050505092915050565b80600760008460001916600019168152602001908152602001600020819055505050565b6000610edd6040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525084846040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140192505050604051809103902061146a565b905092915050565b6000806004600086600019166000191681526020019081526020016000206000858152602001908152602001600020541415610f93576006600085600019166000191681526020019081526020016000205490508260056000866000191660001916815260200190815260200160002082600581101515610f6257fe5b0181905550600660008560001916600019168152602001908152602001600020600081548092919060010191905055505b8160046000866000191660001916815260200190815260200160002060008581526020019081526020016000208190555050505050565b6000610fd4611670565b600080600093505b600a8410156112bb57610fed611506565b84600a81101515610ffa57fe5b60200201519250600083511415156112ae57600091505b6000836040518082805190602001908083835b6020831015156110495780518252602082019150602081019050602083039250611024565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015611236576000836040518082805190602001908083835b6020831015156110bf578051825260208201915060208101905060208303925061109a565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020828154811015156110ff57fe5b90600052602060002090015490506002836040518082805190602001908083835b6020831015156111455780518252602082019150602081019050602083039250611120565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b6020831015156111d957805182526020820191506020810190506020830392506111b4565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050611011565b6000836040518082805190602001908083835b60208310151561126e5780518252602082019150602081019050602083039250611249565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006112ad9190611684565b5b8380600101945050610fdc565b50505050565b60008090505b600581101561130c576000600560008460001916600019168152602001908152602001600020826005811015156112fa57fe5b018190555080806001019150506112c7565b6000600660008460001916600019168152602001908152602001600020819055505050565b60016002836040518082805190602001908083835b60208310151561136b5780518252602082019150602081019050602083039250611346565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b60208310151561140657805182526020820191506020810190506020830392506113e1565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020805480600101828161144b9190611644565b9160005260206000209001600083909190915090600019169055505050565b60006002836040518082805190602001908083835b6020831015156114a4578051825260208201915060208101905060208303925061147f565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b61150e6116a5565b610140604051908101604052806040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525081526020016040805190810160405280601181526020017f72656769737465725465726d53746172740000000000000000000000000000008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b81548183558181151161166b5781836000526020600020918201910161166a91906116d4565b5b505050565b602060405190810160405280600081525090565b50805460008255906000526020600020908101906116a291906116d4565b50565b61014060405190810160405280600a905b6116be6116f9565b8152602001906001900390816116b65790505090565b6116f691905b808211156116f25760008160009055506001016116da565b5090565b90565b6020604051908101604052806000815250905600a165627a7a723058204d4a42366ffe718c7c0132f03d9a37572c3b87d50179cb19a289775d2405c1500029", + "deployedBytecode": "0x6060604052600436106100e6576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a896a1146100eb57806304aa85fa1461012657806306e9d7cd1461014b578063131018581461017b5780632762dd8c146102015780635f0280ba1461023c5780636dcea718146102e15780637f8601a11461034657806380da20d4146103eb578063977a5e641461046257806399114d84146104c0578063b433022f14610504578063c45d83ef14610534578063c73e02b014610592578063d826f88f146105cb578063ed3c7d40146105e0575b600080fd5b34156100f657600080fd5b610110600480803560001916906020019091905050610607565b6040518082815260200191505060405180910390f35b341561013157600080fd5b6101496004808035151590602001909190505061062c565b005b341561015657600080fd5b610179600480803560001916906020019091908035906020019091905050610686565b005b341561018657600080fd5b6101e3600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091908035600019169060200190919050506106aa565b60405180826000191660001916815260200191505060405180910390f35b341561020c57600080fd5b610226600480803560001916906020019091905050610739565b6040518082815260200191505060405180910390f35b341561024757600080fd5b6102c760048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061075e565b604051808215151515815260200191505060405180910390f35b34156102ec57600080fd5b610344600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506108e8565b005b341561035157600080fd5b6103d160048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506109c2565b604051808215151515815260200191505060405180910390f35b34156103f657600080fd5b610460600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080356000191690602001909190803560001916906020019091905050610afc565b005b341561046d57600080fd5b6104a660048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610c26565b604051808215151515815260200191505060405180910390f35b34156104cb57600080fd5b6104ee600480803560001916906020019091908035906020019091905050610d7b565b6040518082815260200191505060405180910390f35b341561050f57600080fd5b610532600480803560001916906020019091908035906020019091905050610e18565b005b341561053f57600080fd5b61057860048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610e3c565b604051808215151515815260200191505060405180910390f35b341561059d57600080fd5b6105c9600480803560001916906020019091908035906020019091908035906020019091905050610ee5565b005b34156105d657600080fd5b6105de610fca565b005b34156105eb57600080fd5b6106056004808035600019169060200190919050506112c1565b005b6000600360008360001916600019168152602001908152602001600020549050919050565b6106836040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525060006001028361067957600060010261067e565b600180025b610afc565b50565b80600360008460001916600019168152602001908152602001600020819055505050565b60006001836040518082805190602001908083835b6020831015156106e457805182526020820191506020810190506020830392506106bf565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b6000600760008360001916600019168152602001908152602001600020549050919050565b600061088d6040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525087878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401955050505050506040518091039020611331565b60018002600019166108d86040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525060006001026106aa565b6000191614905095945050505050565b60008390508073ffffffffffffffffffffffffffffffffffffffff1663649404bd84846000604051602001526040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b15156109a057600080fd5b6102c65a03f115156109b157600080fd5b505050604051805190505050505050565b6000610af16040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525087878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140195505050505050604051809103902061146a565b905095945050505050565b6000836040518082805190602001908083835b602083101515610b345780518252602082019150602081019050602083039250610b0f565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281610b799190611644565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b602083101515610bcd5780518252602082019150602081019050602083039250610ba8565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b6000610cc76040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525084846040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040518091039020611331565b6001800260001916610d6e6040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525085856040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019250505060405180910390206106aa565b6000191614905092915050565b600080600080600091505b6005821015610de05760056000876000191660001916815260200190815260200160002082600581101515610db757fe5b01549050848111158015610dca57508281115b15610dd3578092505b8180600101925050610d86565b600460008760001916600019168152602001908152602001600020600084815260200190815260200160002054935050505092915050565b80600760008460001916600019168152602001908152602001600020819055505050565b6000610edd6040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525084846040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140192505050604051809103902061146a565b905092915050565b6000806004600086600019166000191681526020019081526020016000206000858152602001908152602001600020541415610f93576006600085600019166000191681526020019081526020016000205490508260056000866000191660001916815260200190815260200160002082600581101515610f6257fe5b0181905550600660008560001916600019168152602001908152602001600020600081548092919060010191905055505b8160046000866000191660001916815260200190815260200160002060008581526020019081526020016000208190555050505050565b6000610fd4611670565b600080600093505b600a8410156112bb57610fed611506565b84600a81101515610ffa57fe5b60200201519250600083511415156112ae57600091505b6000836040518082805190602001908083835b6020831015156110495780518252602082019150602081019050602083039250611024565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015611236576000836040518082805190602001908083835b6020831015156110bf578051825260208201915060208101905060208303925061109a565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020828154811015156110ff57fe5b90600052602060002090015490506002836040518082805190602001908083835b6020831015156111455780518252602082019150602081019050602083039250611120565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b6020831015156111d957805182526020820191506020810190506020830392506111b4565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050611011565b6000836040518082805190602001908083835b60208310151561126e5780518252602082019150602081019050602083039250611249565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006112ad9190611684565b5b8380600101945050610fdc565b50505050565b60008090505b600581101561130c576000600560008460001916600019168152602001908152602001600020826005811015156112fa57fe5b018190555080806001019150506112c7565b6000600660008460001916600019168152602001908152602001600020819055505050565b60016002836040518082805190602001908083835b60208310151561136b5780518252602082019150602081019050602083039250611346565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b60208310151561140657805182526020820191506020810190506020830392506113e1565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020805480600101828161144b9190611644565b9160005260206000209001600083909190915090600019169055505050565b60006002836040518082805190602001908083835b6020831015156114a4578051825260208201915060208101905060208303925061147f565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b61150e6116a5565b610140604051908101604052806040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525081526020016040805190810160405280601181526020017f72656769737465725465726d53746172740000000000000000000000000000008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b81548183558181151161166b5781836000526020600020918201910161166a91906116d4565b5b505050565b602060405190810160405280600081525090565b50805460008255906000526020600020908101906116a291906116d4565b50565b61014060405190810160405280600a905b6116be6116f9565b8152602001906001900390816116b65790505090565b6116f691905b808211156116f25760008160009055506001016116da565b5090565b90565b6020604051908101604052806000815250905600a165627a7a723058204d4a42366ffe718c7c0132f03d9a37572c3b87d50179cb19a289775d2405c1500029", "sourceMap": "675:5832:22:-;;;;;;;;;;;;;;;;;", "deployedSourceMap": "675:5832:22:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3019:158;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3183:187;;;;;;;;;;;;;;;;;;;;;;;;;;;;4937:156;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1294:217:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4250:161:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1571:551;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5990:320;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3376:493;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1018:270:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3875:369:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2128:885;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4765:166;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4417:267;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5099:671;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1517:610:23;;;;;;;;;;;;;;5776:208:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3019:158;3115:7;3145:12;:25;3158:11;3145:25;;;;;;;;;;;;;;;;;;3138:32;;3019:158;;;:::o;3183:187::-;3268:95;;;;;;;;;;;;;;;;;;;697:1:23;689:10;;3329:7:22;:33;;3360:1;3352:10;;3329:33;;;3347:1;3339:10;;3329:33;3268:15;:95::i;:::-;3183:187;:::o;4937:156::-;5080:6;5052:12;:25;5065:11;5052:25;;;;;;;;;;;;;;;;;:34;;;;4937:156;;:::o;1294:217:23:-;1411:24;1458:17;1476:12;1458:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1458:46:23;1490:13;1458:46;;;;;;;;;;;;;;;;;;1451:53;;1294:217;;;;:::o;4250:161:22:-;4345:7;4375:16;:29;4392:11;4375:29;;;;;;;;;;;;;;;;;;4368:36;;4250:161;;;:::o;1571:551::-;1778:13;1807:213;;;;;;;;;;;;;;;;;;;1878:11;1907:5;1930:11;1959:16;1993:12;1851:168;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1807:22;:213::i;:::-;2113:1;2105:10;;2038:77;;;:63;;;;;;;;;;;;;;;;;;;697:1:23;689:10;;2038:18:22;:63::i;:::-;:77;;;;2031:84;;1571:551;;;;;;;:::o;5990:320::-;6144:29;6191:15;6144:63;;6218:14;:28;;;6260:12;6286:7;6218:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5990:320;;;;:::o;3376:493::-;3609:14;3646:216;;;;;;;;;;;;;;;;;;;3720:11;3749:5;3772:11;3801:16;3835:12;3693:168;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3646:25;:216::i;:::-;3639:223;;3376:493;;;;;;;:::o;1018:270:23:-;1155:22;1178:12;1155:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1155:56:23;;;;;;;;;;;:::i;:::-;;;;;;;;;;1197:13;1155:56;;;;;;;;;;;;1270:11;1221:17;1239:12;1221:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1221:46:23;1253:13;1221:46;;;;;;;;;;;;;;;;;:60;;;;;;;1018:270;;;:::o;3875:369:22:-;3993:16;4025:75;;;;;;;;;;;;;;;;;;;4079:11;4092:6;4069:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4025:22;:75::i;:::-;4235:1;4227:10;;4118:119;;;:105;;;;;;;;;;;;;;;;;;;4193:11;4206:6;4183:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4118:18;:105::i;:::-;:119;;;;4111:126;;3875:369;;;;:::o;2128:885::-;2270:7;2293:33;2548:6;2586:21;2557:1;2548:10;;2543:311;2564:1;2560;:5;2543:311;;;2610:25;:38;2636:11;2610:38;;;;;;;;;;;;;;;;;2649:1;2610:41;;;;;;;;;;;2586:65;;2690:9;2670:16;:29;;:92;;;;;2734:28;2715:16;:47;2670:92;2666:178;;;2813:16;2782:47;;2666:178;2567:3;;;;;;;2543:311;;;2933:30;:43;2964:11;2933:43;;;;;;;;;;;;;;;;;:73;2977:28;2933:73;;;;;;;;;;;;2926:80;;2128:885;;;;;;;:::o;4765:166::-;4915:9;4883:16;:29;4900:11;4883:29;;;;;;;;;;;;;;;;;:41;;;;4765:166;;:::o;4417:267::-;4561:15;4599:78;;;;;;;;;;;;;;;;;;;4656:11;4669:6;4646:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4599:25;:78::i;:::-;4592:85;;4417:267;;;;:::o;5099:671::-;5451:39;5434:1;5376:30;:43;5407:11;5376:43;;;;;;;;;;;;;;;;;:54;5420:9;5376:54;;;;;;;;;;;;:59;5372:318;;;5493:22;:35;5516:11;5493:35;;;;;;;;;;;;;;;;;;5451:77;;5619:9;5542:25;:38;5568:11;5542:38;;;;;;;;;;;;;;;;;5581:34;5542:74;;;;;;;;;;:86;;;;5642:22;:35;5665:11;5642:35;;;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;5372:318;5757:6;5700:30;:43;5731:11;5700:43;;;;;;;;;;;;;;;;;:54;5744:9;5700:54;;;;;;;;;;;:63;;;;5099:671;;;;:::o;1517:610:23:-;1556:6;1595:26;;:::i;:::-;1719:6;1807:21;1565:1;1556:10;;1551:570;1572:2;1568:1;:6;1551:570;;;1624:17;:15;:17::i;:::-;1642:1;1624:20;;;;;;;;;;;;;1595:49;;1693:1;1669:12;1663:26;:31;;1659:452;;;1728:1;1719:10;;1714:321;1735:22;1758:12;1735:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1735:43:23;;;;1731:1;:47;1714:321;;;1831:22;1854:12;1831:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1868:1:23;1831:39;;;;;;;;;;;;;;;;;;;1807:63;;1899:13;1913:12;1899:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1899:42:23;1927:13;1899:42;;;;;;;;;;;;;;;;;;1892:49;;;;;;;;;;;1970:17;1988:12;1970:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1970:46:23;2002:13;1970:46;;;;;;;;;;;;;;;;;1963:53;;;1780:3;;;;;;;1714:321;;;2060:22;2083:12;2060:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;;2053:43:23;;;;:::i;:::-;1659:452;1576:3;;;;;;;1551:570;;;1517:610;;;;:::o;5776:208:22:-;5834:6;5843:1;5834:10;;5829:99;5850:1;5846;:5;5829:99;;;5916:1;5872:25;:38;5898:11;5872:38;;;;;;;;;;;;;;;;;5911:1;5872:41;;;;;;;;;;:45;;;;5853:3;;;;;;;5829:99;;;5976:1;5938:22;:35;5961:11;5938:35;;;;;;;;;;;;;;;;;:39;;;;5776:208;;:::o;2133:202:23:-;2267:4;2231:13;2245:12;2231:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2231:33:23;2259:4;2231:33;;;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;2281:22;2304:12;2281:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2281:47:23;;;;;;;;;;;:::i;:::-;;;;;;;;;;2323:4;2281:47;;;;;;;;;;;;2133:202;;:::o;2341:194::-;2458:14;2495:13;2509:12;2495:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2495:33:23;2523:4;2495:33;;;;;;;;;;;;;;;;;;;;;;;;;;;2488:40;;2341:194;;;;:::o;6316:189:22:-;6377:24;;:::i;:::-;6417:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6316:189;:::o;675:5832::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\nimport \"./MockContract.sol\";\nimport \"../../Collateralizer.sol\";\n\n\ncontract MockCollateralizedTermsContract is MockContract {\n using SafeMath for uint;\n\n // Maps from agreementId's to the amount repaid to date\n mapping (bytes32 => uint) internal amountRepaid;\n // Maps from agreementId's to a mapping of timestamps to the expected\n // value repaid at said timestamp\n mapping (bytes32 => mapping (uint => uint)) internal expectedValueRepaidAtTimestamp;\n // Maps from agreementId's to a list of timestamps at which\n // repayments are expected (used primarily for resetting our mocks)\n mapping (bytes32 => uint[5]) internal expectedRepaymentSchedule;\n // Maps from agreementId's to the number of repayment dates\n // expected for that agreement\n mapping (bytes32 => uint) internal numRepaymentTimestamps;\n // Maps from agreementId's to the mocked term end timestamp\n mapping (bytes32 => uint) internal termEndTimestamp;\n\n function registerRepayment(\n bytes32 agreementId,\n address payer,\n address beneficiary,\n uint unitsOfRepayment,\n address tokenAddress\n )\n public\n returns (bool _success)\n {\n functionCalledWithArgs(\"registerRepayment\", keccak256(\n agreementId,\n payer,\n beneficiary,\n unitsOfRepayment,\n tokenAddress\n ));\n\n return getMockReturnValue(\"registerRepayment\", DEFAULT_SIGNATURE_ARGS) == bytes32(1);\n }\n\n function getExpectedRepaymentValue(\n bytes32 agreementId,\n uint256 timestamp\n )\n public\n view\n returns (uint256)\n {\n uint latestDueDateBeforeTimestamp;\n\n // Iterate over each mocked repayment timestamp associated with the\n // agreement ID and find the LATEST timestamp that is BEFORE\n // the timestamp specified in the functiom arguments\n for (uint i = 0; i < 5; i++) {\n uint dueDateTimestamp = expectedRepaymentSchedule[agreementId][i];\n\n if (dueDateTimestamp <= timestamp &&\n dueDateTimestamp > latestDueDateBeforeTimestamp) {\n latestDueDateBeforeTimestamp = dueDateTimestamp;\n }\n }\n\n // Return the expected value repaid at said timestamp\n return expectedValueRepaidAtTimestamp[agreementId][latestDueDateBeforeTimestamp];\n }\n\n function getValueRepaidToDate(bytes32 agreementId)\n public\n view\n returns (uint256)\n {\n return amountRepaid[agreementId];\n }\n\n function mockRegisterRepaymentReturnValue(bool success)\n public\n {\n mockReturnValue(\"registerRepayment\", DEFAULT_SIGNATURE_ARGS, success ? bytes32(1) : bytes32(0));\n }\n\n function wasRegisterRepaymentCalledWith(\n bytes32 agreementId,\n address payer,\n address beneficiary,\n uint unitsOfRepayment,\n address tokenAddress\n )\n public\n view\n returns (bool wasCalled)\n {\n return wasFunctionCalledWithArgs(\"registerRepayment\", keccak256(\n agreementId,\n payer,\n beneficiary,\n unitsOfRepayment,\n tokenAddress\n ));\n }\n\n function registerTermStart(\n bytes32 agreementId,\n address debtor\n )\n public\n returns (bool _registered)\n {\n functionCalledWithArgs(\"registerTermStart\", keccak256(agreementId, debtor));\n\n return getMockReturnValue(\n \"registerTermStart\",\n keccak256(agreementId, debtor)\n ) == bytes32(1);\n }\n\n function getTermEndTimestamp(bytes32 agreementId)\n public\n view\n returns (uint256)\n {\n return termEndTimestamp[agreementId];\n }\n\n function wasRegisterTermStartCalledWith(\n bytes32 agreementId,\n address debtor\n )\n public\n view\n returns (bool _wasCalled)\n {\n return wasFunctionCalledWithArgs(\"registerTermStart\", keccak256(agreementId, debtor));\n }\n\n /* Dummy functionality used to mock behavior for testing purposes. */\n\n function mockTermEndTimestamp(\n bytes32 agreementId,\n uint timestamp\n )\n public\n {\n termEndTimestamp[agreementId] = timestamp;\n }\n\n function mockDummyValueRepaid(\n bytes32 agreementId,\n uint amount\n )\n public\n {\n amountRepaid[agreementId] = amount;\n }\n\n function mockExpectedRepaymentValue(\n bytes32 agreementId,\n uint timestamp,\n uint amount\n )\n public\n {\n // If timestamp is not mocked already, append it to list of repayment timestamps\n // associated with agreementId\n if (expectedValueRepaidAtTimestamp[agreementId][timestamp] == 0) {\n uint numRepaymentTimestampsForAgreement = numRepaymentTimestamps[agreementId];\n expectedRepaymentSchedule[agreementId][numRepaymentTimestampsForAgreement] = timestamp;\n numRepaymentTimestamps[agreementId]++;\n }\n\n expectedValueRepaidAtTimestamp[agreementId][timestamp] = amount;\n }\n\n function reset(bytes32 agreementId) public {\n for (uint i = 0; i < 5; i++) {\n expectedRepaymentSchedule[agreementId][i] = 0;\n }\n\n numRepaymentTimestamps[agreementId] = 0;\n }\n\n function mockCallCollateralize(\n address _collateralizer,\n bytes32 _agreementId,\n address _debtor\n )\n public\n {\n Collateralizer collateralizer = Collateralizer(_collateralizer);\n\n collateralizer.collateralize(\n _agreementId,\n _debtor\n );\n }\n\n function getFunctionList()\n internal\n returns (string[10] functionNames)\n {\n return [\"registerRepayment\", \"registerTermStart\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\"];\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockCollateralizedTermsContract.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockCollateralizedTermsContract.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockCollateralizedTermsContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockCollateralizedTermsContract.sol", "exportedSymbols": { "MockCollateralizedTermsContract": [ 10507 @@ -372,7 +372,7 @@ { "attributes": { "SourceUnit": 10693, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockContract.sol", "file": "./MockContract.sol", "scope": 10508, "symbolAliases": [ @@ -387,7 +387,7 @@ { "attributes": { "SourceUnit": 615, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/Collateralizer.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/Collateralizer.sol", "file": "../../Collateralizer.sol", "scope": 10508, "symbolAliases": [ @@ -5722,7 +5722,7 @@ "42": { "events": {}, "links": {}, - "address": "0xa125dc548b8b163b53d6b88f890766370b2350bd" + "address": "0x67d4984f33adaa13b879dc532a49bc7a46140353" }, "70": { "events": {}, @@ -5731,5 +5731,5 @@ } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:13:01.039Z" + "updatedAt": "2018-10-09T17:50:01.318Z" } \ No newline at end of file diff --git a/artifacts/json/MockContract.json b/artifacts/json/MockContract.json index 93b1b846..241fa26f 100644 --- a/artifacts/json/MockContract.json +++ b/artifacts/json/MockContract.json @@ -61,10 +61,10 @@ "sourceMap": "", "deployedSourceMap": "", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\n\ncontract MockContract {\n bytes32 internal constant DEFAULT_SIGNATURE_ARGS = bytes32(0);\n\n // We use bytes32 as our generic base type from and to which we cast all other types\n mapping (string => bytes32[]) internal functionCallSignatures;\n mapping (string => mapping (bytes32 => bytes32)) internal mockedReturnValue;\n mapping (string => mapping (bytes32 => bool)) internal functionCalls;\n\n function mockReturnValue(\n string functionName,\n bytes32 argsSignature,\n bytes32 returnValue\n ) public {\n functionCallSignatures[functionName].push(argsSignature);\n mockedReturnValue[functionName][argsSignature] = returnValue;\n }\n\n function getMockReturnValue(string functionName, bytes32 argsSignature)\n public\n view\n returns (bytes32 _mockReturnValue)\n {\n return mockedReturnValue[functionName][argsSignature];\n }\n\n function reset() public {\n for (uint i = 0; i < 10; i++) {\n string memory functionName = getFunctionList()[i];\n\n if (bytes(functionName).length != 0) {\n for (uint j = 0; j < functionCallSignatures[functionName].length; j++) {\n bytes32 callSignature = functionCallSignatures[functionName][j];\n delete functionCalls[functionName][callSignature];\n delete mockedReturnValue[functionName][callSignature];\n }\n\n delete functionCallSignatures[functionName];\n }\n }\n }\n\n function functionCalledWithArgs(string functionName, bytes32 args)\n internal\n {\n functionCalls[functionName][args] = true;\n functionCallSignatures[functionName].push(args);\n }\n\n function wasFunctionCalledWithArgs(string functionName, bytes32 args)\n internal\n view\n returns (bool wasCalled)\n {\n return functionCalls[functionName][args];\n }\n\n function getFunctionList() internal returns (string[10] functionNames);\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockContract.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockContract.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockContract.sol", "exportedSymbols": { "MockContract": [ 10692 @@ -2543,5 +2543,5 @@ }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:47.986Z" + "updatedAt": "2018-10-09T17:45:35.500Z" } \ No newline at end of file diff --git a/artifacts/json/MockDebtKernel.json b/artifacts/json/MockDebtKernel.json index 9865779d..9c802bcb 100644 --- a/artifacts/json/MockDebtKernel.json +++ b/artifacts/json/MockDebtKernel.json @@ -156,15 +156,15 @@ "type": "function" } ], - "bytecode": "0x6060604052341561000f57600080fd5b6111118061001e6000396000f300606060405260043610610078576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063131018581461007d57806380da20d414610103578063a0144d311461017a578063c2d96de9146101a1578063d826f88f146102fb578063e6488fc914610310575b600080fd5b341561008857600080fd5b6100e5600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080356000191690602001909190505061046e565b60405180826000191660001916815260200191505060405180910390f35b341561010e57600080fd5b610178600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091908035600019169060200190919050506104fd565b005b341561018557600080fd5b61019f600480803560001916906020019091905050610627565b005b34156101ac57600080fd5b6102e1600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908060c001906006806020026040519081016040528092919082600660200280828437820191505050505091908061010001906008806020026040519081016040528092919082600860200280828437820191505050505091908060200190600180602002604051908101604052809291908260016020028082843782019150505050509190806060019060038060200260405190810160405280929190826003602002808284378201915050505050919080606001906003806020026040519081016040528092919082600360200280828437820191505050505091908060600190600380602002604051908101604052809291908260036020028082843782019150505050509190505061066e565b604051808215151515815260200191505060405180910390f35b341561030657600080fd5b61030e610831565b005b341561031b57600080fd5b610450600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908060c0019060068060200260405190810160405280929190826006602002808284378201915050505050919080610100019060088060200260405190810160405280929190826008602002808284378201915050505050919080602001906001806020026040519081016040528092919082600160200280828437820191505050505091908060600190600380602002604051908101604052809291908260036020028082843782019150505050509190806060019060038060200260405190810160405280929190826003602002808284378201915050505050919080606001906003806020026040519081016040528092919082600360200280828437820191505050505091905050610b28565b60405180826000191660001916815260200191505060405180910390f35b60006001836040518082805190602001908083835b6020831015156104a85780518252602082019150602081019050602083039250610483565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b6000836040518082805190602001908083835b6020831015156105355780518252602082019150602081019050602083039250610510565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020805480600101828161057a919061101c565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b6020831015156105ce57805182526020820191506020810190506020830392506105a9565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b61066b6040805190810160405280600d81526020017f66696c6c446562744f72646572000000000000000000000000000000000000008152506000600102836104fd565b50565b60008088888888888888604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140187600660200280838360005b838110156106e45780820151818401526020810190506106c9565b5050505090500186600860200280838360005b838110156107125780820151818401526020810190506106f7565b5050505090500185600160200280838360005b83811015610740578082015181840152602081019050610725565b5050505090500184600360200280838360005b8381101561076e578082015181840152602081019050610753565b5050505090500183600360200280838360005b8381101561079c578082015181840152602081019050610781565b5050505090500182600360200280838360005b838110156107ca5780820151818401526020810190506107af565b50505050905001975050505050505050604051809103902090506108236040805190810160405280600d81526020017f66696c6c446562744f726465720000000000000000000000000000000000000081525082610d2e565b915050979650505050505050565b600061083b611048565b600080600093505b600a841015610b2257610854610dca565b84600a8110151561086157fe5b6020020151925060008351141515610b1557600091505b6000836040518082805190602001908083835b6020831015156108b0578051825260208201915060208101905060208303925061088b565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015610a9d576000836040518082805190602001908083835b6020831015156109265780518252602082019150602081019050602083039250610901565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208281548110151561096657fe5b90600052602060002090015490506002836040518082805190602001908083835b6020831015156109ac5780518252602082019150602081019050602083039250610987565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b602083101515610a405780518252602082019150602081019050602083039250610a1b565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050610878565b6000836040518082805190602001908083835b602083101515610ad55780518252602082019150602081019050602083039250610ab0565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000610b14919061105c565b5b8380600101945050610843565b50505050565b60008088888888888888604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140187600660200280838360005b83811015610b9e578082015181840152602081019050610b83565b5050505090500186600860200280838360005b83811015610bcc578082015181840152602081019050610bb1565b5050505090500185600160200280838360005b83811015610bfa578082015181840152602081019050610bdf565b5050505090500184600360200280838360005b83811015610c28578082015181840152602081019050610c0d565b5050505090500183600360200280838360005b83811015610c56578082015181840152602081019050610c3b565b5050505090500182600360200280838360005b83811015610c84578082015181840152602081019050610c69565b5050505090500197505050505050505060405180910390209050610cdd6040805190810160405280600d81526020017f66696c6c446562744f726465720000000000000000000000000000000000000081525082610ee3565b610d206040805190810160405280600d81526020017f66696c6c446562744f7264657200000000000000000000000000000000000000815250600060010261046e565b915050979650505050505050565b60006002836040518082805190602001908083835b602083101515610d685780518252602082019150602081019050602083039250610d43565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b610dd261107d565b610140604051908101604052806040805190810160405280600d81526020017f66696c6c446562744f7264657200000000000000000000000000000000000000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b60016002836040518082805190602001908083835b602083101515610f1d5780518252602082019150602081019050602083039250610ef8565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b602083101515610fb85780518252602082019150602081019050602083039250610f93565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281610ffd919061101c565b9160005260206000209001600083909190915090600019169055505050565b8154818355818115116110435781836000526020600020918201910161104291906110ac565b5b505050565b602060405190810160405280600081525090565b508054600082559060005260206000209081019061107a91906110ac565b50565b61014060405190810160405280600a905b6110966110d1565b81526020019060019003908161108e5790505090565b6110ce91905b808211156110ca5760008160009055506001016110b2565b5090565b90565b6020604051908101604052806000815250905600a165627a7a72305820cf63d5c22cf55fa54d57ddcd64f26b2f2aad598996f4f7629434f2aa601c9ed70029", - "deployedBytecode": "0x606060405260043610610078576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063131018581461007d57806380da20d414610103578063a0144d311461017a578063c2d96de9146101a1578063d826f88f146102fb578063e6488fc914610310575b600080fd5b341561008857600080fd5b6100e5600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080356000191690602001909190505061046e565b60405180826000191660001916815260200191505060405180910390f35b341561010e57600080fd5b610178600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091908035600019169060200190919050506104fd565b005b341561018557600080fd5b61019f600480803560001916906020019091905050610627565b005b34156101ac57600080fd5b6102e1600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908060c001906006806020026040519081016040528092919082600660200280828437820191505050505091908061010001906008806020026040519081016040528092919082600860200280828437820191505050505091908060200190600180602002604051908101604052809291908260016020028082843782019150505050509190806060019060038060200260405190810160405280929190826003602002808284378201915050505050919080606001906003806020026040519081016040528092919082600360200280828437820191505050505091908060600190600380602002604051908101604052809291908260036020028082843782019150505050509190505061066e565b604051808215151515815260200191505060405180910390f35b341561030657600080fd5b61030e610831565b005b341561031b57600080fd5b610450600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908060c0019060068060200260405190810160405280929190826006602002808284378201915050505050919080610100019060088060200260405190810160405280929190826008602002808284378201915050505050919080602001906001806020026040519081016040528092919082600160200280828437820191505050505091908060600190600380602002604051908101604052809291908260036020028082843782019150505050509190806060019060038060200260405190810160405280929190826003602002808284378201915050505050919080606001906003806020026040519081016040528092919082600360200280828437820191505050505091905050610b28565b60405180826000191660001916815260200191505060405180910390f35b60006001836040518082805190602001908083835b6020831015156104a85780518252602082019150602081019050602083039250610483565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b6000836040518082805190602001908083835b6020831015156105355780518252602082019150602081019050602083039250610510565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020805480600101828161057a919061101c565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b6020831015156105ce57805182526020820191506020810190506020830392506105a9565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b61066b6040805190810160405280600d81526020017f66696c6c446562744f72646572000000000000000000000000000000000000008152506000600102836104fd565b50565b60008088888888888888604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140187600660200280838360005b838110156106e45780820151818401526020810190506106c9565b5050505090500186600860200280838360005b838110156107125780820151818401526020810190506106f7565b5050505090500185600160200280838360005b83811015610740578082015181840152602081019050610725565b5050505090500184600360200280838360005b8381101561076e578082015181840152602081019050610753565b5050505090500183600360200280838360005b8381101561079c578082015181840152602081019050610781565b5050505090500182600360200280838360005b838110156107ca5780820151818401526020810190506107af565b50505050905001975050505050505050604051809103902090506108236040805190810160405280600d81526020017f66696c6c446562744f726465720000000000000000000000000000000000000081525082610d2e565b915050979650505050505050565b600061083b611048565b600080600093505b600a841015610b2257610854610dca565b84600a8110151561086157fe5b6020020151925060008351141515610b1557600091505b6000836040518082805190602001908083835b6020831015156108b0578051825260208201915060208101905060208303925061088b565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015610a9d576000836040518082805190602001908083835b6020831015156109265780518252602082019150602081019050602083039250610901565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208281548110151561096657fe5b90600052602060002090015490506002836040518082805190602001908083835b6020831015156109ac5780518252602082019150602081019050602083039250610987565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b602083101515610a405780518252602082019150602081019050602083039250610a1b565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050610878565b6000836040518082805190602001908083835b602083101515610ad55780518252602082019150602081019050602083039250610ab0565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000610b14919061105c565b5b8380600101945050610843565b50505050565b60008088888888888888604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140187600660200280838360005b83811015610b9e578082015181840152602081019050610b83565b5050505090500186600860200280838360005b83811015610bcc578082015181840152602081019050610bb1565b5050505090500185600160200280838360005b83811015610bfa578082015181840152602081019050610bdf565b5050505090500184600360200280838360005b83811015610c28578082015181840152602081019050610c0d565b5050505090500183600360200280838360005b83811015610c56578082015181840152602081019050610c3b565b5050505090500182600360200280838360005b83811015610c84578082015181840152602081019050610c69565b5050505090500197505050505050505060405180910390209050610cdd6040805190810160405280600d81526020017f66696c6c446562744f726465720000000000000000000000000000000000000081525082610ee3565b610d206040805190810160405280600d81526020017f66696c6c446562744f7264657200000000000000000000000000000000000000815250600060010261046e565b915050979650505050505050565b60006002836040518082805190602001908083835b602083101515610d685780518252602082019150602081019050602083039250610d43565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b610dd261107d565b610140604051908101604052806040805190810160405280600d81526020017f66696c6c446562744f7264657200000000000000000000000000000000000000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b60016002836040518082805190602001908083835b602083101515610f1d5780518252602082019150602081019050602083039250610ef8565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b602083101515610fb85780518252602082019150602081019050602083039250610f93565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281610ffd919061101c565b9160005260206000209001600083909190915090600019169055505050565b8154818355818115116110435781836000526020600020918201910161104291906110ac565b5b505050565b602060405190810160405280600081525090565b508054600082559060005260206000209081019061107a91906110ac565b50565b61014060405190810160405280600a905b6110966110d1565b81526020019060019003908161108e5790505090565b6110ce91905b808211156110ca5760008160009055506001016110b2565b5090565b90565b6020604051908101604052806000815250905600a165627a7a72305820cf63d5c22cf55fa54d57ddcd64f26b2f2aad598996f4f7629434f2aa601c9ed70029", + "bytecode": "0x6060604052341561000f57600080fd5b6111118061001e6000396000f300606060405260043610610078576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063131018581461007d57806380da20d414610103578063a0144d311461017a578063c2d96de9146101a1578063d826f88f146102fb578063e6488fc914610310575b600080fd5b341561008857600080fd5b6100e5600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080356000191690602001909190505061046e565b60405180826000191660001916815260200191505060405180910390f35b341561010e57600080fd5b610178600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091908035600019169060200190919050506104fd565b005b341561018557600080fd5b61019f600480803560001916906020019091905050610627565b005b34156101ac57600080fd5b6102e1600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908060c001906006806020026040519081016040528092919082600660200280828437820191505050505091908061010001906008806020026040519081016040528092919082600860200280828437820191505050505091908060200190600180602002604051908101604052809291908260016020028082843782019150505050509190806060019060038060200260405190810160405280929190826003602002808284378201915050505050919080606001906003806020026040519081016040528092919082600360200280828437820191505050505091908060600190600380602002604051908101604052809291908260036020028082843782019150505050509190505061066e565b604051808215151515815260200191505060405180910390f35b341561030657600080fd5b61030e610831565b005b341561031b57600080fd5b610450600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908060c0019060068060200260405190810160405280929190826006602002808284378201915050505050919080610100019060088060200260405190810160405280929190826008602002808284378201915050505050919080602001906001806020026040519081016040528092919082600160200280828437820191505050505091908060600190600380602002604051908101604052809291908260036020028082843782019150505050509190806060019060038060200260405190810160405280929190826003602002808284378201915050505050919080606001906003806020026040519081016040528092919082600360200280828437820191505050505091905050610b28565b60405180826000191660001916815260200191505060405180910390f35b60006001836040518082805190602001908083835b6020831015156104a85780518252602082019150602081019050602083039250610483565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b6000836040518082805190602001908083835b6020831015156105355780518252602082019150602081019050602083039250610510565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020805480600101828161057a919061101c565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b6020831015156105ce57805182526020820191506020810190506020830392506105a9565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b61066b6040805190810160405280600d81526020017f66696c6c446562744f72646572000000000000000000000000000000000000008152506000600102836104fd565b50565b60008088888888888888604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140187600660200280838360005b838110156106e45780820151818401526020810190506106c9565b5050505090500186600860200280838360005b838110156107125780820151818401526020810190506106f7565b5050505090500185600160200280838360005b83811015610740578082015181840152602081019050610725565b5050505090500184600360200280838360005b8381101561076e578082015181840152602081019050610753565b5050505090500183600360200280838360005b8381101561079c578082015181840152602081019050610781565b5050505090500182600360200280838360005b838110156107ca5780820151818401526020810190506107af565b50505050905001975050505050505050604051809103902090506108236040805190810160405280600d81526020017f66696c6c446562744f726465720000000000000000000000000000000000000081525082610d2e565b915050979650505050505050565b600061083b611048565b600080600093505b600a841015610b2257610854610dca565b84600a8110151561086157fe5b6020020151925060008351141515610b1557600091505b6000836040518082805190602001908083835b6020831015156108b0578051825260208201915060208101905060208303925061088b565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015610a9d576000836040518082805190602001908083835b6020831015156109265780518252602082019150602081019050602083039250610901565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208281548110151561096657fe5b90600052602060002090015490506002836040518082805190602001908083835b6020831015156109ac5780518252602082019150602081019050602083039250610987565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b602083101515610a405780518252602082019150602081019050602083039250610a1b565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050610878565b6000836040518082805190602001908083835b602083101515610ad55780518252602082019150602081019050602083039250610ab0565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000610b14919061105c565b5b8380600101945050610843565b50505050565b60008088888888888888604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140187600660200280838360005b83811015610b9e578082015181840152602081019050610b83565b5050505090500186600860200280838360005b83811015610bcc578082015181840152602081019050610bb1565b5050505090500185600160200280838360005b83811015610bfa578082015181840152602081019050610bdf565b5050505090500184600360200280838360005b83811015610c28578082015181840152602081019050610c0d565b5050505090500183600360200280838360005b83811015610c56578082015181840152602081019050610c3b565b5050505090500182600360200280838360005b83811015610c84578082015181840152602081019050610c69565b5050505090500197505050505050505060405180910390209050610cdd6040805190810160405280600d81526020017f66696c6c446562744f726465720000000000000000000000000000000000000081525082610ee3565b610d206040805190810160405280600d81526020017f66696c6c446562744f7264657200000000000000000000000000000000000000815250600060010261046e565b915050979650505050505050565b60006002836040518082805190602001908083835b602083101515610d685780518252602082019150602081019050602083039250610d43565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b610dd261107d565b610140604051908101604052806040805190810160405280600d81526020017f66696c6c446562744f7264657200000000000000000000000000000000000000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b60016002836040518082805190602001908083835b602083101515610f1d5780518252602082019150602081019050602083039250610ef8565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b602083101515610fb85780518252602082019150602081019050602083039250610f93565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281610ffd919061101c565b9160005260206000209001600083909190915090600019169055505050565b8154818355818115116110435781836000526020600020918201910161104291906110ac565b5b505050565b602060405190810160405280600081525090565b508054600082559060005260206000209081019061107a91906110ac565b50565b61014060405190810160405280600a905b6110966110d1565b81526020019060019003908161108e5790505090565b6110ce91905b808211156110ca5760008160009055506001016110b2565b5090565b90565b6020604051908101604052806000815250905600a165627a7a723058208851299aa2ea4bf3e6a4df06bafff421b5bbf52499b820e0e1d7297b0459c8100029", + "deployedBytecode": "0x606060405260043610610078576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063131018581461007d57806380da20d414610103578063a0144d311461017a578063c2d96de9146101a1578063d826f88f146102fb578063e6488fc914610310575b600080fd5b341561008857600080fd5b6100e5600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080356000191690602001909190505061046e565b60405180826000191660001916815260200191505060405180910390f35b341561010e57600080fd5b610178600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091908035600019169060200190919050506104fd565b005b341561018557600080fd5b61019f600480803560001916906020019091905050610627565b005b34156101ac57600080fd5b6102e1600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908060c001906006806020026040519081016040528092919082600660200280828437820191505050505091908061010001906008806020026040519081016040528092919082600860200280828437820191505050505091908060200190600180602002604051908101604052809291908260016020028082843782019150505050509190806060019060038060200260405190810160405280929190826003602002808284378201915050505050919080606001906003806020026040519081016040528092919082600360200280828437820191505050505091908060600190600380602002604051908101604052809291908260036020028082843782019150505050509190505061066e565b604051808215151515815260200191505060405180910390f35b341561030657600080fd5b61030e610831565b005b341561031b57600080fd5b610450600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908060c0019060068060200260405190810160405280929190826006602002808284378201915050505050919080610100019060088060200260405190810160405280929190826008602002808284378201915050505050919080602001906001806020026040519081016040528092919082600160200280828437820191505050505091908060600190600380602002604051908101604052809291908260036020028082843782019150505050509190806060019060038060200260405190810160405280929190826003602002808284378201915050505050919080606001906003806020026040519081016040528092919082600360200280828437820191505050505091905050610b28565b60405180826000191660001916815260200191505060405180910390f35b60006001836040518082805190602001908083835b6020831015156104a85780518252602082019150602081019050602083039250610483565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b6000836040518082805190602001908083835b6020831015156105355780518252602082019150602081019050602083039250610510565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020805480600101828161057a919061101c565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b6020831015156105ce57805182526020820191506020810190506020830392506105a9565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b61066b6040805190810160405280600d81526020017f66696c6c446562744f72646572000000000000000000000000000000000000008152506000600102836104fd565b50565b60008088888888888888604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140187600660200280838360005b838110156106e45780820151818401526020810190506106c9565b5050505090500186600860200280838360005b838110156107125780820151818401526020810190506106f7565b5050505090500185600160200280838360005b83811015610740578082015181840152602081019050610725565b5050505090500184600360200280838360005b8381101561076e578082015181840152602081019050610753565b5050505090500183600360200280838360005b8381101561079c578082015181840152602081019050610781565b5050505090500182600360200280838360005b838110156107ca5780820151818401526020810190506107af565b50505050905001975050505050505050604051809103902090506108236040805190810160405280600d81526020017f66696c6c446562744f726465720000000000000000000000000000000000000081525082610d2e565b915050979650505050505050565b600061083b611048565b600080600093505b600a841015610b2257610854610dca565b84600a8110151561086157fe5b6020020151925060008351141515610b1557600091505b6000836040518082805190602001908083835b6020831015156108b0578051825260208201915060208101905060208303925061088b565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015610a9d576000836040518082805190602001908083835b6020831015156109265780518252602082019150602081019050602083039250610901565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208281548110151561096657fe5b90600052602060002090015490506002836040518082805190602001908083835b6020831015156109ac5780518252602082019150602081019050602083039250610987565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b602083101515610a405780518252602082019150602081019050602083039250610a1b565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050610878565b6000836040518082805190602001908083835b602083101515610ad55780518252602082019150602081019050602083039250610ab0565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000610b14919061105c565b5b8380600101945050610843565b50505050565b60008088888888888888604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140187600660200280838360005b83811015610b9e578082015181840152602081019050610b83565b5050505090500186600860200280838360005b83811015610bcc578082015181840152602081019050610bb1565b5050505090500185600160200280838360005b83811015610bfa578082015181840152602081019050610bdf565b5050505090500184600360200280838360005b83811015610c28578082015181840152602081019050610c0d565b5050505090500183600360200280838360005b83811015610c56578082015181840152602081019050610c3b565b5050505090500182600360200280838360005b83811015610c84578082015181840152602081019050610c69565b5050505090500197505050505050505060405180910390209050610cdd6040805190810160405280600d81526020017f66696c6c446562744f726465720000000000000000000000000000000000000081525082610ee3565b610d206040805190810160405280600d81526020017f66696c6c446562744f7264657200000000000000000000000000000000000000815250600060010261046e565b915050979650505050505050565b60006002836040518082805190602001908083835b602083101515610d685780518252602082019150602081019050602083039250610d43565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b610dd261107d565b610140604051908101604052806040805190810160405280600d81526020017f66696c6c446562744f7264657200000000000000000000000000000000000000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b60016002836040518082805190602001908083835b602083101515610f1d5780518252602082019150602081019050602083039250610ef8565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b602083101515610fb85780518252602082019150602081019050602083039250610f93565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281610ffd919061101c565b9160005260206000209001600083909190915090600019169055505050565b8154818355818115116110435781836000526020600020918201910161104291906110ac565b5b505050565b602060405190810160405280600081525090565b508054600082559060005260206000209081019061107a91906110ac565b50565b61014060405190810160405280600a905b6110966110d1565b81526020019060019003908161108e5790505090565b6110ce91905b808211156110ca5760008160009055506001016110b2565b5090565b90565b6020604051908101604052806000815250905600a165627a7a723058208851299aa2ea4bf3e6a4df06bafff421b5bbf52499b820e0e1d7297b0459c8100029", "sourceMap": "640:1847:24:-;;;;;;;;;;;;;;;;;", "deployedSourceMap": "640:1847:24:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1294:217:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1018:270;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;687:168:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1547:634;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1517:610:23;;;;;;;;;;;;;;861:680:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1294:217:23;1411:24;1458:17;1476:12;1458:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1458:46:23;1490:13;1458:46;;;;;;;;;;;;;;;;;;1451:53;;1294:217;;;;:::o;1018:270::-;1155:22;1178:12;1155:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1155:56:23;;;;;;;;;;;:::i;:::-;;;;;;;;;;1197:13;1155:56;;;;;;;;;;;;1270:11;1221:17;1239:12;1221:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1221:46:23;1253:13;1221:46;;;;;;;;;;;;;;;;;:60;;;;;;;1018:270;;;:::o;687:168:24:-;769:79;;;;;;;;;;;;;;;;;;;697:1:23;689:10;;834:12:24;769:15;:79::i;:::-;687:168;:::o;1547:634::-;1851:14;1881:21;1928:8;1950:14;1978:11;2003:12;2029:11;2054;2079;1905:195;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;23:1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;23:1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;23:1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;23:1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;23:1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;1881:219:24;;2117:57;;;;;;;;;;;;;;;;;;;2160:13;2117:25;:57::i;:::-;2110:64;;1547:634;;;;;;;;;;:::o;1517:610:23:-;1556:6;1595:26;;:::i;:::-;1719:6;1807:21;1565:1;1556:10;;1551:570;1572:2;1568:1;:6;1551:570;;;1624:17;:15;:17::i;:::-;1642:1;1624:20;;;;;;;;;;;;;1595:49;;1693:1;1669:12;1663:26;:31;;1659:452;;;1728:1;1719:10;;1714:321;1735:22;1758:12;1735:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1735:43:23;;;;1731:1;:47;1714:321;;;1831:22;1854:12;1831:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1868:1:23;1831:39;;;;;;;;;;;;;;;;;;;1807:63;;1899:13;1913:12;1899:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1899:42:23;1927:13;1899:42;;;;;;;;;;;;;;;;;;1892:49;;;;;;;;;;;1970:17;1988:12;1970:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1970:46:23;2002:13;1970:46;;;;;;;;;;;;;;;;;1963:53;;;1780:3;;;;;;;1714:321;;;2060:22;2083:12;2060:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;;2053:43:23;;;;:::i;:::-;1659:452;1576:3;;;;;;;1551:570;;;1517:610;;;;:::o;861:680:24:-;1139:20;1175:21;1222:8;1244:14;1272:11;1297:12;1323:11;1348;1373;1199:195;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;23:1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;23:1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;23:1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;23:1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;23:1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;1175:219:24;;1404:54;;;;;;;;;;;;;;;;;;;1444:13;1404:22;:54::i;:::-;1475:59;;;;;;;;;;;;;;;;;;;697:1:23;689:10;;1475:18:24;:59::i;:::-;1468:66;;861:680;;;;;;;;;;:::o;2341:194:23:-;2458:14;2495:13;2509:12;2495:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2495:33:23;2523:4;2495:33;;;;;;;;;;;;;;;;;;;;;;;;;;;2488:40;;2341:194;;;;:::o;2187:298:24:-;2248:24;;:::i;:::-;2288:190;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2187:298;:::o;2133:202:23:-;2267:4;2231:13;2245:12;2231:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2231:33:23;2259:4;2231:33;;;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;2281:22;2304:12;2281:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2281:47:23;;;;;;;;;;;:::i;:::-;;;;;;;;;;2323:4;2281:47;;;;;;;;;;;;2133:202;;:::o;640:1847:24:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\nimport \"./MockContract.sol\";\n\n\ncontract MockDebtKernel is MockContract {\n\n function mockCreateReturnValue(bytes32 _agreementId)\n public\n {\n mockReturnValue(\"fillDebtOrder\", DEFAULT_SIGNATURE_ARGS, bytes32(_agreementId));\n }\n\n function fillDebtOrder(\n address creditor,\n address[6] orderAddresses,\n uint[8] orderValues,\n bytes32[1] orderBytes32,\n uint8[3] signaturesV,\n bytes32[3] signaturesR,\n bytes32[3] signaturesS\n )\n public\n returns (bytes32 _agreementId)\n {\n bytes32 argsSignature = keccak256(\n creditor,\n orderAddresses,\n orderValues,\n orderBytes32,\n signaturesV,\n signaturesR,\n signaturesS\n );\n functionCalledWithArgs(\"fillDebtOrder\", argsSignature);\n return getMockReturnValue(\"fillDebtOrder\", DEFAULT_SIGNATURE_ARGS);\n }\n\n function wasFillDebtOrderCalledWith(\n address creditor,\n address[6] orderAddresses,\n uint[8] orderValues,\n bytes32[1] orderBytes32,\n uint8[3] signaturesV,\n bytes32[3] signaturesR,\n bytes32[3] signaturesS\n )\n public\n view\n returns (bool wasCalled)\n {\n bytes32 argsSignature = keccak256(\n creditor,\n orderAddresses,\n orderValues,\n orderBytes32,\n signaturesV,\n signaturesR,\n signaturesS\n );\n return wasFunctionCalledWithArgs(\"fillDebtOrder\", argsSignature);\n }\n\n function getFunctionList()\n internal\n returns (string[10] functionNames)\n {\n return [\n \"fillDebtOrder\",\n \"\",\n \"\",\n \"\",\n \"\",\n \"\",\n \"\",\n \"\",\n \"\",\n \"\"\n ];\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockDebtKernel.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockDebtKernel.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockDebtKernel.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockDebtKernel.sol", "exportedSymbols": { "MockDebtKernel": [ 10835 @@ -187,7 +187,7 @@ { "attributes": { "SourceUnit": 10693, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockContract.sol", "file": "./MockContract.sol", "scope": 10836, "symbolAliases": [ @@ -2230,5 +2230,5 @@ }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:48.018Z" + "updatedAt": "2018-10-09T17:45:35.497Z" } \ No newline at end of file diff --git a/artifacts/json/MockDebtRegistry.json b/artifacts/json/MockDebtRegistry.json index 52bf0993..8dfa985c 100644 --- a/artifacts/json/MockDebtRegistry.json +++ b/artifacts/json/MockDebtRegistry.json @@ -435,15 +435,15 @@ "type": "function" } ], - "bytecode": "0x6060604052341561000f57600080fd5b611be98061001e6000396000f300606060405260043610610112576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063131018581461011757806318d2efef1461019d578063212e5da1146101e3578063314a522e146102cf5780635969549e146103125780636be39bda146103585780636ea5f93a146103ce57806380da20d4146104025780638dc8a7b2146104795780639758af1e146104a95780639feff4cc146104e8578063a1bc7ef01461050f578063b4045ae914610541578063ba20dda414610594578063cf9df5eb146105fb578063d69dbf63146106eb578063d826f88f14610726578063f0450a5c1461073b578063f6a6189614610781578063f6f494c9146107df575b600080fd5b341561012257600080fd5b61017f600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091905050610846565b60405180826000191660001916815260200191505060405180910390f35b34156101a857600080fd5b6101e160048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506108d5565b005b34156101ee57600080fd5b6102b5600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803560001916906020019091908035906020019091905050610932565b604051808215151515815260200191505060405180910390f35b34156102da57600080fd5b6102f4600480803560001916906020019091905050610afd565b60405180826000191660001916815260200191505060405180910390f35b341561031d57600080fd5b61035660048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b45565b005b341561036357600080fd5b61037d600480803560001916906020019091905050610bf2565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182600019166000191681526020019250505060405180910390f35b34156103d957600080fd5b61040060048080356000191690602001909190803560001916906020019091905050610c80565b005b341561040d57600080fd5b610477600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080356000191690602001909190803560001916906020019091905050610cc4565b005b341561048457600080fd5b6104a7600480803560001916906020019091908035906020019091905050610dee565b005b34156104b457600080fd5b6104ce600480803560001916906020019091905050610e35565b604051808215151515815260200191505060405180910390f35b34156104f357600080fd5b61050d600480803560001916906020019091905050610e9e565b005b341561051a57600080fd5b61053f6004808035600019169060200190919080351515906020019091905050610ee5565b005b341561054c57600080fd5b61059260048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803560001916906020019091905050610f3c565b005b341561059f57600080fd5b6105b9600480803560001916906020019091905050610fda565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561060657600080fd5b6106cd600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803560001916906020019091908035906020019091905050611026565b60405180826000191660001916815260200191505060405180910390f35b34156106f657600080fd5b610710600480803560001916906020019091905050611249565b6040518082815260200191505060405180910390f35b341561073157600080fd5b610739611295565b005b341561074657600080fd5b61077f60048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061158c565b005b341561078c57600080fd5b6107c560048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506115e9565b604051808215151515815260200191505060405180910390f35b34156107ea57600080fd5b610804600480803560001916906020019091905050611692565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60006001836040518082805190602001908083835b602083101515610880578051825260208201915060208101905060208303925061085b565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b61092e6040805190810160405280601081526020017f6765745465726d73436f6e747261637400000000000000000000000000000000815250838373ffffffffffffffffffffffffffffffffffffffff16600102610cc4565b5050565b6000610aef6040805190810160405280600681526020017f696e7365727400000000000000000000000000000000000000000000000000008152508a8a8a8a8a8a8a8a604051808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140183600019166000191681526020018281526020019850505050505050505060405180910390206116de565b905098975050505050505050565b6000610b3e6040805190810160405280601a81526020017f6765745465726d73436f6e7472616374506172616d657465727300000000000081525083610846565b9050919050565b610be46040805190810160405280601181526020017f6d6f6469667942656e656669636961727900000000000000000000000000000081525083836040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140192505050604051809103902061177a565b610bee828261158c565b5050565b600080610c346040805190810160405280601681526020017f6765745465726d735f7465726d73436f6e74726163740000000000000000000081525084610846565b60019004610c776040805190810160405280602081526020017f6765745465726d735f7465726d73436f6e7472616374506172616d657465727381525085610846565b91509150915091565b610cc06040805190810160405280601a81526020017f6765745465726d73436f6e7472616374506172616d65746572730000000000008152508383610cc4565b5050565b6000836040518082805190602001908083835b602083101515610cfc5780518252602082019150602081019050602083039250610cd7565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281610d419190611af4565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b602083101515610d955780518252602082019150602081019050602083039250610d70565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b610e316040805190810160405280601981526020017f67657449737375616e6365426c6f636b54696d657374616d70000000000000008152508383600102610cc4565b5050565b600080610e776040805190810160405280600e81526020017f646f6573456e747279457869737400000000000000000000000000000000000081525084610846565b9050600060010260001916816000191614610e93576001610e96565b60005b915050919050565b610ee26040805190810160405280600681526020017f696e736572740000000000000000000000000000000000000000000000000000815250600060010283610cc4565b50565b610f386040805190810160405280600e81526020017f646f6573456e74727945786973740000000000000000000000000000000000008152508383610f2e576000600102610f33565b600180025b610cc4565b5050565b610f956040805190810160405280601681526020017f6765745465726d735f7465726d73436f6e747261637400000000000000000000815250848473ffffffffffffffffffffffffffffffffffffffff16600102610cc4565b610fd56040805190810160405280602081526020017f6765745465726d735f7465726d73436f6e7472616374506172616d65746572738152508483610cc4565b505050565b600061101b6040805190810160405280600e81526020017f67657442656e656669636961727900000000000000000000000000000000000081525083610846565b600190049050919050565b60008060008a8a8a8a8a8a8a8a604051808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401836000191660001916815260200182815260200198505050505050505050604051809103902091506111e96040805190810160405280600681526020017f696e7365727400000000000000000000000000000000000000000000000000008152508361177a565b61122c6040805190810160405280600681526020017f696e7365727400000000000000000000000000000000000000000000000000008152506000600102610846565b9050611238818b61158c565b809250505098975050505050505050565b600061128a6040805190810160405280601981526020017f67657449737375616e6365426c6f636b54696d657374616d700000000000000081525083610846565b600190049050919050565b600061129f611b20565b600080600093505b600a841015611586576112b86118b3565b84600a811015156112c557fe5b602002015192506000835114151561157957600091505b6000836040518082805190602001908083835b60208310151561131457805182526020820191506020810190506020830392506112ef565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015611501576000836040518082805190602001908083835b60208310151561138a5780518252602082019150602081019050602083039250611365565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020828154811015156113ca57fe5b90600052602060002090015490506002836040518082805190602001908083835b60208310151561141057805182526020820191506020810190506020830392506113eb565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b6020831015156114a4578051825260208201915060208101905060208303925061147f565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600082600019166000191681526020019081526020016000206000905581806001019250506112dc565b6000836040518082805190602001908083835b6020831015156115395780518252602082019150602081019050602083039250611514565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006115789190611b34565b5b83806001019450506112a7565b50505050565b6115e56040805190810160405280600e81526020017f67657442656e6566696369617279000000000000000000000000000000000000815250838373ffffffffffffffffffffffffffffffffffffffff16600102610cc4565b5050565b600061168a6040805190810160405280601181526020017f6d6f6469667942656e656669636961727900000000000000000000000000000081525084846040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019250505060405180910390206116de565b905092915050565b60006116d36040805190810160405280601081526020017f6765745465726d73436f6e74726163740000000000000000000000000000000081525083610846565b600190049050919050565b60006002836040518082805190602001908083835b60208310151561171857805182526020820191506020810190506020830392506116f3565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b60016002836040518082805190602001908083835b6020831015156117b4578051825260208201915060208101905060208303925061178f565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b60208310151561184f578051825260208201915060208101905060208303925061182a565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816118949190611af4565b9160005260206000209001600083909190915090600019169055505050565b6118bb611b55565b610140604051908101604052806040805190810160405280600681526020017f696e73657274000000000000000000000000000000000000000000000000000081525081526020016040805190810160405280601181526020017f6d6f6469667942656e656669636961727900000000000000000000000000000081525081526020016040805190810160405280600e81526020017f67657442656e656669636961727900000000000000000000000000000000000081525081526020016040805190810160405280601681526020017f6765745465726d735f7465726d73436f6e74726163740000000000000000000081525081526020016040805190810160405280602081526020017f6765745465726d735f7465726d73436f6e7472616374506172616d657465727381525081526020016040805190810160405280601081526020017f6765745465726d73436f6e74726163740000000000000000000000000000000081525081526020016040805190810160405280601a81526020017f6765745465726d73436f6e7472616374506172616d657465727300000000000081525081526020016040805190810160405280601981526020017f67657449737375616e6365426c6f636b54696d657374616d700000000000000081525081526020016040805190810160405280600e81526020017f646f6573456e747279457869737400000000000000000000000000000000000081525081526020016020604051908101604052806000815250815250905090565b815481835581811511611b1b57818360005260206000209182019101611b1a9190611b84565b5b505050565b602060405190810160405280600081525090565b5080546000825590600052602060002090810190611b529190611b84565b50565b61014060405190810160405280600a905b611b6e611ba9565b815260200190600190039081611b665790505090565b611ba691905b80821115611ba2576000816000905550600101611b8a565b5090565b90565b6020604051908101604052806000815250905600a165627a7a72305820d5442d020f4b87def34d11e5cbdab2f23191b3955aea8493145530a5c92c62420029", - "deployedBytecode": "0x606060405260043610610112576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063131018581461011757806318d2efef1461019d578063212e5da1146101e3578063314a522e146102cf5780635969549e146103125780636be39bda146103585780636ea5f93a146103ce57806380da20d4146104025780638dc8a7b2146104795780639758af1e146104a95780639feff4cc146104e8578063a1bc7ef01461050f578063b4045ae914610541578063ba20dda414610594578063cf9df5eb146105fb578063d69dbf63146106eb578063d826f88f14610726578063f0450a5c1461073b578063f6a6189614610781578063f6f494c9146107df575b600080fd5b341561012257600080fd5b61017f600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091905050610846565b60405180826000191660001916815260200191505060405180910390f35b34156101a857600080fd5b6101e160048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506108d5565b005b34156101ee57600080fd5b6102b5600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803560001916906020019091908035906020019091905050610932565b604051808215151515815260200191505060405180910390f35b34156102da57600080fd5b6102f4600480803560001916906020019091905050610afd565b60405180826000191660001916815260200191505060405180910390f35b341561031d57600080fd5b61035660048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b45565b005b341561036357600080fd5b61037d600480803560001916906020019091905050610bf2565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182600019166000191681526020019250505060405180910390f35b34156103d957600080fd5b61040060048080356000191690602001909190803560001916906020019091905050610c80565b005b341561040d57600080fd5b610477600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080356000191690602001909190803560001916906020019091905050610cc4565b005b341561048457600080fd5b6104a7600480803560001916906020019091908035906020019091905050610dee565b005b34156104b457600080fd5b6104ce600480803560001916906020019091905050610e35565b604051808215151515815260200191505060405180910390f35b34156104f357600080fd5b61050d600480803560001916906020019091905050610e9e565b005b341561051a57600080fd5b61053f6004808035600019169060200190919080351515906020019091905050610ee5565b005b341561054c57600080fd5b61059260048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803560001916906020019091905050610f3c565b005b341561059f57600080fd5b6105b9600480803560001916906020019091905050610fda565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561060657600080fd5b6106cd600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803560001916906020019091908035906020019091905050611026565b60405180826000191660001916815260200191505060405180910390f35b34156106f657600080fd5b610710600480803560001916906020019091905050611249565b6040518082815260200191505060405180910390f35b341561073157600080fd5b610739611295565b005b341561074657600080fd5b61077f60048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061158c565b005b341561078c57600080fd5b6107c560048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506115e9565b604051808215151515815260200191505060405180910390f35b34156107ea57600080fd5b610804600480803560001916906020019091905050611692565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60006001836040518082805190602001908083835b602083101515610880578051825260208201915060208101905060208303925061085b565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b61092e6040805190810160405280601081526020017f6765745465726d73436f6e747261637400000000000000000000000000000000815250838373ffffffffffffffffffffffffffffffffffffffff16600102610cc4565b5050565b6000610aef6040805190810160405280600681526020017f696e7365727400000000000000000000000000000000000000000000000000008152508a8a8a8a8a8a8a8a604051808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140183600019166000191681526020018281526020019850505050505050505060405180910390206116de565b905098975050505050505050565b6000610b3e6040805190810160405280601a81526020017f6765745465726d73436f6e7472616374506172616d657465727300000000000081525083610846565b9050919050565b610be46040805190810160405280601181526020017f6d6f6469667942656e656669636961727900000000000000000000000000000081525083836040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140192505050604051809103902061177a565b610bee828261158c565b5050565b600080610c346040805190810160405280601681526020017f6765745465726d735f7465726d73436f6e74726163740000000000000000000081525084610846565b60019004610c776040805190810160405280602081526020017f6765745465726d735f7465726d73436f6e7472616374506172616d657465727381525085610846565b91509150915091565b610cc06040805190810160405280601a81526020017f6765745465726d73436f6e7472616374506172616d65746572730000000000008152508383610cc4565b5050565b6000836040518082805190602001908083835b602083101515610cfc5780518252602082019150602081019050602083039250610cd7565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281610d419190611af4565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b602083101515610d955780518252602082019150602081019050602083039250610d70565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b610e316040805190810160405280601981526020017f67657449737375616e6365426c6f636b54696d657374616d70000000000000008152508383600102610cc4565b5050565b600080610e776040805190810160405280600e81526020017f646f6573456e747279457869737400000000000000000000000000000000000081525084610846565b9050600060010260001916816000191614610e93576001610e96565b60005b915050919050565b610ee26040805190810160405280600681526020017f696e736572740000000000000000000000000000000000000000000000000000815250600060010283610cc4565b50565b610f386040805190810160405280600e81526020017f646f6573456e74727945786973740000000000000000000000000000000000008152508383610f2e576000600102610f33565b600180025b610cc4565b5050565b610f956040805190810160405280601681526020017f6765745465726d735f7465726d73436f6e747261637400000000000000000000815250848473ffffffffffffffffffffffffffffffffffffffff16600102610cc4565b610fd56040805190810160405280602081526020017f6765745465726d735f7465726d73436f6e7472616374506172616d65746572738152508483610cc4565b505050565b600061101b6040805190810160405280600e81526020017f67657442656e656669636961727900000000000000000000000000000000000081525083610846565b600190049050919050565b60008060008a8a8a8a8a8a8a8a604051808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401836000191660001916815260200182815260200198505050505050505050604051809103902091506111e96040805190810160405280600681526020017f696e7365727400000000000000000000000000000000000000000000000000008152508361177a565b61122c6040805190810160405280600681526020017f696e7365727400000000000000000000000000000000000000000000000000008152506000600102610846565b9050611238818b61158c565b809250505098975050505050505050565b600061128a6040805190810160405280601981526020017f67657449737375616e6365426c6f636b54696d657374616d700000000000000081525083610846565b600190049050919050565b600061129f611b20565b600080600093505b600a841015611586576112b86118b3565b84600a811015156112c557fe5b602002015192506000835114151561157957600091505b6000836040518082805190602001908083835b60208310151561131457805182526020820191506020810190506020830392506112ef565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015611501576000836040518082805190602001908083835b60208310151561138a5780518252602082019150602081019050602083039250611365565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020828154811015156113ca57fe5b90600052602060002090015490506002836040518082805190602001908083835b60208310151561141057805182526020820191506020810190506020830392506113eb565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b6020831015156114a4578051825260208201915060208101905060208303925061147f565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600082600019166000191681526020019081526020016000206000905581806001019250506112dc565b6000836040518082805190602001908083835b6020831015156115395780518252602082019150602081019050602083039250611514565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006115789190611b34565b5b83806001019450506112a7565b50505050565b6115e56040805190810160405280600e81526020017f67657442656e6566696369617279000000000000000000000000000000000000815250838373ffffffffffffffffffffffffffffffffffffffff16600102610cc4565b5050565b600061168a6040805190810160405280601181526020017f6d6f6469667942656e656669636961727900000000000000000000000000000081525084846040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019250505060405180910390206116de565b905092915050565b60006116d36040805190810160405280601081526020017f6765745465726d73436f6e74726163740000000000000000000000000000000081525083610846565b600190049050919050565b60006002836040518082805190602001908083835b60208310151561171857805182526020820191506020810190506020830392506116f3565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b60016002836040518082805190602001908083835b6020831015156117b4578051825260208201915060208101905060208303925061178f565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b60208310151561184f578051825260208201915060208101905060208303925061182a565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816118949190611af4565b9160005260206000209001600083909190915090600019169055505050565b6118bb611b55565b610140604051908101604052806040805190810160405280600681526020017f696e73657274000000000000000000000000000000000000000000000000000081525081526020016040805190810160405280601181526020017f6d6f6469667942656e656669636961727900000000000000000000000000000081525081526020016040805190810160405280600e81526020017f67657442656e656669636961727900000000000000000000000000000000000081525081526020016040805190810160405280601681526020017f6765745465726d735f7465726d73436f6e74726163740000000000000000000081525081526020016040805190810160405280602081526020017f6765745465726d735f7465726d73436f6e7472616374506172616d657465727381525081526020016040805190810160405280601081526020017f6765745465726d73436f6e74726163740000000000000000000000000000000081525081526020016040805190810160405280601a81526020017f6765745465726d73436f6e7472616374506172616d657465727300000000000081525081526020016040805190810160405280601981526020017f67657449737375616e6365426c6f636b54696d657374616d700000000000000081525081526020016040805190810160405280600e81526020017f646f6573456e747279457869737400000000000000000000000000000000000081525081526020016020604051908101604052806000815250815250905090565b815481835581811511611b1b57818360005260206000209182019101611b1a9190611b84565b5b505050565b602060405190810160405280600081525090565b5080546000825590600052602060002090810190611b529190611b84565b50565b61014060405190810160405280600a905b611b6e611ba9565b815260200190600190039081611b665790505090565b611ba691905b80821115611ba2576000816000905550600101611b8a565b5090565b90565b6020604051908101604052806000815250905600a165627a7a72305820d5442d020f4b87def34d11e5cbdab2f23191b3955aea8493145530a5c92c62420029", + "bytecode": "0x6060604052341561000f57600080fd5b611be98061001e6000396000f300606060405260043610610112576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063131018581461011757806318d2efef1461019d578063212e5da1146101e3578063314a522e146102cf5780635969549e146103125780636be39bda146103585780636ea5f93a146103ce57806380da20d4146104025780638dc8a7b2146104795780639758af1e146104a95780639feff4cc146104e8578063a1bc7ef01461050f578063b4045ae914610541578063ba20dda414610594578063cf9df5eb146105fb578063d69dbf63146106eb578063d826f88f14610726578063f0450a5c1461073b578063f6a6189614610781578063f6f494c9146107df575b600080fd5b341561012257600080fd5b61017f600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091905050610846565b60405180826000191660001916815260200191505060405180910390f35b34156101a857600080fd5b6101e160048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506108d5565b005b34156101ee57600080fd5b6102b5600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803560001916906020019091908035906020019091905050610932565b604051808215151515815260200191505060405180910390f35b34156102da57600080fd5b6102f4600480803560001916906020019091905050610afd565b60405180826000191660001916815260200191505060405180910390f35b341561031d57600080fd5b61035660048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b45565b005b341561036357600080fd5b61037d600480803560001916906020019091905050610bf2565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182600019166000191681526020019250505060405180910390f35b34156103d957600080fd5b61040060048080356000191690602001909190803560001916906020019091905050610c80565b005b341561040d57600080fd5b610477600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080356000191690602001909190803560001916906020019091905050610cc4565b005b341561048457600080fd5b6104a7600480803560001916906020019091908035906020019091905050610dee565b005b34156104b457600080fd5b6104ce600480803560001916906020019091905050610e35565b604051808215151515815260200191505060405180910390f35b34156104f357600080fd5b61050d600480803560001916906020019091905050610e9e565b005b341561051a57600080fd5b61053f6004808035600019169060200190919080351515906020019091905050610ee5565b005b341561054c57600080fd5b61059260048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803560001916906020019091905050610f3c565b005b341561059f57600080fd5b6105b9600480803560001916906020019091905050610fda565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561060657600080fd5b6106cd600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803560001916906020019091908035906020019091905050611026565b60405180826000191660001916815260200191505060405180910390f35b34156106f657600080fd5b610710600480803560001916906020019091905050611249565b6040518082815260200191505060405180910390f35b341561073157600080fd5b610739611295565b005b341561074657600080fd5b61077f60048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061158c565b005b341561078c57600080fd5b6107c560048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506115e9565b604051808215151515815260200191505060405180910390f35b34156107ea57600080fd5b610804600480803560001916906020019091905050611692565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60006001836040518082805190602001908083835b602083101515610880578051825260208201915060208101905060208303925061085b565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b61092e6040805190810160405280601081526020017f6765745465726d73436f6e747261637400000000000000000000000000000000815250838373ffffffffffffffffffffffffffffffffffffffff16600102610cc4565b5050565b6000610aef6040805190810160405280600681526020017f696e7365727400000000000000000000000000000000000000000000000000008152508a8a8a8a8a8a8a8a604051808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140183600019166000191681526020018281526020019850505050505050505060405180910390206116de565b905098975050505050505050565b6000610b3e6040805190810160405280601a81526020017f6765745465726d73436f6e7472616374506172616d657465727300000000000081525083610846565b9050919050565b610be46040805190810160405280601181526020017f6d6f6469667942656e656669636961727900000000000000000000000000000081525083836040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140192505050604051809103902061177a565b610bee828261158c565b5050565b600080610c346040805190810160405280601681526020017f6765745465726d735f7465726d73436f6e74726163740000000000000000000081525084610846565b60019004610c776040805190810160405280602081526020017f6765745465726d735f7465726d73436f6e7472616374506172616d657465727381525085610846565b91509150915091565b610cc06040805190810160405280601a81526020017f6765745465726d73436f6e7472616374506172616d65746572730000000000008152508383610cc4565b5050565b6000836040518082805190602001908083835b602083101515610cfc5780518252602082019150602081019050602083039250610cd7565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281610d419190611af4565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b602083101515610d955780518252602082019150602081019050602083039250610d70565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b610e316040805190810160405280601981526020017f67657449737375616e6365426c6f636b54696d657374616d70000000000000008152508383600102610cc4565b5050565b600080610e776040805190810160405280600e81526020017f646f6573456e747279457869737400000000000000000000000000000000000081525084610846565b9050600060010260001916816000191614610e93576001610e96565b60005b915050919050565b610ee26040805190810160405280600681526020017f696e736572740000000000000000000000000000000000000000000000000000815250600060010283610cc4565b50565b610f386040805190810160405280600e81526020017f646f6573456e74727945786973740000000000000000000000000000000000008152508383610f2e576000600102610f33565b600180025b610cc4565b5050565b610f956040805190810160405280601681526020017f6765745465726d735f7465726d73436f6e747261637400000000000000000000815250848473ffffffffffffffffffffffffffffffffffffffff16600102610cc4565b610fd56040805190810160405280602081526020017f6765745465726d735f7465726d73436f6e7472616374506172616d65746572738152508483610cc4565b505050565b600061101b6040805190810160405280600e81526020017f67657442656e656669636961727900000000000000000000000000000000000081525083610846565b600190049050919050565b60008060008a8a8a8a8a8a8a8a604051808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401836000191660001916815260200182815260200198505050505050505050604051809103902091506111e96040805190810160405280600681526020017f696e7365727400000000000000000000000000000000000000000000000000008152508361177a565b61122c6040805190810160405280600681526020017f696e7365727400000000000000000000000000000000000000000000000000008152506000600102610846565b9050611238818b61158c565b809250505098975050505050505050565b600061128a6040805190810160405280601981526020017f67657449737375616e6365426c6f636b54696d657374616d700000000000000081525083610846565b600190049050919050565b600061129f611b20565b600080600093505b600a841015611586576112b86118b3565b84600a811015156112c557fe5b602002015192506000835114151561157957600091505b6000836040518082805190602001908083835b60208310151561131457805182526020820191506020810190506020830392506112ef565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015611501576000836040518082805190602001908083835b60208310151561138a5780518252602082019150602081019050602083039250611365565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020828154811015156113ca57fe5b90600052602060002090015490506002836040518082805190602001908083835b60208310151561141057805182526020820191506020810190506020830392506113eb565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b6020831015156114a4578051825260208201915060208101905060208303925061147f565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600082600019166000191681526020019081526020016000206000905581806001019250506112dc565b6000836040518082805190602001908083835b6020831015156115395780518252602082019150602081019050602083039250611514565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006115789190611b34565b5b83806001019450506112a7565b50505050565b6115e56040805190810160405280600e81526020017f67657442656e6566696369617279000000000000000000000000000000000000815250838373ffffffffffffffffffffffffffffffffffffffff16600102610cc4565b5050565b600061168a6040805190810160405280601181526020017f6d6f6469667942656e656669636961727900000000000000000000000000000081525084846040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019250505060405180910390206116de565b905092915050565b60006116d36040805190810160405280601081526020017f6765745465726d73436f6e74726163740000000000000000000000000000000081525083610846565b600190049050919050565b60006002836040518082805190602001908083835b60208310151561171857805182526020820191506020810190506020830392506116f3565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b60016002836040518082805190602001908083835b6020831015156117b4578051825260208201915060208101905060208303925061178f565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b60208310151561184f578051825260208201915060208101905060208303925061182a565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816118949190611af4565b9160005260206000209001600083909190915090600019169055505050565b6118bb611b55565b610140604051908101604052806040805190810160405280600681526020017f696e73657274000000000000000000000000000000000000000000000000000081525081526020016040805190810160405280601181526020017f6d6f6469667942656e656669636961727900000000000000000000000000000081525081526020016040805190810160405280600e81526020017f67657442656e656669636961727900000000000000000000000000000000000081525081526020016040805190810160405280601681526020017f6765745465726d735f7465726d73436f6e74726163740000000000000000000081525081526020016040805190810160405280602081526020017f6765745465726d735f7465726d73436f6e7472616374506172616d657465727381525081526020016040805190810160405280601081526020017f6765745465726d73436f6e74726163740000000000000000000000000000000081525081526020016040805190810160405280601a81526020017f6765745465726d73436f6e7472616374506172616d657465727300000000000081525081526020016040805190810160405280601981526020017f67657449737375616e6365426c6f636b54696d657374616d700000000000000081525081526020016040805190810160405280600e81526020017f646f6573456e747279457869737400000000000000000000000000000000000081525081526020016020604051908101604052806000815250815250905090565b815481835581811511611b1b57818360005260206000209182019101611b1a9190611b84565b5b505050565b602060405190810160405280600081525090565b5080546000825590600052602060002090810190611b529190611b84565b50565b61014060405190810160405280600a905b611b6e611ba9565b815260200190600190039081611b665790505090565b611ba691905b80821115611ba2576000816000905550600101611b8a565b5090565b90565b6020604051908101604052806000815250905600a165627a7a723058201e90a79a26f6c096d1731ffbf61a123ab6cc589c7ae0e98f1465c95a181984960029", + "deployedBytecode": "0x606060405260043610610112576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063131018581461011757806318d2efef1461019d578063212e5da1146101e3578063314a522e146102cf5780635969549e146103125780636be39bda146103585780636ea5f93a146103ce57806380da20d4146104025780638dc8a7b2146104795780639758af1e146104a95780639feff4cc146104e8578063a1bc7ef01461050f578063b4045ae914610541578063ba20dda414610594578063cf9df5eb146105fb578063d69dbf63146106eb578063d826f88f14610726578063f0450a5c1461073b578063f6a6189614610781578063f6f494c9146107df575b600080fd5b341561012257600080fd5b61017f600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091905050610846565b60405180826000191660001916815260200191505060405180910390f35b34156101a857600080fd5b6101e160048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506108d5565b005b34156101ee57600080fd5b6102b5600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803560001916906020019091908035906020019091905050610932565b604051808215151515815260200191505060405180910390f35b34156102da57600080fd5b6102f4600480803560001916906020019091905050610afd565b60405180826000191660001916815260200191505060405180910390f35b341561031d57600080fd5b61035660048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b45565b005b341561036357600080fd5b61037d600480803560001916906020019091905050610bf2565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182600019166000191681526020019250505060405180910390f35b34156103d957600080fd5b61040060048080356000191690602001909190803560001916906020019091905050610c80565b005b341561040d57600080fd5b610477600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080356000191690602001909190803560001916906020019091905050610cc4565b005b341561048457600080fd5b6104a7600480803560001916906020019091908035906020019091905050610dee565b005b34156104b457600080fd5b6104ce600480803560001916906020019091905050610e35565b604051808215151515815260200191505060405180910390f35b34156104f357600080fd5b61050d600480803560001916906020019091905050610e9e565b005b341561051a57600080fd5b61053f6004808035600019169060200190919080351515906020019091905050610ee5565b005b341561054c57600080fd5b61059260048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803560001916906020019091905050610f3c565b005b341561059f57600080fd5b6105b9600480803560001916906020019091905050610fda565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561060657600080fd5b6106cd600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803560001916906020019091908035906020019091905050611026565b60405180826000191660001916815260200191505060405180910390f35b34156106f657600080fd5b610710600480803560001916906020019091905050611249565b6040518082815260200191505060405180910390f35b341561073157600080fd5b610739611295565b005b341561074657600080fd5b61077f60048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061158c565b005b341561078c57600080fd5b6107c560048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506115e9565b604051808215151515815260200191505060405180910390f35b34156107ea57600080fd5b610804600480803560001916906020019091905050611692565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60006001836040518082805190602001908083835b602083101515610880578051825260208201915060208101905060208303925061085b565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b61092e6040805190810160405280601081526020017f6765745465726d73436f6e747261637400000000000000000000000000000000815250838373ffffffffffffffffffffffffffffffffffffffff16600102610cc4565b5050565b6000610aef6040805190810160405280600681526020017f696e7365727400000000000000000000000000000000000000000000000000008152508a8a8a8a8a8a8a8a604051808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140183600019166000191681526020018281526020019850505050505050505060405180910390206116de565b905098975050505050505050565b6000610b3e6040805190810160405280601a81526020017f6765745465726d73436f6e7472616374506172616d657465727300000000000081525083610846565b9050919050565b610be46040805190810160405280601181526020017f6d6f6469667942656e656669636961727900000000000000000000000000000081525083836040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140192505050604051809103902061177a565b610bee828261158c565b5050565b600080610c346040805190810160405280601681526020017f6765745465726d735f7465726d73436f6e74726163740000000000000000000081525084610846565b60019004610c776040805190810160405280602081526020017f6765745465726d735f7465726d73436f6e7472616374506172616d657465727381525085610846565b91509150915091565b610cc06040805190810160405280601a81526020017f6765745465726d73436f6e7472616374506172616d65746572730000000000008152508383610cc4565b5050565b6000836040518082805190602001908083835b602083101515610cfc5780518252602082019150602081019050602083039250610cd7565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281610d419190611af4565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b602083101515610d955780518252602082019150602081019050602083039250610d70565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b610e316040805190810160405280601981526020017f67657449737375616e6365426c6f636b54696d657374616d70000000000000008152508383600102610cc4565b5050565b600080610e776040805190810160405280600e81526020017f646f6573456e747279457869737400000000000000000000000000000000000081525084610846565b9050600060010260001916816000191614610e93576001610e96565b60005b915050919050565b610ee26040805190810160405280600681526020017f696e736572740000000000000000000000000000000000000000000000000000815250600060010283610cc4565b50565b610f386040805190810160405280600e81526020017f646f6573456e74727945786973740000000000000000000000000000000000008152508383610f2e576000600102610f33565b600180025b610cc4565b5050565b610f956040805190810160405280601681526020017f6765745465726d735f7465726d73436f6e747261637400000000000000000000815250848473ffffffffffffffffffffffffffffffffffffffff16600102610cc4565b610fd56040805190810160405280602081526020017f6765745465726d735f7465726d73436f6e7472616374506172616d65746572738152508483610cc4565b505050565b600061101b6040805190810160405280600e81526020017f67657442656e656669636961727900000000000000000000000000000000000081525083610846565b600190049050919050565b60008060008a8a8a8a8a8a8a8a604051808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401836000191660001916815260200182815260200198505050505050505050604051809103902091506111e96040805190810160405280600681526020017f696e7365727400000000000000000000000000000000000000000000000000008152508361177a565b61122c6040805190810160405280600681526020017f696e7365727400000000000000000000000000000000000000000000000000008152506000600102610846565b9050611238818b61158c565b809250505098975050505050505050565b600061128a6040805190810160405280601981526020017f67657449737375616e6365426c6f636b54696d657374616d700000000000000081525083610846565b600190049050919050565b600061129f611b20565b600080600093505b600a841015611586576112b86118b3565b84600a811015156112c557fe5b602002015192506000835114151561157957600091505b6000836040518082805190602001908083835b60208310151561131457805182526020820191506020810190506020830392506112ef565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015611501576000836040518082805190602001908083835b60208310151561138a5780518252602082019150602081019050602083039250611365565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020828154811015156113ca57fe5b90600052602060002090015490506002836040518082805190602001908083835b60208310151561141057805182526020820191506020810190506020830392506113eb565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b6020831015156114a4578051825260208201915060208101905060208303925061147f565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600082600019166000191681526020019081526020016000206000905581806001019250506112dc565b6000836040518082805190602001908083835b6020831015156115395780518252602082019150602081019050602083039250611514565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006115789190611b34565b5b83806001019450506112a7565b50505050565b6115e56040805190810160405280600e81526020017f67657442656e6566696369617279000000000000000000000000000000000000815250838373ffffffffffffffffffffffffffffffffffffffff16600102610cc4565b5050565b600061168a6040805190810160405280601181526020017f6d6f6469667942656e656669636961727900000000000000000000000000000081525084846040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019250505060405180910390206116de565b905092915050565b60006116d36040805190810160405280601081526020017f6765745465726d73436f6e74726163740000000000000000000000000000000081525083610846565b600190049050919050565b60006002836040518082805190602001908083835b60208310151561171857805182526020820191506020810190506020830392506116f3565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b60016002836040518082805190602001908083835b6020831015156117b4578051825260208201915060208101905060208303925061178f565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b60208310151561184f578051825260208201915060208101905060208303925061182a565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816118949190611af4565b9160005260206000209001600083909190915090600019169055505050565b6118bb611b55565b610140604051908101604052806040805190810160405280600681526020017f696e73657274000000000000000000000000000000000000000000000000000081525081526020016040805190810160405280601181526020017f6d6f6469667942656e656669636961727900000000000000000000000000000081525081526020016040805190810160405280600e81526020017f67657442656e656669636961727900000000000000000000000000000000000081525081526020016040805190810160405280601681526020017f6765745465726d735f7465726d73436f6e74726163740000000000000000000081525081526020016040805190810160405280602081526020017f6765745465726d735f7465726d73436f6e7472616374506172616d657465727381525081526020016040805190810160405280601081526020017f6765745465726d73436f6e74726163740000000000000000000000000000000081525081526020016040805190810160405280601a81526020017f6765745465726d73436f6e7472616374506172616d657465727300000000000081525081526020016040805190810160405280601981526020017f67657449737375616e6365426c6f636b54696d657374616d700000000000000081525081526020016040805190810160405280600e81526020017f646f6573456e747279457869737400000000000000000000000000000000000081525081526020016020604051908101604052806000815250815250905090565b815481835581811511611b1b57818360005260206000209182019101611b1a9190611b84565b5b505050565b602060405190810160405280600081525090565b5080546000825590600052602060002090810190611b529190611b84565b50565b61014060405190810160405280600a905b611b6e611ba9565b815260200190600190039081611b665790505090565b611ba691905b80821115611ba2576000816000905550600101611b8a565b5090565b90565b6020604051908101604052806000815250905600a165627a7a723058201e90a79a26f6c096d1731ffbf61a123ab6cc589c7ae0e98f1465c95a181984960029", "sourceMap": "640:5492:25:-;;;;;;;;;;;;;;;;;", "deployedSourceMap": "640:5492:25:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1294:217:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4525:218:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4749:639;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4112:200;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1534:275;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2759:341;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4318:201;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1018:270:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3895:211:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2023:220;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2421:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2249:166;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3106:356;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1815:202;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;688:840;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3678:211;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1517:610:23;;;;;;;;;;;;;;2565:188:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5394:273;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3468:204;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1294:217:23;1411:24;1458:17;1476:12;1458:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1458:46:23;1490:13;1458:46;;;;;;;;;;;;;;;;;;1451:53;;1294:217;;;;:::o;4525:218:25:-;4664:72;;;;;;;;;;;;;;;;;;;4700:11;4721:13;4713:22;;;;4664:15;:72::i;:::-;4525:218;;:::o;4749:639::-;5071:15;5109:272;;;;;;;;;;;;;;;;;;;5168:8;5190:12;5216:7;5237:12;5263:22;5299:14;5327:24;5365:5;5145:235;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5109:25;:272::i;:::-;5102:279;;4749:639;;;;;;;;;;:::o;4112:200::-;4214:7;4244:61;;;;;;;;;;;;;;;;;;;4293:11;4244:18;:61::i;:::-;4237:68;;4112:200;;;:::o;1534:275::-;1635:95;;;;;;;;;;;;;;;;;;;1701:11;1714:14;1691:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1635:22;:95::i;:::-;1741:61;1774:11;1787:14;1741:32;:61::i;:::-;1534:275;;:::o;2759:341::-;2843:22;2867:32;2944:57;;;;;;;;;;;;;;;;;;;2989:11;2944:18;:57::i;:::-;2936:66;;;3016:67;;;;;;;;;;;;;;;;;;;3071:11;3016:18;:67::i;:::-;2915:178;;;;2759:341;;;:::o;4318:201::-;4446:66;;;;;;;;;;;;;;;;;;;4492:11;4505:6;4446:15;:66::i;:::-;4318:201;;:::o;1018:270:23:-;1155:22;1178:12;1155:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1155:56:23;;;;;;;;;;;:::i;:::-;;;;;;;;;;1197:13;1155:56;;;;;;;;;;;;1270:11;1221:17;1239:12;1221:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1221:46:23;1253:13;1221:46;;;;;;;;;;;;;;;;;:60;;;;;;;1018:270;;;:::o;3895:211:25:-;4022:77;;;;;;;;;;;;;;;;;;;4067:11;4088:9;4080:18;;4022:15;:77::i;:::-;3895:211;;:::o;2023:220::-;2084:4;2100:23;2126:49;;;;;;;;;;;;;;;;;;;2163:11;2126:18;:49::i;:::-;2100:75;;2219:1;2211:10;;2192:29;;;:15;:29;;;;:44;;2232:4;2192:44;;;2224:5;2192:44;2185:51;;2023:220;;;;:::o;2421:138::-;2490:62;;;;;;;;;;;;;;;;;;;697:1:23;689:10;;2540:11:25;2490:15;:62::i;:::-;2421:138;:::o;2249:166::-;2328:80;;;;;;;;;;;;;;;;;;;2362:11;2375:6;:32;;2405:1;2397:10;;2375:32;;;2392:1;2384:10;;2375:32;2328:15;:80::i;:::-;2249:166;;:::o;3106:356::-;3278:78;;;;;;;;;;;;;;;;;;;3320:11;3341:13;3333:22;;;;3278:15;:78::i;:::-;3366:89;;;;;;;;;;;;;;;;;;;3418:11;3431:23;3366:15;:89::i;:::-;3106:356;;;:::o;1815:202::-;1905:24;1960:49;;;;;;;;;;;;;;;;;;;1997:11;1960:18;:49::i;:::-;1952:58;;;1945:65;;1815:202;;;:::o;688:840::-;984:20;1020:21;1348:19;1067:8;1089:12;1115:7;1136:12;1162:22;1198:14;1226:24;1264:5;1044:235;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1020:259;;1290:47;;;;;;;;;;;;;;;;;;;1323:13;1290:22;:47::i;:::-;1370:52;;;;;;;;;;;;;;;;;;;697:1:23;689:10;;1370:18:25;:52::i;:::-;1348:74;;1433:59;1466:11;1479:12;1433:32;:59::i;:::-;1510:11;1503:18;;688:840;;;;;;;;;;;;:::o;3678:211::-;3779:14;3821:60;;;;;;;;;;;;;;;;;;;3869:11;3821:18;:60::i;:::-;3816:66;;;3809:73;;3678:211;;;:::o;1517:610:23:-;1556:6;1595:26;;:::i;:::-;1719:6;1807:21;1565:1;1556:10;;1551:570;1572:2;1568:1;:6;1551:570;;;1624:17;:15;:17::i;:::-;1642:1;1624:20;;;;;;;;;;;;;1595:49;;1693:1;1669:12;1663:26;:31;;1659:452;;;1728:1;1719:10;;1714:321;1735:22;1758:12;1735:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1735:43:23;;;;1731:1;:47;1714:321;;;1831:22;1854:12;1831:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1868:1:23;1831:39;;;;;;;;;;;;;;;;;;;1807:63;;1899:13;1913:12;1899:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1899:42:23;1927:13;1899:42;;;;;;;;;;;;;;;;;;1892:49;;;;;;;;;;;1970:17;1988:12;1970:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1970:46:23;2002:13;1970:46;;;;;;;;;;;;;;;;;1963:53;;;1780:3;;;;;;;1714:321;;;2060:22;2083:12;2060:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;;2053:43:23;;;;:::i;:::-;1659:452;1576:3;;;;;;;1551:570;;;1517:610;;;;:::o;2565:188:25:-;2678:68;;;;;;;;;;;;;;;;;;;2712:11;2733;2725:20;;;;2678:15;:68::i;:::-;2565:188;;:::o;5394:273::-;5524:15;5562:98;;;;;;;;;;;;;;;;;;;5631:11;5644:14;5621:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5562:25;:98::i;:::-;5555:105;;5394:273;;;;:::o;3468:204::-;3560:22;3613:51;;;;;;;;;;;;;;;;;;;3652:11;3613:18;:51::i;:::-;3605:60;;;3598:67;;3468:204;;;:::o;2341:194:23:-;2458:14;2495:13;2509:12;2495:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2495:33:23;2523:4;2495:33;;;;;;;;;;;;;;;;;;;;;;;;;;;2488:40;;2341:194;;;;:::o;2133:202::-;2267:4;2231:13;2245:12;2231:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2231:33:23;2259:4;2231:33;;;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;2281:22;2304:12;2281:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2281:47:23;;;;;;;;;;;:::i;:::-;;;;;;;;;;2323:4;2281:47;;;;;;;;;;;;2133:202;;:::o;5673:457:25:-;5734:24;;:::i;:::-;5774:349;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5673:457;:::o;640:5492::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\nimport \"./MockContract.sol\";\n\n\ncontract MockDebtRegistry is MockContract {\n function insert(\n address _version,\n address _beneficiary,\n address _debtor,\n address _underwriter,\n uint _underwriterRiskRating,\n address _termsContract,\n bytes32 _termsContractParameters,\n uint _salt\n )\n public\n returns (bytes32 _agreementId)\n {\n bytes32 argsSignature = keccak256(\n _version,\n _beneficiary,\n _debtor,\n _underwriter,\n _underwriterRiskRating,\n _termsContract,\n _termsContractParameters,\n _salt\n );\n\n functionCalledWithArgs(\"insert\", argsSignature);\n\n bytes32 agreementId = getMockReturnValue(\"insert\", DEFAULT_SIGNATURE_ARGS);\n\n mockGetBeneficiaryReturnValueFor(agreementId, _beneficiary);\n\n return agreementId;\n }\n\n function modifyBeneficiary(bytes32 agreementId, address newBeneficiary)\n public\n {\n functionCalledWithArgs(\"modifyBeneficiary\",\n keccak256(agreementId, newBeneficiary));\n\n mockGetBeneficiaryReturnValueFor(agreementId, newBeneficiary);\n }\n\n function getBeneficiary(bytes32 agreementId)\n public\n view\n returns (address _mockBeneficiary)\n {\n return address(getMockReturnValue(\"getBeneficiary\", agreementId));\n }\n\n function doesEntryExist(bytes32 agreementId) public returns (bool) {\n bytes32 mockReturnValue = getMockReturnValue(\"doesEntryExist\", agreementId);\n return mockReturnValue == bytes32(0) ? false : true;\n }\n\n function mockDoesEntryExist(bytes32 agreementId, bool exists) public {\n mockReturnValue(\"doesEntryExist\", agreementId, exists ? bytes32(1) : bytes32(0));\n }\n\n function mockInsertReturnValue(bytes32 agreementId) public {\n mockReturnValue(\"insert\", DEFAULT_SIGNATURE_ARGS, agreementId);\n }\n\n function mockGetBeneficiaryReturnValueFor(bytes32 agreementId, address beneficiary)\n public\n {\n mockReturnValue(\"getBeneficiary\", agreementId, bytes32(beneficiary));\n }\n\n function getTerms(bytes32 agreementId)\n public\n view\n returns (address _termsContract, bytes32 _termsContractParameters)\n {\n return (\n address(getMockReturnValue(\"getTerms_termsContract\", agreementId)),\n getMockReturnValue(\"getTerms_termsContractParameters\", agreementId)\n );\n }\n\n function mockGetTermsReturnValueFor(\n bytes32 agreementId,\n address termsContract,\n bytes32 termsContractParameters\n )\n public\n {\n mockReturnValue(\"getTerms_termsContract\", agreementId, bytes32(termsContract));\n mockReturnValue(\"getTerms_termsContractParameters\", agreementId, termsContractParameters);\n }\n\n function getTermsContract(bytes32 agreementId)\n public\n view\n returns (address _termsContract)\n {\n return address(getMockReturnValue(\"getTermsContract\", agreementId));\n }\n\n function getIssuanceBlockTimestamp(bytes32 agreementId)\n public\n view\n returns (uint timestamp)\n {\n return uint(getMockReturnValue(\"getIssuanceBlockTimestamp\", agreementId));\n }\n\n function mockGetIssuanceBlockTimestamp(\n bytes32 agreementId,\n uint timestamp\n )\n public\n {\n mockReturnValue(\"getIssuanceBlockTimestamp\", agreementId, bytes32(timestamp));\n }\n\n function getTermsContractParameters(bytes32 agreementId)\n public\n view\n returns (bytes32)\n {\n return getMockReturnValue(\"getTermsContractParameters\", agreementId);\n }\n\n function mockGetTermsContractParameters(\n bytes32 agreementId,\n bytes32 params\n )\n public\n {\n mockReturnValue(\"getTermsContractParameters\", agreementId, params);\n }\n\n function mockGetTermsContractReturnValueFor(\n bytes32 agreementId,\n address termsContract\n )\n public\n {\n mockReturnValue(\"getTermsContract\", agreementId, bytes32(termsContract));\n }\n\n function wasInsertCalledWith(\n address _version,\n address _beneficiary,\n address _debtor,\n address _underwriter,\n uint _underwriterRiskRating,\n address _termsContract,\n bytes32 _termsContractParameters,\n uint _salt\n )\n public\n view\n returns (bool _wasCalled)\n {\n return wasFunctionCalledWithArgs(\"insert\", keccak256(\n _version,\n _beneficiary,\n _debtor,\n _underwriter,\n _underwriterRiskRating,\n _termsContract,\n _termsContractParameters,\n _salt\n ));\n }\n\n function wasModifyBeneficiaryCalledWith(bytes32 agreementId, address newBeneficiary)\n public\n view\n returns (bool _wasCalled)\n {\n return wasFunctionCalledWithArgs(\"modifyBeneficiary\",\n keccak256(agreementId, newBeneficiary));\n }\n\n function getFunctionList()\n internal\n returns (string[10] functionNames)\n {\n return [\n \"insert\",\n \"modifyBeneficiary\",\n \"getBeneficiary\",\n \"getTerms_termsContract\",\n \"getTerms_termsContractParameters\",\n \"getTermsContract\",\n \"getTermsContractParameters\",\n \"getIssuanceBlockTimestamp\",\n \"doesEntryExist\",\n \"\"\n ];\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockDebtRegistry.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockDebtRegistry.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockDebtRegistry.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockDebtRegistry.sol", "exportedSymbols": { "MockDebtRegistry": [ 11213 @@ -466,7 +466,7 @@ { "attributes": { "SourceUnit": 10693, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockContract.sol", "file": "./MockContract.sol", "scope": 11214, "symbolAliases": [ @@ -5996,7 +5996,7 @@ "42": { "events": {}, "links": {}, - "address": "0x14fd9ddb3cfc7a3fa9c44f910825c0d287be2e34" + "address": "0x7593f653e23985ac6371a1e2d0a681f6e5534007" }, "70": { "events": {}, @@ -6005,5 +6005,5 @@ } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:13:01.024Z" + "updatedAt": "2018-10-09T17:50:01.328Z" } \ No newline at end of file diff --git a/artifacts/json/MockDebtToken.json b/artifacts/json/MockDebtToken.json index 1476095a..93d39292 100644 --- a/artifacts/json/MockDebtToken.json +++ b/artifacts/json/MockDebtToken.json @@ -322,15 +322,15 @@ "type": "function" } ], - "bytecode": "0x6060604052341561000f57600080fd5b6118918061001e6000396000f3006060604052600436106100db576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630e81bd9f146100e0578063131018581461013a57806313d2a2ab146101c05780634f558e79146102025780636352211e1461023d57806380da20d4146102a05780638456cb591461031757806399f105011461032c5780639c0d9c4314610414578063a9059cbb1461044d578063b742f563146104a7578063c6f5407a14610593578063d826f88f146105e4578063e18b2126146105f9578063e55f7fd51461061c575b600080fd5b34156100eb57600080fd5b610120600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610649565b604051808215151515815260200191505060405180910390f35b341561014557600080fd5b6101a2600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091908035600019169060200190919050506106ea565b60405180826000191660001916815260200191505060405180910390f35b34156101cb57600080fd5b610200600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610779565b005b341561020d57600080fd5b61022360048080359060200190919050506107eb565b604051808215151515815260200191505060405180910390f35b341561024857600080fd5b61025e600480803590602001909190505061082c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102ab57600080fd5b610315600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091908035600019169060200190919080356000191690602001909190505061087d565b005b341561032257600080fd5b61032a6109a7565b005b341561033757600080fd5b6103fe600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803560001916906020019091908035906020019091905050610a23565b6040518082815260200191505060405180910390f35b341561041f57600080fd5b61044b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610c3a565b005b341561045857600080fd5b61048d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610ccc565b604051808215151515815260200191505060405180910390f35b34156104b257600080fd5b610579600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803560001916906020019091908035906020019091905050610d6f565b604051808215151515815260200191505060405180910390f35b341561059e57600080fd5b6105ca600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610f3a565b604051808215151515815260200191505060405180910390f35b34156105ef57600080fd5b6105f7610fd2565b005b341561060457600080fd5b61061a60048080359060200190919050506112c9565b005b341561062757600080fd5b61062f611313565b604051808215151515815260200191505060405180910390f35b60006106e26040805190810160405280600881526020017f7472616e736665720000000000000000000000000000000000000000000000008152508484604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040518091039020611394565b905092915050565b60006001836040518082805190602001908083835b60208310151561072457805182526020820191506020810190506020830392506106ff565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b6107e76040805190810160405280600781526020017f6f776e65724f6600000000000000000000000000000000000000000000000000815250836040518082815260200191505060405180910390208373ffffffffffffffffffffffffffffffffffffffff1660010261087d565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff1661080d83611430565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600061083782611430565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561087557600080fd5b809050919050565b6000836040518082805190602001908083835b6020831015156108b55780518252602082019150602081019050602083039250610890565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816108fa919061179c565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b60208310151561094e5780518252602082019150602081019050602083039250610929565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b610a216040805190810160405280600581526020017f70617573650000000000000000000000000000000000000000000000000000008152506000604051808260ff167f01000000000000000000000000000000000000000000000000000000000000000281526001019150506040518091039020611491565b565b6000808989898989898989604051808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140183600019166000191681526020018281526020019850505050505050505060405180910390209050610be46040805190810160405280600681526020017f637265617465000000000000000000000000000000000000000000000000000081525082611491565b610c276040805190810160405280600681526020017f637265617465000000000000000000000000000000000000000000000000000081525060006001026106ea565b6001900491505098975050505050505050565b610cc96040805190810160405280601681526020017f616464417574686f72697a65644d696e744167656e740000000000000000000081525082604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019150506040518091039020611491565b50565b6000610d656040805190810160405280600881526020017f7472616e736665720000000000000000000000000000000000000000000000008152508484604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040518091039020611491565b6001905092915050565b6000610f2c6040805190810160405280600681526020017f63726561746500000000000000000000000000000000000000000000000000008152508a8a8a8a8a8a8a8a604051808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018360001916600019168152602001828152602001985050505050505050506040518091039020611394565b905098975050505050505050565b6000610fcb6040805190810160405280601681526020017f616464417574686f72697a65644d696e744167656e740000000000000000000081525083604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019150506040518091039020611394565b9050919050565b6000610fdc6117c8565b600080600093505b600a8410156112c357610ff56115ca565b84600a8110151561100257fe5b60200201519250600083511415156112b657600091505b6000836040518082805190602001908083835b602083101515611051578051825260208201915060208101905060208303925061102c565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054905082101561123e576000836040518082805190602001908083835b6020831015156110c757805182526020820191506020810190506020830392506110a2565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208281548110151561110757fe5b90600052602060002090015490506002836040518082805190602001908083835b60208310151561114d5780518252602082019150602081019050602083039250611128565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b6020831015156111e157805182526020820191506020810190506020830392506111bc565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050611019565b6000836040518082805190602001908083835b6020831015156112765780518252602082019150602081019050602083039250611251565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006112b591906117dc565b5b8380600101945050610fe4565b50505050565b6113106040805190810160405280600681526020017f637265617465000000000000000000000000000000000000000000000000000081525060006001028360010261087d565b50565b600061138f6040805190810160405280600581526020017f70617573650000000000000000000000000000000000000000000000000000008152506000604051808260ff167f01000000000000000000000000000000000000000000000000000000000000000281526001019150506040518091039020611394565b905090565b60006002836040518082805190602001908083835b6020831015156113ce57805182526020820191506020810190506020830392506113a9565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b60006114866040805190810160405280600781526020017f6f776e65724f6600000000000000000000000000000000000000000000000000815250836040518082815260200191505060405180910390206106ea565b600190049050919050565b60016002836040518082805190602001908083835b6020831015156114cb57805182526020820191506020810190506020830392506114a6565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b6020831015156115665780518252602082019150602081019050602083039250611541565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816115ab919061179c565b9160005260206000209001600083909190915090600019169055505050565b6115d26117fd565b610140604051908101604052806040805190810160405280600681526020017f637265617465000000000000000000000000000000000000000000000000000081525081526020016040805190810160405280600781526020017f6f776e65724f660000000000000000000000000000000000000000000000000081525081526020016040805190810160405280600881526020017f7472616e7366657200000000000000000000000000000000000000000000000081525081526020016040805190810160405280600681526020017f657869737473000000000000000000000000000000000000000000000000000081525081526020016040805190810160405280601681526020017f616464417574686f72697a65644d696e744167656e740000000000000000000081525081526020016040805190810160405280600581526020017f706175736500000000000000000000000000000000000000000000000000000081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b8154818355818115116117c3578183600052602060002091820191016117c2919061182c565b5b505050565b602060405190810160405280600081525090565b50805460008255906000526020600020908101906117fa919061182c565b50565b61014060405190810160405280600a905b611816611851565b81526020019060019003908161180e5790505090565b61184e91905b8082111561184a576000816000905550600101611832565b5090565b90565b6020604051908101604052806000815250905600a165627a7a72305820e9a591eeb6627cf9c13507bc2383976749cd8a371dc32aa5c6aeeb0ac606ef260029", - "deployedBytecode": "0x6060604052600436106100db576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630e81bd9f146100e0578063131018581461013a57806313d2a2ab146101c05780634f558e79146102025780636352211e1461023d57806380da20d4146102a05780638456cb591461031757806399f105011461032c5780639c0d9c4314610414578063a9059cbb1461044d578063b742f563146104a7578063c6f5407a14610593578063d826f88f146105e4578063e18b2126146105f9578063e55f7fd51461061c575b600080fd5b34156100eb57600080fd5b610120600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610649565b604051808215151515815260200191505060405180910390f35b341561014557600080fd5b6101a2600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091908035600019169060200190919050506106ea565b60405180826000191660001916815260200191505060405180910390f35b34156101cb57600080fd5b610200600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610779565b005b341561020d57600080fd5b61022360048080359060200190919050506107eb565b604051808215151515815260200191505060405180910390f35b341561024857600080fd5b61025e600480803590602001909190505061082c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102ab57600080fd5b610315600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091908035600019169060200190919080356000191690602001909190505061087d565b005b341561032257600080fd5b61032a6109a7565b005b341561033757600080fd5b6103fe600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803560001916906020019091908035906020019091905050610a23565b6040518082815260200191505060405180910390f35b341561041f57600080fd5b61044b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610c3a565b005b341561045857600080fd5b61048d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610ccc565b604051808215151515815260200191505060405180910390f35b34156104b257600080fd5b610579600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803560001916906020019091908035906020019091905050610d6f565b604051808215151515815260200191505060405180910390f35b341561059e57600080fd5b6105ca600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610f3a565b604051808215151515815260200191505060405180910390f35b34156105ef57600080fd5b6105f7610fd2565b005b341561060457600080fd5b61061a60048080359060200190919050506112c9565b005b341561062757600080fd5b61062f611313565b604051808215151515815260200191505060405180910390f35b60006106e26040805190810160405280600881526020017f7472616e736665720000000000000000000000000000000000000000000000008152508484604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040518091039020611394565b905092915050565b60006001836040518082805190602001908083835b60208310151561072457805182526020820191506020810190506020830392506106ff565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b6107e76040805190810160405280600781526020017f6f776e65724f6600000000000000000000000000000000000000000000000000815250836040518082815260200191505060405180910390208373ffffffffffffffffffffffffffffffffffffffff1660010261087d565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff1661080d83611430565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600061083782611430565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561087557600080fd5b809050919050565b6000836040518082805190602001908083835b6020831015156108b55780518252602082019150602081019050602083039250610890565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816108fa919061179c565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b60208310151561094e5780518252602082019150602081019050602083039250610929565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b610a216040805190810160405280600581526020017f70617573650000000000000000000000000000000000000000000000000000008152506000604051808260ff167f01000000000000000000000000000000000000000000000000000000000000000281526001019150506040518091039020611491565b565b6000808989898989898989604051808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140183600019166000191681526020018281526020019850505050505050505060405180910390209050610be46040805190810160405280600681526020017f637265617465000000000000000000000000000000000000000000000000000081525082611491565b610c276040805190810160405280600681526020017f637265617465000000000000000000000000000000000000000000000000000081525060006001026106ea565b6001900491505098975050505050505050565b610cc96040805190810160405280601681526020017f616464417574686f72697a65644d696e744167656e740000000000000000000081525082604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019150506040518091039020611491565b50565b6000610d656040805190810160405280600881526020017f7472616e736665720000000000000000000000000000000000000000000000008152508484604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040518091039020611491565b6001905092915050565b6000610f2c6040805190810160405280600681526020017f63726561746500000000000000000000000000000000000000000000000000008152508a8a8a8a8a8a8a8a604051808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018360001916600019168152602001828152602001985050505050505050506040518091039020611394565b905098975050505050505050565b6000610fcb6040805190810160405280601681526020017f616464417574686f72697a65644d696e744167656e740000000000000000000081525083604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019150506040518091039020611394565b9050919050565b6000610fdc6117c8565b600080600093505b600a8410156112c357610ff56115ca565b84600a8110151561100257fe5b60200201519250600083511415156112b657600091505b6000836040518082805190602001908083835b602083101515611051578051825260208201915060208101905060208303925061102c565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054905082101561123e576000836040518082805190602001908083835b6020831015156110c757805182526020820191506020810190506020830392506110a2565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208281548110151561110757fe5b90600052602060002090015490506002836040518082805190602001908083835b60208310151561114d5780518252602082019150602081019050602083039250611128565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b6020831015156111e157805182526020820191506020810190506020830392506111bc565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050611019565b6000836040518082805190602001908083835b6020831015156112765780518252602082019150602081019050602083039250611251565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006112b591906117dc565b5b8380600101945050610fe4565b50505050565b6113106040805190810160405280600681526020017f637265617465000000000000000000000000000000000000000000000000000081525060006001028360010261087d565b50565b600061138f6040805190810160405280600581526020017f70617573650000000000000000000000000000000000000000000000000000008152506000604051808260ff167f01000000000000000000000000000000000000000000000000000000000000000281526001019150506040518091039020611394565b905090565b60006002836040518082805190602001908083835b6020831015156113ce57805182526020820191506020810190506020830392506113a9565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b60006114866040805190810160405280600781526020017f6f776e65724f6600000000000000000000000000000000000000000000000000815250836040518082815260200191505060405180910390206106ea565b600190049050919050565b60016002836040518082805190602001908083835b6020831015156114cb57805182526020820191506020810190506020830392506114a6565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b6020831015156115665780518252602082019150602081019050602083039250611541565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816115ab919061179c565b9160005260206000209001600083909190915090600019169055505050565b6115d26117fd565b610140604051908101604052806040805190810160405280600681526020017f637265617465000000000000000000000000000000000000000000000000000081525081526020016040805190810160405280600781526020017f6f776e65724f660000000000000000000000000000000000000000000000000081525081526020016040805190810160405280600881526020017f7472616e7366657200000000000000000000000000000000000000000000000081525081526020016040805190810160405280600681526020017f657869737473000000000000000000000000000000000000000000000000000081525081526020016040805190810160405280601681526020017f616464417574686f72697a65644d696e744167656e740000000000000000000081525081526020016040805190810160405280600581526020017f706175736500000000000000000000000000000000000000000000000000000081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b8154818355818115116117c3578183600052602060002091820191016117c2919061182c565b5b505050565b602060405190810160405280600081525090565b50805460008255906000526020600020908101906117fa919061182c565b50565b61014060405190810160405280600a905b611816611851565b81526020019060019003908161180e5790505090565b61184e91905b8082111561184a576000816000905550600101611832565b5090565b90565b6020604051908101604052806000815250905600a165627a7a72305820e9a591eeb6627cf9c13507bc2383976749cd8a371dc32aa5c6aeeb0ac606ef260029", + "bytecode": "0x6060604052341561000f57600080fd5b6118918061001e6000396000f3006060604052600436106100db576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630e81bd9f146100e0578063131018581461013a57806313d2a2ab146101c05780634f558e79146102025780636352211e1461023d57806380da20d4146102a05780638456cb591461031757806399f105011461032c5780639c0d9c4314610414578063a9059cbb1461044d578063b742f563146104a7578063c6f5407a14610593578063d826f88f146105e4578063e18b2126146105f9578063e55f7fd51461061c575b600080fd5b34156100eb57600080fd5b610120600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610649565b604051808215151515815260200191505060405180910390f35b341561014557600080fd5b6101a2600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091908035600019169060200190919050506106ea565b60405180826000191660001916815260200191505060405180910390f35b34156101cb57600080fd5b610200600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610779565b005b341561020d57600080fd5b61022360048080359060200190919050506107eb565b604051808215151515815260200191505060405180910390f35b341561024857600080fd5b61025e600480803590602001909190505061082c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102ab57600080fd5b610315600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091908035600019169060200190919080356000191690602001909190505061087d565b005b341561032257600080fd5b61032a6109a7565b005b341561033757600080fd5b6103fe600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803560001916906020019091908035906020019091905050610a23565b6040518082815260200191505060405180910390f35b341561041f57600080fd5b61044b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610c3a565b005b341561045857600080fd5b61048d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610ccc565b604051808215151515815260200191505060405180910390f35b34156104b257600080fd5b610579600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803560001916906020019091908035906020019091905050610d6f565b604051808215151515815260200191505060405180910390f35b341561059e57600080fd5b6105ca600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610f3a565b604051808215151515815260200191505060405180910390f35b34156105ef57600080fd5b6105f7610fd2565b005b341561060457600080fd5b61061a60048080359060200190919050506112c9565b005b341561062757600080fd5b61062f611313565b604051808215151515815260200191505060405180910390f35b60006106e26040805190810160405280600881526020017f7472616e736665720000000000000000000000000000000000000000000000008152508484604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040518091039020611394565b905092915050565b60006001836040518082805190602001908083835b60208310151561072457805182526020820191506020810190506020830392506106ff565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b6107e76040805190810160405280600781526020017f6f776e65724f6600000000000000000000000000000000000000000000000000815250836040518082815260200191505060405180910390208373ffffffffffffffffffffffffffffffffffffffff1660010261087d565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff1661080d83611430565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600061083782611430565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561087557600080fd5b809050919050565b6000836040518082805190602001908083835b6020831015156108b55780518252602082019150602081019050602083039250610890565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816108fa919061179c565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b60208310151561094e5780518252602082019150602081019050602083039250610929565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b610a216040805190810160405280600581526020017f70617573650000000000000000000000000000000000000000000000000000008152506000604051808260ff167f01000000000000000000000000000000000000000000000000000000000000000281526001019150506040518091039020611491565b565b6000808989898989898989604051808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140183600019166000191681526020018281526020019850505050505050505060405180910390209050610be46040805190810160405280600681526020017f637265617465000000000000000000000000000000000000000000000000000081525082611491565b610c276040805190810160405280600681526020017f637265617465000000000000000000000000000000000000000000000000000081525060006001026106ea565b6001900491505098975050505050505050565b610cc96040805190810160405280601681526020017f616464417574686f72697a65644d696e744167656e740000000000000000000081525082604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019150506040518091039020611491565b50565b6000610d656040805190810160405280600881526020017f7472616e736665720000000000000000000000000000000000000000000000008152508484604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040518091039020611491565b6001905092915050565b6000610f2c6040805190810160405280600681526020017f63726561746500000000000000000000000000000000000000000000000000008152508a8a8a8a8a8a8a8a604051808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018360001916600019168152602001828152602001985050505050505050506040518091039020611394565b905098975050505050505050565b6000610fcb6040805190810160405280601681526020017f616464417574686f72697a65644d696e744167656e740000000000000000000081525083604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019150506040518091039020611394565b9050919050565b6000610fdc6117c8565b600080600093505b600a8410156112c357610ff56115ca565b84600a8110151561100257fe5b60200201519250600083511415156112b657600091505b6000836040518082805190602001908083835b602083101515611051578051825260208201915060208101905060208303925061102c565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054905082101561123e576000836040518082805190602001908083835b6020831015156110c757805182526020820191506020810190506020830392506110a2565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208281548110151561110757fe5b90600052602060002090015490506002836040518082805190602001908083835b60208310151561114d5780518252602082019150602081019050602083039250611128565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b6020831015156111e157805182526020820191506020810190506020830392506111bc565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050611019565b6000836040518082805190602001908083835b6020831015156112765780518252602082019150602081019050602083039250611251565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006112b591906117dc565b5b8380600101945050610fe4565b50505050565b6113106040805190810160405280600681526020017f637265617465000000000000000000000000000000000000000000000000000081525060006001028360010261087d565b50565b600061138f6040805190810160405280600581526020017f70617573650000000000000000000000000000000000000000000000000000008152506000604051808260ff167f01000000000000000000000000000000000000000000000000000000000000000281526001019150506040518091039020611394565b905090565b60006002836040518082805190602001908083835b6020831015156113ce57805182526020820191506020810190506020830392506113a9565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b60006114866040805190810160405280600781526020017f6f776e65724f6600000000000000000000000000000000000000000000000000815250836040518082815260200191505060405180910390206106ea565b600190049050919050565b60016002836040518082805190602001908083835b6020831015156114cb57805182526020820191506020810190506020830392506114a6565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b6020831015156115665780518252602082019150602081019050602083039250611541565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816115ab919061179c565b9160005260206000209001600083909190915090600019169055505050565b6115d26117fd565b610140604051908101604052806040805190810160405280600681526020017f637265617465000000000000000000000000000000000000000000000000000081525081526020016040805190810160405280600781526020017f6f776e65724f660000000000000000000000000000000000000000000000000081525081526020016040805190810160405280600881526020017f7472616e7366657200000000000000000000000000000000000000000000000081525081526020016040805190810160405280600681526020017f657869737473000000000000000000000000000000000000000000000000000081525081526020016040805190810160405280601681526020017f616464417574686f72697a65644d696e744167656e740000000000000000000081525081526020016040805190810160405280600581526020017f706175736500000000000000000000000000000000000000000000000000000081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b8154818355818115116117c3578183600052602060002091820191016117c2919061182c565b5b505050565b602060405190810160405280600081525090565b50805460008255906000526020600020908101906117fa919061182c565b50565b61014060405190810160405280600a905b611816611851565b81526020019060019003908161180e5790505090565b61184e91905b8082111561184a576000816000905550600101611832565b5090565b90565b6020604051908101604052806000815250905600a165627a7a72305820028ce1ac7f4a24ee72a10f6bfb6857fae9415a855e6b43a683c6766f5891a5ba0029", + "deployedBytecode": "0x6060604052600436106100db576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630e81bd9f146100e0578063131018581461013a57806313d2a2ab146101c05780634f558e79146102025780636352211e1461023d57806380da20d4146102a05780638456cb591461031757806399f105011461032c5780639c0d9c4314610414578063a9059cbb1461044d578063b742f563146104a7578063c6f5407a14610593578063d826f88f146105e4578063e18b2126146105f9578063e55f7fd51461061c575b600080fd5b34156100eb57600080fd5b610120600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610649565b604051808215151515815260200191505060405180910390f35b341561014557600080fd5b6101a2600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091908035600019169060200190919050506106ea565b60405180826000191660001916815260200191505060405180910390f35b34156101cb57600080fd5b610200600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610779565b005b341561020d57600080fd5b61022360048080359060200190919050506107eb565b604051808215151515815260200191505060405180910390f35b341561024857600080fd5b61025e600480803590602001909190505061082c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102ab57600080fd5b610315600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091908035600019169060200190919080356000191690602001909190505061087d565b005b341561032257600080fd5b61032a6109a7565b005b341561033757600080fd5b6103fe600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803560001916906020019091908035906020019091905050610a23565b6040518082815260200191505060405180910390f35b341561041f57600080fd5b61044b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610c3a565b005b341561045857600080fd5b61048d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610ccc565b604051808215151515815260200191505060405180910390f35b34156104b257600080fd5b610579600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803560001916906020019091908035906020019091905050610d6f565b604051808215151515815260200191505060405180910390f35b341561059e57600080fd5b6105ca600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610f3a565b604051808215151515815260200191505060405180910390f35b34156105ef57600080fd5b6105f7610fd2565b005b341561060457600080fd5b61061a60048080359060200190919050506112c9565b005b341561062757600080fd5b61062f611313565b604051808215151515815260200191505060405180910390f35b60006106e26040805190810160405280600881526020017f7472616e736665720000000000000000000000000000000000000000000000008152508484604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040518091039020611394565b905092915050565b60006001836040518082805190602001908083835b60208310151561072457805182526020820191506020810190506020830392506106ff565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b6107e76040805190810160405280600781526020017f6f776e65724f6600000000000000000000000000000000000000000000000000815250836040518082815260200191505060405180910390208373ffffffffffffffffffffffffffffffffffffffff1660010261087d565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff1661080d83611430565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600061083782611430565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561087557600080fd5b809050919050565b6000836040518082805190602001908083835b6020831015156108b55780518252602082019150602081019050602083039250610890565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816108fa919061179c565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b60208310151561094e5780518252602082019150602081019050602083039250610929565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b610a216040805190810160405280600581526020017f70617573650000000000000000000000000000000000000000000000000000008152506000604051808260ff167f01000000000000000000000000000000000000000000000000000000000000000281526001019150506040518091039020611491565b565b6000808989898989898989604051808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140183600019166000191681526020018281526020019850505050505050505060405180910390209050610be46040805190810160405280600681526020017f637265617465000000000000000000000000000000000000000000000000000081525082611491565b610c276040805190810160405280600681526020017f637265617465000000000000000000000000000000000000000000000000000081525060006001026106ea565b6001900491505098975050505050505050565b610cc96040805190810160405280601681526020017f616464417574686f72697a65644d696e744167656e740000000000000000000081525082604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019150506040518091039020611491565b50565b6000610d656040805190810160405280600881526020017f7472616e736665720000000000000000000000000000000000000000000000008152508484604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040518091039020611491565b6001905092915050565b6000610f2c6040805190810160405280600681526020017f63726561746500000000000000000000000000000000000000000000000000008152508a8a8a8a8a8a8a8a604051808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018360001916600019168152602001828152602001985050505050505050506040518091039020611394565b905098975050505050505050565b6000610fcb6040805190810160405280601681526020017f616464417574686f72697a65644d696e744167656e740000000000000000000081525083604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019150506040518091039020611394565b9050919050565b6000610fdc6117c8565b600080600093505b600a8410156112c357610ff56115ca565b84600a8110151561100257fe5b60200201519250600083511415156112b657600091505b6000836040518082805190602001908083835b602083101515611051578051825260208201915060208101905060208303925061102c565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054905082101561123e576000836040518082805190602001908083835b6020831015156110c757805182526020820191506020810190506020830392506110a2565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208281548110151561110757fe5b90600052602060002090015490506002836040518082805190602001908083835b60208310151561114d5780518252602082019150602081019050602083039250611128565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b6020831015156111e157805182526020820191506020810190506020830392506111bc565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050611019565b6000836040518082805190602001908083835b6020831015156112765780518252602082019150602081019050602083039250611251565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006112b591906117dc565b5b8380600101945050610fe4565b50505050565b6113106040805190810160405280600681526020017f637265617465000000000000000000000000000000000000000000000000000081525060006001028360010261087d565b50565b600061138f6040805190810160405280600581526020017f70617573650000000000000000000000000000000000000000000000000000008152506000604051808260ff167f01000000000000000000000000000000000000000000000000000000000000000281526001019150506040518091039020611394565b905090565b60006002836040518082805190602001908083835b6020831015156113ce57805182526020820191506020810190506020830392506113a9565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b60006114866040805190810160405280600781526020017f6f776e65724f6600000000000000000000000000000000000000000000000000815250836040518082815260200191505060405180910390206106ea565b600190049050919050565b60016002836040518082805190602001908083835b6020831015156114cb57805182526020820191506020810190506020830392506114a6565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b6020831015156115665780518252602082019150602081019050602083039250611541565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816115ab919061179c565b9160005260206000209001600083909190915090600019169055505050565b6115d26117fd565b610140604051908101604052806040805190810160405280600681526020017f637265617465000000000000000000000000000000000000000000000000000081525081526020016040805190810160405280600781526020017f6f776e65724f660000000000000000000000000000000000000000000000000081525081526020016040805190810160405280600881526020017f7472616e7366657200000000000000000000000000000000000000000000000081525081526020016040805190810160405280600681526020017f657869737473000000000000000000000000000000000000000000000000000081525081526020016040805190810160405280601681526020017f616464417574686f72697a65644d696e744167656e740000000000000000000081525081526020016040805190810160405280600581526020017f706175736500000000000000000000000000000000000000000000000000000081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b8154818355818115116117c3578183600052602060002091820191016117c2919061182c565b5b505050565b602060405190810160405280600081525090565b50805460008255906000526020600020908101906117fa919061182c565b50565b61014060405190810160405280600a905b611816611851565b81526020019060019003908161180e5790505090565b61184e91905b8082111561184a576000816000905550600101611832565b5090565b90565b6020604051908101604052806000815250905600a165627a7a72305820028ce1ac7f4a24ee72a10f6bfb6857fae9415a855e6b43a683c6766f5891a5ba0029", "sourceMap": "700:3580:26:-;;;;;;;;;;;;;;;;;", "deployedSourceMap": "700:3580:26:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2477:211;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1294:217:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2904:155:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3065:151;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2694:204;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1018:270:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3606:98:26;;;;;;;;;;;;;;745:725;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3222:151;;;;;;;;;;;;;;;;;;;;;;;;;;;;2276:195;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1632:638;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3379:221;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1517:610:23;;;;;;;;;;;;;;1476:150:26;;;;;;;;;;;;;;;;;;;;;;;;;;3710:164;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2477:211;2581:14;2618:63;;;;;;;;;;;;;;;;;;;2666:3;2671:8;2656:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2618:25;:63::i;:::-;2611:70;;2477:211;;;;:::o;1294:217:23:-;1411:24;1458:17;1476:12;1458:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1458:46:23;1490:13;1458:46;;;;;;;;;;;;;;;;;;1451:53;;1294:217;;;;:::o;2904:155:26:-;2988:64;;;;;;;;;;;;;;;;;;;3025:8;3015:19;;;;;;;;;;;;;;;;;;3044:6;3036:15;;;;2988;:64::i;:::-;2904:155;;:::o;3065:151::-;3141:12;3207:1;3176:33;;:19;3186:8;3176:9;:19::i;:::-;:33;;;;3169:40;;3065:151;;;:::o;2694:204::-;2771:14;2810:19;2820:8;2810:9;:19::i;:::-;2801:28;;2865:1;2847:20;;:6;:20;;;;2839:29;;;;;;;;2885:6;2878:13;;2694:204;;;:::o;1018:270:23:-;1155:22;1178:12;1155:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1155:56:23;;;;;;;;;;;:::i;:::-;;;;;;;;;;1197:13;1155:56;;;;;;;;;;;;1270:11;1221:17;1239:12;1221:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1221:46:23;1253:13;1221:46;;;;;;;;;;;;;;;;;:60;;;;;;;1018:270;;;:::o;3606:98:26:-;3652:45;;;;;;;;;;;;;;;;;;;3694:1;3684:12;;;;;;;;;;;;;;;;;;;;;;3652:22;:45::i;:::-;3606:98::o;745:725::-;1041:13;1070:21;1117:8;1139:12;1165:7;1186:12;1212:22;1248:14;1276:24;1314:5;1094:235;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1070:259;;1340:47;;;;;;;;;;;;;;;;;;;1373:13;1340:22;:47::i;:::-;1410:52;;;;;;;;;;;;;;;;;;;697:1:23;689:10;;1410:18:26;:52::i;:::-;1405:58;;;1398:65;;745:725;;;;;;;;;;;:::o;3222:151::-;3299:67;;;;;;;;;;;;;;;;;;;3358:6;3348:17;;;;;;;;;;;;;;;;;;;;;;;;3299:22;:67::i;:::-;3222:151;:::o;2276:195::-;2354:12;2382:60;;;;;;;;;;;;;;;;;;;2427:3;2432:8;2417:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2382:22;:60::i;:::-;2460:4;2453:11;;2276:195;;;;:::o;1632:638::-;1954:14;1991:272;;;;;;;;;;;;;;;;;;;2050:8;2072:12;2098:7;2119:12;2145:22;2181:14;2209:24;2247:5;2027:235;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1991:25;:272::i;:::-;1984:279;;1632:638;;;;;;;;;;:::o;3379:221::-;3485:15;3523:70;;;;;;;;;;;;;;;;;;;3585:6;3575:17;;;;;;;;;;;;;;;;;;;;;;;;3523:25;:70::i;:::-;3516:77;;3379:221;;;:::o;1517:610:23:-;1556:6;1595:26;;:::i;:::-;1719:6;1807:21;1565:1;1556:10;;1551:570;1572:2;1568:1;:6;1551:570;;;1624:17;:15;:17::i;:::-;1642:1;1624:20;;;;;;;;;;;;;1595:49;;1693:1;1669:12;1663:26;:31;;1659:452;;;1728:1;1719:10;;1714:321;1735:22;1758:12;1735:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1735:43:23;;;;1731:1;:47;1714:321;;;1831:22;1854:12;1831:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1868:1:23;1831:39;;;;;;;;;;;;;;;;;;;1807:63;;1899:13;1913:12;1899:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1899:42:23;1927:13;1899:42;;;;;;;;;;;;;;;;;;1892:49;;;;;;;;;;;1970:17;1988:12;1970:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1970:46:23;2002:13;1970:46;;;;;;;;;;;;;;;;;1963:53;;;1780:3;;;;;;;1714:321;;;2060:22;2083:12;2060:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;;2053:43:23;;;;:::i;:::-;1659:452;1576:3;;;;;;;1551:570;;;1517:610;;;;:::o;1476:150:26:-;1551:68;;;;;;;;;;;;;;;;;;;697:1:23;689:10;;1609:8:26;1601:17;;1551:15;:68::i;:::-;1476:150;:::o;3710:164::-;3781:15;3819:48;;;;;;;;;;;;;;;;;;;3864:1;3854:12;;;;;;;;;;;;;;;;;;;;;;3819:25;:48::i;:::-;3812:55;;3710:164;:::o;2341:194:23:-;2458:14;2495:13;2509:12;2495:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2495:33:23;2523:4;2495:33;;;;;;;;;;;;;;;;;;;;;;;;;;;2488:40;;2341:194;;;;:::o;3880:183:26:-;3960:14;4005:50;;;;;;;;;;;;;;;;;;;4045:8;4035:19;;;;;;;;;;;;;;;;;;4005:18;:50::i;:::-;3997:59;;;3990:66;;3880:183;;;:::o;2133:202:23:-;2267:4;2231:13;2245:12;2231:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2231:33:23;2259:4;2231:33;;;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;2281:22;2304:12;2281:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2281:47:23;;;;;;;;;;;:::i;:::-;;;;;;;;;;2323:4;2281:47;;;;;;;;;;;;2133:202;;:::o;4069:209:26:-;4130:24;;:::i;:::-;4170:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4069:209;:::o;700:3580::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\nimport \"./MockContract.sol\";\nimport \"zeppelin-solidity/contracts/token/ERC20/ERC20.sol\";\n\n\ncontract MockDebtToken is MockContract {\n function create(\n address _version,\n address _beneficiary,\n address _debtor,\n address _underwriter,\n uint _underwriterRiskRating,\n address _termsContract,\n bytes32 _termsContractParameters,\n uint _salt\n )\n public\n returns (uint _tokenId)\n {\n bytes32 argsSignature = keccak256(\n _version,\n _beneficiary,\n _debtor,\n _underwriter,\n _underwriterRiskRating,\n _termsContract,\n _termsContractParameters,\n _salt\n );\n\n functionCalledWithArgs(\"create\", argsSignature);\n\n return uint(getMockReturnValue(\"create\", DEFAULT_SIGNATURE_ARGS));\n }\n\n function mockCreateReturnValue(uint _tokenId)\n public\n {\n mockReturnValue(\"create\", DEFAULT_SIGNATURE_ARGS, bytes32(_tokenId));\n }\n\n function wasCreateCalledWith(\n address _version,\n address _beneficiary,\n address _debtor,\n address _underwriter,\n uint _underwriterRiskRating,\n address _termsContract,\n bytes32 _termsContractParameters,\n uint _salt\n )\n public\n view\n returns (bool wasCalled)\n {\n return wasFunctionCalledWithArgs(\"create\", keccak256(\n _version,\n _beneficiary,\n _debtor,\n _underwriter,\n _underwriterRiskRating,\n _termsContract,\n _termsContractParameters,\n _salt\n ));\n }\n\n function transfer(address _to, uint _tokenId)\n public\n returns (bool success)\n {\n functionCalledWithArgs(\"transfer\", keccak256(_to, _tokenId));\n\n return true;\n }\n\n function wasTransferCalledWith(address _to, uint _tokenId)\n public\n view\n returns (bool wasCalled)\n {\n return wasFunctionCalledWithArgs(\"transfer\", keccak256(_to, _tokenId));\n }\n\n function ownerOf(uint _tokenId)\n public\n view\n returns (address _owner)\n {\n _owner = _getOwner(_tokenId);\n require(_owner != address(0));\n return _owner;\n }\n\n function mockOwnerOfFor(uint _tokenId, address _owner)\n public\n {\n mockReturnValue(\"ownerOf\", keccak256(_tokenId), bytes32(_owner));\n }\n\n function exists(uint _tokenId)\n public\n view\n returns (bool _exists)\n {\n return _getOwner(_tokenId) != address(0);\n }\n\n function addAuthorizedMintAgent(address _agent)\n public\n {\n functionCalledWithArgs(\"addAuthorizedMintAgent\", keccak256(_agent));\n }\n\n function wasAddAuthorizedMintAgentCalledWith(address _agent)\n public\n view\n returns (bool _wasCalled)\n {\n return wasFunctionCalledWithArgs(\"addAuthorizedMintAgent\", keccak256(_agent));\n }\n\n function pause()\n public\n {\n functionCalledWithArgs(\"pause\", keccak256(0));\n }\n\n function wasPauseCalled()\n public\n view\n returns (bool _wasCalled)\n {\n return wasFunctionCalledWithArgs(\"pause\", keccak256(0));\n }\n\n function _getOwner(uint _tokenId)\n private\n view\n returns (address _owner)\n {\n return address(getMockReturnValue(\"ownerOf\", keccak256(_tokenId)));\n }\n\n function getFunctionList()\n internal\n returns (string[10] functionNames)\n {\n return [\"create\", \"ownerOf\", \"transfer\", \"exists\", \"addAuthorizedMintAgent\", \"pause\", \"\", \"\", \"\", \"\"];\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockDebtToken.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockDebtToken.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockDebtToken.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockDebtToken.sol", "exportedSymbols": { "MockDebtToken": [ 11502 @@ -353,7 +353,7 @@ { "attributes": { "SourceUnit": 10693, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockContract.sol", "file": "./MockContract.sol", "scope": 11503, "symbolAliases": [ @@ -4598,7 +4598,7 @@ "42": { "events": {}, "links": {}, - "address": "0x124529e78bd31b7c187b7bc69069d5cbbebceb70" + "address": "0xf655449119757b6fd26c45702718812dbbd51356" }, "70": { "events": {}, @@ -4607,5 +4607,5 @@ } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:13:01.030Z" + "updatedAt": "2018-10-09T17:50:01.286Z" } \ No newline at end of file diff --git a/artifacts/json/MockERC20Token.json b/artifacts/json/MockERC20Token.json index c4e4492b..626675d8 100644 --- a/artifacts/json/MockERC20Token.json +++ b/artifacts/json/MockERC20Token.json @@ -284,15 +284,15 @@ "type": "function" } ], - "bytecode": "0x6060604052341561000f57600080fd5b6115458061001e6000396000f3006060604052600436106100c5576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063095ea7b3146100ca5780630e81bd9f14610124578063131018581461017e57806323b872dd1461020457806351d5d7a91461027d57806370a08231146102bf578063771a70091461030c57806380da20d414610385578063a9059cbb146103fc578063b801982014610456578063d826f88f146104b0578063dd62ed3e146104c5578063e39ff13d14610531575b600080fd5b34156100d557600080fd5b61010a600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610592565b604051808215151515815260200191505060405180910390f35b341561012f57600080fd5b610164600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610635565b604051808215151515815260200191505060405180910390f35b341561018957600080fd5b6101e6600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091905050610687565b60405180826000191660001916815260200191505060405180910390f35b341561020f57600080fd5b610263600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610716565b604051808215151515815260200191505060405180910390f35b341561028857600080fd5b6102bd600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061076c565b005b34156102ca57600080fd5b6102f6600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610803565b6040518082815260200191505060405180910390f35b341561031757600080fd5b61036b600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061089f565b604051808215151515815260200191505060405180910390f35b341561039057600080fd5b6103fa600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091908035600019169060200190919050506108f3565b005b341561040757600080fd5b61043c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610a1d565b604051808215151515815260200191505060405180910390f35b341561046157600080fd5b610496600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610a71565b604051808215151515815260200191505060405180910390f35b34156104bb57600080fd5b6104c3610b12565b005b34156104d057600080fd5b61051b600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610e09565b6040518082815260200191505060405180910390f35b341561053c57600080fd5b610590600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610ee9565b005b600061062b6040805190810160405280600781526020017f617070726f7665000000000000000000000000000000000000000000000000008152508484604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040518091039020610fc4565b6001905092915050565b600061067f6040805190810160405280600881526020017f7472616e7366657200000000000000000000000000000000000000000000000081525061067a85856110fd565b611160565b905092915050565b60006001836040518082805190602001908083835b6020831015156106c1578051825260208201915060208101905060208303925061069c565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b60006107616040805190810160405280600c81526020017f7472616e7366657246726f6d000000000000000000000000000000000000000081525061075c8686866111fc565b610fc4565b600190509392505050565b6107ff6040805190810160405280600981526020017f62616c616e63654f66000000000000000000000000000000000000000000000081525083604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019150506040518091039020836001026108f3565b5050565b60006108946040805190810160405280600981526020017f62616c616e63654f66000000000000000000000000000000000000000000000081525083604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019150506040518091039020610687565b600190049050919050565b60006108ea6040805190810160405280600c81526020017f7472616e7366657246726f6d00000000000000000000000000000000000000008152506108e58686866111fc565b611160565b90509392505050565b6000836040518082805190602001908083835b60208310151561092b5780518252602082019150602081019050602083039250610906565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816109709190611450565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b6020831015156109c4578051825260208201915060208101905060208303925061099f565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b6000610a676040805190810160405280600881526020017f7472616e73666572000000000000000000000000000000000000000000000000815250610a6285856110fd565b610fc4565b6001905092915050565b6000610b0a6040805190810160405280600781526020017f617070726f7665000000000000000000000000000000000000000000000000008152508484604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040518091039020611160565b905092915050565b6000610b1c61147c565b600080600093505b600a841015610e0357610b356112a3565b84600a81101515610b4257fe5b6020020151925060008351141515610df657600091505b6000836040518082805190602001908083835b602083101515610b915780518252602082019150602081019050602083039250610b6c565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015610d7e576000836040518082805190602001908083835b602083101515610c075780518252602082019150602081019050602083039250610be2565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902082815481101515610c4757fe5b90600052602060002090015490506002836040518082805190602001908083835b602083101515610c8d5780518252602082019150602081019050602083039250610c68565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b602083101515610d215780518252602082019150602081019050602083039250610cfc565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050610b59565b6000836040518082805190602001908083835b602083101515610db65780518252602082019150602081019050602083039250610d91565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000610df59190611490565b5b8380600101945050610b24565b50505050565b6000610edd6040805190810160405280600981526020017f616c6c6f77616e636500000000000000000000000000000000000000000000008152508484604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040518091039020610687565b60019004905092915050565b610fbf6040805190810160405280600981526020017f616c6c6f77616e636500000000000000000000000000000000000000000000008152508484604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040518091039020836001026108f3565b505050565b60016002836040518082805190602001908083835b602083101515610ffe5780518252602082019150602081019050602083039250610fd9565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b6020831015156110995780518252602082019150602081019050602083039250611074565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816110de9190611450565b9160005260206000209001600083909190915090600019169055505050565b60008282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040518091039020905092915050565b60006002836040518082805190602001908083835b60208310151561119a5780518252602082019150602081019050602083039250611175565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b6000838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018281526020019350505050604051809103902090509392505050565b6112ab6114b1565b610140604051908101604052806040805190810160405280600881526020017f7472616e7366657200000000000000000000000000000000000000000000000081525081526020016040805190810160405280600c81526020017f7472616e7366657246726f6d000000000000000000000000000000000000000081525081526020016040805190810160405280600981526020017f616c6c6f77616e6365000000000000000000000000000000000000000000000081525081526020016040805190810160405280600981526020017f62616c616e63654f66000000000000000000000000000000000000000000000081525081526020016040805190810160405280600781526020017f617070726f7665000000000000000000000000000000000000000000000000008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b8154818355818115116114775781836000526020600020918201910161147691906114e0565b5b505050565b602060405190810160405280600081525090565b50805460008255906000526020600020908101906114ae91906114e0565b50565b61014060405190810160405280600a905b6114ca611505565b8152602001906001900390816114c25790505090565b61150291905b808211156114fe5760008160009055506001016114e6565b5090565b90565b6020604051908101604052806000815250905600a165627a7a723058203243120a9ee1d87f90fb2ad2c659e9eb6e76bf3bf337b36db4011ccf7792f95f0029", - "deployedBytecode": "0x6060604052600436106100c5576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063095ea7b3146100ca5780630e81bd9f14610124578063131018581461017e57806323b872dd1461020457806351d5d7a91461027d57806370a08231146102bf578063771a70091461030c57806380da20d414610385578063a9059cbb146103fc578063b801982014610456578063d826f88f146104b0578063dd62ed3e146104c5578063e39ff13d14610531575b600080fd5b34156100d557600080fd5b61010a600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610592565b604051808215151515815260200191505060405180910390f35b341561012f57600080fd5b610164600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610635565b604051808215151515815260200191505060405180910390f35b341561018957600080fd5b6101e6600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091905050610687565b60405180826000191660001916815260200191505060405180910390f35b341561020f57600080fd5b610263600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610716565b604051808215151515815260200191505060405180910390f35b341561028857600080fd5b6102bd600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061076c565b005b34156102ca57600080fd5b6102f6600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610803565b6040518082815260200191505060405180910390f35b341561031757600080fd5b61036b600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061089f565b604051808215151515815260200191505060405180910390f35b341561039057600080fd5b6103fa600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091908035600019169060200190919050506108f3565b005b341561040757600080fd5b61043c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610a1d565b604051808215151515815260200191505060405180910390f35b341561046157600080fd5b610496600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610a71565b604051808215151515815260200191505060405180910390f35b34156104bb57600080fd5b6104c3610b12565b005b34156104d057600080fd5b61051b600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610e09565b6040518082815260200191505060405180910390f35b341561053c57600080fd5b610590600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610ee9565b005b600061062b6040805190810160405280600781526020017f617070726f7665000000000000000000000000000000000000000000000000008152508484604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040518091039020610fc4565b6001905092915050565b600061067f6040805190810160405280600881526020017f7472616e7366657200000000000000000000000000000000000000000000000081525061067a85856110fd565b611160565b905092915050565b60006001836040518082805190602001908083835b6020831015156106c1578051825260208201915060208101905060208303925061069c565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b60006107616040805190810160405280600c81526020017f7472616e7366657246726f6d000000000000000000000000000000000000000081525061075c8686866111fc565b610fc4565b600190509392505050565b6107ff6040805190810160405280600981526020017f62616c616e63654f66000000000000000000000000000000000000000000000081525083604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019150506040518091039020836001026108f3565b5050565b60006108946040805190810160405280600981526020017f62616c616e63654f66000000000000000000000000000000000000000000000081525083604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019150506040518091039020610687565b600190049050919050565b60006108ea6040805190810160405280600c81526020017f7472616e7366657246726f6d00000000000000000000000000000000000000008152506108e58686866111fc565b611160565b90509392505050565b6000836040518082805190602001908083835b60208310151561092b5780518252602082019150602081019050602083039250610906565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816109709190611450565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b6020831015156109c4578051825260208201915060208101905060208303925061099f565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b6000610a676040805190810160405280600881526020017f7472616e73666572000000000000000000000000000000000000000000000000815250610a6285856110fd565b610fc4565b6001905092915050565b6000610b0a6040805190810160405280600781526020017f617070726f7665000000000000000000000000000000000000000000000000008152508484604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040518091039020611160565b905092915050565b6000610b1c61147c565b600080600093505b600a841015610e0357610b356112a3565b84600a81101515610b4257fe5b6020020151925060008351141515610df657600091505b6000836040518082805190602001908083835b602083101515610b915780518252602082019150602081019050602083039250610b6c565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015610d7e576000836040518082805190602001908083835b602083101515610c075780518252602082019150602081019050602083039250610be2565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902082815481101515610c4757fe5b90600052602060002090015490506002836040518082805190602001908083835b602083101515610c8d5780518252602082019150602081019050602083039250610c68565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b602083101515610d215780518252602082019150602081019050602083039250610cfc565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050610b59565b6000836040518082805190602001908083835b602083101515610db65780518252602082019150602081019050602083039250610d91565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000610df59190611490565b5b8380600101945050610b24565b50505050565b6000610edd6040805190810160405280600981526020017f616c6c6f77616e636500000000000000000000000000000000000000000000008152508484604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040518091039020610687565b60019004905092915050565b610fbf6040805190810160405280600981526020017f616c6c6f77616e636500000000000000000000000000000000000000000000008152508484604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040518091039020836001026108f3565b505050565b60016002836040518082805190602001908083835b602083101515610ffe5780518252602082019150602081019050602083039250610fd9565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b6020831015156110995780518252602082019150602081019050602083039250611074565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816110de9190611450565b9160005260206000209001600083909190915090600019169055505050565b60008282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040518091039020905092915050565b60006002836040518082805190602001908083835b60208310151561119a5780518252602082019150602081019050602083039250611175565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b6000838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018281526020019350505050604051809103902090509392505050565b6112ab6114b1565b610140604051908101604052806040805190810160405280600881526020017f7472616e7366657200000000000000000000000000000000000000000000000081525081526020016040805190810160405280600c81526020017f7472616e7366657246726f6d000000000000000000000000000000000000000081525081526020016040805190810160405280600981526020017f616c6c6f77616e6365000000000000000000000000000000000000000000000081525081526020016040805190810160405280600981526020017f62616c616e63654f66000000000000000000000000000000000000000000000081525081526020016040805190810160405280600781526020017f617070726f7665000000000000000000000000000000000000000000000000008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b8154818355818115116114775781836000526020600020918201910161147691906114e0565b5b505050565b602060405190810160405280600081525090565b50805460008255906000526020600020908101906114ae91906114e0565b50565b61014060405190810160405280600a905b6114ca611505565b8152602001906001900390816114c25790505090565b61150291905b808211156114fe5760008160009055506001016114e6565b5090565b90565b6020604051908101604052806000815250905600a165627a7a723058203243120a9ee1d87f90fb2ad2c659e9eb6e76bf3bf337b36db4011ccf7792f95f0029", + "bytecode": "0x6060604052341561000f57600080fd5b6115458061001e6000396000f3006060604052600436106100c5576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063095ea7b3146100ca5780630e81bd9f14610124578063131018581461017e57806323b872dd1461020457806351d5d7a91461027d57806370a08231146102bf578063771a70091461030c57806380da20d414610385578063a9059cbb146103fc578063b801982014610456578063d826f88f146104b0578063dd62ed3e146104c5578063e39ff13d14610531575b600080fd5b34156100d557600080fd5b61010a600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610592565b604051808215151515815260200191505060405180910390f35b341561012f57600080fd5b610164600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610635565b604051808215151515815260200191505060405180910390f35b341561018957600080fd5b6101e6600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091905050610687565b60405180826000191660001916815260200191505060405180910390f35b341561020f57600080fd5b610263600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610716565b604051808215151515815260200191505060405180910390f35b341561028857600080fd5b6102bd600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061076c565b005b34156102ca57600080fd5b6102f6600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610803565b6040518082815260200191505060405180910390f35b341561031757600080fd5b61036b600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061089f565b604051808215151515815260200191505060405180910390f35b341561039057600080fd5b6103fa600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091908035600019169060200190919050506108f3565b005b341561040757600080fd5b61043c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610a1d565b604051808215151515815260200191505060405180910390f35b341561046157600080fd5b610496600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610a71565b604051808215151515815260200191505060405180910390f35b34156104bb57600080fd5b6104c3610b12565b005b34156104d057600080fd5b61051b600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610e09565b6040518082815260200191505060405180910390f35b341561053c57600080fd5b610590600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610ee9565b005b600061062b6040805190810160405280600781526020017f617070726f7665000000000000000000000000000000000000000000000000008152508484604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040518091039020610fc4565b6001905092915050565b600061067f6040805190810160405280600881526020017f7472616e7366657200000000000000000000000000000000000000000000000081525061067a85856110fd565b611160565b905092915050565b60006001836040518082805190602001908083835b6020831015156106c1578051825260208201915060208101905060208303925061069c565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b60006107616040805190810160405280600c81526020017f7472616e7366657246726f6d000000000000000000000000000000000000000081525061075c8686866111fc565b610fc4565b600190509392505050565b6107ff6040805190810160405280600981526020017f62616c616e63654f66000000000000000000000000000000000000000000000081525083604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019150506040518091039020836001026108f3565b5050565b60006108946040805190810160405280600981526020017f62616c616e63654f66000000000000000000000000000000000000000000000081525083604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019150506040518091039020610687565b600190049050919050565b60006108ea6040805190810160405280600c81526020017f7472616e7366657246726f6d00000000000000000000000000000000000000008152506108e58686866111fc565b611160565b90509392505050565b6000836040518082805190602001908083835b60208310151561092b5780518252602082019150602081019050602083039250610906565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816109709190611450565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b6020831015156109c4578051825260208201915060208101905060208303925061099f565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b6000610a676040805190810160405280600881526020017f7472616e73666572000000000000000000000000000000000000000000000000815250610a6285856110fd565b610fc4565b6001905092915050565b6000610b0a6040805190810160405280600781526020017f617070726f7665000000000000000000000000000000000000000000000000008152508484604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040518091039020611160565b905092915050565b6000610b1c61147c565b600080600093505b600a841015610e0357610b356112a3565b84600a81101515610b4257fe5b6020020151925060008351141515610df657600091505b6000836040518082805190602001908083835b602083101515610b915780518252602082019150602081019050602083039250610b6c565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015610d7e576000836040518082805190602001908083835b602083101515610c075780518252602082019150602081019050602083039250610be2565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902082815481101515610c4757fe5b90600052602060002090015490506002836040518082805190602001908083835b602083101515610c8d5780518252602082019150602081019050602083039250610c68565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b602083101515610d215780518252602082019150602081019050602083039250610cfc565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050610b59565b6000836040518082805190602001908083835b602083101515610db65780518252602082019150602081019050602083039250610d91565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000610df59190611490565b5b8380600101945050610b24565b50505050565b6000610edd6040805190810160405280600981526020017f616c6c6f77616e636500000000000000000000000000000000000000000000008152508484604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040518091039020610687565b60019004905092915050565b610fbf6040805190810160405280600981526020017f616c6c6f77616e636500000000000000000000000000000000000000000000008152508484604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040518091039020836001026108f3565b505050565b60016002836040518082805190602001908083835b602083101515610ffe5780518252602082019150602081019050602083039250610fd9565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b6020831015156110995780518252602082019150602081019050602083039250611074565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816110de9190611450565b9160005260206000209001600083909190915090600019169055505050565b60008282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040518091039020905092915050565b60006002836040518082805190602001908083835b60208310151561119a5780518252602082019150602081019050602083039250611175565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b6000838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018281526020019350505050604051809103902090509392505050565b6112ab6114b1565b610140604051908101604052806040805190810160405280600881526020017f7472616e7366657200000000000000000000000000000000000000000000000081525081526020016040805190810160405280600c81526020017f7472616e7366657246726f6d000000000000000000000000000000000000000081525081526020016040805190810160405280600981526020017f616c6c6f77616e6365000000000000000000000000000000000000000000000081525081526020016040805190810160405280600981526020017f62616c616e63654f66000000000000000000000000000000000000000000000081525081526020016040805190810160405280600781526020017f617070726f7665000000000000000000000000000000000000000000000000008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b8154818355818115116114775781836000526020600020918201910161147691906114e0565b5b505050565b602060405190810160405280600081525090565b50805460008255906000526020600020908101906114ae91906114e0565b50565b61014060405190810160405280600a905b6114ca611505565b8152602001906001900390816114c25790505090565b61150291905b808211156114fe5760008160009055506001016114e6565b5090565b90565b6020604051908101604052806000815250905600a165627a7a72305820ea49beef342ccd0dc6fb5abf2f9b3ba8250f340e67e663b88b3d0af1f776c76b0029", + "deployedBytecode": "0x6060604052600436106100c5576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063095ea7b3146100ca5780630e81bd9f14610124578063131018581461017e57806323b872dd1461020457806351d5d7a91461027d57806370a08231146102bf578063771a70091461030c57806380da20d414610385578063a9059cbb146103fc578063b801982014610456578063d826f88f146104b0578063dd62ed3e146104c5578063e39ff13d14610531575b600080fd5b34156100d557600080fd5b61010a600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610592565b604051808215151515815260200191505060405180910390f35b341561012f57600080fd5b610164600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610635565b604051808215151515815260200191505060405180910390f35b341561018957600080fd5b6101e6600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091905050610687565b60405180826000191660001916815260200191505060405180910390f35b341561020f57600080fd5b610263600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610716565b604051808215151515815260200191505060405180910390f35b341561028857600080fd5b6102bd600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061076c565b005b34156102ca57600080fd5b6102f6600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610803565b6040518082815260200191505060405180910390f35b341561031757600080fd5b61036b600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061089f565b604051808215151515815260200191505060405180910390f35b341561039057600080fd5b6103fa600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091908035600019169060200190919050506108f3565b005b341561040757600080fd5b61043c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610a1d565b604051808215151515815260200191505060405180910390f35b341561046157600080fd5b610496600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610a71565b604051808215151515815260200191505060405180910390f35b34156104bb57600080fd5b6104c3610b12565b005b34156104d057600080fd5b61051b600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610e09565b6040518082815260200191505060405180910390f35b341561053c57600080fd5b610590600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610ee9565b005b600061062b6040805190810160405280600781526020017f617070726f7665000000000000000000000000000000000000000000000000008152508484604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040518091039020610fc4565b6001905092915050565b600061067f6040805190810160405280600881526020017f7472616e7366657200000000000000000000000000000000000000000000000081525061067a85856110fd565b611160565b905092915050565b60006001836040518082805190602001908083835b6020831015156106c1578051825260208201915060208101905060208303925061069c565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b60006107616040805190810160405280600c81526020017f7472616e7366657246726f6d000000000000000000000000000000000000000081525061075c8686866111fc565b610fc4565b600190509392505050565b6107ff6040805190810160405280600981526020017f62616c616e63654f66000000000000000000000000000000000000000000000081525083604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019150506040518091039020836001026108f3565b5050565b60006108946040805190810160405280600981526020017f62616c616e63654f66000000000000000000000000000000000000000000000081525083604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019150506040518091039020610687565b600190049050919050565b60006108ea6040805190810160405280600c81526020017f7472616e7366657246726f6d00000000000000000000000000000000000000008152506108e58686866111fc565b611160565b90509392505050565b6000836040518082805190602001908083835b60208310151561092b5780518252602082019150602081019050602083039250610906565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816109709190611450565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b6020831015156109c4578051825260208201915060208101905060208303925061099f565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b6000610a676040805190810160405280600881526020017f7472616e73666572000000000000000000000000000000000000000000000000815250610a6285856110fd565b610fc4565b6001905092915050565b6000610b0a6040805190810160405280600781526020017f617070726f7665000000000000000000000000000000000000000000000000008152508484604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040518091039020611160565b905092915050565b6000610b1c61147c565b600080600093505b600a841015610e0357610b356112a3565b84600a81101515610b4257fe5b6020020151925060008351141515610df657600091505b6000836040518082805190602001908083835b602083101515610b915780518252602082019150602081019050602083039250610b6c565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015610d7e576000836040518082805190602001908083835b602083101515610c075780518252602082019150602081019050602083039250610be2565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902082815481101515610c4757fe5b90600052602060002090015490506002836040518082805190602001908083835b602083101515610c8d5780518252602082019150602081019050602083039250610c68565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b602083101515610d215780518252602082019150602081019050602083039250610cfc565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050610b59565b6000836040518082805190602001908083835b602083101515610db65780518252602082019150602081019050602083039250610d91565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000610df59190611490565b5b8380600101945050610b24565b50505050565b6000610edd6040805190810160405280600981526020017f616c6c6f77616e636500000000000000000000000000000000000000000000008152508484604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040518091039020610687565b60019004905092915050565b610fbf6040805190810160405280600981526020017f616c6c6f77616e636500000000000000000000000000000000000000000000008152508484604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040518091039020836001026108f3565b505050565b60016002836040518082805190602001908083835b602083101515610ffe5780518252602082019150602081019050602083039250610fd9565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b6020831015156110995780518252602082019150602081019050602083039250611074565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816110de9190611450565b9160005260206000209001600083909190915090600019169055505050565b60008282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040518091039020905092915050565b60006002836040518082805190602001908083835b60208310151561119a5780518252602082019150602081019050602083039250611175565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b6000838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018281526020019350505050604051809103902090509392505050565b6112ab6114b1565b610140604051908101604052806040805190810160405280600881526020017f7472616e7366657200000000000000000000000000000000000000000000000081525081526020016040805190810160405280600c81526020017f7472616e7366657246726f6d000000000000000000000000000000000000000081525081526020016040805190810160405280600981526020017f616c6c6f77616e6365000000000000000000000000000000000000000000000081525081526020016040805190810160405280600981526020017f62616c616e63654f66000000000000000000000000000000000000000000000081525081526020016040805190810160405280600781526020017f617070726f7665000000000000000000000000000000000000000000000000008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b8154818355818115116114775781836000526020600020918201910161147691906114e0565b5b505050565b602060405190810160405280600081525090565b50805460008255906000526020600020908101906114ae91906114e0565b50565b61014060405190810160405280600a905b6114ca611505565b8152602001906001900390816114c25790505090565b61150291905b808211156114fe5760008160009055506001016114e6565b5090565b90565b6020604051908101604052806000815250905600a165627a7a72305820ea49beef342ccd0dc6fb5abf2f9b3ba8250f340e67e663b88b3d0af1f776c76b0029", "sourceMap": "700:3104:27:-;;;;;;;;;;;;;;;;;", "deployedSourceMap": "700:3104:27:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2321:181;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1017:280;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1294:217:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1303:319:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2147:147;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1991:150;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1628:334;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1018:270:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;746:265:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2508:189;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1517:610:23;;;;;;;;;;;;;;2726:170:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2902:169;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2321:181;2384:13;2413:61;;;;;;;;;;;;;;;;;;;2457:3;2462:10;2447:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2413:22;:61::i;:::-;2491:4;2484:11;;2321:181;;;;:::o;1017:280::-;1142:14;1179:111;;;;;;;;;;;;;;;;;;;1217:72;1255:3;1272:7;1217:24;:72::i;:::-;1179:25;:111::i;:::-;1172:118;;1017:280;;;;:::o;1294:217:23:-;1411:24;1458:17;1476:12;1458:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1458:46:23;1490:13;1458:46;;;;;;;;;;;;;;;;;;1451:53;;1294:217;;;;:::o;1303:319:27:-;1429:13;1458:135;;;;;;;;;;;;;;;;;;;1497:95;1539:5;1558:3;1575:7;1497:28;:95::i;:::-;1458:22;:135::i;:::-;1611:4;1604:11;;1303:319;;;;;:::o;2147:147::-;2221:66;;;;;;;;;;;;;;;;;;;2260:6;2250:17;;;;;;;;;;;;;;;;;;;;;;;;2277:8;2269:17;;2221:15;:66::i;:::-;2147:147;;:::o;1991:150::-;2046:13;2083:50;;;;;;;;;;;;;;;;;;;2125:6;2115:17;;;;;;;;;;;;;;;;;;;;;;;;2083:18;:50::i;:::-;2078:56;;;2071:63;;1991:150;;;:::o;1628:334::-;1780:14;1817:138;;;;;;;;;;;;;;;;;;;1859:95;1901:5;1920:3;1937:7;1859:28;:95::i;:::-;1817:25;:138::i;:::-;1810:145;;1628:334;;;;;:::o;1018:270:23:-;1155:22;1178:12;1155:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1155:56:23;;;;;;;;;;;:::i;:::-;;;;;;;;;;1197:13;1155:56;;;;;;;;;;;;1270:11;1221:17;1239:12;1221:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1221:46:23;1253:13;1221:46;;;;;;;;;;;;;;;;;:60;;;;;;;1018:270;;;:::o;746:265:27:-;845:13;874:108;;;;;;;;;;;;;;;;;;;909:72;947:3;964:7;909:24;:72::i;:::-;874:22;:108::i;:::-;1000:4;993:11;;746:265;;;;:::o;2508:189::-;2589:14;2626:64;;;;;;;;;;;;;;;;;;;2673:3;2678:10;2663:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2626:25;:64::i;:::-;2619:71;;2508:189;;;;:::o;1517:610:23:-;1556:6;1595:26;;:::i;:::-;1719:6;1807:21;1565:1;1556:10;;1551:570;1572:2;1568:1;:6;1551:570;;;1624:17;:15;:17::i;:::-;1642:1;1624:20;;;;;;;;;;;;;1595:49;;1693:1;1669:12;1663:26;:31;;1659:452;;;1728:1;1719:10;;1714:321;1735:22;1758:12;1735:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1735:43:23;;;;1731:1;:47;1714:321;;;1831:22;1854:12;1831:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1868:1:23;1831:39;;;;;;;;;;;;;;;;;;;1807:63;;1899:13;1913:12;1899:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1899:42:23;1927:13;1899:42;;;;;;;;;;;;;;;;;;1892:49;;;;;;;;;;;1970:17;1988:12;1970:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1970:46:23;2002:13;1970:46;;;;;;;;;;;;;;;;;1963:53;;;1780:3;;;;;;;1714:321;;;2060:22;2083:12;2060:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;;2053:43:23;;;;:::i;:::-;1659:452;1576:3;;;;;;;1551:570;;;1517:610;;;;:::o;2726:170:27:-;2794:15;2833:55;;;;;;;;;;;;;;;;;;;2875:6;2883:3;2865:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2833:18;:55::i;:::-;2828:61;;;2821:68;;2726:170;;;;:::o;2902:169::-;2991:73;;;;;;;;;;;;;;;;;;;3030:6;3038:3;3020:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3052:10;3044:19;;2991:15;:73::i;:::-;2902:169;;;:::o;2133:202:23:-;2267:4;2231:13;2245:12;2231:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2231:33:23;2259:4;2231:33;;;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;2281:22;2304:12;2281:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2281:47:23;;;;;;;;;;;:::i;:::-;;;;;;;;;;2323:4;2281:47;;;;;;;;;;;;2133:202;;:::o;3077:229:27:-;3207:12;3265:3;3282:7;3242:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3235:64;;3077:229;;;;:::o;2341:194:23:-;2458:14;2495:13;2509:12;2495:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2495:33:23;2523:4;2495:33;;;;;;;;;;;;;;;;;;;;;;;;;;;2488:40;;2341:194;;;;:::o;3312:284:27:-;3469:21;3536:5;3555:3;3572:7;3513:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3506:83;;3312:284;;;;;:::o;3602:200::-;3663:24;;:::i;:::-;3703:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3602:200;:::o;700:3104::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\nimport \"./MockContract.sol\";\nimport \"zeppelin-solidity/contracts/token/ERC20/ERC20.sol\";\n\n\ncontract MockERC20Token is MockContract {\n function transfer(\n address _to,\n uint _amount\n )\n public\n returns (bool _success)\n {\n functionCalledWithArgs(\"transfer\", getTransferArgsSignature(\n _to,\n _amount\n ));\n\n return true;\n }\n\n function wasTransferCalledWith(\n address _to,\n uint _amount\n )\n public\n view\n returns (bool wasCalled)\n {\n return wasFunctionCalledWithArgs(\"transfer\", getTransferArgsSignature(\n _to,\n _amount\n ));\n }\n\n function transferFrom(\n address _from,\n address _to,\n uint _amount\n )\n public\n returns (bool _success)\n {\n functionCalledWithArgs(\"transferFrom\", getTransferFromArgsSignature(\n _from,\n _to,\n _amount\n ));\n\n return true;\n }\n\n function wasTransferFromCalledWith(\n address _from,\n address _to,\n uint _amount\n )\n public\n view\n returns (bool wasCalled)\n {\n return wasFunctionCalledWithArgs(\"transferFrom\", getTransferFromArgsSignature(\n _from,\n _to,\n _amount\n ));\n }\n\n /* `balanceOf` */\n\n function balanceOf(address _owner) public view returns(uint _balance) {\n return uint(getMockReturnValue(\"balanceOf\", keccak256(_owner)));\n }\n\n function mockBalanceOfFor(address _owner, uint _balance) public {\n mockReturnValue(\"balanceOf\", keccak256(_owner), bytes32(_balance));\n }\n\n /* `approve` */\n\n function approve(address _to, uint _allowance) public returns (bool _success)\n {\n functionCalledWithArgs(\"approve\", keccak256(_to, _allowance));\n return true;\n }\n\n function wasApproveCalledWith(address _to, uint _allowance) public view returns (bool wasCalled)\n {\n return wasFunctionCalledWithArgs(\"approve\", keccak256(_to, _allowance));\n }\n\n /* `allowance` */\n\n function allowance(address _owner, address _to) public view returns(uint _allowance) {\n return uint(getMockReturnValue(\"allowance\", keccak256(_owner, _to)));\n }\n\n function mockAllowanceFor(address _owner, address _to, uint _allowance) public {\n mockReturnValue(\"allowance\", keccak256(_owner, _to), bytes32(_allowance));\n }\n\n function getTransferArgsSignature(\n address _to,\n uint _amount\n )\n internal\n pure\n returns (bytes32 args)\n {\n return keccak256(\n _to,\n _amount\n );\n }\n\n function getTransferFromArgsSignature(\n address _from,\n address _to,\n uint _amount\n )\n internal\n pure\n returns (bytes32 argsSignature)\n {\n return keccak256(\n _from,\n _to,\n _amount\n );\n }\n\n function getFunctionList()\n internal\n returns (string[10] functionNames)\n {\n return [\"transfer\", \"transferFrom\", \"allowance\", \"balanceOf\", \"approve\", \"\", \"\", \"\", \"\", \"\"];\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockERC20Token.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockERC20Token.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockERC20Token.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockERC20Token.sol", "exportedSymbols": { "MockERC20Token": [ 11758 @@ -315,7 +315,7 @@ { "attributes": { "SourceUnit": 10693, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockContract.sol", "file": "./MockContract.sol", "scope": 11759, "symbolAliases": [ @@ -4016,7 +4016,7 @@ "42": { "events": {}, "links": {}, - "address": "0x7ac01104b3ddaf1d5ad092817b31a8442c140158" + "address": "0x80bd8dc16d0b1bee8ce941ce2fb9108177a7dc85" }, "70": { "events": {}, @@ -4025,5 +4025,5 @@ } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:13:01.027Z" + "updatedAt": "2018-10-09T17:50:01.281Z" } \ No newline at end of file diff --git a/artifacts/json/MockERC721Receiver.json b/artifacts/json/MockERC721Receiver.json index e1559983..d41282c8 100644 --- a/artifacts/json/MockERC721Receiver.json +++ b/artifacts/json/MockERC721Receiver.json @@ -138,15 +138,15 @@ "type": "function" } ], - "bytecode": "0x60606040526000600360006101000a81548160ff02191690831515021790555063f0b9e5ba7c010000000000000000000000000000000000000000000000000000000002600360016101000a81548163ffffffff02191690837c010000000000000000000000000000000000000000000000000000000090040217905550341561008857600080fd5b610ed9806100976000396000f300606060405260043610610083576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806313101858146100885780632c0e70a21461010e5780636813d7871461015057806380da20d414610175578063a3e28911146101ec578063d826f88f14610289578063f0b9e5ba1461029e575b600080fd5b341561009357600080fd5b6100f0600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091905050610375565b60405180826000191660001916815260200191505060405180910390f35b341561011957600080fd5b61014e60048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050610404565b005b341561015b57600080fd5b61017360048080351515906020019091905050610442565b005b341561018057600080fd5b6101ea600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091908035600019169060200190919080356000191690602001909190505061045f565b005b34156101f757600080fd5b61026f600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610589565b604051808215151515815260200191505060405180910390f35b341561029457600080fd5b61029c610680565b005b34156102a957600080fd5b610321600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506106c0565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b60006001836040518082805190602001908083835b6020831015156103af578051825260208201915060208101905060208303925061038a565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b80600360016101000a81548163ffffffff02191690837c01000000000000000000000000000000000000000000000000000000009004021790555050565b80600360006101000a81548160ff02191690831515021790555050565b6000836040518082805190602001908083835b6020831015156104975780518252602082019150602081019050602083039250610472565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816104dc9190610de4565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b602083101515610530578051825260208201915060208101905060208303925061050b565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b60006106776040805190810160405280601081526020017f6f6e455243373231526563656976656400000000000000000000000000000000815250858585604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140183815260200182805190602001908083835b602083101515610643578051825260208201915060208101905060208303925061061e565b6001836020036101000a038019825116818451168082178552505050505050905001935050505060405180910390206107ff565b90509392505050565b61068a6000610442565b6106b663f0b9e5ba7c010000000000000000000000000000000000000000000000000000000002610404565b6106be61089b565b565b6000600360009054906101000a900460ff161515156106de57600080fd5b6107ca6040805190810160405280601081526020017f6f6e455243373231526563656976656400000000000000000000000000000000815250858585604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140183815260200182805190602001908083835b6020831015156107965780518252602082019150602081019050602083039250610771565b6001836020036101000a03801982511681845116808217855250505050505090500193505050506040518091039020610b92565b600360019054906101000a90047c01000000000000000000000000000000000000000000000000000000000290509392505050565b60006002836040518082805190602001908083835b6020831015156108395780518252602082019150602081019050602083039250610814565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b60006108a5610e10565b600080600093505b600a841015610b8c576108be610ccb565b84600a811015156108cb57fe5b6020020151925060008351141515610b7f57600091505b6000836040518082805190602001908083835b60208310151561091a57805182526020820191506020810190506020830392506108f5565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015610b07576000836040518082805190602001908083835b602083101515610990578051825260208201915060208101905060208303925061096b565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020828154811015156109d057fe5b90600052602060002090015490506002836040518082805190602001908083835b602083101515610a1657805182526020820191506020810190506020830392506109f1565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b602083101515610aaa5780518252602082019150602081019050602083039250610a85565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600082600019166000191681526020019081526020016000206000905581806001019250506108e2565b6000836040518082805190602001908083835b602083101515610b3f5780518252602082019150602081019050602083039250610b1a565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000610b7e9190610e24565b5b83806001019450506108ad565b50505050565b60016002836040518082805190602001908083835b602083101515610bcc5780518252602082019150602081019050602083039250610ba7565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b602083101515610c675780518252602082019150602081019050602083039250610c42565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281610cac9190610de4565b9160005260206000209001600083909190915090600019169055505050565b610cd3610e45565b610140604051908101604052806040805190810160405280601081526020017f6f6e455243373231526563656976656400000000000000000000000000000000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b815481835581811511610e0b57818360005260206000209182019101610e0a9190610e74565b5b505050565b602060405190810160405280600081525090565b5080546000825590600052602060002090810190610e429190610e74565b50565b61014060405190810160405280600a905b610e5e610e99565b815260200190600190039081610e565790505090565b610e9691905b80821115610e92576000816000905550600101610e7a565b5090565b90565b6020604051908101604052806000815250905600a165627a7a723058206c4752c3dec1b43bf9a8d22ae4b21030d6564673acbb10429757e00625cfca720029", - "deployedBytecode": "0x606060405260043610610083576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806313101858146100885780632c0e70a21461010e5780636813d7871461015057806380da20d414610175578063a3e28911146101ec578063d826f88f14610289578063f0b9e5ba1461029e575b600080fd5b341561009357600080fd5b6100f0600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091905050610375565b60405180826000191660001916815260200191505060405180910390f35b341561011957600080fd5b61014e60048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050610404565b005b341561015b57600080fd5b61017360048080351515906020019091905050610442565b005b341561018057600080fd5b6101ea600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091908035600019169060200190919080356000191690602001909190505061045f565b005b34156101f757600080fd5b61026f600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610589565b604051808215151515815260200191505060405180910390f35b341561029457600080fd5b61029c610680565b005b34156102a957600080fd5b610321600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506106c0565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b60006001836040518082805190602001908083835b6020831015156103af578051825260208201915060208101905060208303925061038a565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b80600360016101000a81548163ffffffff02191690837c01000000000000000000000000000000000000000000000000000000009004021790555050565b80600360006101000a81548160ff02191690831515021790555050565b6000836040518082805190602001908083835b6020831015156104975780518252602082019150602081019050602083039250610472565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816104dc9190610de4565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b602083101515610530578051825260208201915060208101905060208303925061050b565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b60006106776040805190810160405280601081526020017f6f6e455243373231526563656976656400000000000000000000000000000000815250858585604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140183815260200182805190602001908083835b602083101515610643578051825260208201915060208101905060208303925061061e565b6001836020036101000a038019825116818451168082178552505050505050905001935050505060405180910390206107ff565b90509392505050565b61068a6000610442565b6106b663f0b9e5ba7c010000000000000000000000000000000000000000000000000000000002610404565b6106be61089b565b565b6000600360009054906101000a900460ff161515156106de57600080fd5b6107ca6040805190810160405280601081526020017f6f6e455243373231526563656976656400000000000000000000000000000000815250858585604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140183815260200182805190602001908083835b6020831015156107965780518252602082019150602081019050602083039250610771565b6001836020036101000a03801982511681845116808217855250505050505090500193505050506040518091039020610b92565b600360019054906101000a90047c01000000000000000000000000000000000000000000000000000000000290509392505050565b60006002836040518082805190602001908083835b6020831015156108395780518252602082019150602081019050602083039250610814565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b60006108a5610e10565b600080600093505b600a841015610b8c576108be610ccb565b84600a811015156108cb57fe5b6020020151925060008351141515610b7f57600091505b6000836040518082805190602001908083835b60208310151561091a57805182526020820191506020810190506020830392506108f5565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015610b07576000836040518082805190602001908083835b602083101515610990578051825260208201915060208101905060208303925061096b565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020828154811015156109d057fe5b90600052602060002090015490506002836040518082805190602001908083835b602083101515610a1657805182526020820191506020810190506020830392506109f1565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b602083101515610aaa5780518252602082019150602081019050602083039250610a85565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600082600019166000191681526020019081526020016000206000905581806001019250506108e2565b6000836040518082805190602001908083835b602083101515610b3f5780518252602082019150602081019050602083039250610b1a565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000610b7e9190610e24565b5b83806001019450506108ad565b50505050565b60016002836040518082805190602001908083835b602083101515610bcc5780518252602082019150602081019050602083039250610ba7565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b602083101515610c675780518252602082019150602081019050602083039250610c42565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281610cac9190610de4565b9160005260206000209001600083909190915090600019169055505050565b610cd3610e45565b610140604051908101604052806040805190810160405280601081526020017f6f6e455243373231526563656976656400000000000000000000000000000000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b815481835581811511610e0b57818360005260206000209182019101610e0a9190610e74565b5b505050565b602060405190810160405280600081525090565b5080546000825590600052602060002090810190610e429190610e74565b50565b61014060405190810160405280600a905b610e5e610e99565b815260200190600190039081610e565790505090565b610e9691905b80821115610e92576000816000905550600101610e7a565b5090565b90565b6020604051908101604052806000815250905600a165627a7a723058206c4752c3dec1b43bf9a8d22ae4b21030d6564673acbb10429757e00625cfca720029", + "bytecode": "0x60606040526000600360006101000a81548160ff02191690831515021790555063f0b9e5ba7c010000000000000000000000000000000000000000000000000000000002600360016101000a81548163ffffffff02191690837c010000000000000000000000000000000000000000000000000000000090040217905550341561008857600080fd5b610ed9806100976000396000f300606060405260043610610083576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806313101858146100885780632c0e70a21461010e5780636813d7871461015057806380da20d414610175578063a3e28911146101ec578063d826f88f14610289578063f0b9e5ba1461029e575b600080fd5b341561009357600080fd5b6100f0600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091905050610375565b60405180826000191660001916815260200191505060405180910390f35b341561011957600080fd5b61014e60048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050610404565b005b341561015b57600080fd5b61017360048080351515906020019091905050610442565b005b341561018057600080fd5b6101ea600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091908035600019169060200190919080356000191690602001909190505061045f565b005b34156101f757600080fd5b61026f600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610589565b604051808215151515815260200191505060405180910390f35b341561029457600080fd5b61029c610680565b005b34156102a957600080fd5b610321600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506106c0565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b60006001836040518082805190602001908083835b6020831015156103af578051825260208201915060208101905060208303925061038a565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b80600360016101000a81548163ffffffff02191690837c01000000000000000000000000000000000000000000000000000000009004021790555050565b80600360006101000a81548160ff02191690831515021790555050565b6000836040518082805190602001908083835b6020831015156104975780518252602082019150602081019050602083039250610472565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816104dc9190610de4565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b602083101515610530578051825260208201915060208101905060208303925061050b565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b60006106776040805190810160405280601081526020017f6f6e455243373231526563656976656400000000000000000000000000000000815250858585604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140183815260200182805190602001908083835b602083101515610643578051825260208201915060208101905060208303925061061e565b6001836020036101000a038019825116818451168082178552505050505050905001935050505060405180910390206107ff565b90509392505050565b61068a6000610442565b6106b663f0b9e5ba7c010000000000000000000000000000000000000000000000000000000002610404565b6106be61089b565b565b6000600360009054906101000a900460ff161515156106de57600080fd5b6107ca6040805190810160405280601081526020017f6f6e455243373231526563656976656400000000000000000000000000000000815250858585604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140183815260200182805190602001908083835b6020831015156107965780518252602082019150602081019050602083039250610771565b6001836020036101000a03801982511681845116808217855250505050505090500193505050506040518091039020610b92565b600360019054906101000a90047c01000000000000000000000000000000000000000000000000000000000290509392505050565b60006002836040518082805190602001908083835b6020831015156108395780518252602082019150602081019050602083039250610814565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b60006108a5610e10565b600080600093505b600a841015610b8c576108be610ccb565b84600a811015156108cb57fe5b6020020151925060008351141515610b7f57600091505b6000836040518082805190602001908083835b60208310151561091a57805182526020820191506020810190506020830392506108f5565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015610b07576000836040518082805190602001908083835b602083101515610990578051825260208201915060208101905060208303925061096b565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020828154811015156109d057fe5b90600052602060002090015490506002836040518082805190602001908083835b602083101515610a1657805182526020820191506020810190506020830392506109f1565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b602083101515610aaa5780518252602082019150602081019050602083039250610a85565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600082600019166000191681526020019081526020016000206000905581806001019250506108e2565b6000836040518082805190602001908083835b602083101515610b3f5780518252602082019150602081019050602083039250610b1a565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000610b7e9190610e24565b5b83806001019450506108ad565b50505050565b60016002836040518082805190602001908083835b602083101515610bcc5780518252602082019150602081019050602083039250610ba7565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b602083101515610c675780518252602082019150602081019050602083039250610c42565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281610cac9190610de4565b9160005260206000209001600083909190915090600019169055505050565b610cd3610e45565b610140604051908101604052806040805190810160405280601081526020017f6f6e455243373231526563656976656400000000000000000000000000000000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b815481835581811511610e0b57818360005260206000209182019101610e0a9190610e74565b5b505050565b602060405190810160405280600081525090565b5080546000825590600052602060002090810190610e429190610e74565b50565b61014060405190810160405280600a905b610e5e610e99565b815260200190600190039081610e565790505090565b610e9691905b80821115610e92576000816000905550600101610e7a565b5090565b90565b6020604051908101604052806000815250905600a165627a7a723058203cd854cc3959e7476977747da4397aca9a46f3839717e77ca70b40eef13d3afc0029", + "deployedBytecode": "0x606060405260043610610083576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806313101858146100885780632c0e70a21461010e5780636813d7871461015057806380da20d414610175578063a3e28911146101ec578063d826f88f14610289578063f0b9e5ba1461029e575b600080fd5b341561009357600080fd5b6100f0600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091905050610375565b60405180826000191660001916815260200191505060405180910390f35b341561011957600080fd5b61014e60048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050610404565b005b341561015b57600080fd5b61017360048080351515906020019091905050610442565b005b341561018057600080fd5b6101ea600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091908035600019169060200190919080356000191690602001909190505061045f565b005b34156101f757600080fd5b61026f600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610589565b604051808215151515815260200191505060405180910390f35b341561029457600080fd5b61029c610680565b005b34156102a957600080fd5b610321600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506106c0565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b60006001836040518082805190602001908083835b6020831015156103af578051825260208201915060208101905060208303925061038a565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b80600360016101000a81548163ffffffff02191690837c01000000000000000000000000000000000000000000000000000000009004021790555050565b80600360006101000a81548160ff02191690831515021790555050565b6000836040518082805190602001908083835b6020831015156104975780518252602082019150602081019050602083039250610472565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816104dc9190610de4565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b602083101515610530578051825260208201915060208101905060208303925061050b565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b60006106776040805190810160405280601081526020017f6f6e455243373231526563656976656400000000000000000000000000000000815250858585604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140183815260200182805190602001908083835b602083101515610643578051825260208201915060208101905060208303925061061e565b6001836020036101000a038019825116818451168082178552505050505050905001935050505060405180910390206107ff565b90509392505050565b61068a6000610442565b6106b663f0b9e5ba7c010000000000000000000000000000000000000000000000000000000002610404565b6106be61089b565b565b6000600360009054906101000a900460ff161515156106de57600080fd5b6107ca6040805190810160405280601081526020017f6f6e455243373231526563656976656400000000000000000000000000000000815250858585604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140183815260200182805190602001908083835b6020831015156107965780518252602082019150602081019050602083039250610771565b6001836020036101000a03801982511681845116808217855250505050505090500193505050506040518091039020610b92565b600360019054906101000a90047c01000000000000000000000000000000000000000000000000000000000290509392505050565b60006002836040518082805190602001908083835b6020831015156108395780518252602082019150602081019050602083039250610814565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b60006108a5610e10565b600080600093505b600a841015610b8c576108be610ccb565b84600a811015156108cb57fe5b6020020151925060008351141515610b7f57600091505b6000836040518082805190602001908083835b60208310151561091a57805182526020820191506020810190506020830392506108f5565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015610b07576000836040518082805190602001908083835b602083101515610990578051825260208201915060208101905060208303925061096b565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020828154811015156109d057fe5b90600052602060002090015490506002836040518082805190602001908083835b602083101515610a1657805182526020820191506020810190506020830392506109f1565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b602083101515610aaa5780518252602082019150602081019050602083039250610a85565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600082600019166000191681526020019081526020016000206000905581806001019250506108e2565b6000836040518082805190602001908083835b602083101515610b3f5780518252602082019150602081019050602083039250610b1a565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000610b7e9190610e24565b5b83806001019450506108ad565b50505050565b60016002836040518082805190602001908083835b602083101515610bcc5780518252602082019150602081019050602083039250610ba7565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b602083101515610c675780518252602082019150602081019050602083039250610c42565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281610cac9190610de4565b9160005260206000209001600083909190915090600019169055505050565b610cd3610e45565b610140604051908101604052806040805190810160405280601081526020017f6f6e455243373231526563656976656400000000000000000000000000000000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b815481835581811511610e0b57818360005260206000209182019101610e0a9190610e74565b5b505050565b602060405190810160405280600081525090565b5080546000825590600052602060002090810190610e429190610e74565b50565b61014060405190810160405280600a905b610e5e610e99565b815260200190600190039081610e565790505090565b610e9691905b80821115610e92576000816000905550600101610e7a565b5090565b90565b6020604051908101604052806000815250905600a165627a7a723058203cd854cc3959e7476977747da4397aca9a46f3839717e77ca70b40eef13d3afc0029", "sourceMap": "709:1427:28:-;;;853:5;824:34;;;;;;;;;;;;;;;;;;;;489:10:49;894:15:28;;864:45;;;;;;;;;;;;;;;;;;;;;709:1427;;;;;;;;;;;;;;", "deployedSourceMap": "709:1427:28:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1294:217:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1019:116:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;916:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;1018:270:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1625:336:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1141:148;;;;;;;;;;;;;;1295:324;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1294:217:23;1411:24;1458:17;1476:12;1458:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1458:46:23;1490:13;1458:46;;;;;;;;;;;;;;;;;;1451:53;;1294:217;;;;:::o;1019:116:28:-;1116:12;1102:11;;:26;;;;;;;;;;;;;;;;;;;1019:116;:::o;916:97::-;993:13;978:12;;:28;;;;;;;;;;;;;;;;;;916:97;:::o;1018:270:23:-;1155:22;1178:12;1155:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1155:56:23;;;;;;;;;;;:::i;:::-;;;;;;;;;;1197:13;1155:56;;;;;;;;;;;;1270:11;1221:17;1239:12;1221:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1221:46:23;1253:13;1221:46;;;;;;;;;;;;;;;;;:60;;;;;;;1018:270;;;:::o;1625:336:28:-;1788:14;1825:129;;;;;;;;;;;;;;;;;;;1894:8;1916;1938:5;1871:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;1825:25:28;:129::i;:::-;1818:136;;1625:336;;;;;:::o;1141:148::-;1175:22;1191:5;1175:15;:22::i;:::-;1207:52;489:10:49;1243:15:28;;1207:35;:52::i;:::-;1269:13;:11;:13::i;:::-;1141:148::o;1295:324::-;1402:6;1433:12;;;;;;;;;;;1432:13;1424:22;;;;;;;;1457:126;;;;;;;;;;;;;;;;;;;1523:8;1545;1567:5;1500:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;1457:22:28;:126::i;:::-;1601:11;;;;;;;;;;;1594:18;;1295:324;;;;;:::o;2341:194:23:-;2458:14;2495:13;2509:12;2495:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2495:33:23;2523:4;2495:33;;;;;;;;;;;;;;;;;;;;;;;;;;;2488:40;;2341:194;;;;:::o;1517:610::-;1556:6;1595:26;;:::i;:::-;1719:6;1807:21;1565:1;1556:10;;1551:570;1572:2;1568:1;:6;1551:570;;;1624:17;:15;:17::i;:::-;1642:1;1624:20;;;;;;;;;;;;;1595:49;;1693:1;1669:12;1663:26;:31;;1659:452;;;1728:1;1719:10;;1714:321;1735:22;1758:12;1735:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1735:43:23;;;;1731:1;:47;1714:321;;;1831:22;1854:12;1831:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1868:1:23;1831:39;;;;;;;;;;;;;;;;;;;1807:63;;1899:13;1913:12;1899:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1899:42:23;1927:13;1899:42;;;;;;;;;;;;;;;;;;1892:49;;;;;;;;;;;1970:17;1988:12;1970:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1970:46:23;2002:13;1970:46;;;;;;;;;;;;;;;;;1963:53;;;1780:3;;;;;;;1714:321;;;2060:22;2083:12;2060:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;;2053:43:23;;;;:::i;:::-;1659:452;1576:3;;;;;;;1551:570;;;1517:610;;;;:::o;2133:202::-;2267:4;2231:13;2245:12;2231:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2231:33:23;2259:4;2231:33;;;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;2281:22;2304:12;2281:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2281:47:23;;;;;;;;;;;:::i;:::-;;;;;;;;;;2323:4;2281:47;;;;;;;;;;;;2133:202;;:::o;1967:167:28:-;2024:24;;:::i;:::-;2064:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1967:167;:::o;709:1427::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\nimport \"./MockContract.sol\";\nimport \"zeppelin-solidity/contracts/token/ERC721/ERC721Receiver.sol\";\n\ncontract MockERC721Receiver is ERC721Receiver, MockContract {\n\n // Internal state controllable via setters.\n bool internal shouldRevert = false;\n bytes4 internal returnValue = ERC721_RECEIVED;\n\n function setShouldRevert(bool _shouldRevert) public {\n shouldRevert = _shouldRevert;\n }\n\n function setReturnValueForERC721ReceivedHook(bytes4 _returnValue) public {\n returnValue = _returnValue;\n }\n\n function reset() public {\n setShouldRevert(false);\n setReturnValueForERC721ReceivedHook(ERC721_RECEIVED);\n super.reset();\n }\n\n function onERC721Received(address _address, uint256 _tokenId, bytes _data)\n public\n returns (bytes4)\n {\n require(!shouldRevert);\n\n functionCalledWithArgs(\"onERC721Received\", keccak256(\n _address,\n _tokenId,\n _data\n ));\n\n return returnValue;\n }\n\n function wasOnERC721ReceivedCalledWith(\n address _address,\n uint256 _tokenId,\n bytes _data\n )\n public\n view\n returns (bool wasCalled)\n {\n return wasFunctionCalledWithArgs(\"onERC721Received\", keccak256(\n _address,\n _tokenId,\n _data\n ));\n }\n\n function getFunctionList()\n internal\n returns (string[10] functionNames)\n {\n return [\"onERC721Received\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\"];\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockERC721Receiver.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockERC721Receiver.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockERC721Receiver.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockERC721Receiver.sol", "exportedSymbols": { "MockERC721Receiver": [ 11879 @@ -169,7 +169,7 @@ { "attributes": { "SourceUnit": 10693, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockContract.sol", "file": "./MockContract.sol", "scope": 11880, "symbolAliases": [ @@ -1844,7 +1844,7 @@ "42": { "events": {}, "links": {}, - "address": "0x00714756c11727a071c47479c0d466f937331b8e" + "address": "0xeadebe1479a642dc27a2874233e5e2b6703a0442" }, "70": { "events": {}, @@ -1853,5 +1853,5 @@ } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:13:01.020Z" + "updatedAt": "2018-10-09T17:50:01.261Z" } \ No newline at end of file diff --git a/artifacts/json/MockERC721Token.json b/artifacts/json/MockERC721Token.json index 9d736cc5..7e06da93 100644 --- a/artifacts/json/MockERC721Token.json +++ b/artifacts/json/MockERC721Token.json @@ -281,15 +281,15 @@ "type": "function" } ], - "bytecode": "0x6060604052341561000f57600080fd5b6113f68061001e6000396000f3006060604052600436106100d0576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063081812fc146100d55780630e81bd9f146101385780631051db341461019257806313101858146101bf57806313d2a2ab1461024557806323b872dd1461028757806351d5d7a9146103005780636352211e1461034257806370a08231146103a5578063771a7009146103f257806380da20d41461046b578063a9059cbb146104e2578063c97773671461053c578063d826f88f1461057e575b600080fd5b34156100e057600080fd5b6100f66004808035906020019091905050610593565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561014357600080fd5b610178600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506105f4565b604051808215151515815260200191505060405180910390f35b341561019d57600080fd5b6101a5610646565b604051808215151515815260200191505060405180910390f35b34156101ca57600080fd5b610227600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080356000191690602001909190505061064f565b60405180826000191660001916815260200191505060405180910390f35b341561025057600080fd5b610285600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506106de565b005b341561029257600080fd5b6102e6600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610750565b604051808215151515815260200191505060405180910390f35b341561030b57600080fd5b610340600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506107a6565b005b341561034d57600080fd5b610363600480803590602001909190505061083d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103b057600080fd5b6103dc600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061089e565b6040518082815260200191505060405180910390f35b34156103fd57600080fd5b610451600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061093a565b604051808215151515815260200191505060405180910390f35b341561047657600080fd5b6104e0600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091908035600019169060200190919080356000191690602001909190505061098e565b005b34156104ed57600080fd5b610522600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610ab8565b604051808215151515815260200191505060405180910390f35b341561054757600080fd5b61057c600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b0c565b005b341561058957600080fd5b610591610b7e565b005b60006105e96040805190810160405280600b81526020017f676574417070726f7665640000000000000000000000000000000000000000008152508360405180828152602001915050604051809103902061064f565b600190049050919050565b600061063e6040805190810160405280600881526020017f7472616e736665720000000000000000000000000000000000000000000000008152506106398585610e75565b610ed8565b905092915050565b60006001905090565b60006001836040518082805190602001908083835b6020831015156106895780518252602082019150602081019050602083039250610664565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b61074c6040805190810160405280600781526020017f6f776e65724f6600000000000000000000000000000000000000000000000000815250836040518082815260200191505060405180910390208373ffffffffffffffffffffffffffffffffffffffff1660010261098e565b5050565b600061079b6040805190810160405280600c81526020017f7472616e7366657246726f6d0000000000000000000000000000000000000000815250610796868686610f74565b61101b565b600190509392505050565b6108396040805190810160405280600981526020017f62616c616e63654f66000000000000000000000000000000000000000000000081525083604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140191505060405180910390208360010261098e565b5050565b60006108936040805190810160405280600781526020017f6f776e65724f66000000000000000000000000000000000000000000000000008152508360405180828152602001915050604051809103902061064f565b600190049050919050565b600061092f6040805190810160405280600981526020017f62616c616e63654f66000000000000000000000000000000000000000000000081525083604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401915050604051809103902061064f565b600190049050919050565b60006109856040805190810160405280600c81526020017f7472616e7366657246726f6d0000000000000000000000000000000000000000815250610980868686610f74565b610ed8565b90509392505050565b6000836040518082805190602001908083835b6020831015156109c657805182526020820191506020810190506020830392506109a1565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281610a0b9190611301565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b602083101515610a5f5780518252602082019150602081019050602083039250610a3a565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b6000610b026040805190810160405280600881526020017f7472616e73666572000000000000000000000000000000000000000000000000815250610afd8585610e75565b61101b565b6001905092915050565b610b7a6040805190810160405280600b81526020017f676574417070726f766564000000000000000000000000000000000000000000815250836040518082815260200191505060405180910390208373ffffffffffffffffffffffffffffffffffffffff1660010261098e565b5050565b6000610b8861132d565b600080600093505b600a841015610e6f57610ba1611154565b84600a81101515610bae57fe5b6020020151925060008351141515610e6257600091505b6000836040518082805190602001908083835b602083101515610bfd5780518252602082019150602081019050602083039250610bd8565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015610dea576000836040518082805190602001908083835b602083101515610c735780518252602082019150602081019050602083039250610c4e565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902082815481101515610cb357fe5b90600052602060002090015490506002836040518082805190602001908083835b602083101515610cf95780518252602082019150602081019050602083039250610cd4565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b602083101515610d8d5780518252602082019150602081019050602083039250610d68565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050610bc5565b6000836040518082805190602001908083835b602083101515610e225780518252602082019150602081019050602083039250610dfd565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000610e619190611341565b5b8380600101945050610b90565b50505050565b60008282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040518091039020905092915050565b60006002836040518082805190602001908083835b602083101515610f125780518252602082019150602081019050602083039250610eed565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b6000838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018281526020019350505050604051809103902090509392505050565b60016002836040518082805190602001908083835b6020831015156110555780518252602082019150602081019050602083039250611030565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b6020831015156110f057805182526020820191506020810190506020830392506110cb565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816111359190611301565b9160005260206000209001600083909190915090600019169055505050565b61115c611362565b610140604051908101604052806040805190810160405280600881526020017f7472616e7366657200000000000000000000000000000000000000000000000081525081526020016040805190810160405280600c81526020017f7472616e7366657246726f6d000000000000000000000000000000000000000081525081526020016040805190810160405280600781526020017f6f776e65724f660000000000000000000000000000000000000000000000000081525081526020016040805190810160405280600981526020017f62616c616e63654f66000000000000000000000000000000000000000000000081525081526020016040805190810160405280600b81526020017f676574417070726f7665640000000000000000000000000000000000000000008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b815481835581811511611328578183600052602060002091820191016113279190611391565b5b505050565b602060405190810160405280600081525090565b508054600082559060005260206000209081019061135f9190611391565b50565b61014060405190810160405280600a905b61137b6113b6565b8152602001906001900390816113735790505090565b6113b391905b808211156113af576000816000905550600101611397565b5090565b90565b6020604051908101604052806000815250905600a165627a7a72305820455323b5fbeeebf4323aa75c15a2c47540d0a35c5e874d31990ffd4efddce1360029", - "deployedBytecode": "0x6060604052600436106100d0576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063081812fc146100d55780630e81bd9f146101385780631051db341461019257806313101858146101bf57806313d2a2ab1461024557806323b872dd1461028757806351d5d7a9146103005780636352211e1461034257806370a08231146103a5578063771a7009146103f257806380da20d41461046b578063a9059cbb146104e2578063c97773671461053c578063d826f88f1461057e575b600080fd5b34156100e057600080fd5b6100f66004808035906020019091905050610593565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561014357600080fd5b610178600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506105f4565b604051808215151515815260200191505060405180910390f35b341561019d57600080fd5b6101a5610646565b604051808215151515815260200191505060405180910390f35b34156101ca57600080fd5b610227600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080356000191690602001909190505061064f565b60405180826000191660001916815260200191505060405180910390f35b341561025057600080fd5b610285600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506106de565b005b341561029257600080fd5b6102e6600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610750565b604051808215151515815260200191505060405180910390f35b341561030b57600080fd5b610340600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506107a6565b005b341561034d57600080fd5b610363600480803590602001909190505061083d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103b057600080fd5b6103dc600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061089e565b6040518082815260200191505060405180910390f35b34156103fd57600080fd5b610451600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061093a565b604051808215151515815260200191505060405180910390f35b341561047657600080fd5b6104e0600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091908035600019169060200190919080356000191690602001909190505061098e565b005b34156104ed57600080fd5b610522600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610ab8565b604051808215151515815260200191505060405180910390f35b341561054757600080fd5b61057c600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b0c565b005b341561058957600080fd5b610591610b7e565b005b60006105e96040805190810160405280600b81526020017f676574417070726f7665640000000000000000000000000000000000000000008152508360405180828152602001915050604051809103902061064f565b600190049050919050565b600061063e6040805190810160405280600881526020017f7472616e736665720000000000000000000000000000000000000000000000008152506106398585610e75565b610ed8565b905092915050565b60006001905090565b60006001836040518082805190602001908083835b6020831015156106895780518252602082019150602081019050602083039250610664565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b61074c6040805190810160405280600781526020017f6f776e65724f6600000000000000000000000000000000000000000000000000815250836040518082815260200191505060405180910390208373ffffffffffffffffffffffffffffffffffffffff1660010261098e565b5050565b600061079b6040805190810160405280600c81526020017f7472616e7366657246726f6d0000000000000000000000000000000000000000815250610796868686610f74565b61101b565b600190509392505050565b6108396040805190810160405280600981526020017f62616c616e63654f66000000000000000000000000000000000000000000000081525083604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140191505060405180910390208360010261098e565b5050565b60006108936040805190810160405280600781526020017f6f776e65724f66000000000000000000000000000000000000000000000000008152508360405180828152602001915050604051809103902061064f565b600190049050919050565b600061092f6040805190810160405280600981526020017f62616c616e63654f66000000000000000000000000000000000000000000000081525083604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401915050604051809103902061064f565b600190049050919050565b60006109856040805190810160405280600c81526020017f7472616e7366657246726f6d0000000000000000000000000000000000000000815250610980868686610f74565b610ed8565b90509392505050565b6000836040518082805190602001908083835b6020831015156109c657805182526020820191506020810190506020830392506109a1565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281610a0b9190611301565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b602083101515610a5f5780518252602082019150602081019050602083039250610a3a565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b6000610b026040805190810160405280600881526020017f7472616e73666572000000000000000000000000000000000000000000000000815250610afd8585610e75565b61101b565b6001905092915050565b610b7a6040805190810160405280600b81526020017f676574417070726f766564000000000000000000000000000000000000000000815250836040518082815260200191505060405180910390208373ffffffffffffffffffffffffffffffffffffffff1660010261098e565b5050565b6000610b8861132d565b600080600093505b600a841015610e6f57610ba1611154565b84600a81101515610bae57fe5b6020020151925060008351141515610e6257600091505b6000836040518082805190602001908083835b602083101515610bfd5780518252602082019150602081019050602083039250610bd8565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015610dea576000836040518082805190602001908083835b602083101515610c735780518252602082019150602081019050602083039250610c4e565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902082815481101515610cb357fe5b90600052602060002090015490506002836040518082805190602001908083835b602083101515610cf95780518252602082019150602081019050602083039250610cd4565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b602083101515610d8d5780518252602082019150602081019050602083039250610d68565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050610bc5565b6000836040518082805190602001908083835b602083101515610e225780518252602082019150602081019050602083039250610dfd565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000610e619190611341565b5b8380600101945050610b90565b50505050565b60008282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040518091039020905092915050565b60006002836040518082805190602001908083835b602083101515610f125780518252602082019150602081019050602083039250610eed565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b6000838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018281526020019350505050604051809103902090509392505050565b60016002836040518082805190602001908083835b6020831015156110555780518252602082019150602081019050602083039250611030565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b6020831015156110f057805182526020820191506020810190506020830392506110cb565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816111359190611301565b9160005260206000209001600083909190915090600019169055505050565b61115c611362565b610140604051908101604052806040805190810160405280600881526020017f7472616e7366657200000000000000000000000000000000000000000000000081525081526020016040805190810160405280600c81526020017f7472616e7366657246726f6d000000000000000000000000000000000000000081525081526020016040805190810160405280600781526020017f6f776e65724f660000000000000000000000000000000000000000000000000081525081526020016040805190810160405280600981526020017f62616c616e63654f66000000000000000000000000000000000000000000000081525081526020016040805190810160405280600b81526020017f676574417070726f7665640000000000000000000000000000000000000000008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b815481835581811511611328578183600052602060002091820191016113279190611391565b5b505050565b602060405190810160405280600081525090565b508054600082559060005260206000209081019061135f9190611391565b50565b61014060405190810160405280600a905b61137b6113b6565b8152602001906001900390816113735790505090565b6113b391905b808211156113af576000816000905550600101611397565b5090565b90565b6020604051908101604052806000815250905600a165627a7a72305820455323b5fbeeebf4323aa75c15a2c47540d0a35c5e874d31990ffd4efddce1360029", + "bytecode": "0x6060604052341561000f57600080fd5b6113f68061001e6000396000f3006060604052600436106100d0576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063081812fc146100d55780630e81bd9f146101385780631051db341461019257806313101858146101bf57806313d2a2ab1461024557806323b872dd1461028757806351d5d7a9146103005780636352211e1461034257806370a08231146103a5578063771a7009146103f257806380da20d41461046b578063a9059cbb146104e2578063c97773671461053c578063d826f88f1461057e575b600080fd5b34156100e057600080fd5b6100f66004808035906020019091905050610593565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561014357600080fd5b610178600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506105f4565b604051808215151515815260200191505060405180910390f35b341561019d57600080fd5b6101a5610646565b604051808215151515815260200191505060405180910390f35b34156101ca57600080fd5b610227600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080356000191690602001909190505061064f565b60405180826000191660001916815260200191505060405180910390f35b341561025057600080fd5b610285600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506106de565b005b341561029257600080fd5b6102e6600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610750565b604051808215151515815260200191505060405180910390f35b341561030b57600080fd5b610340600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506107a6565b005b341561034d57600080fd5b610363600480803590602001909190505061083d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103b057600080fd5b6103dc600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061089e565b6040518082815260200191505060405180910390f35b34156103fd57600080fd5b610451600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061093a565b604051808215151515815260200191505060405180910390f35b341561047657600080fd5b6104e0600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091908035600019169060200190919080356000191690602001909190505061098e565b005b34156104ed57600080fd5b610522600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610ab8565b604051808215151515815260200191505060405180910390f35b341561054757600080fd5b61057c600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b0c565b005b341561058957600080fd5b610591610b7e565b005b60006105e96040805190810160405280600b81526020017f676574417070726f7665640000000000000000000000000000000000000000008152508360405180828152602001915050604051809103902061064f565b600190049050919050565b600061063e6040805190810160405280600881526020017f7472616e736665720000000000000000000000000000000000000000000000008152506106398585610e75565b610ed8565b905092915050565b60006001905090565b60006001836040518082805190602001908083835b6020831015156106895780518252602082019150602081019050602083039250610664565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b61074c6040805190810160405280600781526020017f6f776e65724f6600000000000000000000000000000000000000000000000000815250836040518082815260200191505060405180910390208373ffffffffffffffffffffffffffffffffffffffff1660010261098e565b5050565b600061079b6040805190810160405280600c81526020017f7472616e7366657246726f6d0000000000000000000000000000000000000000815250610796868686610f74565b61101b565b600190509392505050565b6108396040805190810160405280600981526020017f62616c616e63654f66000000000000000000000000000000000000000000000081525083604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140191505060405180910390208360010261098e565b5050565b60006108936040805190810160405280600781526020017f6f776e65724f66000000000000000000000000000000000000000000000000008152508360405180828152602001915050604051809103902061064f565b600190049050919050565b600061092f6040805190810160405280600981526020017f62616c616e63654f66000000000000000000000000000000000000000000000081525083604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401915050604051809103902061064f565b600190049050919050565b60006109856040805190810160405280600c81526020017f7472616e7366657246726f6d0000000000000000000000000000000000000000815250610980868686610f74565b610ed8565b90509392505050565b6000836040518082805190602001908083835b6020831015156109c657805182526020820191506020810190506020830392506109a1565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281610a0b9190611301565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b602083101515610a5f5780518252602082019150602081019050602083039250610a3a565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b6000610b026040805190810160405280600881526020017f7472616e73666572000000000000000000000000000000000000000000000000815250610afd8585610e75565b61101b565b6001905092915050565b610b7a6040805190810160405280600b81526020017f676574417070726f766564000000000000000000000000000000000000000000815250836040518082815260200191505060405180910390208373ffffffffffffffffffffffffffffffffffffffff1660010261098e565b5050565b6000610b8861132d565b600080600093505b600a841015610e6f57610ba1611154565b84600a81101515610bae57fe5b6020020151925060008351141515610e6257600091505b6000836040518082805190602001908083835b602083101515610bfd5780518252602082019150602081019050602083039250610bd8565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015610dea576000836040518082805190602001908083835b602083101515610c735780518252602082019150602081019050602083039250610c4e565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902082815481101515610cb357fe5b90600052602060002090015490506002836040518082805190602001908083835b602083101515610cf95780518252602082019150602081019050602083039250610cd4565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b602083101515610d8d5780518252602082019150602081019050602083039250610d68565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050610bc5565b6000836040518082805190602001908083835b602083101515610e225780518252602082019150602081019050602083039250610dfd565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000610e619190611341565b5b8380600101945050610b90565b50505050565b60008282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040518091039020905092915050565b60006002836040518082805190602001908083835b602083101515610f125780518252602082019150602081019050602083039250610eed565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b6000838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018281526020019350505050604051809103902090509392505050565b60016002836040518082805190602001908083835b6020831015156110555780518252602082019150602081019050602083039250611030565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b6020831015156110f057805182526020820191506020810190506020830392506110cb565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816111359190611301565b9160005260206000209001600083909190915090600019169055505050565b61115c611362565b610140604051908101604052806040805190810160405280600881526020017f7472616e7366657200000000000000000000000000000000000000000000000081525081526020016040805190810160405280600c81526020017f7472616e7366657246726f6d000000000000000000000000000000000000000081525081526020016040805190810160405280600781526020017f6f776e65724f660000000000000000000000000000000000000000000000000081525081526020016040805190810160405280600981526020017f62616c616e63654f66000000000000000000000000000000000000000000000081525081526020016040805190810160405280600b81526020017f676574417070726f7665640000000000000000000000000000000000000000008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b815481835581811511611328578183600052602060002091820191016113279190611391565b5b505050565b602060405190810160405280600081525090565b508054600082559060005260206000209081019061135f9190611391565b50565b61014060405190810160405280600a905b61137b6113b6565b8152602001906001900390816113735790505090565b6113b391905b808211156113af576000816000905550600101611397565b5090565b90565b6020604051908101604052806000815250905600a165627a7a72305820bf4c452e0cacd255115587f0c129e41bf3da6ba427abf7f57fa663c6c6d014340029", + "deployedBytecode": "0x6060604052600436106100d0576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063081812fc146100d55780630e81bd9f146101385780631051db341461019257806313101858146101bf57806313d2a2ab1461024557806323b872dd1461028757806351d5d7a9146103005780636352211e1461034257806370a08231146103a5578063771a7009146103f257806380da20d41461046b578063a9059cbb146104e2578063c97773671461053c578063d826f88f1461057e575b600080fd5b34156100e057600080fd5b6100f66004808035906020019091905050610593565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561014357600080fd5b610178600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506105f4565b604051808215151515815260200191505060405180910390f35b341561019d57600080fd5b6101a5610646565b604051808215151515815260200191505060405180910390f35b34156101ca57600080fd5b610227600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080356000191690602001909190505061064f565b60405180826000191660001916815260200191505060405180910390f35b341561025057600080fd5b610285600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506106de565b005b341561029257600080fd5b6102e6600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610750565b604051808215151515815260200191505060405180910390f35b341561030b57600080fd5b610340600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506107a6565b005b341561034d57600080fd5b610363600480803590602001909190505061083d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103b057600080fd5b6103dc600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061089e565b6040518082815260200191505060405180910390f35b34156103fd57600080fd5b610451600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061093a565b604051808215151515815260200191505060405180910390f35b341561047657600080fd5b6104e0600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091908035600019169060200190919080356000191690602001909190505061098e565b005b34156104ed57600080fd5b610522600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610ab8565b604051808215151515815260200191505060405180910390f35b341561054757600080fd5b61057c600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b0c565b005b341561058957600080fd5b610591610b7e565b005b60006105e96040805190810160405280600b81526020017f676574417070726f7665640000000000000000000000000000000000000000008152508360405180828152602001915050604051809103902061064f565b600190049050919050565b600061063e6040805190810160405280600881526020017f7472616e736665720000000000000000000000000000000000000000000000008152506106398585610e75565b610ed8565b905092915050565b60006001905090565b60006001836040518082805190602001908083835b6020831015156106895780518252602082019150602081019050602083039250610664565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b61074c6040805190810160405280600781526020017f6f776e65724f6600000000000000000000000000000000000000000000000000815250836040518082815260200191505060405180910390208373ffffffffffffffffffffffffffffffffffffffff1660010261098e565b5050565b600061079b6040805190810160405280600c81526020017f7472616e7366657246726f6d0000000000000000000000000000000000000000815250610796868686610f74565b61101b565b600190509392505050565b6108396040805190810160405280600981526020017f62616c616e63654f66000000000000000000000000000000000000000000000081525083604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140191505060405180910390208360010261098e565b5050565b60006108936040805190810160405280600781526020017f6f776e65724f66000000000000000000000000000000000000000000000000008152508360405180828152602001915050604051809103902061064f565b600190049050919050565b600061092f6040805190810160405280600981526020017f62616c616e63654f66000000000000000000000000000000000000000000000081525083604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401915050604051809103902061064f565b600190049050919050565b60006109856040805190810160405280600c81526020017f7472616e7366657246726f6d0000000000000000000000000000000000000000815250610980868686610f74565b610ed8565b90509392505050565b6000836040518082805190602001908083835b6020831015156109c657805182526020820191506020810190506020830392506109a1565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281610a0b9190611301565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b602083101515610a5f5780518252602082019150602081019050602083039250610a3a565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b6000610b026040805190810160405280600881526020017f7472616e73666572000000000000000000000000000000000000000000000000815250610afd8585610e75565b61101b565b6001905092915050565b610b7a6040805190810160405280600b81526020017f676574417070726f766564000000000000000000000000000000000000000000815250836040518082815260200191505060405180910390208373ffffffffffffffffffffffffffffffffffffffff1660010261098e565b5050565b6000610b8861132d565b600080600093505b600a841015610e6f57610ba1611154565b84600a81101515610bae57fe5b6020020151925060008351141515610e6257600091505b6000836040518082805190602001908083835b602083101515610bfd5780518252602082019150602081019050602083039250610bd8565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015610dea576000836040518082805190602001908083835b602083101515610c735780518252602082019150602081019050602083039250610c4e565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902082815481101515610cb357fe5b90600052602060002090015490506002836040518082805190602001908083835b602083101515610cf95780518252602082019150602081019050602083039250610cd4565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b602083101515610d8d5780518252602082019150602081019050602083039250610d68565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050610bc5565b6000836040518082805190602001908083835b602083101515610e225780518252602082019150602081019050602083039250610dfd565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000610e619190611341565b5b8380600101945050610b90565b50505050565b60008282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040518091039020905092915050565b60006002836040518082805190602001908083835b602083101515610f125780518252602082019150602081019050602083039250610eed565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b6000838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018281526020019350505050604051809103902090509392505050565b60016002836040518082805190602001908083835b6020831015156110555780518252602082019150602081019050602083039250611030565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b6020831015156110f057805182526020820191506020810190506020830392506110cb565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816111359190611301565b9160005260206000209001600083909190915090600019169055505050565b61115c611362565b610140604051908101604052806040805190810160405280600881526020017f7472616e7366657200000000000000000000000000000000000000000000000081525081526020016040805190810160405280600c81526020017f7472616e7366657246726f6d000000000000000000000000000000000000000081525081526020016040805190810160405280600781526020017f6f776e65724f660000000000000000000000000000000000000000000000000081525081526020016040805190810160405280600981526020017f62616c616e63654f66000000000000000000000000000000000000000000000081525081526020016040805190810160405280600b81526020017f676574417070726f7665640000000000000000000000000000000000000000008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b815481835581811511611328578183600052602060002091820191016113279190611391565b5b505050565b602060405190810160405280600081525090565b508054600082559060005260206000209081019061135f9190611391565b50565b61014060405190810160405280600a905b61137b6113b6565b8152602001906001900390816113735790505090565b6113b391905b808211156113af576000816000905550600101611397565b5090565b90565b6020604051908101604052806000815250905600a165627a7a72305820bf4c452e0cacd255115587f0c129e41bf3da6ba427abf7f57fa663c6c6d014340029", "sourceMap": "640:3066:29:-;;;;;;;;;;;;;;;;;", "deployedSourceMap": "640:3066:29:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2534:163;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;960:282;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2866:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1294:217:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2385:143:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1248:321;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2074:147;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2227:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1917:151;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1575:336;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1018:270:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;687:267:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2703:157;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1517:610:23;;;;;;;;;;;;;;2534:163:29;2591:17;2635:54;;;;;;;;;;;;;;;;;;;2679:8;2669:19;;;;;;;;;;;;;;;;;;2635:18;:54::i;:::-;2627:63;;;2620:70;;2534:163;;;:::o;960:282::-;1086:14;1123:112;;;;;;;;;;;;;;;;;;;1161:73;1199:3;1216:8;1161:24;:73::i;:::-;1123:25;:112::i;:::-;1116:119;;960:282;;;;:::o;2866:101::-;2915:22;2956:4;2949:11;;2866:101;:::o;1294:217:23:-;1411:24;1458:17;1476:12;1458:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1458:46:23;1490:13;1458:46;;;;;;;;;;;;;;;;;;1451:53;;1294:217;;;;:::o;2385:143:29:-;2457:64;;;;;;;;;;;;;;;;;;;2494:8;2484:19;;;;;;;;;;;;;;;;;;2513:6;2505:15;;;;2457;:64::i;:::-;2385:143;;:::o;1248:321::-;1375:13;1404:136;;;;;;;;;;;;;;;;;;;1443:96;1485:5;1504:3;1521:8;1443:28;:96::i;:::-;1404:22;:136::i;:::-;1558:4;1551:11;;1248:321;;;;;:::o;2074:147::-;2148:66;;;;;;;;;;;;;;;;;;;2187:6;2177:17;;;;;;;;;;;;;;;;;;;;;;;;2204:8;2196:17;;2148:15;:66::i;:::-;2074:147;;:::o;2227:152::-;2280:14;2321:50;;;;;;;;;;;;;;;;;;;2361:8;2351:19;;;;;;;;;;;;;;;;;;2321:18;:50::i;:::-;2313:59;;;2306:66;;2227:152;;;:::o;1917:151::-;1973:13;2010:50;;;;;;;;;;;;;;;;;;;2052:6;2042:17;;;;;;;;;;;;;;;;;;;;;;;;2010:18;:50::i;:::-;2005:56;;;1998:63;;1917:151;;;:::o;1575:336::-;1728:14;1765:139;;;;;;;;;;;;;;;;;;;1807:96;1849:5;1868:3;1885:8;1807:28;:96::i;:::-;1765:25;:139::i;:::-;1758:146;;1575:336;;;;;:::o;1018:270:23:-;1155:22;1178:12;1155:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1155:56:23;;;;;;;;;;;:::i;:::-;;;;;;;;;;1197:13;1155:56;;;;;;;;;;;;1270:11;1221:17;1239:12;1221:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1221:46:23;1253:13;1221:46;;;;;;;;;;;;;;;;;:60;;;;;;;1018:270;;;:::o;687:267:29:-;787:13;816:109;;;;;;;;;;;;;;;;;;;851:73;889:3;906:8;851:24;:73::i;:::-;816:22;:109::i;:::-;943:4;936:11;;687:267;;;;:::o;2703:157::-;2782:71;;;;;;;;;;;;;;;;;;;2823:8;2813:19;;;;;;;;;;;;;;;;;;2842:9;2834:18;;;;2782:15;:71::i;:::-;2703:157;;:::o;1517:610:23:-;1556:6;1595:26;;:::i;:::-;1719:6;1807:21;1565:1;1556:10;;1551:570;1572:2;1568:1;:6;1551:570;;;1624:17;:15;:17::i;:::-;1642:1;1624:20;;;;;;;;;;;;;1595:49;;1693:1;1669:12;1663:26;:31;;1659:452;;;1728:1;1719:10;;1714:321;1735:22;1758:12;1735:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1735:43:23;;;;1731:1;:47;1714:321;;;1831:22;1854:12;1831:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1868:1:23;1831:39;;;;;;;;;;;;;;;;;;;1807:63;;1899:13;1913:12;1899:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1899:42:23;1927:13;1899:42;;;;;;;;;;;;;;;;;;1892:49;;;;;;;;;;;1970:17;1988:12;1970:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1970:46:23;2002:13;1970:46;;;;;;;;;;;;;;;;;1963:53;;;1780:3;;;;;;;1714:321;;;2060:22;2083:12;2060:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;;2053:43:23;;;;:::i;:::-;1659:452;1576:3;;;;;;;1551:570;;;1517:610;;;;:::o;2973:231:29:-;3104:12;3162:3;3179:8;3139:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3132:65;;2973:231;;;;:::o;2341:194:23:-;2458:14;2495:13;2509:12;2495:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2495:33:23;2523:4;2495:33;;;;;;;;;;;;;;;;;;;;;;;;;;;2488:40;;2341:194;;;;:::o;3210:286:29:-;3368:21;3435:5;3454:3;3471:8;3412:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3405:84;;3210:286;;;;;:::o;2133:202:23:-;2267:4;2231:13;2245:12;2231:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2231:33:23;2259:4;2231:33;;;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;2281:22;2304:12;2281:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2281:47:23;;;;;;;;;;;:::i;:::-;;;;;;;;;;2323:4;2281:47;;;;;;;;;;;;2133:202;;:::o;3502::29:-;3563:24;;:::i;:::-;3603:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3502:202;:::o;640:3066::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\nimport \"./MockContract.sol\";\n\n\ncontract MockERC721Token is MockContract {\n function transfer(\n address _to,\n uint _tokenId\n )\n public\n returns (bool _success)\n {\n functionCalledWithArgs(\"transfer\", getTransferArgsSignature(\n _to,\n _tokenId\n ));\n\n return true;\n }\n\n function wasTransferCalledWith(\n address _to,\n uint _tokenId\n )\n public\n view\n returns (bool wasCalled)\n {\n return wasFunctionCalledWithArgs(\"transfer\", getTransferArgsSignature(\n _to,\n _tokenId\n ));\n }\n\n function transferFrom(\n address _from,\n address _to,\n uint _tokenId\n )\n public\n returns (bool _success)\n {\n functionCalledWithArgs(\"transferFrom\", getTransferFromArgsSignature(\n _from,\n _to,\n _tokenId\n ));\n\n return true;\n }\n\n function wasTransferFromCalledWith(\n address _from,\n address _to,\n uint _tokenId\n )\n public\n view\n returns (bool wasCalled)\n {\n return wasFunctionCalledWithArgs(\"transferFrom\", getTransferFromArgsSignature(\n _from,\n _to,\n _tokenId\n ));\n }\n\n function balanceOf(address _owner) public view returns (uint _balance) {\n return uint(getMockReturnValue(\"balanceOf\", keccak256(_owner)));\n }\n\n function mockBalanceOfFor(address _owner, uint _balance) public {\n mockReturnValue(\"balanceOf\", keccak256(_owner), bytes32(_balance));\n }\n\n function ownerOf(uint _tokenId) public view returns (address _owner) {\n return address(getMockReturnValue(\"ownerOf\", keccak256(_tokenId)));\n }\n\n function mockOwnerOfFor(uint _tokenId, address _owner) public {\n mockReturnValue(\"ownerOf\", keccak256(_tokenId), bytes32(_owner));\n }\n\n function getApproved(uint _tokenId) public view returns (address _approved) {\n return address(getMockReturnValue(\"getApproved\", keccak256(_tokenId)));\n }\n\n function mockGetApprovedFor(uint _tokenId, address _approved) public {\n mockReturnValue(\"getApproved\", keccak256(_tokenId), bytes32(_approved));\n }\n\n function implementsERC721() public pure returns (bool _implementsERC721) {\n return true;\n }\n\n function getTransferArgsSignature(\n address _to,\n uint _tokenId\n )\n internal\n pure\n returns (bytes32 args)\n {\n return keccak256(\n _to,\n _tokenId\n );\n }\n\n function getTransferFromArgsSignature(\n address _from,\n address _to,\n uint _tokenId\n )\n internal\n pure\n returns (bytes32 argsSignature)\n {\n return keccak256(\n _from,\n _to,\n _tokenId\n );\n }\n\n function getFunctionList()\n internal\n returns (string[10] functionNames)\n {\n return [\"transfer\", \"transferFrom\", \"ownerOf\", \"balanceOf\", \"getApproved\", \"\", \"\", \"\", \"\", \"\"];\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockERC721Token.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockERC721Token.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockERC721Token.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockERC721Token.sol", "exportedSymbols": { "MockERC721Token": [ 12133 @@ -312,7 +312,7 @@ { "attributes": { "SourceUnit": 10693, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockContract.sol", "file": "./MockContract.sol", "scope": 12134, "symbolAliases": [ @@ -3994,7 +3994,7 @@ "42": { "events": {}, "links": {}, - "address": "0xa57d132d946d0ba4f7febd543763f18b3627dd10" + "address": "0x5ff98c9ca70a7d2fdd1107c1a80d20c5fc8a3e40" }, "70": { "events": {}, @@ -4003,5 +4003,5 @@ } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:13:01.014Z" + "updatedAt": "2018-10-09T17:50:01.278Z" } \ No newline at end of file diff --git a/artifacts/json/MockTermsContract.json b/artifacts/json/MockTermsContract.json index 8b36447b..af91cd66 100644 --- a/artifacts/json/MockTermsContract.json +++ b/artifacts/json/MockTermsContract.json @@ -245,15 +245,15 @@ "type": "function" } ], - "bytecode": "0x6060604052341561000f57600080fd5b6113828061001e6000396000f3006060604052600436106100af576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806304aa85fa146100b457806313101858146100d95780632762dd8c1461015f5780635f0280ba1461019a57806360a068611461023f5780637f8601a11461029057806380da20d414610335578063977a5e64146103ac578063b433022f1461040a578063c45d83ef1461043a578063d826f88f14610498575b600080fd5b34156100bf57600080fd5b6100d7600480803515159060200190919050506104ad565b005b34156100e457600080fd5b610141600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091905050610507565b60405180826000191660001916815260200191505060405180910390f35b341561016a57600080fd5b610184600480803560001916906020019091905050610596565b6040518082815260200191505060405180910390f35b34156101a557600080fd5b61022560048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506105bb565b604051808215151515815260200191505060405180910390f35b341561024a57600080fd5b61028e60048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080351515906020019091905050610745565b005b341561029b57600080fd5b61031b60048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506107fd565b604051808215151515815260200191505060405180910390f35b341561034057600080fd5b6103aa600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080356000191690602001909190803560001916906020019091905050610937565b005b34156103b757600080fd5b6103f060048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610a61565b604051808215151515815260200191505060405180910390f35b341561041557600080fd5b610438600480803560001916906020019091908035906020019091905050610bb6565b005b341561044557600080fd5b61047e60048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610bda565b604051808215151515815260200191505060405180910390f35b34156104a357600080fd5b6104ab610c83565b005b6105046040805190810160405280601181526020017f726567697374657252657061796d656e740000000000000000000000000000008152506000600102836104fa5760006001026104ff565b600180025b610937565b50565b60006001836040518082805190602001908083835b602083101515610541578051825260208201915060208101905060208303925061051c565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b6000600360008360001916600019168152602001908152602001600020549050919050565b60006106ea6040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525087878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401955050505050506040518091039020610f7a565b60018002600019166107356040805190810160405280601181526020017f726567697374657252657061796d656e740000000000000000000000000000008152506000600102610507565b6000191614905095945050505050565b6107f86040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525084846040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040518091039020836107ee5760006001026107f3565b600180025b610937565b505050565b600061092c6040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525087878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019550505050505060405180910390206110b3565b905095945050505050565b6000836040518082805190602001908083835b60208310151561096f578051825260208201915060208101905060208303925061094a565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816109b4919061128d565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b602083101515610a0857805182526020820191506020810190506020830392506109e3565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b6000610b026040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525084846040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040518091039020610f7a565b6001800260001916610ba96040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525085856040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040518091039020610507565b6000191614905092915050565b80600360008460001916600019168152602001908152602001600020819055505050565b6000610c7b6040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525084846040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019250505060405180910390206110b3565b905092915050565b6000610c8d6112b9565b600080600093505b600a841015610f7457610ca661114f565b84600a81101515610cb357fe5b6020020151925060008351141515610f6757600091505b6000836040518082805190602001908083835b602083101515610d025780518252602082019150602081019050602083039250610cdd565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015610eef576000836040518082805190602001908083835b602083101515610d785780518252602082019150602081019050602083039250610d53565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902082815481101515610db857fe5b90600052602060002090015490506002836040518082805190602001908083835b602083101515610dfe5780518252602082019150602081019050602083039250610dd9565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b602083101515610e925780518252602082019150602081019050602083039250610e6d565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050610cca565b6000836040518082805190602001908083835b602083101515610f275780518252602082019150602081019050602083039250610f02565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000610f6691906112cd565b5b8380600101945050610c95565b50505050565b60016002836040518082805190602001908083835b602083101515610fb45780518252602082019150602081019050602083039250610f8f565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b60208310151561104f578051825260208201915060208101905060208303925061102a565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281611094919061128d565b9160005260206000209001600083909190915090600019169055505050565b60006002836040518082805190602001908083835b6020831015156110ed57805182526020820191506020810190506020830392506110c8565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b6111576112ee565b610140604051908101604052806040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525081526020016040805190810160405280601181526020017f72656769737465725465726d53746172740000000000000000000000000000008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b8154818355818115116112b4578183600052602060002091820191016112b3919061131d565b5b505050565b602060405190810160405280600081525090565b50805460008255906000526020600020908101906112eb919061131d565b50565b61014060405190810160405280600a905b611307611342565b8152602001906001900390816112ff5790505090565b61133f91905b8082111561133b576000816000905550600101611323565b5090565b90565b6020604051908101604052806000815250905600a165627a7a72305820dd2f1a586a6c9b47af225787fcb9bfc4ca8e161d014496f465bd5bdaf9cd87fe0029", - "deployedBytecode": "0x6060604052600436106100af576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806304aa85fa146100b457806313101858146100d95780632762dd8c1461015f5780635f0280ba1461019a57806360a068611461023f5780637f8601a11461029057806380da20d414610335578063977a5e64146103ac578063b433022f1461040a578063c45d83ef1461043a578063d826f88f14610498575b600080fd5b34156100bf57600080fd5b6100d7600480803515159060200190919050506104ad565b005b34156100e457600080fd5b610141600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091905050610507565b60405180826000191660001916815260200191505060405180910390f35b341561016a57600080fd5b610184600480803560001916906020019091905050610596565b6040518082815260200191505060405180910390f35b34156101a557600080fd5b61022560048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506105bb565b604051808215151515815260200191505060405180910390f35b341561024a57600080fd5b61028e60048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080351515906020019091905050610745565b005b341561029b57600080fd5b61031b60048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506107fd565b604051808215151515815260200191505060405180910390f35b341561034057600080fd5b6103aa600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080356000191690602001909190803560001916906020019091905050610937565b005b34156103b757600080fd5b6103f060048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610a61565b604051808215151515815260200191505060405180910390f35b341561041557600080fd5b610438600480803560001916906020019091908035906020019091905050610bb6565b005b341561044557600080fd5b61047e60048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610bda565b604051808215151515815260200191505060405180910390f35b34156104a357600080fd5b6104ab610c83565b005b6105046040805190810160405280601181526020017f726567697374657252657061796d656e740000000000000000000000000000008152506000600102836104fa5760006001026104ff565b600180025b610937565b50565b60006001836040518082805190602001908083835b602083101515610541578051825260208201915060208101905060208303925061051c565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b6000600360008360001916600019168152602001908152602001600020549050919050565b60006106ea6040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525087878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401955050505050506040518091039020610f7a565b60018002600019166107356040805190810160405280601181526020017f726567697374657252657061796d656e740000000000000000000000000000008152506000600102610507565b6000191614905095945050505050565b6107f86040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525084846040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040518091039020836107ee5760006001026107f3565b600180025b610937565b505050565b600061092c6040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525087878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019550505050505060405180910390206110b3565b905095945050505050565b6000836040518082805190602001908083835b60208310151561096f578051825260208201915060208101905060208303925061094a565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816109b4919061128d565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b602083101515610a0857805182526020820191506020810190506020830392506109e3565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b6000610b026040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525084846040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040518091039020610f7a565b6001800260001916610ba96040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525085856040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040518091039020610507565b6000191614905092915050565b80600360008460001916600019168152602001908152602001600020819055505050565b6000610c7b6040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525084846040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019250505060405180910390206110b3565b905092915050565b6000610c8d6112b9565b600080600093505b600a841015610f7457610ca661114f565b84600a81101515610cb357fe5b6020020151925060008351141515610f6757600091505b6000836040518082805190602001908083835b602083101515610d025780518252602082019150602081019050602083039250610cdd565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015610eef576000836040518082805190602001908083835b602083101515610d785780518252602082019150602081019050602083039250610d53565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902082815481101515610db857fe5b90600052602060002090015490506002836040518082805190602001908083835b602083101515610dfe5780518252602082019150602081019050602083039250610dd9565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b602083101515610e925780518252602082019150602081019050602083039250610e6d565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050610cca565b6000836040518082805190602001908083835b602083101515610f275780518252602082019150602081019050602083039250610f02565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000610f6691906112cd565b5b8380600101945050610c95565b50505050565b60016002836040518082805190602001908083835b602083101515610fb45780518252602082019150602081019050602083039250610f8f565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b60208310151561104f578051825260208201915060208101905060208303925061102a565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281611094919061128d565b9160005260206000209001600083909190915090600019169055505050565b60006002836040518082805190602001908083835b6020831015156110ed57805182526020820191506020810190506020830392506110c8565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b6111576112ee565b610140604051908101604052806040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525081526020016040805190810160405280601181526020017f72656769737465725465726d53746172740000000000000000000000000000008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b8154818355818115116112b4578183600052602060002091820191016112b3919061131d565b5b505050565b602060405190810160405280600081525090565b50805460008255906000526020600020908101906112eb919061131d565b50565b61014060405190810160405280600a905b611307611342565b8152602001906001900390816112ff5790505090565b61133f91905b8082111561133b576000816000905550600101611323565b5090565b90565b6020604051908101604052806000815250905600a165627a7a72305820dd2f1a586a6c9b47af225787fcb9bfc4ca8e161d014496f465bd5bdaf9cd87fe0029", + "bytecode": "0x6060604052341561000f57600080fd5b6113828061001e6000396000f3006060604052600436106100af576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806304aa85fa146100b457806313101858146100d95780632762dd8c1461015f5780635f0280ba1461019a57806360a068611461023f5780637f8601a11461029057806380da20d414610335578063977a5e64146103ac578063b433022f1461040a578063c45d83ef1461043a578063d826f88f14610498575b600080fd5b34156100bf57600080fd5b6100d7600480803515159060200190919050506104ad565b005b34156100e457600080fd5b610141600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091905050610507565b60405180826000191660001916815260200191505060405180910390f35b341561016a57600080fd5b610184600480803560001916906020019091905050610596565b6040518082815260200191505060405180910390f35b34156101a557600080fd5b61022560048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506105bb565b604051808215151515815260200191505060405180910390f35b341561024a57600080fd5b61028e60048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080351515906020019091905050610745565b005b341561029b57600080fd5b61031b60048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506107fd565b604051808215151515815260200191505060405180910390f35b341561034057600080fd5b6103aa600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080356000191690602001909190803560001916906020019091905050610937565b005b34156103b757600080fd5b6103f060048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610a61565b604051808215151515815260200191505060405180910390f35b341561041557600080fd5b610438600480803560001916906020019091908035906020019091905050610bb6565b005b341561044557600080fd5b61047e60048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610bda565b604051808215151515815260200191505060405180910390f35b34156104a357600080fd5b6104ab610c83565b005b6105046040805190810160405280601181526020017f726567697374657252657061796d656e740000000000000000000000000000008152506000600102836104fa5760006001026104ff565b600180025b610937565b50565b60006001836040518082805190602001908083835b602083101515610541578051825260208201915060208101905060208303925061051c565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b6000600360008360001916600019168152602001908152602001600020549050919050565b60006106ea6040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525087878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401955050505050506040518091039020610f7a565b60018002600019166107356040805190810160405280601181526020017f726567697374657252657061796d656e740000000000000000000000000000008152506000600102610507565b6000191614905095945050505050565b6107f86040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525084846040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040518091039020836107ee5760006001026107f3565b600180025b610937565b505050565b600061092c6040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525087878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019550505050505060405180910390206110b3565b905095945050505050565b6000836040518082805190602001908083835b60208310151561096f578051825260208201915060208101905060208303925061094a565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816109b4919061128d565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b602083101515610a0857805182526020820191506020810190506020830392506109e3565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b6000610b026040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525084846040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040518091039020610f7a565b6001800260001916610ba96040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525085856040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040518091039020610507565b6000191614905092915050565b80600360008460001916600019168152602001908152602001600020819055505050565b6000610c7b6040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525084846040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019250505060405180910390206110b3565b905092915050565b6000610c8d6112b9565b600080600093505b600a841015610f7457610ca661114f565b84600a81101515610cb357fe5b6020020151925060008351141515610f6757600091505b6000836040518082805190602001908083835b602083101515610d025780518252602082019150602081019050602083039250610cdd565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015610eef576000836040518082805190602001908083835b602083101515610d785780518252602082019150602081019050602083039250610d53565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902082815481101515610db857fe5b90600052602060002090015490506002836040518082805190602001908083835b602083101515610dfe5780518252602082019150602081019050602083039250610dd9565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b602083101515610e925780518252602082019150602081019050602083039250610e6d565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050610cca565b6000836040518082805190602001908083835b602083101515610f275780518252602082019150602081019050602083039250610f02565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000610f6691906112cd565b5b8380600101945050610c95565b50505050565b60016002836040518082805190602001908083835b602083101515610fb45780518252602082019150602081019050602083039250610f8f565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b60208310151561104f578051825260208201915060208101905060208303925061102a565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281611094919061128d565b9160005260206000209001600083909190915090600019169055505050565b60006002836040518082805190602001908083835b6020831015156110ed57805182526020820191506020810190506020830392506110c8565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b6111576112ee565b610140604051908101604052806040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525081526020016040805190810160405280601181526020017f72656769737465725465726d53746172740000000000000000000000000000008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b8154818355818115116112b4578183600052602060002091820191016112b3919061131d565b5b505050565b602060405190810160405280600081525090565b50805460008255906000526020600020908101906112eb919061131d565b50565b61014060405190810160405280600a905b611307611342565b8152602001906001900390816112ff5790505090565b61133f91905b8082111561133b576000816000905550600101611323565b5090565b90565b6020604051908101604052806000815250905600a165627a7a7230582064f0c3a441aa3426a3423aabf1bd74155f24b9a2d2319f555b608732344dbacf0029", + "deployedBytecode": "0x6060604052600436106100af576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806304aa85fa146100b457806313101858146100d95780632762dd8c1461015f5780635f0280ba1461019a57806360a068611461023f5780637f8601a11461029057806380da20d414610335578063977a5e64146103ac578063b433022f1461040a578063c45d83ef1461043a578063d826f88f14610498575b600080fd5b34156100bf57600080fd5b6100d7600480803515159060200190919050506104ad565b005b34156100e457600080fd5b610141600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091905050610507565b60405180826000191660001916815260200191505060405180910390f35b341561016a57600080fd5b610184600480803560001916906020019091905050610596565b6040518082815260200191505060405180910390f35b34156101a557600080fd5b61022560048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506105bb565b604051808215151515815260200191505060405180910390f35b341561024a57600080fd5b61028e60048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080351515906020019091905050610745565b005b341561029b57600080fd5b61031b60048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506107fd565b604051808215151515815260200191505060405180910390f35b341561034057600080fd5b6103aa600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080356000191690602001909190803560001916906020019091905050610937565b005b34156103b757600080fd5b6103f060048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610a61565b604051808215151515815260200191505060405180910390f35b341561041557600080fd5b610438600480803560001916906020019091908035906020019091905050610bb6565b005b341561044557600080fd5b61047e60048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610bda565b604051808215151515815260200191505060405180910390f35b34156104a357600080fd5b6104ab610c83565b005b6105046040805190810160405280601181526020017f726567697374657252657061796d656e740000000000000000000000000000008152506000600102836104fa5760006001026104ff565b600180025b610937565b50565b60006001836040518082805190602001908083835b602083101515610541578051825260208201915060208101905060208303925061051c565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b6000600360008360001916600019168152602001908152602001600020549050919050565b60006106ea6040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525087878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401955050505050506040518091039020610f7a565b60018002600019166107356040805190810160405280601181526020017f726567697374657252657061796d656e740000000000000000000000000000008152506000600102610507565b6000191614905095945050505050565b6107f86040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525084846040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040518091039020836107ee5760006001026107f3565b600180025b610937565b505050565b600061092c6040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525087878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019550505050505060405180910390206110b3565b905095945050505050565b6000836040518082805190602001908083835b60208310151561096f578051825260208201915060208101905060208303925061094a565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816109b4919061128d565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b602083101515610a0857805182526020820191506020810190506020830392506109e3565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b6000610b026040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525084846040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040518091039020610f7a565b6001800260001916610ba96040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525085856040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040518091039020610507565b6000191614905092915050565b80600360008460001916600019168152602001908152602001600020819055505050565b6000610c7b6040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525084846040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019250505060405180910390206110b3565b905092915050565b6000610c8d6112b9565b600080600093505b600a841015610f7457610ca661114f565b84600a81101515610cb357fe5b6020020151925060008351141515610f6757600091505b6000836040518082805190602001908083835b602083101515610d025780518252602082019150602081019050602083039250610cdd565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015610eef576000836040518082805190602001908083835b602083101515610d785780518252602082019150602081019050602083039250610d53565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902082815481101515610db857fe5b90600052602060002090015490506002836040518082805190602001908083835b602083101515610dfe5780518252602082019150602081019050602083039250610dd9565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b602083101515610e925780518252602082019150602081019050602083039250610e6d565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050610cca565b6000836040518082805190602001908083835b602083101515610f275780518252602082019150602081019050602083039250610f02565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000610f6691906112cd565b5b8380600101945050610c95565b50505050565b60016002836040518082805190602001908083835b602083101515610fb45780518252602082019150602081019050602083039250610f8f565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b60208310151561104f578051825260208201915060208101905060208303925061102a565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281611094919061128d565b9160005260206000209001600083909190915090600019169055505050565b60006002836040518082805190602001908083835b6020831015156110ed57805182526020820191506020810190506020830392506110c8565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b6111576112ee565b610140604051908101604052806040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525081526020016040805190810160405280601181526020017f72656769737465725465726d53746172740000000000000000000000000000008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b8154818355818115116112b4578183600052602060002091820191016112b3919061131d565b5b505050565b602060405190810160405280600081525090565b50805460008255906000526020600020908101906112eb919061131d565b50565b61014060405190810160405280600a905b611307611342565b8152602001906001900390816112ff5790505090565b61133f91905b8082111561133b576000816000905550600101611323565b5090565b90565b6020604051908101604052806000815250905600a165627a7a7230582064f0c3a441aa3426a3423aabf1bd74155f24b9a2d2319f555b608732344dbacf0029", "sourceMap": "640:2786:30:-;;;;;;;;;;;;;;;;;", "deployedSourceMap": "640:2786:30:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1344:187;;;;;;;;;;;;;;;;;;;;;;;;;;;;1294:217:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2831:147:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;811:527;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2547:278;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1697:469;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1018:270:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2172:369:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1537:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2984:245;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1517:610:23;;;;;;;;;;;;;;1344:187:30;1429:95;;;;;;;;;;;;;;;;;;;697:1:23;689:10;;1490:7:30;:33;;1521:1;1513:10;;1490:33;;;1508:1;1500:10;;1490:33;1429:15;:95::i;:::-;1344:187;:::o;1294:217:23:-;1411:24;1458:17;1476:12;1458:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1458:46:23;1490:13;1458:46;;;;;;;;;;;;;;;;;;1451:53;;1294:217;;;;:::o;2831:147:30:-;2916:7;2942:16;:29;2959:11;2942:29;;;;;;;;;;;;;;;;;;2935:36;;2831:147;;;:::o;811:527::-;1018:13;1047:189;;;;;;;;;;;;;;;;;;;1114:11;1139:5;1158:11;1183:16;1213:12;1091:144;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1047:22;:189::i;:::-;1329:1;1321:10;;1254:77;;;:63;;;;;;;;;;;;;;;;;;;697:1:23;689:10;;1254:18:30;:63::i;:::-;:77;;;;1247:84;;811:527;;;;;;;:::o;2547:278::-;2669:149;;;;;;;;;;;;;;;;;;;2741:11;2754:6;2731:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2775:7;:33;;2806:1;2798:10;;2775:33;;;2793:1;2785:10;;2775:33;2669:15;:149::i;:::-;2547:278;;;:::o;1697:469::-;1930:14;1967:192;;;;;;;;;;;;;;;;;;;2037:11;2062:5;2081:11;2106:16;2136:12;2014:144;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1967:25;:192::i;:::-;1960:199;;1697:469;;;;;;;:::o;1018:270:23:-;1155:22;1178:12;1155:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1155:56:23;;;;;;;;;;;:::i;:::-;;;;;;;;;;1197:13;1155:56;;;;;;;;;;;;1270:11;1221:17;1239:12;1221:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1221:46:23;1253:13;1221:46;;;;;;;;;;;;;;;;;:60;;;;;;;1018:270;;;:::o;2172:369:30:-;2290:16;2322:75;;;;;;;;;;;;;;;;;;;2376:11;2389:6;2366:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2322:22;:75::i;:::-;2532:1;2524:10;;2415:119;;;:105;;;;;;;;;;;;;;;;;;;2490:11;2503:6;2480:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2415:18;:105::i;:::-;:119;;;;2408:126;;2172:369;;;;:::o;1537:154::-;1675:9;1643:16;:29;1660:11;1643:29;;;;;;;;;;;;;;;;;:41;;;;1537:154;;:::o;2984:245::-;3106:15;3144:78;;;;;;;;;;;;;;;;;;;3201:11;3214:6;3191:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3144:25;:78::i;:::-;3137:85;;2984:245;;;;:::o;1517:610:23:-;1556:6;1595:26;;:::i;:::-;1719:6;1807:21;1565:1;1556:10;;1551:570;1572:2;1568:1;:6;1551:570;;;1624:17;:15;:17::i;:::-;1642:1;1624:20;;;;;;;;;;;;;1595:49;;1693:1;1669:12;1663:26;:31;;1659:452;;;1728:1;1719:10;;1714:321;1735:22;1758:12;1735:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1735:43:23;;;;1731:1;:47;1714:321;;;1831:22;1854:12;1831:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1868:1:23;1831:39;;;;;;;;;;;;;;;;;;;1807:63;;1899:13;1913:12;1899:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1899:42:23;1927:13;1899:42;;;;;;;;;;;;;;;;;;1892:49;;;;;;;;;;;1970:17;1988:12;1970:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1970:46:23;2002:13;1970:46;;;;;;;;;;;;;;;;;1963:53;;;1780:3;;;;;;;1714:321;;;2060:22;2083:12;2060:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;;2053:43:23;;;;:::i;:::-;1659:452;1576:3;;;;;;;1551:570;;;1517:610;;;;:::o;2133:202::-;2267:4;2231:13;2245:12;2231:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2231:33:23;2259:4;2231:33;;;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;2281:22;2304:12;2281:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2281:47:23;;;;;;;;;;;:::i;:::-;;;;;;;;;;2323:4;2281:47;;;;;;;;;;;;2133:202;;:::o;2341:194::-;2458:14;2495:13;2509:12;2495:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2495:33:23;2523:4;2495:33;;;;;;;;;;;;;;;;;;;;;;;;;;;2488:40;;2341:194;;;;:::o;3235:189:30:-;3296:24;;:::i;:::-;3336:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3235:189;:::o;640:2786::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\nimport \"./MockContract.sol\";\n\n\ncontract MockTermsContract is MockContract {\n // Maps from agreementId's to the mocked term end timestamp\n mapping (bytes32 => uint) internal termEndTimestamp;\n\n function registerRepayment(\n bytes32 agreementId,\n address payer,\n address beneficiary,\n uint unitsOfRepayment,\n address tokenAddress\n )\n public\n returns (bool _success)\n {\n functionCalledWithArgs(\"registerRepayment\", keccak256(\n agreementId,\n payer,\n beneficiary,\n unitsOfRepayment,\n tokenAddress\n ));\n\n return getMockReturnValue(\"registerRepayment\", DEFAULT_SIGNATURE_ARGS) == bytes32(1);\n }\n\n function mockRegisterRepaymentReturnValue(bool success)\n public\n {\n mockReturnValue(\"registerRepayment\", DEFAULT_SIGNATURE_ARGS, success ? bytes32(1) : bytes32(0));\n }\n\n function mockTermEndTimestamp(\n bytes32 agreementId,\n uint timestamp\n ) public {\n termEndTimestamp[agreementId] = timestamp;\n }\n\n function wasRegisterRepaymentCalledWith(\n bytes32 agreementId,\n address payer,\n address beneficiary,\n uint unitsOfRepayment,\n address tokenAddress\n )\n public\n view\n returns (bool wasCalled)\n {\n return wasFunctionCalledWithArgs(\"registerRepayment\", keccak256(\n agreementId,\n payer,\n beneficiary,\n unitsOfRepayment,\n tokenAddress\n ));\n }\n\n function registerTermStart(\n bytes32 agreementId,\n address debtor\n )\n public\n returns (bool _registered)\n {\n functionCalledWithArgs(\"registerTermStart\", keccak256(agreementId, debtor));\n\n return getMockReturnValue(\n \"registerTermStart\",\n keccak256(agreementId, debtor)\n ) == bytes32(1);\n }\n\n function mockRegisterTermStartReturnValue(bytes32 agreementId, address debtor, bool success)\n public\n {\n mockReturnValue(\n \"registerTermStart\",\n keccak256(agreementId, debtor),\n success ? bytes32(1) : bytes32(0)\n );\n }\n\n function getTermEndTimestamp(\n bytes32 agreementId\n ) public view returns (uint256) {\n return termEndTimestamp[agreementId];\n }\n\n function wasRegisterTermStartCalledWith(bytes32 agreementId, address debtor)\n public\n view\n returns (bool _wasCalled)\n {\n return wasFunctionCalledWithArgs(\"registerTermStart\", keccak256(agreementId, debtor));\n }\n\n function getFunctionList()\n internal\n returns (string[10] functionNames)\n {\n return [\"registerRepayment\", \"registerTermStart\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\"];\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockTermsContract.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockTermsContract.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockTermsContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockTermsContract.sol", "exportedSymbols": { "MockTermsContract": [ 12345 @@ -276,7 +276,7 @@ { "attributes": { "SourceUnit": 10693, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockContract.sol", "file": "./MockContract.sol", "scope": 12346, "symbolAliases": [ @@ -3394,7 +3394,7 @@ "42": { "events": {}, "links": {}, - "address": "0xb0f7c5054eed756d6522d60fd02cd29be8b19a96" + "address": "0x76dcdc1df7af00e87bb5dd8f600e5637053fc0e1" }, "70": { "events": {}, @@ -3403,5 +3403,5 @@ } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:13:01.034Z" + "updatedAt": "2018-10-09T17:50:01.274Z" } \ No newline at end of file diff --git a/artifacts/json/MockTokenRegistry.json b/artifacts/json/MockTokenRegistry.json index 340158d3..f44e9d96 100644 --- a/artifacts/json/MockTokenRegistry.json +++ b/artifacts/json/MockTokenRegistry.json @@ -130,15 +130,15 @@ "type": "function" } ], - "bytecode": "0x6060604052341561000f57600080fd5b610c7b8061001e6000396000f300606060405260043610610083576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806313101858146100885780633550b6d91461010e5780635715c5b7146101ab57806380da20d41461020e5780639a22471514610285578063d826f88f14610301578063e1f1956414610316575b600080fd5b341561009357600080fd5b6100f0600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091905050610358565b60405180826000191660001916815260200191505060405180910390f35b341561011957600080fd5b610169600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506103e7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101b657600080fd5b6101cc6004808035906020019091905050610495565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561021957600080fd5b610283600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091908035600019169060200190919050506104f6565b005b341561029057600080fd5b6102ff600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610620565b005b341561030c57600080fd5b6103146106df565b005b341561032157600080fd5b610356600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506109d6565b005b60006001836040518082805190602001908083835b602083101515610392578051825260208201915060208101905060208303925061036d565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b600061048a6040805190810160405280601781526020017f676574546f6b656e41646472657373427953796d626f6c000000000000000000815250836040518082805190602001908083835b6020831015156104585780518252602082019150602081019050602083039250610433565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020610358565b600190049050919050565b60006104eb6040805190810160405280601681526020017f676574546f6b656e416464726573734279496e6465780000000000000000000081525083604051808281526020019150506040518091039020610358565b600190049050919050565b6000836040518082805190602001908083835b60208310151561052e5780518252602082019150602081019050602083039250610509565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816105739190610b86565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b6020831015156105c757805182526020820191506020810190506020830392506105a2565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b6106db6040805190810160405280601781526020017f676574546f6b656e41646472657373427953796d626f6c000000000000000000815250836040518082805190602001908083835b60208310151561068f578051825260208201915060208101905060208303925061066a565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390208373ffffffffffffffffffffffffffffffffffffffff166001026104f6565b5050565b60006106e9610bb2565b600080600093505b600a8410156109d057610702610a48565b84600a8110151561070f57fe5b60200201519250600083511415156109c357600091505b6000836040518082805190602001908083835b60208310151561075e5780518252602082019150602081019050602083039250610739565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054905082101561094b576000836040518082805190602001908083835b6020831015156107d457805182526020820191506020810190506020830392506107af565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208281548110151561081457fe5b90600052602060002090015490506002836040518082805190602001908083835b60208310151561085a5780518252602082019150602081019050602083039250610835565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b6020831015156108ee57805182526020820191506020810190506020830392506108c9565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050610726565b6000836040518082805190602001908083835b602083101515610983578051825260208201915060208101905060208303925061095e565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006109c29190610bc6565b5b83806001019450506106f1565b50505050565b610a446040805190810160405280601681526020017f676574546f6b656e416464726573734279496e64657800000000000000000000815250836040518082815260200191505060405180910390208373ffffffffffffffffffffffffffffffffffffffff166001026104f6565b5050565b610a50610be7565b610140604051908101604052806040805190810160405280601781526020017f676574546f6b656e41646472657373427953796d626f6c00000000000000000081525081526020016040805190810160405280601681526020017f676574546f6b656e416464726573734279496e646578000000000000000000008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b815481835581811511610bad57818360005260206000209182019101610bac9190610c16565b5b505050565b602060405190810160405280600081525090565b5080546000825590600052602060002090810190610be49190610c16565b50565b61014060405190810160405280600a905b610c00610c3b565b815260200190600190039081610bf85790505090565b610c3891905b80821115610c34576000816000905550600101610c1c565b5090565b90565b6020604051908101604052806000815250905600a165627a7a723058209cb701e32bf165977bd5586d506811cb88300142a2fa893bb1018312372e1cc50029", - "deployedBytecode": "0x606060405260043610610083576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806313101858146100885780633550b6d91461010e5780635715c5b7146101ab57806380da20d41461020e5780639a22471514610285578063d826f88f14610301578063e1f1956414610316575b600080fd5b341561009357600080fd5b6100f0600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091905050610358565b60405180826000191660001916815260200191505060405180910390f35b341561011957600080fd5b610169600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506103e7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101b657600080fd5b6101cc6004808035906020019091905050610495565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561021957600080fd5b610283600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091908035600019169060200190919050506104f6565b005b341561029057600080fd5b6102ff600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610620565b005b341561030c57600080fd5b6103146106df565b005b341561032157600080fd5b610356600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506109d6565b005b60006001836040518082805190602001908083835b602083101515610392578051825260208201915060208101905060208303925061036d565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b600061048a6040805190810160405280601781526020017f676574546f6b656e41646472657373427953796d626f6c000000000000000000815250836040518082805190602001908083835b6020831015156104585780518252602082019150602081019050602083039250610433565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020610358565b600190049050919050565b60006104eb6040805190810160405280601681526020017f676574546f6b656e416464726573734279496e6465780000000000000000000081525083604051808281526020019150506040518091039020610358565b600190049050919050565b6000836040518082805190602001908083835b60208310151561052e5780518252602082019150602081019050602083039250610509565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816105739190610b86565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b6020831015156105c757805182526020820191506020810190506020830392506105a2565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b6106db6040805190810160405280601781526020017f676574546f6b656e41646472657373427953796d626f6c000000000000000000815250836040518082805190602001908083835b60208310151561068f578051825260208201915060208101905060208303925061066a565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390208373ffffffffffffffffffffffffffffffffffffffff166001026104f6565b5050565b60006106e9610bb2565b600080600093505b600a8410156109d057610702610a48565b84600a8110151561070f57fe5b60200201519250600083511415156109c357600091505b6000836040518082805190602001908083835b60208310151561075e5780518252602082019150602081019050602083039250610739565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054905082101561094b576000836040518082805190602001908083835b6020831015156107d457805182526020820191506020810190506020830392506107af565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208281548110151561081457fe5b90600052602060002090015490506002836040518082805190602001908083835b60208310151561085a5780518252602082019150602081019050602083039250610835565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b6020831015156108ee57805182526020820191506020810190506020830392506108c9565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050610726565b6000836040518082805190602001908083835b602083101515610983578051825260208201915060208101905060208303925061095e565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006109c29190610bc6565b5b83806001019450506106f1565b50505050565b610a446040805190810160405280601681526020017f676574546f6b656e416464726573734279496e64657800000000000000000000815250836040518082815260200191505060405180910390208373ffffffffffffffffffffffffffffffffffffffff166001026104f6565b5050565b610a50610be7565b610140604051908101604052806040805190810160405280601781526020017f676574546f6b656e41646472657373427953796d626f6c00000000000000000081525081526020016040805190810160405280601681526020017f676574546f6b656e416464726573734279496e646578000000000000000000008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b815481835581811511610bad57818360005260206000209182019101610bac9190610c16565b5b505050565b602060405190810160405280600081525090565b5080546000825590600052602060002090810190610be49190610c16565b50565b61014060405190810160405280600a905b610c00610c3b565b815260200190600190039081610bf85790505090565b610c3891905b80821115610c34576000816000905550600101610c1c565b5090565b90565b6020604051908101604052806000815250905600a165627a7a723058209cb701e32bf165977bd5586d506811cb88300142a2fa893bb1018312372e1cc50029", + "bytecode": "0x6060604052341561000f57600080fd5b610c7b8061001e6000396000f300606060405260043610610083576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806313101858146100885780633550b6d91461010e5780635715c5b7146101ab57806380da20d41461020e5780639a22471514610285578063d826f88f14610301578063e1f1956414610316575b600080fd5b341561009357600080fd5b6100f0600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091905050610358565b60405180826000191660001916815260200191505060405180910390f35b341561011957600080fd5b610169600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506103e7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101b657600080fd5b6101cc6004808035906020019091905050610495565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561021957600080fd5b610283600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091908035600019169060200190919050506104f6565b005b341561029057600080fd5b6102ff600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610620565b005b341561030c57600080fd5b6103146106df565b005b341561032157600080fd5b610356600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506109d6565b005b60006001836040518082805190602001908083835b602083101515610392578051825260208201915060208101905060208303925061036d565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b600061048a6040805190810160405280601781526020017f676574546f6b656e41646472657373427953796d626f6c000000000000000000815250836040518082805190602001908083835b6020831015156104585780518252602082019150602081019050602083039250610433565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020610358565b600190049050919050565b60006104eb6040805190810160405280601681526020017f676574546f6b656e416464726573734279496e6465780000000000000000000081525083604051808281526020019150506040518091039020610358565b600190049050919050565b6000836040518082805190602001908083835b60208310151561052e5780518252602082019150602081019050602083039250610509565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816105739190610b86565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b6020831015156105c757805182526020820191506020810190506020830392506105a2565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b6106db6040805190810160405280601781526020017f676574546f6b656e41646472657373427953796d626f6c000000000000000000815250836040518082805190602001908083835b60208310151561068f578051825260208201915060208101905060208303925061066a565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390208373ffffffffffffffffffffffffffffffffffffffff166001026104f6565b5050565b60006106e9610bb2565b600080600093505b600a8410156109d057610702610a48565b84600a8110151561070f57fe5b60200201519250600083511415156109c357600091505b6000836040518082805190602001908083835b60208310151561075e5780518252602082019150602081019050602083039250610739565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054905082101561094b576000836040518082805190602001908083835b6020831015156107d457805182526020820191506020810190506020830392506107af565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208281548110151561081457fe5b90600052602060002090015490506002836040518082805190602001908083835b60208310151561085a5780518252602082019150602081019050602083039250610835565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b6020831015156108ee57805182526020820191506020810190506020830392506108c9565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050610726565b6000836040518082805190602001908083835b602083101515610983578051825260208201915060208101905060208303925061095e565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006109c29190610bc6565b5b83806001019450506106f1565b50505050565b610a446040805190810160405280601681526020017f676574546f6b656e416464726573734279496e64657800000000000000000000815250836040518082815260200191505060405180910390208373ffffffffffffffffffffffffffffffffffffffff166001026104f6565b5050565b610a50610be7565b610140604051908101604052806040805190810160405280601781526020017f676574546f6b656e41646472657373427953796d626f6c00000000000000000081525081526020016040805190810160405280601681526020017f676574546f6b656e416464726573734279496e646578000000000000000000008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b815481835581811511610bad57818360005260206000209182019101610bac9190610c16565b5b505050565b602060405190810160405280600081525090565b5080546000825590600052602060002090810190610be49190610c16565b50565b61014060405190810160405280600a905b610c00610c3b565b815260200190600190039081610bf85790505090565b610c3891905b80821115610c34576000816000905550600101610c1c565b5090565b90565b6020604051908101604052806000815250905600a165627a7a72305820d6624be7f630164703e7fe969dc32739ddfcc754d5181ff0a230d964f42c6d2c0029", + "deployedBytecode": "0x606060405260043610610083576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806313101858146100885780633550b6d91461010e5780635715c5b7146101ab57806380da20d41461020e5780639a22471514610285578063d826f88f14610301578063e1f1956414610316575b600080fd5b341561009357600080fd5b6100f0600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091905050610358565b60405180826000191660001916815260200191505060405180910390f35b341561011957600080fd5b610169600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506103e7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101b657600080fd5b6101cc6004808035906020019091905050610495565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561021957600080fd5b610283600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091908035600019169060200190919050506104f6565b005b341561029057600080fd5b6102ff600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610620565b005b341561030c57600080fd5b6103146106df565b005b341561032157600080fd5b610356600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506109d6565b005b60006001836040518082805190602001908083835b602083101515610392578051825260208201915060208101905060208303925061036d565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b600061048a6040805190810160405280601781526020017f676574546f6b656e41646472657373427953796d626f6c000000000000000000815250836040518082805190602001908083835b6020831015156104585780518252602082019150602081019050602083039250610433565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020610358565b600190049050919050565b60006104eb6040805190810160405280601681526020017f676574546f6b656e416464726573734279496e6465780000000000000000000081525083604051808281526020019150506040518091039020610358565b600190049050919050565b6000836040518082805190602001908083835b60208310151561052e5780518252602082019150602081019050602083039250610509565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816105739190610b86565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b6020831015156105c757805182526020820191506020810190506020830392506105a2565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b6106db6040805190810160405280601781526020017f676574546f6b656e41646472657373427953796d626f6c000000000000000000815250836040518082805190602001908083835b60208310151561068f578051825260208201915060208101905060208303925061066a565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390208373ffffffffffffffffffffffffffffffffffffffff166001026104f6565b5050565b60006106e9610bb2565b600080600093505b600a8410156109d057610702610a48565b84600a8110151561070f57fe5b60200201519250600083511415156109c357600091505b6000836040518082805190602001908083835b60208310151561075e5780518252602082019150602081019050602083039250610739565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054905082101561094b576000836040518082805190602001908083835b6020831015156107d457805182526020820191506020810190506020830392506107af565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208281548110151561081457fe5b90600052602060002090015490506002836040518082805190602001908083835b60208310151561085a5780518252602082019150602081019050602083039250610835565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b6020831015156108ee57805182526020820191506020810190506020830392506108c9565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050610726565b6000836040518082805190602001908083835b602083101515610983578051825260208201915060208101905060208303925061095e565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006109c29190610bc6565b5b83806001019450506106f1565b50505050565b610a446040805190810160405280601681526020017f676574546f6b656e416464726573734279496e64657800000000000000000000815250836040518082815260200191505060405180910390208373ffffffffffffffffffffffffffffffffffffffff166001026104f6565b5050565b610a50610be7565b610140604051908101604052806040805190810160405280601781526020017f676574546f6b656e41646472657373427953796d626f6c00000000000000000081525081526020016040805190810160405280601681526020017f676574546f6b656e416464726573734279496e646578000000000000000000008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b815481835581811511610bad57818360005260206000209182019101610bac9190610c16565b5b505050565b602060405190810160405280600081525090565b5080546000825590600052602060002090810190610be49190610c16565b50565b61014060405190810160405280600a905b610c00610c3b565b815260200190600190039081610bf85790505090565b610c3891905b80821115610c34576000816000905550600101610c1c565b5090565b90565b6020604051908101604052806000815250905600a165627a7a72305820d6624be7f630164703e7fe969dc32739ddfcc754d5181ff0a230d964f42c6d2c0029", "sourceMap": "640:1029:31:-;;;;;;;;;;;;;;;;;", "deployedSourceMap": "640:1029:31:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1294:217:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;689:203:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;898:197;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1018:270:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1101:180:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1517:610:23;;;;;;;;;;;;;;1287:174:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1294:217:23;1411:24;1458:17;1476:12;1458:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1458:46:23;1490:13;1458:46;;;;;;;;;;;;;;;;;;1451:53;;1294:217;;;;:::o;689:203:31:-;782:7;820:64;;;;;;;;;;;;;;;;;;;876:6;866:17;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;820:18:31;:64::i;:::-;812:73;;;805:80;;689:203;;;:::o;898:197::-;987:7;1025:62;;;;;;;;;;;;;;;;;;;1080:5;1070:16;;;;;;;;;;;;;;;;;;1025:18;:62::i;:::-;1017:71;;;1010:78;;898:197;;;:::o;1018:270:23:-;1155:22;1178:12;1155:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1155:56:23;;;;;;;;;;;:::i;:::-;;;;;;;;;;1197:13;1155:56;;;;;;;;;;;;1270:11;1221:17;1239:12;1221:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1221:46:23;1253:13;1221:46;;;;;;;;;;;;;;;;;:60;;;;;;;1018:270;;;:::o;1101:180:31:-;1197:77;;;;;;;;;;;;;;;;;;;1250:6;1240:17;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;1267:5:31;1259:14;;;;1197:15;:77::i;:::-;1101:180;;:::o;1517:610:23:-;1556:6;1595:26;;:::i;:::-;1719:6;1807:21;1565:1;1556:10;;1551:570;1572:2;1568:1;:6;1551:570;;;1624:17;:15;:17::i;:::-;1642:1;1624:20;;;;;;;;;;;;;1595:49;;1693:1;1669:12;1663:26;:31;;1659:452;;;1728:1;1719:10;;1714:321;1735:22;1758:12;1735:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1735:43:23;;;;1731:1;:47;1714:321;;;1831:22;1854:12;1831:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1868:1:23;1831:39;;;;;;;;;;;;;;;;;;;1807:63;;1899:13;1913:12;1899:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1899:42:23;1927:13;1899:42;;;;;;;;;;;;;;;;;;1892:49;;;;;;;;;;;1970:17;1988:12;1970:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1970:46:23;2002:13;1970:46;;;;;;;;;;;;;;;;;1963:53;;;1780:3;;;;;;;1714:321;;;2060:22;2083:12;2060:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;;2053:43:23;;;;:::i;:::-;1659:452;1576:3;;;;;;;1551:570;;;1517:610;;;;:::o;1287:174:31:-;1379:75;;;;;;;;;;;;;;;;;;;1431:5;1421:16;;;;;;;;;;;;;;;;;;1447:5;1439:14;;;;1379:15;:75::i;:::-;1287:174;;:::o;1467:200::-;1528:24;;:::i;:::-;1568:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1467:200;:::o;640:1029::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\nimport \"./MockContract.sol\";\n\n\ncontract MockTokenRegistry is MockContract {\n function getTokenAddressBySymbol(string symbol)\n public\n view\n returns (address)\n {\n return address(getMockReturnValue(\"getTokenAddressBySymbol\", keccak256(symbol)));\n }\n\n function getTokenAddressByIndex(uint index)\n public\n view\n returns (address)\n {\n return address(getMockReturnValue(\"getTokenAddressByIndex\", keccak256(index)));\n }\n\n function mockGetTokenAddressBySymbol(string symbol, address token)\n public\n {\n mockReturnValue(\"getTokenAddressBySymbol\", keccak256(symbol), bytes32(token));\n }\n\n function mockGetTokenAddressByIndex(uint index, address token)\n public\n {\n mockReturnValue(\"getTokenAddressByIndex\", keccak256(index), bytes32(token));\n }\n\n function getFunctionList()\n internal\n returns (string[10] functionNames)\n {\n return [\"getTokenAddressBySymbol\", \"getTokenAddressByIndex\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\"];\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockTokenRegistry.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockTokenRegistry.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockTokenRegistry.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockTokenRegistry.sol", "exportedSymbols": { "MockTokenRegistry": [ 12441 @@ -161,7 +161,7 @@ { "attributes": { "SourceUnit": 10693, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockContract.sol", "file": "./MockContract.sol", "scope": 12442, "symbolAliases": [ @@ -1587,7 +1587,7 @@ "42": { "events": {}, "links": {}, - "address": "0x7723ed4c29ba84d381dd389890ccb0c17cda7204" + "address": "0x8d60b63345a4394a627672aca9f0f2541057d0ba" }, "70": { "events": {}, @@ -1596,5 +1596,5 @@ } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:13:01.033Z" + "updatedAt": "2018-10-09T17:50:01.268Z" } \ No newline at end of file diff --git a/artifacts/json/MockTokenTransferProxy.json b/artifacts/json/MockTokenTransferProxy.json index 413d2356..cfbe53a5 100644 --- a/artifacts/json/MockTokenTransferProxy.json +++ b/artifacts/json/MockTokenTransferProxy.json @@ -118,15 +118,15 @@ "type": "function" } ], - "bytecode": "0x6060604052341561000f57600080fd5b610d9b8061001e6000396000f30060606040526004361061006d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063131018581461007257806315dacbea146100f857806329f5967c1461019057806380da20d414610228578063d826f88f1461029f575b600080fd5b341561007d57600080fd5b6100da600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091908035600019169060200190919050506102b4565b60405180826000191660001916815260200191505060405180910390f35b341561010357600080fd5b610176600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610343565b604051808215151515815260200191505060405180910390f35b341561019b57600080fd5b61020e600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061046e565b604051808215151515815260200191505060405180910390f35b341561023357600080fd5b61029d600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080356000191690602001909190803560001916906020019091905050610597565b005b34156102aa57600080fd5b6102b26106c1565b005b60006001836040518082805190602001908083835b6020831015156102ee57805182526020820191506020810190506020830392506102c9565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b60006104626040805190810160405280600c81526020017f7472616e7366657246726f6d000000000000000000000000000000000000000081525086868686604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140182815260200194505050505060405180910390206109b8565b60019050949350505050565b600061058d6040805190810160405280600c81526020017f7472616e7366657246726f6d000000000000000000000000000000000000000081525086868686604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018281526020019450505050506040518091039020610af1565b9050949350505050565b6000836040518082805190602001908083835b6020831015156105cf57805182526020820191506020810190506020830392506105aa565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816106149190610ca6565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b6020831015156106685780518252602082019150602081019050602083039250610643565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b60006106cb610cd2565b600080600093505b600a8410156109b2576106e4610b8d565b84600a811015156106f157fe5b60200201519250600083511415156109a557600091505b6000836040518082805190602001908083835b602083101515610740578051825260208201915060208101905060208303925061071b565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054905082101561092d576000836040518082805190602001908083835b6020831015156107b65780518252602082019150602081019050602083039250610791565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020828154811015156107f657fe5b90600052602060002090015490506002836040518082805190602001908083835b60208310151561083c5780518252602082019150602081019050602083039250610817565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b6020831015156108d057805182526020820191506020810190506020830392506108ab565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050610708565b6000836040518082805190602001908083835b6020831015156109655780518252602082019150602081019050602083039250610940565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006109a49190610ce6565b5b83806001019450506106d3565b50505050565b60016002836040518082805190602001908083835b6020831015156109f257805182526020820191506020810190506020830392506109cd565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b602083101515610a8d5780518252602082019150602081019050602083039250610a68565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281610ad29190610ca6565b9160005260206000209001600083909190915090600019169055505050565b60006002836040518082805190602001908083835b602083101515610b2b5780518252602082019150602081019050602083039250610b06565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b610b95610d07565b610140604051908101604052806040805190810160405280600c81526020017f7472616e7366657246726f6d0000000000000000000000000000000000000000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b815481835581811511610ccd57818360005260206000209182019101610ccc9190610d36565b5b505050565b602060405190810160405280600081525090565b5080546000825590600052602060002090810190610d049190610d36565b50565b61014060405190810160405280600a905b610d20610d5b565b815260200190600190039081610d185790505090565b610d5891905b80821115610d54576000816000905550600101610d3c565b5090565b90565b6020604051908101604052806000815250905600a165627a7a72305820c914a6830543a821acf2bd660c6504fcfc6beb076fadd06cd3906389e5b568230029", - "deployedBytecode": "0x60606040526004361061006d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063131018581461007257806315dacbea146100f857806329f5967c1461019057806380da20d414610228578063d826f88f1461029f575b600080fd5b341561007d57600080fd5b6100da600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091908035600019169060200190919050506102b4565b60405180826000191660001916815260200191505060405180910390f35b341561010357600080fd5b610176600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610343565b604051808215151515815260200191505060405180910390f35b341561019b57600080fd5b61020e600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061046e565b604051808215151515815260200191505060405180910390f35b341561023357600080fd5b61029d600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080356000191690602001909190803560001916906020019091905050610597565b005b34156102aa57600080fd5b6102b26106c1565b005b60006001836040518082805190602001908083835b6020831015156102ee57805182526020820191506020810190506020830392506102c9565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b60006104626040805190810160405280600c81526020017f7472616e7366657246726f6d000000000000000000000000000000000000000081525086868686604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140182815260200194505050505060405180910390206109b8565b60019050949350505050565b600061058d6040805190810160405280600c81526020017f7472616e7366657246726f6d000000000000000000000000000000000000000081525086868686604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018281526020019450505050506040518091039020610af1565b9050949350505050565b6000836040518082805190602001908083835b6020831015156105cf57805182526020820191506020810190506020830392506105aa565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816106149190610ca6565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b6020831015156106685780518252602082019150602081019050602083039250610643565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b60006106cb610cd2565b600080600093505b600a8410156109b2576106e4610b8d565b84600a811015156106f157fe5b60200201519250600083511415156109a557600091505b6000836040518082805190602001908083835b602083101515610740578051825260208201915060208101905060208303925061071b565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054905082101561092d576000836040518082805190602001908083835b6020831015156107b65780518252602082019150602081019050602083039250610791565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020828154811015156107f657fe5b90600052602060002090015490506002836040518082805190602001908083835b60208310151561083c5780518252602082019150602081019050602083039250610817565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b6020831015156108d057805182526020820191506020810190506020830392506108ab565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050610708565b6000836040518082805190602001908083835b6020831015156109655780518252602082019150602081019050602083039250610940565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006109a49190610ce6565b5b83806001019450506106d3565b50505050565b60016002836040518082805190602001908083835b6020831015156109f257805182526020820191506020810190506020830392506109cd565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b602083101515610a8d5780518252602082019150602081019050602083039250610a68565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281610ad29190610ca6565b9160005260206000209001600083909190915090600019169055505050565b60006002836040518082805190602001908083835b602083101515610b2b5780518252602082019150602081019050602083039250610b06565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b610b95610d07565b610140604051908101604052806040805190810160405280600c81526020017f7472616e7366657246726f6d0000000000000000000000000000000000000000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b815481835581811511610ccd57818360005260206000209182019101610ccc9190610d36565b5b505050565b602060405190810160405280600081525090565b5080546000825590600052602060002090810190610d049190610d36565b50565b61014060405190810160405280600a905b610d20610d5b565b815260200190600190039081610d185790505090565b610d5891905b80821115610d54576000816000905550600101610d3c565b5090565b90565b6020604051908101604052806000815250905600a165627a7a72305820c914a6830543a821acf2bd660c6504fcfc6beb076fadd06cd3906389e5b568230029", + "bytecode": "0x6060604052341561000f57600080fd5b610d9b8061001e6000396000f30060606040526004361061006d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063131018581461007257806315dacbea146100f857806329f5967c1461019057806380da20d414610228578063d826f88f1461029f575b600080fd5b341561007d57600080fd5b6100da600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091908035600019169060200190919050506102b4565b60405180826000191660001916815260200191505060405180910390f35b341561010357600080fd5b610176600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610343565b604051808215151515815260200191505060405180910390f35b341561019b57600080fd5b61020e600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061046e565b604051808215151515815260200191505060405180910390f35b341561023357600080fd5b61029d600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080356000191690602001909190803560001916906020019091905050610597565b005b34156102aa57600080fd5b6102b26106c1565b005b60006001836040518082805190602001908083835b6020831015156102ee57805182526020820191506020810190506020830392506102c9565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b60006104626040805190810160405280600c81526020017f7472616e7366657246726f6d000000000000000000000000000000000000000081525086868686604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140182815260200194505050505060405180910390206109b8565b60019050949350505050565b600061058d6040805190810160405280600c81526020017f7472616e7366657246726f6d000000000000000000000000000000000000000081525086868686604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018281526020019450505050506040518091039020610af1565b9050949350505050565b6000836040518082805190602001908083835b6020831015156105cf57805182526020820191506020810190506020830392506105aa565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816106149190610ca6565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b6020831015156106685780518252602082019150602081019050602083039250610643565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b60006106cb610cd2565b600080600093505b600a8410156109b2576106e4610b8d565b84600a811015156106f157fe5b60200201519250600083511415156109a557600091505b6000836040518082805190602001908083835b602083101515610740578051825260208201915060208101905060208303925061071b565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054905082101561092d576000836040518082805190602001908083835b6020831015156107b65780518252602082019150602081019050602083039250610791565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020828154811015156107f657fe5b90600052602060002090015490506002836040518082805190602001908083835b60208310151561083c5780518252602082019150602081019050602083039250610817565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b6020831015156108d057805182526020820191506020810190506020830392506108ab565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050610708565b6000836040518082805190602001908083835b6020831015156109655780518252602082019150602081019050602083039250610940565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006109a49190610ce6565b5b83806001019450506106d3565b50505050565b60016002836040518082805190602001908083835b6020831015156109f257805182526020820191506020810190506020830392506109cd565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b602083101515610a8d5780518252602082019150602081019050602083039250610a68565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281610ad29190610ca6565b9160005260206000209001600083909190915090600019169055505050565b60006002836040518082805190602001908083835b602083101515610b2b5780518252602082019150602081019050602083039250610b06565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b610b95610d07565b610140604051908101604052806040805190810160405280600c81526020017f7472616e7366657246726f6d0000000000000000000000000000000000000000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b815481835581811511610ccd57818360005260206000209182019101610ccc9190610d36565b5b505050565b602060405190810160405280600081525090565b5080546000825590600052602060002090810190610d049190610d36565b50565b61014060405190810160405280600a905b610d20610d5b565b815260200190600190039081610d185790505090565b610d5891905b80821115610d54576000816000905550600101610d3c565b5090565b90565b6020604051908101604052806000815250905600a165627a7a72305820c4be82117623ab8bbec2a7b895d532488e30faa49392945c3494ce6849daa3820029", + "deployedBytecode": "0x60606040526004361061006d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063131018581461007257806315dacbea146100f857806329f5967c1461019057806380da20d414610228578063d826f88f1461029f575b600080fd5b341561007d57600080fd5b6100da600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091908035600019169060200190919050506102b4565b60405180826000191660001916815260200191505060405180910390f35b341561010357600080fd5b610176600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610343565b604051808215151515815260200191505060405180910390f35b341561019b57600080fd5b61020e600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061046e565b604051808215151515815260200191505060405180910390f35b341561023357600080fd5b61029d600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080356000191690602001909190803560001916906020019091905050610597565b005b34156102aa57600080fd5b6102b26106c1565b005b60006001836040518082805190602001908083835b6020831015156102ee57805182526020820191506020810190506020830392506102c9565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b60006104626040805190810160405280600c81526020017f7472616e7366657246726f6d000000000000000000000000000000000000000081525086868686604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140182815260200194505050505060405180910390206109b8565b60019050949350505050565b600061058d6040805190810160405280600c81526020017f7472616e7366657246726f6d000000000000000000000000000000000000000081525086868686604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018281526020019450505050506040518091039020610af1565b9050949350505050565b6000836040518082805190602001908083835b6020831015156105cf57805182526020820191506020810190506020830392506105aa565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816106149190610ca6565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b6020831015156106685780518252602082019150602081019050602083039250610643565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b60006106cb610cd2565b600080600093505b600a8410156109b2576106e4610b8d565b84600a811015156106f157fe5b60200201519250600083511415156109a557600091505b6000836040518082805190602001908083835b602083101515610740578051825260208201915060208101905060208303925061071b565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054905082101561092d576000836040518082805190602001908083835b6020831015156107b65780518252602082019150602081019050602083039250610791565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020828154811015156107f657fe5b90600052602060002090015490506002836040518082805190602001908083835b60208310151561083c5780518252602082019150602081019050602083039250610817565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b6020831015156108d057805182526020820191506020810190506020830392506108ab565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050610708565b6000836040518082805190602001908083835b6020831015156109655780518252602082019150602081019050602083039250610940565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006109a49190610ce6565b5b83806001019450506106d3565b50505050565b60016002836040518082805190602001908083835b6020831015156109f257805182526020820191506020810190506020830392506109cd565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b602083101515610a8d5780518252602082019150602081019050602083039250610a68565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281610ad29190610ca6565b9160005260206000209001600083909190915090600019169055505050565b60006002836040518082805190602001908083835b602083101515610b2b5780518252602082019150602081019050602083039250610b06565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b610b95610d07565b610140604051908101604052806040805190810160405280600c81526020017f7472616e7366657246726f6d0000000000000000000000000000000000000000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b815481835581811511610ccd57818360005260206000209182019101610ccc9190610d36565b5b505050565b602060405190810160405280600081525090565b5080546000825590600052602060002090810190610d049190610d36565b50565b61014060405190810160405280600a905b610d20610d5b565b815260200190600190039081610d185790505090565b610d5891905b80821115610d54576000816000905550600101610d3c565b5090565b90565b6020604051908101604052806000815250905600a165627a7a72305820c4be82117623ab8bbec2a7b895d532488e30faa49392945c3494ce6849daa3820029", "sourceMap": "640:939:32:-;;;;;;;;;;;;;;;;;", "deployedSourceMap": "640:939:32:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1294:217:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;694:344:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1044:360;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1018:270:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1517:610;;;;;;;;;;;;;;1294:217;1411:24;1458:17;1476:12;1458:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1458:46:23;1490:13;1458:46;;;;;;;;;;;;;;;;;;1451:53;;1294:217;;;;:::o;694:344:32:-;844:13;873:136;;;;;;;;;;;;;;;;;;;935:6;955:5;974:3;991:7;912:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;873:22;:136::i;:::-;1027:4;1020:11;;694:344;;;;;;:::o;1044:360::-;1220:15;1258:139;;;;;;;;;;;;;;;;;;;1323:6;1343:5;1362:3;1379:7;1300:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1258:25;:139::i;:::-;1251:146;;1044:360;;;;;;:::o;1018:270:23:-;1155:22;1178:12;1155:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1155:56:23;;;;;;;;;;;:::i;:::-;;;;;;;;;;1197:13;1155:56;;;;;;;;;;;;1270:11;1221:17;1239:12;1221:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1221:46:23;1253:13;1221:46;;;;;;;;;;;;;;;;;:60;;;;;;;1018:270;;;:::o;1517:610::-;1556:6;1595:26;;:::i;:::-;1719:6;1807:21;1565:1;1556:10;;1551:570;1572:2;1568:1;:6;1551:570;;;1624:17;:15;:17::i;:::-;1642:1;1624:20;;;;;;;;;;;;;1595:49;;1693:1;1669:12;1663:26;:31;;1659:452;;;1728:1;1719:10;;1714:321;1735:22;1758:12;1735:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1735:43:23;;;;1731:1;:47;1714:321;;;1831:22;1854:12;1831:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1868:1:23;1831:39;;;;;;;;;;;;;;;;;;;1807:63;;1899:13;1913:12;1899:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1899:42:23;1927:13;1899:42;;;;;;;;;;;;;;;;;;1892:49;;;;;;;;;;;1970:17;1988:12;1970:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1970:46:23;2002:13;1970:46;;;;;;;;;;;;;;;;;1963:53;;;1780:3;;;;;;;1714:321;;;2060:22;2083:12;2060:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;;2053:43:23;;;;:::i;:::-;1659:452;1576:3;;;;;;;1551:570;;;1517:610;;;;:::o;2133:202::-;2267:4;2231:13;2245:12;2231:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2231:33:23;2259:4;2231:33;;;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;2281:22;2304:12;2281:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2281:47:23;;;;;;;;;;;:::i;:::-;;;;;;;;;;2323:4;2281:47;;;;;;;;;;;;2133:202;;:::o;2341:194::-;2458:14;2495:13;2509:12;2495:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2495:33:23;2523:4;2495:33;;;;;;;;;;;;;;;;;;;;;;;;;;;2488:40;;2341:194;;;;:::o;1410:167:32:-;1471:24;;:::i;:::-;1511:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1410:167;:::o;640:939::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\nimport \"./MockContract.sol\";\n\n\ncontract MockTokenTransferProxy is MockContract {\n function transferFrom(\n address _token,\n address _from,\n address _to,\n uint _amount\n )\n public\n returns (bool _success)\n {\n functionCalledWithArgs(\"transferFrom\", keccak256(\n _token,\n _from,\n _to,\n _amount\n ));\n\n return true;\n }\n\n function wasTransferFromCalledWith(\n address _token,\n address _from,\n address _to,\n uint _amount\n )\n public\n view\n returns (bool _wasCalled)\n {\n return wasFunctionCalledWithArgs(\"transferFrom\", keccak256(\n _token,\n _from,\n _to,\n _amount\n ));\n }\n\n function getFunctionList()\n internal\n returns (string[10] functionNames)\n {\n return [\"transferFrom\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\"];\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockTokenTransferProxy.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockTokenTransferProxy.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockTokenTransferProxy.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockTokenTransferProxy.sol", "exportedSymbols": { "MockTokenTransferProxy": [ 12517 @@ -149,7 +149,7 @@ { "attributes": { "SourceUnit": 10693, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockContract.sol", "file": "./MockContract.sol", "scope": 12518, "symbolAliases": [ @@ -1235,7 +1235,7 @@ "42": { "events": {}, "links": {}, - "address": "0xea14749d27f5eed380dbeab1afe18d4bc174b77c" + "address": "0xe73f46c08eb3a1d218af468c6dbefbc5967bb6bd" }, "70": { "events": {}, @@ -1244,5 +1244,5 @@ } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:13:01.032Z" + "updatedAt": "2018-10-09T17:50:01.252Z" } \ No newline at end of file diff --git a/artifacts/json/MultiSigWallet.json b/artifacts/json/MultiSigWallet.json index a97d6df8..ba2bbbad 100644 --- a/artifacts/json/MultiSigWallet.json +++ b/artifacts/json/MultiSigWallet.json @@ -533,15 +533,15 @@ "type": "event" } ], - "bytecode": "0x606060405234156200001057600080fd5b604051620023813803806200238183398101604052808051820191906020018051906020019091905050600082518260328211158015620000515750818111155b80156200005f575060008114155b80156200006d575060008214155b15156200007957600080fd5b600092505b8451831015620001b4576002600086858151811015156200009b57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156200012a5750600085848151811015156200010757fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1614155b15156200013657600080fd5b60016002600087868151811015156200014b57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555082806001019350506200007e565b8460039080519060200190620001cc929190620001df565b50836004819055505050505050620002b4565b8280548282559060005260206000209081019282156200025b579160200282015b828111156200025a5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019062000200565b5b5090506200026a91906200026e565b5090565b620002b191905b80821115620002ad57600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555060010162000275565b5090565b90565b6120bd80620002c46000396000f30060606040526004361061011d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063025e7c2714610177578063173825d9146101da57806320ea8d86146102135780632f54bf6e146102365780633411c81c1461028757806354741525146102e15780637065cb4814610325578063784547a71461035e5780638b51d13f146103995780639ace38c2146103d0578063a0e67e2b146104ce578063a8abe69a14610538578063b5dc40c3146105cf578063b77bf60014610647578063ba51a6df14610670578063c01a8c8414610693578063c6427474146106b6578063d74f8edd1461074f578063dc8452cd14610778578063e20056e6146107a1578063ee22610b146107f9575b6000341115610175573373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a25b005b341561018257600080fd5b610198600480803590602001909190505061081c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101e557600080fd5b610211600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061085b565b005b341561021e57600080fd5b6102346004808035906020019091905050610af7565b005b341561024157600080fd5b61026d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610c9f565b604051808215151515815260200191505060405180910390f35b341561029257600080fd5b6102c7600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610cbf565b604051808215151515815260200191505060405180910390f35b34156102ec57600080fd5b61030f600480803515159060200190919080351515906020019091905050610cee565b6040518082815260200191505060405180910390f35b341561033057600080fd5b61035c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610d80565b005b341561036957600080fd5b61037f6004808035906020019091905050610f82565b604051808215151515815260200191505060405180910390f35b34156103a457600080fd5b6103ba6004808035906020019091905050611068565b6040518082815260200191505060405180910390f35b34156103db57600080fd5b6103f16004808035906020019091905050611134565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200184815260200180602001831515151581526020018281038252848181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156104bc5780601f10610491576101008083540402835291602001916104bc565b820191906000526020600020905b81548152906001019060200180831161049f57829003601f168201915b50509550505050505060405180910390f35b34156104d957600080fd5b6104e1611190565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610524578082015181840152602081019050610509565b505050509050019250505060405180910390f35b341561054357600080fd5b610578600480803590602001909190803590602001909190803515159060200190919080351515906020019091905050611224565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156105bb5780820151818401526020810190506105a0565b505050509050019250505060405180910390f35b34156105da57600080fd5b6105f0600480803590602001909190505061138f565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610633578082015181840152602081019050610618565b505050509050019250505060405180910390f35b341561065257600080fd5b61065a6115b9565b6040518082815260200191505060405180910390f35b341561067b57600080fd5b61069160048080359060200190919050506115bf565b005b341561069e57600080fd5b6106b46004808035906020019091905050611679565b005b34156106c157600080fd5b610739600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611856565b6040518082815260200191505060405180910390f35b341561075a57600080fd5b610762611875565b6040518082815260200191505060405180910390f35b341561078357600080fd5b61078b61187a565b6040518082815260200191505060405180910390f35b34156107ac57600080fd5b6107f7600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611880565b005b341561080457600080fd5b61081a6004808035906020019091905050611b97565b005b60038181548110151561082b57fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561089757600080fd5b81600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615156108f057600080fd5b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600091505b600160038054905003821015610a78578273ffffffffffffffffffffffffffffffffffffffff1660038381548110151561098357fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610a6b5760036001600380549050038154811015156109e257fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600383815481101515610a1d57fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610a78565b818060010192505061094d565b6001600381818054905003915081610a909190611f6c565b506003805490506004541115610aaf57610aae6003805490506115bf565b5b8273ffffffffffffffffffffffffffffffffffffffff167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a2505050565b33600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610b5057600080fd5b81336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610bbb57600080fd5b8360008082815260200190815260200160002060030160009054906101000a900460ff16151515610beb57600080fd5b60006001600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550843373ffffffffffffffffffffffffffffffffffffffff167ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e960405160405180910390a35050505050565b60026020528060005260406000206000915054906101000a900460ff1681565b60016020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b600080600090505b600554811015610d7957838015610d2d575060008082815260200190815260200160002060030160009054906101000a900460ff16155b80610d605750828015610d5f575060008082815260200190815260200160002060030160009054906101000a900460ff165b5b15610d6c576001820191505b8080600101915050610cf6565b5092915050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610dba57600080fd5b80600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151515610e1457600080fd5b8160008173ffffffffffffffffffffffffffffffffffffffff1614151515610e3b57600080fd5b60016003805490500160045460328211158015610e585750818111155b8015610e65575060008114155b8015610e72575060008214155b1515610e7d57600080fd5b6001600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060038054806001018281610ee99190611f98565b9160005260206000209001600087909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508473ffffffffffffffffffffffffffffffffffffffff167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b6000806000809150600090505b60038054905081101561106057600160008581526020019081526020016000206000600383815481101515610fc057fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611040576001820191505b6004548214156110535760019250611061565b8080600101915050610f8f565b5b5050919050565b600080600090505b60038054905081101561112e576001600084815260200190815260200160002060006003838154811015156110a157fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611121576001820191505b8080600101915050611070565b50919050565b60006020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201908060030160009054906101000a900460ff16905084565b611198611fc4565b600380548060200260200160405190810160405280929190818152602001828054801561121a57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116111d0575b5050505050905090565b61122c611fd8565b611234611fd8565b60008086881115151561124657600080fd5b6005546040518059106112565750595b9080825280602002602001820160405250925060009150600090505b600554811015611312578580156112a9575060008082815260200190815260200160002060030160009054906101000a900460ff16155b806112dc57508480156112db575060008082815260200190815260200160002060030160009054906101000a900460ff165b5b15611305578083838151811015156112f057fe5b90602001906020020181815250506001820191505b8080600101915050611272565b8787036040518059106113225750595b908082528060200260200182016040525093508790505b8681101561138457828181518110151561134f57fe5b906020019060200201518489830381518110151561136957fe5b90602001906020020181815250508080600101915050611339565b505050949350505050565b611397611fc4565b61139f611fc4565b6000806003805490506040518059106113b55750595b9080825280602002602001820160405250925060009150600090505b6003805490508110156115145760016000868152602001908152602001600020600060038381548110151561140257fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156115075760038181548110151561148a57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683838151811015156114c457fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506001820191505b80806001019150506113d1565b816040518059106115225750595b90808252806020026020018201604052509350600090505b818110156115b157828181518110151561155057fe5b90602001906020020151848281518110151561156857fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050808060010191505061153a565b505050919050565b60055481565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156115f957600080fd5b60038054905081603282111580156116115750818111155b801561161e575060008114155b801561162b575060008214155b151561163657600080fd5b826004819055507fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a836040518082815260200191505060405180910390a1505050565b33600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615156116d257600080fd5b81600080600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561172e57600080fd5b82336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151561179a57600080fd5b600180600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550843373ffffffffffffffffffffffffffffffffffffffff167f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef60405160405180910390a361184f85611b97565b5050505050565b6000611863848484611e1a565b905061186e81611679565b9392505050565b603281565b60045481565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156118bc57600080fd5b82600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151561191557600080fd5b82600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151561196f57600080fd5b600092505b600380549050831015611a5a578473ffffffffffffffffffffffffffffffffffffffff166003848154811015156119a757fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611a4d57836003848154811015156119ff57fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611a5a565b8280600101935050611974565b6000600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508473ffffffffffffffffffffffffffffffffffffffff167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a28373ffffffffffffffffffffffffffffffffffffffff167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b600033600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515611bf257600080fd5b82336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515611c5d57600080fd5b8460008082815260200190815260200160002060030160009054906101000a900460ff16151515611c8d57600080fd5b611c9686610f82565b15611e1257600080878152602001908152602001600020945060018560030160006101000a81548160ff0219169083151502179055508460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168560010154866002016040518082805460018160011615610100020316600290048015611d755780601f10611d4a57610100808354040283529160200191611d75565b820191906000526020600020905b815481529060010190602001808311611d5857829003601f168201915b505091505060006040518083038185876187965a03f19250505015611dc657857f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7560405160405180910390a2611e11565b857f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923660405160405180910390a260008560030160006101000a81548160ff0219169083151502179055505b5b505050505050565b60008360008173ffffffffffffffffffffffffffffffffffffffff1614151515611e4357600080fd5b60055491506080604051908101604052808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020016000151581525060008084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101556040820151816002019080519060200190611f02929190611fec565b5060608201518160030160006101000a81548160ff0219169083151502179055509050506001600560008282540192505081905550817fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5160405160405180910390a2509392505050565b815481835581811511611f9357818360005260206000209182019101611f92919061206c565b5b505050565b815481835581811511611fbf57818360005260206000209182019101611fbe919061206c565b5b505050565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061202d57805160ff191683800117855561205b565b8280016001018555821561205b579182015b8281111561205a57825182559160200191906001019061203f565b5b509050612068919061206c565b5090565b61208e91905b8082111561208a576000816000905550600101612072565b5090565b905600a165627a7a723058202412500603ed2cf74de534bf9dfb888f8106b2323f8b944bf06f0fe0f18e62a30029", - "deployedBytecode": "0x60606040526004361061011d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063025e7c2714610177578063173825d9146101da57806320ea8d86146102135780632f54bf6e146102365780633411c81c1461028757806354741525146102e15780637065cb4814610325578063784547a71461035e5780638b51d13f146103995780639ace38c2146103d0578063a0e67e2b146104ce578063a8abe69a14610538578063b5dc40c3146105cf578063b77bf60014610647578063ba51a6df14610670578063c01a8c8414610693578063c6427474146106b6578063d74f8edd1461074f578063dc8452cd14610778578063e20056e6146107a1578063ee22610b146107f9575b6000341115610175573373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a25b005b341561018257600080fd5b610198600480803590602001909190505061081c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101e557600080fd5b610211600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061085b565b005b341561021e57600080fd5b6102346004808035906020019091905050610af7565b005b341561024157600080fd5b61026d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610c9f565b604051808215151515815260200191505060405180910390f35b341561029257600080fd5b6102c7600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610cbf565b604051808215151515815260200191505060405180910390f35b34156102ec57600080fd5b61030f600480803515159060200190919080351515906020019091905050610cee565b6040518082815260200191505060405180910390f35b341561033057600080fd5b61035c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610d80565b005b341561036957600080fd5b61037f6004808035906020019091905050610f82565b604051808215151515815260200191505060405180910390f35b34156103a457600080fd5b6103ba6004808035906020019091905050611068565b6040518082815260200191505060405180910390f35b34156103db57600080fd5b6103f16004808035906020019091905050611134565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200184815260200180602001831515151581526020018281038252848181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156104bc5780601f10610491576101008083540402835291602001916104bc565b820191906000526020600020905b81548152906001019060200180831161049f57829003601f168201915b50509550505050505060405180910390f35b34156104d957600080fd5b6104e1611190565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610524578082015181840152602081019050610509565b505050509050019250505060405180910390f35b341561054357600080fd5b610578600480803590602001909190803590602001909190803515159060200190919080351515906020019091905050611224565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156105bb5780820151818401526020810190506105a0565b505050509050019250505060405180910390f35b34156105da57600080fd5b6105f0600480803590602001909190505061138f565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610633578082015181840152602081019050610618565b505050509050019250505060405180910390f35b341561065257600080fd5b61065a6115b9565b6040518082815260200191505060405180910390f35b341561067b57600080fd5b61069160048080359060200190919050506115bf565b005b341561069e57600080fd5b6106b46004808035906020019091905050611679565b005b34156106c157600080fd5b610739600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611856565b6040518082815260200191505060405180910390f35b341561075a57600080fd5b610762611875565b6040518082815260200191505060405180910390f35b341561078357600080fd5b61078b61187a565b6040518082815260200191505060405180910390f35b34156107ac57600080fd5b6107f7600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611880565b005b341561080457600080fd5b61081a6004808035906020019091905050611b97565b005b60038181548110151561082b57fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561089757600080fd5b81600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615156108f057600080fd5b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600091505b600160038054905003821015610a78578273ffffffffffffffffffffffffffffffffffffffff1660038381548110151561098357fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610a6b5760036001600380549050038154811015156109e257fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600383815481101515610a1d57fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610a78565b818060010192505061094d565b6001600381818054905003915081610a909190611f6c565b506003805490506004541115610aaf57610aae6003805490506115bf565b5b8273ffffffffffffffffffffffffffffffffffffffff167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a2505050565b33600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610b5057600080fd5b81336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610bbb57600080fd5b8360008082815260200190815260200160002060030160009054906101000a900460ff16151515610beb57600080fd5b60006001600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550843373ffffffffffffffffffffffffffffffffffffffff167ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e960405160405180910390a35050505050565b60026020528060005260406000206000915054906101000a900460ff1681565b60016020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b600080600090505b600554811015610d7957838015610d2d575060008082815260200190815260200160002060030160009054906101000a900460ff16155b80610d605750828015610d5f575060008082815260200190815260200160002060030160009054906101000a900460ff165b5b15610d6c576001820191505b8080600101915050610cf6565b5092915050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610dba57600080fd5b80600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151515610e1457600080fd5b8160008173ffffffffffffffffffffffffffffffffffffffff1614151515610e3b57600080fd5b60016003805490500160045460328211158015610e585750818111155b8015610e65575060008114155b8015610e72575060008214155b1515610e7d57600080fd5b6001600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060038054806001018281610ee99190611f98565b9160005260206000209001600087909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508473ffffffffffffffffffffffffffffffffffffffff167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b6000806000809150600090505b60038054905081101561106057600160008581526020019081526020016000206000600383815481101515610fc057fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611040576001820191505b6004548214156110535760019250611061565b8080600101915050610f8f565b5b5050919050565b600080600090505b60038054905081101561112e576001600084815260200190815260200160002060006003838154811015156110a157fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611121576001820191505b8080600101915050611070565b50919050565b60006020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201908060030160009054906101000a900460ff16905084565b611198611fc4565b600380548060200260200160405190810160405280929190818152602001828054801561121a57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116111d0575b5050505050905090565b61122c611fd8565b611234611fd8565b60008086881115151561124657600080fd5b6005546040518059106112565750595b9080825280602002602001820160405250925060009150600090505b600554811015611312578580156112a9575060008082815260200190815260200160002060030160009054906101000a900460ff16155b806112dc57508480156112db575060008082815260200190815260200160002060030160009054906101000a900460ff165b5b15611305578083838151811015156112f057fe5b90602001906020020181815250506001820191505b8080600101915050611272565b8787036040518059106113225750595b908082528060200260200182016040525093508790505b8681101561138457828181518110151561134f57fe5b906020019060200201518489830381518110151561136957fe5b90602001906020020181815250508080600101915050611339565b505050949350505050565b611397611fc4565b61139f611fc4565b6000806003805490506040518059106113b55750595b9080825280602002602001820160405250925060009150600090505b6003805490508110156115145760016000868152602001908152602001600020600060038381548110151561140257fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156115075760038181548110151561148a57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683838151811015156114c457fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506001820191505b80806001019150506113d1565b816040518059106115225750595b90808252806020026020018201604052509350600090505b818110156115b157828181518110151561155057fe5b90602001906020020151848281518110151561156857fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050808060010191505061153a565b505050919050565b60055481565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156115f957600080fd5b60038054905081603282111580156116115750818111155b801561161e575060008114155b801561162b575060008214155b151561163657600080fd5b826004819055507fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a836040518082815260200191505060405180910390a1505050565b33600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615156116d257600080fd5b81600080600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561172e57600080fd5b82336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151561179a57600080fd5b600180600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550843373ffffffffffffffffffffffffffffffffffffffff167f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef60405160405180910390a361184f85611b97565b5050505050565b6000611863848484611e1a565b905061186e81611679565b9392505050565b603281565b60045481565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156118bc57600080fd5b82600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151561191557600080fd5b82600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151561196f57600080fd5b600092505b600380549050831015611a5a578473ffffffffffffffffffffffffffffffffffffffff166003848154811015156119a757fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611a4d57836003848154811015156119ff57fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611a5a565b8280600101935050611974565b6000600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508473ffffffffffffffffffffffffffffffffffffffff167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a28373ffffffffffffffffffffffffffffffffffffffff167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b600033600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515611bf257600080fd5b82336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515611c5d57600080fd5b8460008082815260200190815260200160002060030160009054906101000a900460ff16151515611c8d57600080fd5b611c9686610f82565b15611e1257600080878152602001908152602001600020945060018560030160006101000a81548160ff0219169083151502179055508460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168560010154866002016040518082805460018160011615610100020316600290048015611d755780601f10611d4a57610100808354040283529160200191611d75565b820191906000526020600020905b815481529060010190602001808311611d5857829003601f168201915b505091505060006040518083038185876187965a03f19250505015611dc657857f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7560405160405180910390a2611e11565b857f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923660405160405180910390a260008560030160006101000a81548160ff0219169083151502179055505b5b505050505050565b60008360008173ffffffffffffffffffffffffffffffffffffffff1614151515611e4357600080fd5b60055491506080604051908101604052808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020016000151581525060008084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101556040820151816002019080519060200190611f02929190611fec565b5060608201518160030160006101000a81548160ff0219169083151502179055509050506001600560008282540192505081905550817fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5160405160405180910390a2509392505050565b815481835581811511611f9357818360005260206000209182019101611f92919061206c565b5b505050565b815481835581811511611fbf57818360005260206000209182019101611fbe919061206c565b5b505050565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061202d57805160ff191683800117855561205b565b8280016001018555821561205b579182015b8281111561205a57825182559160200191906001019061203f565b5b509050612068919061206c565b5090565b61208e91905b8082111561208a576000816000905550600101612072565b5090565b905600a165627a7a723058202412500603ed2cf74de534bf9dfb888f8106b2323f8b944bf06f0fe0f18e62a30029", + "bytecode": "0x606060405234156200001057600080fd5b604051620023813803806200238183398101604052808051820191906020018051906020019091905050600082518260328211158015620000515750818111155b80156200005f575060008114155b80156200006d575060008214155b15156200007957600080fd5b600092505b8451831015620001b4576002600086858151811015156200009b57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156200012a5750600085848151811015156200010757fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1614155b15156200013657600080fd5b60016002600087868151811015156200014b57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555082806001019350506200007e565b8460039080519060200190620001cc929190620001df565b50836004819055505050505050620002b4565b8280548282559060005260206000209081019282156200025b579160200282015b828111156200025a5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019062000200565b5b5090506200026a91906200026e565b5090565b620002b191905b80821115620002ad57600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555060010162000275565b5090565b90565b6120bd80620002c46000396000f30060606040526004361061011d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063025e7c2714610177578063173825d9146101da57806320ea8d86146102135780632f54bf6e146102365780633411c81c1461028757806354741525146102e15780637065cb4814610325578063784547a71461035e5780638b51d13f146103995780639ace38c2146103d0578063a0e67e2b146104ce578063a8abe69a14610538578063b5dc40c3146105cf578063b77bf60014610647578063ba51a6df14610670578063c01a8c8414610693578063c6427474146106b6578063d74f8edd1461074f578063dc8452cd14610778578063e20056e6146107a1578063ee22610b146107f9575b6000341115610175573373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a25b005b341561018257600080fd5b610198600480803590602001909190505061081c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101e557600080fd5b610211600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061085b565b005b341561021e57600080fd5b6102346004808035906020019091905050610af7565b005b341561024157600080fd5b61026d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610c9f565b604051808215151515815260200191505060405180910390f35b341561029257600080fd5b6102c7600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610cbf565b604051808215151515815260200191505060405180910390f35b34156102ec57600080fd5b61030f600480803515159060200190919080351515906020019091905050610cee565b6040518082815260200191505060405180910390f35b341561033057600080fd5b61035c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610d80565b005b341561036957600080fd5b61037f6004808035906020019091905050610f82565b604051808215151515815260200191505060405180910390f35b34156103a457600080fd5b6103ba6004808035906020019091905050611068565b6040518082815260200191505060405180910390f35b34156103db57600080fd5b6103f16004808035906020019091905050611134565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200184815260200180602001831515151581526020018281038252848181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156104bc5780601f10610491576101008083540402835291602001916104bc565b820191906000526020600020905b81548152906001019060200180831161049f57829003601f168201915b50509550505050505060405180910390f35b34156104d957600080fd5b6104e1611190565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610524578082015181840152602081019050610509565b505050509050019250505060405180910390f35b341561054357600080fd5b610578600480803590602001909190803590602001909190803515159060200190919080351515906020019091905050611224565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156105bb5780820151818401526020810190506105a0565b505050509050019250505060405180910390f35b34156105da57600080fd5b6105f0600480803590602001909190505061138f565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610633578082015181840152602081019050610618565b505050509050019250505060405180910390f35b341561065257600080fd5b61065a6115b9565b6040518082815260200191505060405180910390f35b341561067b57600080fd5b61069160048080359060200190919050506115bf565b005b341561069e57600080fd5b6106b46004808035906020019091905050611679565b005b34156106c157600080fd5b610739600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611856565b6040518082815260200191505060405180910390f35b341561075a57600080fd5b610762611875565b6040518082815260200191505060405180910390f35b341561078357600080fd5b61078b61187a565b6040518082815260200191505060405180910390f35b34156107ac57600080fd5b6107f7600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611880565b005b341561080457600080fd5b61081a6004808035906020019091905050611b97565b005b60038181548110151561082b57fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561089757600080fd5b81600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615156108f057600080fd5b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600091505b600160038054905003821015610a78578273ffffffffffffffffffffffffffffffffffffffff1660038381548110151561098357fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610a6b5760036001600380549050038154811015156109e257fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600383815481101515610a1d57fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610a78565b818060010192505061094d565b6001600381818054905003915081610a909190611f6c565b506003805490506004541115610aaf57610aae6003805490506115bf565b5b8273ffffffffffffffffffffffffffffffffffffffff167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a2505050565b33600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610b5057600080fd5b81336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610bbb57600080fd5b8360008082815260200190815260200160002060030160009054906101000a900460ff16151515610beb57600080fd5b60006001600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550843373ffffffffffffffffffffffffffffffffffffffff167ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e960405160405180910390a35050505050565b60026020528060005260406000206000915054906101000a900460ff1681565b60016020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b600080600090505b600554811015610d7957838015610d2d575060008082815260200190815260200160002060030160009054906101000a900460ff16155b80610d605750828015610d5f575060008082815260200190815260200160002060030160009054906101000a900460ff165b5b15610d6c576001820191505b8080600101915050610cf6565b5092915050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610dba57600080fd5b80600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151515610e1457600080fd5b8160008173ffffffffffffffffffffffffffffffffffffffff1614151515610e3b57600080fd5b60016003805490500160045460328211158015610e585750818111155b8015610e65575060008114155b8015610e72575060008214155b1515610e7d57600080fd5b6001600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060038054806001018281610ee99190611f98565b9160005260206000209001600087909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508473ffffffffffffffffffffffffffffffffffffffff167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b6000806000809150600090505b60038054905081101561106057600160008581526020019081526020016000206000600383815481101515610fc057fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611040576001820191505b6004548214156110535760019250611061565b8080600101915050610f8f565b5b5050919050565b600080600090505b60038054905081101561112e576001600084815260200190815260200160002060006003838154811015156110a157fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611121576001820191505b8080600101915050611070565b50919050565b60006020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201908060030160009054906101000a900460ff16905084565b611198611fc4565b600380548060200260200160405190810160405280929190818152602001828054801561121a57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116111d0575b5050505050905090565b61122c611fd8565b611234611fd8565b60008086881115151561124657600080fd5b6005546040518059106112565750595b9080825280602002602001820160405250925060009150600090505b600554811015611312578580156112a9575060008082815260200190815260200160002060030160009054906101000a900460ff16155b806112dc57508480156112db575060008082815260200190815260200160002060030160009054906101000a900460ff165b5b15611305578083838151811015156112f057fe5b90602001906020020181815250506001820191505b8080600101915050611272565b8787036040518059106113225750595b908082528060200260200182016040525093508790505b8681101561138457828181518110151561134f57fe5b906020019060200201518489830381518110151561136957fe5b90602001906020020181815250508080600101915050611339565b505050949350505050565b611397611fc4565b61139f611fc4565b6000806003805490506040518059106113b55750595b9080825280602002602001820160405250925060009150600090505b6003805490508110156115145760016000868152602001908152602001600020600060038381548110151561140257fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156115075760038181548110151561148a57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683838151811015156114c457fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506001820191505b80806001019150506113d1565b816040518059106115225750595b90808252806020026020018201604052509350600090505b818110156115b157828181518110151561155057fe5b90602001906020020151848281518110151561156857fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050808060010191505061153a565b505050919050565b60055481565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156115f957600080fd5b60038054905081603282111580156116115750818111155b801561161e575060008114155b801561162b575060008214155b151561163657600080fd5b826004819055507fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a836040518082815260200191505060405180910390a1505050565b33600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615156116d257600080fd5b81600080600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561172e57600080fd5b82336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151561179a57600080fd5b600180600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550843373ffffffffffffffffffffffffffffffffffffffff167f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef60405160405180910390a361184f85611b97565b5050505050565b6000611863848484611e1a565b905061186e81611679565b9392505050565b603281565b60045481565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156118bc57600080fd5b82600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151561191557600080fd5b82600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151561196f57600080fd5b600092505b600380549050831015611a5a578473ffffffffffffffffffffffffffffffffffffffff166003848154811015156119a757fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611a4d57836003848154811015156119ff57fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611a5a565b8280600101935050611974565b6000600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508473ffffffffffffffffffffffffffffffffffffffff167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a28373ffffffffffffffffffffffffffffffffffffffff167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b600033600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515611bf257600080fd5b82336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515611c5d57600080fd5b8460008082815260200190815260200160002060030160009054906101000a900460ff16151515611c8d57600080fd5b611c9686610f82565b15611e1257600080878152602001908152602001600020945060018560030160006101000a81548160ff0219169083151502179055508460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168560010154866002016040518082805460018160011615610100020316600290048015611d755780601f10611d4a57610100808354040283529160200191611d75565b820191906000526020600020905b815481529060010190602001808311611d5857829003601f168201915b505091505060006040518083038185876187965a03f19250505015611dc657857f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7560405160405180910390a2611e11565b857f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923660405160405180910390a260008560030160006101000a81548160ff0219169083151502179055505b5b505050505050565b60008360008173ffffffffffffffffffffffffffffffffffffffff1614151515611e4357600080fd5b60055491506080604051908101604052808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020016000151581525060008084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101556040820151816002019080519060200190611f02929190611fec565b5060608201518160030160006101000a81548160ff0219169083151502179055509050506001600560008282540192505081905550817fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5160405160405180910390a2509392505050565b815481835581811511611f9357818360005260206000209182019101611f92919061206c565b5b505050565b815481835581811511611fbf57818360005260206000209182019101611fbe919061206c565b5b505050565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061202d57805160ff191683800117855561205b565b8280016001018555821561205b579182015b8281111561205a57825182559160200191906001019061203f565b5b509050612068919061206c565b5090565b61208e91905b8082111561208a576000816000905550600101612072565b5090565b905600a165627a7a7230582070f5af7e8c22aa406bc8661c8472a466fea1be1a93d078497d704d1354a032630029", + "deployedBytecode": "0x60606040526004361061011d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063025e7c2714610177578063173825d9146101da57806320ea8d86146102135780632f54bf6e146102365780633411c81c1461028757806354741525146102e15780637065cb4814610325578063784547a71461035e5780638b51d13f146103995780639ace38c2146103d0578063a0e67e2b146104ce578063a8abe69a14610538578063b5dc40c3146105cf578063b77bf60014610647578063ba51a6df14610670578063c01a8c8414610693578063c6427474146106b6578063d74f8edd1461074f578063dc8452cd14610778578063e20056e6146107a1578063ee22610b146107f9575b6000341115610175573373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a25b005b341561018257600080fd5b610198600480803590602001909190505061081c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101e557600080fd5b610211600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061085b565b005b341561021e57600080fd5b6102346004808035906020019091905050610af7565b005b341561024157600080fd5b61026d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610c9f565b604051808215151515815260200191505060405180910390f35b341561029257600080fd5b6102c7600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610cbf565b604051808215151515815260200191505060405180910390f35b34156102ec57600080fd5b61030f600480803515159060200190919080351515906020019091905050610cee565b6040518082815260200191505060405180910390f35b341561033057600080fd5b61035c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610d80565b005b341561036957600080fd5b61037f6004808035906020019091905050610f82565b604051808215151515815260200191505060405180910390f35b34156103a457600080fd5b6103ba6004808035906020019091905050611068565b6040518082815260200191505060405180910390f35b34156103db57600080fd5b6103f16004808035906020019091905050611134565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200184815260200180602001831515151581526020018281038252848181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156104bc5780601f10610491576101008083540402835291602001916104bc565b820191906000526020600020905b81548152906001019060200180831161049f57829003601f168201915b50509550505050505060405180910390f35b34156104d957600080fd5b6104e1611190565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610524578082015181840152602081019050610509565b505050509050019250505060405180910390f35b341561054357600080fd5b610578600480803590602001909190803590602001909190803515159060200190919080351515906020019091905050611224565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156105bb5780820151818401526020810190506105a0565b505050509050019250505060405180910390f35b34156105da57600080fd5b6105f0600480803590602001909190505061138f565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610633578082015181840152602081019050610618565b505050509050019250505060405180910390f35b341561065257600080fd5b61065a6115b9565b6040518082815260200191505060405180910390f35b341561067b57600080fd5b61069160048080359060200190919050506115bf565b005b341561069e57600080fd5b6106b46004808035906020019091905050611679565b005b34156106c157600080fd5b610739600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611856565b6040518082815260200191505060405180910390f35b341561075a57600080fd5b610762611875565b6040518082815260200191505060405180910390f35b341561078357600080fd5b61078b61187a565b6040518082815260200191505060405180910390f35b34156107ac57600080fd5b6107f7600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611880565b005b341561080457600080fd5b61081a6004808035906020019091905050611b97565b005b60038181548110151561082b57fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561089757600080fd5b81600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615156108f057600080fd5b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600091505b600160038054905003821015610a78578273ffffffffffffffffffffffffffffffffffffffff1660038381548110151561098357fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610a6b5760036001600380549050038154811015156109e257fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600383815481101515610a1d57fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610a78565b818060010192505061094d565b6001600381818054905003915081610a909190611f6c565b506003805490506004541115610aaf57610aae6003805490506115bf565b5b8273ffffffffffffffffffffffffffffffffffffffff167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a2505050565b33600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610b5057600080fd5b81336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610bbb57600080fd5b8360008082815260200190815260200160002060030160009054906101000a900460ff16151515610beb57600080fd5b60006001600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550843373ffffffffffffffffffffffffffffffffffffffff167ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e960405160405180910390a35050505050565b60026020528060005260406000206000915054906101000a900460ff1681565b60016020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b600080600090505b600554811015610d7957838015610d2d575060008082815260200190815260200160002060030160009054906101000a900460ff16155b80610d605750828015610d5f575060008082815260200190815260200160002060030160009054906101000a900460ff165b5b15610d6c576001820191505b8080600101915050610cf6565b5092915050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610dba57600080fd5b80600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151515610e1457600080fd5b8160008173ffffffffffffffffffffffffffffffffffffffff1614151515610e3b57600080fd5b60016003805490500160045460328211158015610e585750818111155b8015610e65575060008114155b8015610e72575060008214155b1515610e7d57600080fd5b6001600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060038054806001018281610ee99190611f98565b9160005260206000209001600087909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508473ffffffffffffffffffffffffffffffffffffffff167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b6000806000809150600090505b60038054905081101561106057600160008581526020019081526020016000206000600383815481101515610fc057fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611040576001820191505b6004548214156110535760019250611061565b8080600101915050610f8f565b5b5050919050565b600080600090505b60038054905081101561112e576001600084815260200190815260200160002060006003838154811015156110a157fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611121576001820191505b8080600101915050611070565b50919050565b60006020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201908060030160009054906101000a900460ff16905084565b611198611fc4565b600380548060200260200160405190810160405280929190818152602001828054801561121a57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116111d0575b5050505050905090565b61122c611fd8565b611234611fd8565b60008086881115151561124657600080fd5b6005546040518059106112565750595b9080825280602002602001820160405250925060009150600090505b600554811015611312578580156112a9575060008082815260200190815260200160002060030160009054906101000a900460ff16155b806112dc57508480156112db575060008082815260200190815260200160002060030160009054906101000a900460ff165b5b15611305578083838151811015156112f057fe5b90602001906020020181815250506001820191505b8080600101915050611272565b8787036040518059106113225750595b908082528060200260200182016040525093508790505b8681101561138457828181518110151561134f57fe5b906020019060200201518489830381518110151561136957fe5b90602001906020020181815250508080600101915050611339565b505050949350505050565b611397611fc4565b61139f611fc4565b6000806003805490506040518059106113b55750595b9080825280602002602001820160405250925060009150600090505b6003805490508110156115145760016000868152602001908152602001600020600060038381548110151561140257fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156115075760038181548110151561148a57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683838151811015156114c457fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506001820191505b80806001019150506113d1565b816040518059106115225750595b90808252806020026020018201604052509350600090505b818110156115b157828181518110151561155057fe5b90602001906020020151848281518110151561156857fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050808060010191505061153a565b505050919050565b60055481565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156115f957600080fd5b60038054905081603282111580156116115750818111155b801561161e575060008114155b801561162b575060008214155b151561163657600080fd5b826004819055507fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a836040518082815260200191505060405180910390a1505050565b33600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615156116d257600080fd5b81600080600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561172e57600080fd5b82336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151561179a57600080fd5b600180600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550843373ffffffffffffffffffffffffffffffffffffffff167f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef60405160405180910390a361184f85611b97565b5050505050565b6000611863848484611e1a565b905061186e81611679565b9392505050565b603281565b60045481565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156118bc57600080fd5b82600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151561191557600080fd5b82600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151561196f57600080fd5b600092505b600380549050831015611a5a578473ffffffffffffffffffffffffffffffffffffffff166003848154811015156119a757fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611a4d57836003848154811015156119ff57fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611a5a565b8280600101935050611974565b6000600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508473ffffffffffffffffffffffffffffffffffffffff167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a28373ffffffffffffffffffffffffffffffffffffffff167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b600033600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515611bf257600080fd5b82336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515611c5d57600080fd5b8460008082815260200190815260200160002060030160009054906101000a900460ff16151515611c8d57600080fd5b611c9686610f82565b15611e1257600080878152602001908152602001600020945060018560030160006101000a81548160ff0219169083151502179055508460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168560010154866002016040518082805460018160011615610100020316600290048015611d755780601f10611d4a57610100808354040283529160200191611d75565b820191906000526020600020905b815481529060010190602001808311611d5857829003601f168201915b505091505060006040518083038185876187965a03f19250505015611dc657857f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7560405160405180910390a2611e11565b857f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923660405160405180910390a260008560030160006101000a81548160ff0219169083151502179055505b5b505050505050565b60008360008173ffffffffffffffffffffffffffffffffffffffff1614151515611e4357600080fd5b60055491506080604051908101604052808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020016000151581525060008084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101556040820151816002019080519060200190611f02929190611fec565b5060608201518160030160006101000a81548160ff0219169083151502179055509050506001600560008282540192505081905550817fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5160405160405180910390a2509392505050565b815481835581811511611f9357818360005260206000209182019101611f92919061206c565b5b505050565b815481835581811511611fbf57818360005260206000209182019101611fbe919061206c565b5b505050565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061202d57805160ff191683800117855561205b565b8280016001018555821561205b579182015b8281111561205a57825182559160200191906001019061203f565b5b509050612068919061206c565b5090565b61208e91905b8082111561208a576000816000905550600101612072565b5090565b905600a165627a7a7230582070f5af7e8c22aa406bc8661c8472a466fea1be1a93d078497d704d1354a032630029", "sourceMap": "186:11348:35:-;;;2830:353;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2975:6;2929:7;:14;2945:9;819:2;2253:10;:29;;:68;;;;;2311:10;2298:9;:23;;2253:68;:98;;;;;2350:1;2337:9;:14;;2253:98;:129;;;;;2381:1;2367:10;:15;;2253:129;2245:138;;;;;;;;2982:1;2975:8;;2970:151;2987:7;:14;2985:1;:16;2970:151;;;3031:7;:19;3039:7;3047:1;3039:10;;;;;;;;;;;;;;;;;;3031:19;;;;;;;;;;;;;;;;;;;;;;;;;3030:20;:39;;;;;3068:1;3054:7;3062:1;3054:10;;;;;;;;;;;;;;;;;;:15;;;;3030:39;3022:48;;;;;;;;3106:4;3084:7;:19;3092:7;3100:1;3092:10;;;;;;;;;;;;;;;;;;3084:19;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;3003:3;;;;;;;2970:151;;;3139:7;3130:6;:16;;;;;;;;;;;;:::i;:::-;;3167:9;3156:8;:20;;;;2830:353;;;;;186:11348;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;", "deployedSourceMap": "186:11348:35:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2535:1;2523:9;:13;2519:61;;;2558:10;2550:30;;;2570:9;2550:30;;;;;;;;;;;;;;;;;;2519:61;186:11348;1030:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3710:460;;;;;;;;;;;;;;;;;;;;;;;;;;;;6276:291;;;;;;;;;;;;;;;;;;;;;;;;;;984:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;914:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9221:315;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3310:277;;;;;;;;;;;;;;;;;;;;;;;;;;;;7397:333;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8711:248;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;859:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9620:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;10830:702:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;9910:571:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;1085:28:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4992:207;;;;;;;;;;;;;;;;;;;;;;;;;;5808:344;;;;;;;;;;;;;;;;;;;;;;;;;;5458:244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;780:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1059:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4372:449;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6681:565;;;;;;;;;;;;;;;;;;;;;;;;;;1030:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3710:460::-;3858:6;1339:4;1317:27;;:10;:27;;;1309:36;;;;;;;;3800:5;1523:7;:14;1531:5;1523:14;;;;;;;;;;;;;;;;;;;;;;;;;1515:23;;;;;;;;3838:5;3821:7;:14;3829:5;3821:14;;;;;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;3865:1;3858:8;;3853:170;3886:1;3870:6;:13;;;;:17;3868:1;:19;3853:170;;;3923:5;3910:18;;:6;3917:1;3910:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;:18;;;3906:117;;;3960:6;3983:1;3967:6;:13;;;;:17;3960:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;3948:6;3955:1;3948:9;;;;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;4003:5;;3906:117;3889:3;;;;;;;3853:170;;;4049:1;4032:6;:18;;;;;;;;;;;;;;:::i;:::-;;4075:6;:13;;;;4064:8;;:24;4060:74;;;4102:32;4120:6;:13;;;;4102:17;:32::i;:::-;4060:74;4157:5;4144:19;;;;;;;;;;;;1355:1;3710:460;;:::o;6276:291::-;6359:10;1523:7;:14;1531:5;1523:14;;;;;;;;;;;;;;;;;;;;;;;;;1515:23;;;;;;;;6389:13;6404:10;1768:13;:28;1782:13;1768:28;;;;;;;;;;;:35;1797:5;1768:35;;;;;;;;;;;;;;;;;;;;;;;;;1760:44;;;;;;;;6436:13;2024:12;:27;2037:13;2024:27;;;;;;;;;;;:36;;;;;;;;;;;;2023:37;2015:46;;;;;;;;6508:5;6465:13;:28;6479:13;6465:28;;;;;;;;;;;:40;6494:10;6465:40;;;;;;;;;;;;;;;;:48;;;;;;;;;;;;;;;;;;6546:13;6534:10;6523:37;;;;;;;;;;;;1814:1;1548;;6276:291;;:::o;984:40::-;;;;;;;;;;;;;;;;;;;;;;:::o;914:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;9221:315::-;9324:10;9355:6;9362:1;9355:8;;9350:179;9367:16;;9365:1;:18;9350:179;;;9409:7;:36;;;;;9421:12;:15;9434:1;9421:15;;;;;;;;;;;:24;;;;;;;;;;;;9420:25;9409:36;:92;;;;9465:8;:36;;;;;9477:12;:15;9490:1;9477:15;;;;;;;;;;;:24;;;;;;;;;;;;9465:36;9409:92;9402:127;;;9528:1;9519:10;;;;9402:127;9385:3;;;;;;;9350:179;;;9221:315;;;;;:::o;3310:277::-;1339:4;1317:27;;:10;:27;;;1309:36;;;;;;;;3403:5;1430:7;:14;1438:5;1430:14;;;;;;;;;;;;;;;;;;;;;;;;;1429:15;1421:24;;;;;;;;3426:5;2150:1;2138:8;:13;;;;2130:22;;;;;;;;3474:1;3458:6;:13;;;;:17;3477:8;;819:2;2253:10;:29;;:68;;;;;2311:10;2298:9;:23;;2253:68;:98;;;;;2350:1;2337:9;:14;;2253:98;:129;;;;;2381:1;2367:10;:15;;2253:129;2245:138;;;;;;;;3518:4;3501:7;:14;3509:5;3501:14;;;;;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;3532:6;:18;;;;;;;;;;;:::i;:::-;;;;;;;;;;3544:5;3532:18;;;;;;;;;;;;;;;;;;;;;;;3574:5;3560:20;;;;;;;;;;;;2162:1;;1455;1355;3310:277;:::o;7397:333::-;7483:4;7503:10;7532:6;7516:1;7503:14;;7539:1;7532:8;;7527:197;7544:6;:13;;;;7542:1;:15;7527:197;;;7582:13;:28;7596:13;7582:28;;;;;;;;;;;:39;7611:6;7618:1;7611:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;7582:39;;;;;;;;;;;;;;;;;;;;;;;;;7578:71;;;7648:1;7639:10;;;;7578:71;7676:8;;7667:5;:17;7663:50;;;7709:4;7702:11;;;;7663:50;7559:3;;;;;;;7527:197;;;7397:333;;;;;;:::o;8711:248::-;8806:10;8837:6;8844:1;8837:8;;8832:120;8849:6;:13;;;;8847:1;:15;8832:120;;;8885:13;:28;8899:13;8885:28;;;;;;;;;;;:39;8914:6;8921:1;8914:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;8885:39;;;;;;;;;;;;;;;;;;;;;;;;;8881:71;;;8951:1;8942:10;;;;8881:71;8864:3;;;;;;;8832:120;;;8711:248;;;;:::o;859:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;9620:111::-;9686:9;;:::i;:::-;9718:6;9711:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9620:111;:::o;10830:702::-;10951:22;;:::i;:::-;11019:32;;:::i;:::-;11092:10;11116:6;11005:2;10997:4;:10;;10989:19;;;;;;;;11065:16;;11054:28;;;;;;;;;;;;;;;;;;;;;;;;11019:63;;11105:1;11092:14;;11139:1;11137:3;;11132:250;11144:16;;11142:1;:18;11132:250;;;11186:7;:36;;;;;11198:12;:15;11211:1;11198:15;;;;;;;;;;;:24;;;;;;;;;;;;11197:25;11186:36;:92;;;;11242:8;:36;;;;;11254:12;:15;11267:1;11254:15;;;;;;;;;;;:24;;;;;;;;;;;;11242:36;11186:92;11179:203;;;11338:1;11310:18;11329:5;11310:25;;;;;;;;;;;;;;;;;:29;;;;;11366:1;11357:10;;;;11179:203;11162:3;;;;;;;11132:250;;;11425:4;11420:2;:9;11409:21;;;;;;;;;;;;;;;;;;;;;;;;11391:39;;11447:4;11445:6;;11440:85;11455:2;11453:1;:4;11440:85;;;11504:18;11523:1;11504:21;;;;;;;;;;;;;;;;;;11476:15;11496:4;11492:1;:8;11476:25;;;;;;;;;;;;;;;;;:49;;;;;11459:3;;;;;;;11440:85;;;10830:702;;;;;;;;;:::o;9910:571::-;10001:24;;:::i;:::-;10041:34;;:::i;:::-;10116:10;10140:6;10092;:13;;;;10078:28;;;;;;;;;;;;;;;;;;;;;;;;10041:65;;10129:1;10116:14;;10163:1;10161:3;;10156:186;10168:6;:13;;;;10166:1;:15;10156:186;;;10204:13;:28;10218:13;10204:28;;;;;;;;;;;:39;10233:6;10240:1;10233:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;10204:39;;;;;;;;;;;;;;;;;;;;;;;;;10200:142;;;10290:6;10297:1;10290:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;10263:17;10281:5;10263:24;;;;;;;;;;;;;;;;;:36;;;;;;;;;;;10326:1;10317:10;;;;10200:142;10183:3;;;;;;;10156:186;;;10382:5;10368:20;;;;;;;;;;;;;;;;;;;;;;;;10351:37;;10405:1;10403:3;;10398:76;10410:5;10408:1;:7;10398:76;;;10454:17;10472:1;10454:20;;;;;;;;;;;;;;;;;;10434:14;10449:1;10434:17;;;;;;;;;;;;;;;;;:40;;;;;;;;;;;10417:3;;;;;;;10398:76;;;9910:571;;;;;;:::o;1085:28::-;;;;:::o;4992:207::-;1339:4;1317:27;;:10;:27;;;1309:36;;;;;;;;5094:6;:13;;;;5109:9;819:2;2253:10;:29;;:68;;;;;2311:10;2298:9;:23;;2253:68;:98;;;;;2350:1;2337:9;:14;;2253:98;:129;;;;;2381:1;2367:10;:15;;2253:129;2245:138;;;;;;;;5145:9;5134:8;:20;;;;5164:28;5182:9;5164:28;;;;;;;;;;;;;;;;;;1355:1;;4992:207;:::o;5808:344::-;5891:10;1523:7;:14;1531:5;1523:14;;;;;;;;;;;;;;;;;;;;;;;;;1515:23;;;;;;;;5929:13;1670:1;1627:12;:27;1640:13;1627:27;;;;;;;;;;;:39;;;;;;;;;;;;:44;;;;1619:53;;;;;;;;5965:13;5980:10;1904:13;:28;1918:13;1904:28;;;;;;;;;;;:35;1933:5;1904:35;;;;;;;;;;;;;;;;;;;;;;;;;1903:36;1895:45;;;;;;;;6049:4;6006:13;:28;6020:13;6006:28;;;;;;;;;;;:40;6035:10;6006:40;;;;;;;;;;;;;;;;:47;;;;;;;;;;;;;;;;;;6088:13;6076:10;6063:39;;;;;;;;;;;;6112:33;6131:13;6112:18;:33::i;:::-;1682:1;;1548;5808:344;;:::o;5458:244::-;5562:18;5612:40;5627:11;5640:5;5647:4;5612:14;:40::i;:::-;5596:56;;5662:33;5681:13;5662:18;:33::i;:::-;5458:244;;;;;:::o;780:41::-;819:2;780:41;:::o;1059:20::-;;;;:::o;4372:449::-;4543:6;1339:4;1317:27;;:10;:27;;;1309:36;;;;;;;;4481:5;1523:7;:14;1531:5;1523:14;;;;;;;;;;;;;;;;;;;;;;;;;1515:23;;;;;;;;4514:8;1430:7;:14;1438:5;1430:14;;;;;;;;;;;;;;;;;;;;;;;;;1429:15;1421:24;;;;;;;;4550:1;4543:8;;4538:149;4555:6;:13;;;;4553:1;:15;4538:149;;;4604:5;4591:18;;:6;4598:1;4591:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;:18;;;4587:100;;;4641:8;4629:6;4636:1;4629:9;;;;;;;;;;;;;;;;;;;:20;;;;;;;;;;;;;;;;;;4667:5;;4587:100;4570:3;;;;;;;4538:149;;;4713:5;4696:7;:14;4704:5;4696:14;;;;;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;4748:4;4728:7;:17;4736:8;4728:17;;;;;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;4775:5;4762:19;;;;;;;;;;;;4805:8;4791:23;;;;;;;;;;;;1548:1;1355;4372:449;;;:::o;6681:565::-;6916:23;6764:10;1523:7;:14;1531:5;1523:14;;;;;;;;;;;;;;;;;;;;;;;;;1515:23;;;;;;;;6794:13;6809:10;1768:13;:28;1782:13;1768:28;;;;;;;;;;;:35;1797:5;1768:35;;;;;;;;;;;;;;;;;;;;;;;;;1760:44;;;;;;;;6841:13;2024:12;:27;2037:13;2024:27;;;;;;;;;;;:36;;;;;;;;;;;;2023:37;2015:46;;;;;;;;6874:26;6886:13;6874:11;:26::i;:::-;6870:370;;;6942:12;:27;6955:13;6942:27;;;;;;;;;;;6916:53;;6998:4;6983:3;:12;;;:19;;;;;;;;;;;;;;;;;;7020:3;:15;;;;;;;;;;;;:20;;7047:3;:9;;;7058:3;:8;;7020:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7016:214;;;7095:13;7085:24;;;;;;;;;;7016:214;;;7163:13;7146:31;;;;;;;;;;7210:5;7195:3;:12;;;:20;;;;;;;;;;;;;;;;;;7016:214;6870:370;1814:1;1548;;6681:565;;;:::o;8063:451::-;8195:18;8165:11;2150:1;2138:8;:13;;;;2130:22;;;;;;;;8245:16;;8229:32;;8301:140;;;;;;;;;8340:11;8301:140;;;;;;8372:5;8301:140;;;;8397:4;8301:140;;;;8425:5;8301:140;;;;;8271:12;:27;8284:13;8271:27;;;;;;;;;;;:170;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8471:1;8451:16;;:21;;;;;;;;;;;8493:13;8482:25;;;;;;;;;;8063:451;;;;;;:::o;186:11348::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", "source": "pragma solidity 0.4.18;\n\n\n/// @title Multisignature wallet - Allows multiple parties to agree on transactions before execution.\n/// @author Stefan George - \ncontract MultiSigWallet {\n\n /*\n * Events\n */\n event Confirmation(address indexed sender, uint indexed transactionId);\n event Revocation(address indexed sender, uint indexed transactionId);\n event Submission(uint indexed transactionId);\n event Execution(uint indexed transactionId);\n event ExecutionFailure(uint indexed transactionId);\n event Deposit(address indexed sender, uint value);\n event OwnerAddition(address indexed owner);\n event OwnerRemoval(address indexed owner);\n event RequirementChange(uint required);\n\n /*\n * Constants\n */\n uint constant public MAX_OWNER_COUNT = 50;\n\n /*\n * Storage\n */\n mapping (uint => Transaction) public transactions;\n mapping (uint => mapping (address => bool)) public confirmations;\n mapping (address => bool) public isOwner;\n address[] public owners;\n uint public required;\n uint public transactionCount;\n\n struct Transaction {\n address destination;\n uint value;\n bytes data;\n bool executed;\n }\n\n /*\n * Modifiers\n */\n modifier onlyWallet() {\n require(msg.sender == address(this));\n _;\n }\n\n modifier ownerDoesNotExist(address owner) {\n require(!isOwner[owner]);\n _;\n }\n\n modifier ownerExists(address owner) {\n require(isOwner[owner]);\n _;\n }\n\n modifier transactionExists(uint transactionId) {\n require(transactions[transactionId].destination != 0);\n _;\n }\n\n modifier confirmed(uint transactionId, address owner) {\n require(confirmations[transactionId][owner]);\n _;\n }\n\n modifier notConfirmed(uint transactionId, address owner) {\n require(!confirmations[transactionId][owner]);\n _;\n }\n\n modifier notExecuted(uint transactionId) {\n require(!transactions[transactionId].executed);\n _;\n }\n\n modifier notNull(address _address) {\n require(_address != 0);\n _;\n }\n\n modifier validRequirement(uint ownerCount, uint _required) {\n require(ownerCount <= MAX_OWNER_COUNT\n && _required <= ownerCount\n && _required != 0\n && ownerCount != 0);\n _;\n }\n\n /// @dev Fallback function allows to deposit ether.\n function()\n payable\n public\n {\n if (msg.value > 0)\n Deposit(msg.sender, msg.value);\n }\n\n /*\n * Public functions\n */\n /// @dev Contract constructor sets initial owners and required number of confirmations.\n /// @param _owners List of initial owners.\n /// @param _required Number of required confirmations.\n function MultiSigWallet(address[] _owners, uint _required)\n public\n validRequirement(_owners.length, _required)\n {\n for (uint i=0; i<_owners.length; i++) {\n require(!isOwner[_owners[i]] && _owners[i] != 0);\n isOwner[_owners[i]] = true;\n }\n owners = _owners;\n required = _required;\n }\n\n /// @dev Allows to add a new owner. Transaction has to be sent by wallet.\n /// @param owner Address of new owner.\n function addOwner(address owner)\n public\n onlyWallet\n ownerDoesNotExist(owner)\n notNull(owner)\n validRequirement(owners.length + 1, required)\n {\n isOwner[owner] = true;\n owners.push(owner);\n OwnerAddition(owner);\n }\n\n /// @dev Allows to remove an owner. Transaction has to be sent by wallet.\n /// @param owner Address of owner.\n function removeOwner(address owner)\n public\n onlyWallet\n ownerExists(owner)\n {\n isOwner[owner] = false;\n for (uint i=0; i owners.length)\n changeRequirement(owners.length);\n OwnerRemoval(owner);\n }\n\n /// @dev Allows to replace an owner with a new owner. Transaction has to be sent by wallet.\n /// @param owner Address of owner to be replaced.\n /// @param newOwner Address of new owner.\n function replaceOwner(address owner, address newOwner)\n public\n onlyWallet\n ownerExists(owner)\n ownerDoesNotExist(newOwner)\n {\n for (uint i=0; i bool) authorized;\n mapping (address => uint) agentToIndex; // ensures O(1) look-up\n address[] authorizedAgents;\n }\n\n function authorize(\n Permissions storage self,\n address agent,\n string callingContext\n )\n internal\n {\n require(isNotAuthorized(self, agent));\n\n self.authorized[agent] = true;\n self.authorizedAgents.push(agent);\n self.agentToIndex[agent] = self.authorizedAgents.length - 1;\n Authorized(agent, callingContext);\n }\n\n function revokeAuthorization(\n Permissions storage self,\n address agent,\n string callingContext\n )\n internal\n {\n /* We only want to do work in the case where the agent whose\n authorization is being revoked had authorization permissions in the\n first place. */\n require(isAuthorized(self, agent));\n\n uint indexOfAgentToRevoke = self.agentToIndex[agent];\n uint indexOfAgentToMove = self.authorizedAgents.length - 1;\n address agentToMove = self.authorizedAgents[indexOfAgentToMove];\n\n // Revoke the agent's authorization.\n delete self.authorized[agent];\n\n // Remove the agent from our collection of authorized agents.\n self.authorizedAgents[indexOfAgentToRevoke] = agentToMove;\n\n // Update our indices to reflect the above changes.\n self.agentToIndex[agentToMove] = indexOfAgentToRevoke;\n delete self.agentToIndex[agent];\n\n // Clean up memory that's no longer being used.\n delete self.authorizedAgents[indexOfAgentToMove];\n self.authorizedAgents.length -= 1;\n\n AuthorizationRevoked(agent, callingContext);\n }\n\n function isAuthorized(Permissions storage self, address agent)\n internal\n view\n returns (bool)\n {\n return self.authorized[agent];\n }\n\n function isNotAuthorized(Permissions storage self, address agent)\n internal\n view\n returns (bool)\n {\n return !isAuthorized(self, agent);\n }\n\n function getAuthorizedAgents(Permissions storage self)\n internal\n view\n returns (address[])\n {\n return self.authorizedAgents;\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/libraries/PermissionsLib.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/libraries/PermissionsLib.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/libraries/PermissionsLib.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/libraries/PermissionsLib.sol", "exportedSymbols": { "PermissionEvents": [ 6067 @@ -2969,5 +2969,5 @@ }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:47.597Z" + "updatedAt": "2018-10-09T17:45:35.509Z" } \ No newline at end of file diff --git a/artifacts/json/PermissionsLib.json b/artifacts/json/PermissionsLib.json index 8610c086..5f997565 100644 --- a/artifacts/json/PermissionsLib.json +++ b/artifacts/json/PermissionsLib.json @@ -36,15 +36,15 @@ "type": "event" } ], - "bytecode": "0x60606040523415600e57600080fd5b603580601b6000396000f3006060604052600080fd00a165627a7a723058200e47fa0c31932608607a96cf0ff22f799a1c7566f52b4db84a7111f7c3bcf41f0029", - "deployedBytecode": "0x6060604052600080fd00a165627a7a723058200e47fa0c31932608607a96cf0ff22f799a1c7566f52b4db84a7111f7c3bcf41f0029", + "bytecode": "0x60606040523415600e57600080fd5b603580601b6000396000f3006060604052600080fd00a165627a7a723058206768524dfe495f4cfaf16bce9455dae5cc933b71ae46e9c7bb5f52096765abe50029", + "deployedBytecode": "0x6060604052600080fd00a165627a7a723058206768524dfe495f4cfaf16bce9455dae5cc933b71ae46e9c7bb5f52096765abe50029", "sourceMap": "1157:2653:17:-;;;;;;;;;;;;;;;;;", "deployedSourceMap": "1157:2653:17:-;;;;;", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\n\n/**\n * Note(kayvon): these events are emitted by our PermissionsLib, but all contracts that\n * depend on the library must also define the events in order for web3 clients to pick them up.\n * This topic is discussed in greater detail here (under the section \"Events and Libraries\"):\n * https://blog.aragon.one/library-driven-development-in-solidity-2bebcaf88736\n */\ncontract PermissionEvents {\n event Authorized(address indexed agent, string callingContext);\n event AuthorizationRevoked(address indexed agent, string callingContext);\n}\n\n\nlibrary PermissionsLib {\n\n // TODO(kayvon): remove these events and inherit from PermissionEvents when libraries are\n // capable of inheritance.\n // See relevant github issue here: https://github.com/ethereum/solidity/issues/891\n event Authorized(address indexed agent, string callingContext);\n event AuthorizationRevoked(address indexed agent, string callingContext);\n\n struct Permissions {\n mapping (address => bool) authorized;\n mapping (address => uint) agentToIndex; // ensures O(1) look-up\n address[] authorizedAgents;\n }\n\n function authorize(\n Permissions storage self,\n address agent,\n string callingContext\n )\n internal\n {\n require(isNotAuthorized(self, agent));\n\n self.authorized[agent] = true;\n self.authorizedAgents.push(agent);\n self.agentToIndex[agent] = self.authorizedAgents.length - 1;\n Authorized(agent, callingContext);\n }\n\n function revokeAuthorization(\n Permissions storage self,\n address agent,\n string callingContext\n )\n internal\n {\n /* We only want to do work in the case where the agent whose\n authorization is being revoked had authorization permissions in the\n first place. */\n require(isAuthorized(self, agent));\n\n uint indexOfAgentToRevoke = self.agentToIndex[agent];\n uint indexOfAgentToMove = self.authorizedAgents.length - 1;\n address agentToMove = self.authorizedAgents[indexOfAgentToMove];\n\n // Revoke the agent's authorization.\n delete self.authorized[agent];\n\n // Remove the agent from our collection of authorized agents.\n self.authorizedAgents[indexOfAgentToRevoke] = agentToMove;\n\n // Update our indices to reflect the above changes.\n self.agentToIndex[agentToMove] = indexOfAgentToRevoke;\n delete self.agentToIndex[agent];\n\n // Clean up memory that's no longer being used.\n delete self.authorizedAgents[indexOfAgentToMove];\n self.authorizedAgents.length -= 1;\n\n AuthorizationRevoked(agent, callingContext);\n }\n\n function isAuthorized(Permissions storage self, address agent)\n internal\n view\n returns (bool)\n {\n return self.authorized[agent];\n }\n\n function isNotAuthorized(Permissions storage self, address agent)\n internal\n view\n returns (bool)\n {\n return !isAuthorized(self, agent);\n }\n\n function getAuthorizedAgents(Permissions storage self)\n internal\n view\n returns (address[])\n {\n return self.authorizedAgents;\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/libraries/PermissionsLib.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/libraries/PermissionsLib.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/libraries/PermissionsLib.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/libraries/PermissionsLib.sol", "exportedSymbols": { "PermissionEvents": [ 6067 @@ -2976,7 +2976,7 @@ "42": { "events": {}, "links": {}, - "address": "0xaa5ce701623be22ff89ae25fc1f6cc923127ca4c" + "address": "0x7852987ebd814ccb8ae63ff0ebbebaf12b8b45ab" }, "70": { "events": {}, @@ -2985,5 +2985,5 @@ } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:16:13.720Z" + "updatedAt": "2018-10-09T17:53:04.866Z" } \ No newline at end of file diff --git a/artifacts/json/RepaymentRouter.json b/artifacts/json/RepaymentRouter.json index 0672cdd5..87705b91 100644 --- a/artifacts/json/RepaymentRouter.json +++ b/artifacts/json/RepaymentRouter.json @@ -210,15 +210,15 @@ "type": "event" } ], - "bytecode": "0x606060405260008060146101000a81548160ff021916908315150217905550341561002957600080fd5b604051604080610fdb83398101604052808051906020019091908051906020019091905050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050610eba806101216000396000f30060606040526004361061008e576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630eefdbad146100935780632f866f73146100e85780633f4ba83a1461013d5780635c975abb146101525780638456cb591461017f5780638da5cb5b14610194578063f2fde38b146101e9578063ff26812514610222575b600080fd5b341561009e57600080fd5b6100a6610285565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156100f357600080fd5b6100fb6102ab565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561014857600080fd5b6101506102d1565b005b341561015d57600080fd5b61016561038f565b604051808215151515815260200191505060405180910390f35b341561018a57600080fd5b6101926103a2565b005b341561019f57600080fd5b6101a7610462565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101f457600080fd5b610220600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610487565b005b341561022d57600080fd5b61026f60048080356000191690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506105dc565b6040518082815260200191505060405180910390f35b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561032c57600080fd5b600060149054906101000a900460ff16151561034757600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b600060149054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156103fd57600080fd5b600060149054906101000a900460ff1615151561041957600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156104e257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561051e57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060008060149054906101000a900460ff161515156105fc57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415151561063857600080fd5b60008511151561064757600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639758af1e876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156106e857600080fd5b6102c65a03f115156106f957600080fd5b5050506040518051905015156107535785600019166000600281111561071b57fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009250610e85565b848473ffffffffffffffffffffffffffffffffffffffff166370a08231336000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15156107f757600080fd5b6102c65a03f1151561080857600080fd5b5050506040518051905010806109305750848473ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b151561091357600080fd5b6102c65a03f1151561092457600080fd5b50505060405180519050105b1561097f5785600019166001600281111561094757fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009250610e85565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f6f494c9876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610a2057600080fd5b6102c65a03f11515610a3157600080fd5b505050604051805190509150600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ba20dda4876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610ade57600080fd5b6102c65a03f11515610aef57600080fd5b5050506040518051905090508173ffffffffffffffffffffffffffffffffffffffff16635f0280ba87338489896000604051602001526040518663ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050602060405180830381600087803b1515610c1e57600080fd5b6102c65a03f11515610c2f57600080fd5b505050604051805190501515610c88578560001916600280811115610c5057fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009250610e85565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166315dacbea853384896000604051602001526040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050602060405180830381600087803b1515610dbd57600080fd5b6102c65a03f11515610dce57600080fd5b505050604051805190501515610de357600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1687600019167f43ea5a2b552489bf9de7c3d6ded86e3b82423e034255d06db4b388f806db50d08888604051808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a48492505b505093925050505600a165627a7a72305820ee7b0fdfba8706d47069dc4c8b5eb6c445fa373c8a75982dd71f183b2af501850029", - "deployedBytecode": "0x60606040526004361061008e576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630eefdbad146100935780632f866f73146100e85780633f4ba83a1461013d5780635c975abb146101525780638456cb591461017f5780638da5cb5b14610194578063f2fde38b146101e9578063ff26812514610222575b600080fd5b341561009e57600080fd5b6100a6610285565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156100f357600080fd5b6100fb6102ab565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561014857600080fd5b6101506102d1565b005b341561015d57600080fd5b61016561038f565b604051808215151515815260200191505060405180910390f35b341561018a57600080fd5b6101926103a2565b005b341561019f57600080fd5b6101a7610462565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101f457600080fd5b610220600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610487565b005b341561022d57600080fd5b61026f60048080356000191690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506105dc565b6040518082815260200191505060405180910390f35b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561032c57600080fd5b600060149054906101000a900460ff16151561034757600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b600060149054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156103fd57600080fd5b600060149054906101000a900460ff1615151561041957600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156104e257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561051e57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060008060149054906101000a900460ff161515156105fc57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415151561063857600080fd5b60008511151561064757600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639758af1e876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156106e857600080fd5b6102c65a03f115156106f957600080fd5b5050506040518051905015156107535785600019166000600281111561071b57fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009250610e85565b848473ffffffffffffffffffffffffffffffffffffffff166370a08231336000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15156107f757600080fd5b6102c65a03f1151561080857600080fd5b5050506040518051905010806109305750848473ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b151561091357600080fd5b6102c65a03f1151561092457600080fd5b50505060405180519050105b1561097f5785600019166001600281111561094757fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009250610e85565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f6f494c9876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610a2057600080fd5b6102c65a03f11515610a3157600080fd5b505050604051805190509150600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ba20dda4876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610ade57600080fd5b6102c65a03f11515610aef57600080fd5b5050506040518051905090508173ffffffffffffffffffffffffffffffffffffffff16635f0280ba87338489896000604051602001526040518663ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050602060405180830381600087803b1515610c1e57600080fd5b6102c65a03f11515610c2f57600080fd5b505050604051805190501515610c88578560001916600280811115610c5057fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009250610e85565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166315dacbea853384896000604051602001526040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050602060405180830381600087803b1515610dbd57600080fd5b6102c65a03f11515610dce57600080fd5b505050604051805190501515610de357600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1687600019167f43ea5a2b552489bf9de7c3d6ded86e3b82423e034255d06db4b388f806db50d08888604051808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a48492505b505093925050505600a165627a7a72305820ee7b0fdfba8706d47069dc4c8b5eb6c445fa373c8a75982dd71f183b2af501850029", + "bytecode": "0x606060405260008060146101000a81548160ff021916908315150217905550341561002957600080fd5b604051604080610fdb83398101604052808051906020019091908051906020019091905050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050610eba806101216000396000f30060606040526004361061008e576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630eefdbad146100935780632f866f73146100e85780633f4ba83a1461013d5780635c975abb146101525780638456cb591461017f5780638da5cb5b14610194578063f2fde38b146101e9578063ff26812514610222575b600080fd5b341561009e57600080fd5b6100a6610285565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156100f357600080fd5b6100fb6102ab565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561014857600080fd5b6101506102d1565b005b341561015d57600080fd5b61016561038f565b604051808215151515815260200191505060405180910390f35b341561018a57600080fd5b6101926103a2565b005b341561019f57600080fd5b6101a7610462565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101f457600080fd5b610220600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610487565b005b341561022d57600080fd5b61026f60048080356000191690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506105dc565b6040518082815260200191505060405180910390f35b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561032c57600080fd5b600060149054906101000a900460ff16151561034757600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b600060149054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156103fd57600080fd5b600060149054906101000a900460ff1615151561041957600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156104e257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561051e57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060008060149054906101000a900460ff161515156105fc57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415151561063857600080fd5b60008511151561064757600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639758af1e876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156106e857600080fd5b6102c65a03f115156106f957600080fd5b5050506040518051905015156107535785600019166000600281111561071b57fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009250610e85565b848473ffffffffffffffffffffffffffffffffffffffff166370a08231336000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15156107f757600080fd5b6102c65a03f1151561080857600080fd5b5050506040518051905010806109305750848473ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b151561091357600080fd5b6102c65a03f1151561092457600080fd5b50505060405180519050105b1561097f5785600019166001600281111561094757fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009250610e85565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f6f494c9876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610a2057600080fd5b6102c65a03f11515610a3157600080fd5b505050604051805190509150600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ba20dda4876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610ade57600080fd5b6102c65a03f11515610aef57600080fd5b5050506040518051905090508173ffffffffffffffffffffffffffffffffffffffff16635f0280ba87338489896000604051602001526040518663ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050602060405180830381600087803b1515610c1e57600080fd5b6102c65a03f11515610c2f57600080fd5b505050604051805190501515610c88578560001916600280811115610c5057fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009250610e85565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166315dacbea853384896000604051602001526040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050602060405180830381600087803b1515610dbd57600080fd5b6102c65a03f11515610dce57600080fd5b505050604051805190501515610de357600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1687600019167f43ea5a2b552489bf9de7c3d6ded86e3b82423e034255d06db4b388f806db50d08888604051808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a48492505b505093925050505600a165627a7a72305820a5f5f8b11da4685987d7b82cefa96c87871c531e62ad3e028cb997d5c80040310029", + "deployedBytecode": "0x60606040526004361061008e576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630eefdbad146100935780632f866f73146100e85780633f4ba83a1461013d5780635c975abb146101525780638456cb591461017f5780638da5cb5b14610194578063f2fde38b146101e9578063ff26812514610222575b600080fd5b341561009e57600080fd5b6100a6610285565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156100f357600080fd5b6100fb6102ab565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561014857600080fd5b6101506102d1565b005b341561015d57600080fd5b61016561038f565b604051808215151515815260200191505060405180910390f35b341561018a57600080fd5b6101926103a2565b005b341561019f57600080fd5b6101a7610462565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101f457600080fd5b610220600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610487565b005b341561022d57600080fd5b61026f60048080356000191690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506105dc565b6040518082815260200191505060405180910390f35b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561032c57600080fd5b600060149054906101000a900460ff16151561034757600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b600060149054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156103fd57600080fd5b600060149054906101000a900460ff1615151561041957600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156104e257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561051e57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060008060149054906101000a900460ff161515156105fc57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415151561063857600080fd5b60008511151561064757600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639758af1e876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156106e857600080fd5b6102c65a03f115156106f957600080fd5b5050506040518051905015156107535785600019166000600281111561071b57fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009250610e85565b848473ffffffffffffffffffffffffffffffffffffffff166370a08231336000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15156107f757600080fd5b6102c65a03f1151561080857600080fd5b5050506040518051905010806109305750848473ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b151561091357600080fd5b6102c65a03f1151561092457600080fd5b50505060405180519050105b1561097f5785600019166001600281111561094757fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009250610e85565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f6f494c9876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610a2057600080fd5b6102c65a03f11515610a3157600080fd5b505050604051805190509150600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ba20dda4876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610ade57600080fd5b6102c65a03f11515610aef57600080fd5b5050506040518051905090508173ffffffffffffffffffffffffffffffffffffffff16635f0280ba87338489896000604051602001526040518663ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050602060405180830381600087803b1515610c1e57600080fd5b6102c65a03f11515610c2f57600080fd5b505050604051805190501515610c88578560001916600280811115610c5057fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009250610e85565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166315dacbea853384896000604051602001526040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050602060405180830381600087803b1515610dbd57600080fd5b6102c65a03f11515610dce57600080fd5b505050604051805190501515610de357600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1687600019167f43ea5a2b552489bf9de7c3d6ded86e3b82423e034255d06db4b388f806db50d08888604051808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a48492505b505093925050505600a165627a7a72305820a5f5f8b11da4685987d7b82cefa96c87871c531e62ad3e028cb997d5c80040310029", "sourceMap": "1291:2734:10:-;;;268:5:37;247:26;;;;;;;;;;;;;;;;;;;;1936:214:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;509:10:39;501:5;;:18;;;;;;;;;;;;;;;;;;2059:13:10;2031:12;;:42;;;;;;;;;;;;;;;;;;2123:19;2083:18;;:60;;;;;;;;;;;;;;;;;;1936:214;;1291:2734;;;;;;", "deployedSourceMap": "1291:2734:10:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1372:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1334:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;833:87:37;;;;;;;;;;;;;;247:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;666:85;;;;;;;;;;;;;;238:20:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;832:169;;;;;;;;;;;;;;;;;;;;;;;;;;;;2360:1663:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1372:44;;;;;;;;;;;;;:::o;1334:32::-;;;;;;;;;;;;;:::o;833:87:37:-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;568:6:37;;;;;;;;;;;560:15;;;;;;;;895:5;886:6;;:14;;;;;;;;;;;;;;;;;;906:9;;;;;;;;;;833:87::o;247:26::-;;;;;;;;;;;;;:::o;666:85::-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;729:4;720:6;;:13;;;;;;;;;;;;;;;;;;739:7;;;;;;;;;;666:85::o;238:20:39:-;;;;;;;;;;;;;:::o;832:169::-;653:5;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;928:1;908:22;;:8;:22;;;;900:31;;;;;;;;965:8;937:37;;958:5;;;;;;;;;;;937:37;;;;;;;;;;;;988:8;980:5;;:16;;;;;;;;;;;;;;;;;;832:169;:::o;2360:1663:10:-;2518:18;3229:21;3305:19;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;2584:1:10;2560:26;;:12;:26;;;;2552:35;;;;;;;;2614:1;2605:6;:10;2597:19;;;;;;;;2668:12;;;;;;;;;;;:27;;;2696:11;2668:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2667:41;2663:157;;;2775:11;2724:63;;;2739:33;2733:40;;;;;;;;2724:63;;;;;;;;;;;;2808:1;2801:8;;;;2663:157;2969:6;2931:12;2925:29;;;2955:10;2925:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:50;:136;;;;3055:6;2997:12;2991:29;;;3021:10;3033:18;;;;;;;;;;;2991:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:70;2925:136;2921:265;;;3141:11;3077:76;;;3092:46;3086:53;;;;;;;;3077:76;;;;;;;;;;;;3174:1;3167:8;;;;2921:265;3253:12;;;;;;;;;;;:29;;;3283:11;3253:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3229:66;;3327:12;;;;;;;;;;;:27;;;3355:11;3327:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3305:62;;3396:13;3382:46;;;3442:11;3467:10;3491:11;3516:6;3536:12;3382:176;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3381:177;3377:303;;;3635:11;3574:73;;;3589:43;3583:50;;;;;;;;3574:73;;;;;;;;;;;;3668:1;3661:8;;;;3377:303;3737:18;;;;;;;;;;;:31;;;3782:12;3808:10;3832:11;3857:6;3737:136;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3729:145;;;;;;;;3958:11;3920:72;;3946:10;3920:72;;3933:11;3920:72;;;;3971:6;3979:12;3920:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;4010:6;4003:13;;429:1:37;2360:1663:10;;;;;;;:::o", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\nimport \"./DebtRegistry.sol\";\nimport \"./TermsContract.sol\";\nimport \"./TokenTransferProxy.sol\";\nimport \"zeppelin-solidity/contracts/token/ERC20/ERC20.sol\";\nimport \"zeppelin-solidity/contracts/lifecycle/Pausable.sol\";\n\n\n/**\n * The RepaymentRouter routes allowers payers to make repayments on any\n * given debt agreement in any given token by routing the payments to\n * the debt agreement's beneficiary. Additionally, the router acts\n * as a trusted oracle to the debt agreement's terms contract, informing\n * it of exactly what payments have been made in what quantity and in what token.\n *\n * Authors: Jaynti Kanani -- Github: jdkanani, Nadav Hollander -- Github: nadavhollander\n */\ncontract RepaymentRouter is Pausable {\n DebtRegistry public debtRegistry;\n TokenTransferProxy public tokenTransferProxy;\n\n enum Errors {\n DEBT_AGREEMENT_NONEXISTENT,\n PAYER_BALANCE_OR_ALLOWANCE_INSUFFICIENT,\n REPAYMENT_REJECTED_BY_TERMS_CONTRACT\n }\n\n event LogRepayment(\n bytes32 indexed _agreementId,\n address indexed _payer,\n address indexed _beneficiary,\n uint _amount,\n address _token\n );\n\n event LogError(uint8 indexed _errorId, bytes32 indexed _agreementId);\n\n /**\n * Constructor points the repayment router at the deployed registry contract.\n */\n function RepaymentRouter (address _debtRegistry, address _tokenTransferProxy) public {\n debtRegistry = DebtRegistry(_debtRegistry);\n tokenTransferProxy = TokenTransferProxy(_tokenTransferProxy);\n }\n\n /**\n * Given an agreement id, routes a repayment\n * of a given ERC20 token to the debt's current beneficiary, and reports the repayment\n * to the debt's associated terms contract.\n */\n function repay(\n bytes32 agreementId,\n uint256 amount,\n address tokenAddress\n )\n public\n whenNotPaused\n returns (uint _amountRepaid)\n {\n require(tokenAddress != address(0));\n require(amount > 0);\n\n // Ensure agreement exists.\n if (!debtRegistry.doesEntryExist(agreementId)) {\n LogError(uint8(Errors.DEBT_AGREEMENT_NONEXISTENT), agreementId);\n return 0;\n }\n\n // Check payer has sufficient balance and has granted router sufficient allowance.\n if (ERC20(tokenAddress).balanceOf(msg.sender) < amount ||\n ERC20(tokenAddress).allowance(msg.sender, tokenTransferProxy) < amount) {\n LogError(uint8(Errors.PAYER_BALANCE_OR_ALLOWANCE_INSUFFICIENT), agreementId);\n return 0;\n }\n\n // Notify terms contract\n address termsContract = debtRegistry.getTermsContract(agreementId);\n address beneficiary = debtRegistry.getBeneficiary(agreementId);\n if (!TermsContract(termsContract).registerRepayment(\n agreementId,\n msg.sender,\n beneficiary,\n amount,\n tokenAddress\n )) {\n LogError(uint8(Errors.REPAYMENT_REJECTED_BY_TERMS_CONTRACT), agreementId);\n return 0;\n }\n\n // Transfer amount to creditor\n require(tokenTransferProxy.transferFrom(\n tokenAddress,\n msg.sender,\n beneficiary,\n amount\n ));\n\n // Log event for repayment\n LogRepayment(agreementId, msg.sender, beneficiary, amount, tokenAddress);\n\n return amount;\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/RepaymentRouter.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/RepaymentRouter.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/RepaymentRouter.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/RepaymentRouter.sol", "exportedSymbols": { "RepaymentRouter": [ 4707 @@ -241,7 +241,7 @@ { "attributes": { "SourceUnit": 3159, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/DebtRegistry.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/DebtRegistry.sol", "file": "./DebtRegistry.sol", "scope": 4708, "symbolAliases": [ @@ -256,7 +256,7 @@ { "attributes": { "SourceUnit": 4758, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/TermsContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/TermsContract.sol", "file": "./TermsContract.sol", "scope": 4708, "symbolAliases": [ @@ -271,7 +271,7 @@ { "attributes": { "SourceUnit": 5207, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/TokenTransferProxy.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/TokenTransferProxy.sol", "file": "./TokenTransferProxy.sol", "scope": 4708, "symbolAliases": [ @@ -3301,7 +3301,7 @@ } }, "links": {}, - "address": "0xd2c8cf211f4753a10b145c90950add769a8a6bc2" + "address": "0x03ff589c02e794dbb55394ba86c62ba68e399688" }, "70": { "events": { @@ -3389,5 +3389,5 @@ } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:15:01.333Z" + "updatedAt": "2018-10-09T17:51:53.137Z" } \ No newline at end of file diff --git a/artifacts/json/SafeMath.json b/artifacts/json/SafeMath.json index 4840bafc..5786360c 100644 --- a/artifacts/json/SafeMath.json +++ b/artifacts/json/SafeMath.json @@ -1343,5 +1343,5 @@ }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:48.038Z" + "updatedAt": "2018-10-09T17:45:35.450Z" } \ No newline at end of file diff --git a/artifacts/json/SaleClockAuction.json b/artifacts/json/SaleClockAuction.json index a4d02e4f..fb6d4616 100644 --- a/artifacts/json/SaleClockAuction.json +++ b/artifacts/json/SaleClockAuction.json @@ -384,15 +384,15 @@ "type": "event" } ], - "bytecode": "0x606060405260008060146101000a81548160ff0219169083151502179055506001600460006101000a81548160ff021916908315150217905550341561004457600080fd5b6040516040806118da8339810160405280805190602001909190805190602001909190505081816000336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061271082111515156100be57600080fd5b816002819055508290508073ffffffffffffffffffffffffffffffffffffffff166301ffc9a7639a20483d7c0100000000000000000000000000000000000000000000000000000000026000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001915050602060405180830381600087803b15156101a057600080fd5b6102c65a03f115156101b157600080fd5b5050506040518051905015156101c657600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050506116bf8061021b6000396000f3006060604052600436106100fc576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806327ebe40a146101015780633f4ba83a1461015e578063454a2ab31461018b578063484eccb4146101a35780635c975abb146101da5780635fd8c7101461020757806378bd79351461021c57806383b5ff8b1461029b5780638456cb59146102c457806385b86188146102f1578063878eb3681461031e5780638a98a9cc146103415780638da5cb5b1461036a57806396b5a755146103bf578063c55d0f56146103e2578063dd1b7a0f14610419578063eac9d94c1461046e578063f2fde38b14610497575b600080fd5b341561010c57600080fd5b61015c600480803590602001909190803590602001909190803590602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506104d0565b005b341561016957600080fd5b610171610620565b604051808215151515815260200191505060405180910390f35b6101a160048080359060200190919050506106e5565b005b34156101ae57600080fd5b6101c460048080359060200190919050506107c7565b6040518082815260200191505060405180910390f35b34156101e557600080fd5b6101ed6107e1565b604051808215151515815260200191505060405180910390f35b341561021257600080fd5b61021a6107f4565b005b341561022757600080fd5b61023d60048080359060200190919050506108ff565b604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b34156102a657600080fd5b6102ae610a22565b6040518082815260200191505060405180910390f35b34156102cf57600080fd5b6102d7610a28565b604051808215151515815260200191505060405180910390f35b34156102fc57600080fd5b610304610aef565b604051808215151515815260200191505060405180910390f35b341561032957600080fd5b61033f6004808035906020019091905050610b02565b005b341561034c57600080fd5b610354610bd4565b6040518082815260200191505060405180910390f35b341561037557600080fd5b61037d610bda565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103ca57600080fd5b6103e06004808035906020019091905050610bff565b005b34156103ed57600080fd5b6104036004808035906020019091905050610c9b565b6040518082815260200191505060405180910390f35b341561042457600080fd5b61042c610cd8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561047957600080fd5b610481610cfe565b6040518082815260200191505060405180910390f35b34156104a257600080fd5b6104ce600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610d4a565b005b6104d8611615565b846fffffffffffffffffffffffffffffffff16851415156104f857600080fd5b836fffffffffffffffffffffffffffffffff168414151561051857600080fd5b8267ffffffffffffffff168314151561053057600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561058c57600080fd5b6105968287610e1f565b60a0604051908101604052808373ffffffffffffffffffffffffffffffffffffffff168152602001866fffffffffffffffffffffffffffffffff168152602001856fffffffffffffffffffffffffffffffff1681526020018467ffffffffffffffff1681526020014267ffffffffffffffff1681525090506106188682610f2f565b505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561067d57600080fd5b600060149054906101000a900460ff16151561069857600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a16001905090565b6000806003600084815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915061072b8334611114565b905061073733846112b3565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156107c2578060066005805481151561079d57fe5b066005811015156107aa57fe5b01819055506005600081548092919060010191905055505b505050565b6006816005811015156107d657fe5b016000915090505481565b600060149054906101000a900460ff1681565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806108a257508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156108ad57600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505090505050565b6000806000806000806003600088815260200190815260200160002090506109268161138f565b151561093157600080fd5b8060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a90046fffffffffffffffffffffffffffffffff168260010160109054906101000a90046fffffffffffffffffffffffffffffffff168360020160009054906101000a900467ffffffffffffffff168460020160089054906101000a900467ffffffffffffffff16836fffffffffffffffffffffffffffffffff169350826fffffffffffffffffffffffffffffffff1692508167ffffffffffffffff1691508067ffffffffffffffff169050955095509550955095505091939590929450565b60025481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a8557600080fd5b600060149054906101000a900460ff16151515610aa157600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a16001905090565b600460009054906101000a900460ff1681565b60008060149054906101000a900460ff161515610b1e57600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610b7957600080fd5b600360008381526020019081526020016000209050610b978161138f565b1515610ba257600080fd5b610bd0828260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166113bd565b5050565b60055481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600360008481526020019081526020016000209150610c208261138f565b1515610c2b57600080fd5b8160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610c8c57600080fd5b610c9683826113bd565b505050565b600080600360008481526020019081526020016000209050610cbc8161138f565b1515610cc757600080fd5b610cd08161140b565b915050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000809150600090505b6005811015610d3657600681600581101515610d2357fe5b0154820191508080600101915050610d0b565b600582811515610d4257fe5b049250505090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610da557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515610e1c57806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8330846040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1515610f1757600080fd5b6102c65a03f11515610f2857600080fd5b5050505050565b603c816060015167ffffffffffffffff1610151515610f4d57600080fd5b806003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060408201518160010160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160020160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050507fa9c8dfcda5664a5a124c713e386da27de87432d5b668e79458501eb296389ba78282602001516fffffffffffffffffffffffffffffffff1683604001516fffffffffffffffffffffffffffffffff16846060015167ffffffffffffffff166040518085815260200184815260200183815260200182815260200194505050505060405180910390a15050565b6000806000806000806000600360008a8152602001908152602001600020955061113d8661138f565b151561114857600080fd5b6111518661140b565b945084881015151561116257600080fd5b8560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169350611192896114fe565b60008511156111ec576111a4856115ba565b925082850391508373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015156111eb57600080fd5b5b84880390503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561123157600080fd5b7f4fcc30d90a842164dd58501ab874a101a3749c3d4747139cefe7c876f4ccebd2898633604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a184965050505050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b151561137757600080fd5b6102c65a03f1151561138857600080fd5b5050505050565b6000808260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16119050919050565b6113c6826114fe565b6113d081836112b3565b7f2809c7e17bf978fbc7194c0a694b638c4215e9140cacc6c38ca36010b45697df826040518082815260200191505060405180910390a15050565b600080600090508260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16421115611464578260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16420390505b6114f68360010160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168460010160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168560020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16846115d5565b915050919050565b60036000828152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160006101000a8154906fffffffffffffffffffffffffffffffff02191690556001820160106101000a8154906fffffffffffffffffffffffffffffffff02191690556002820160006101000a81549067ffffffffffffffff02191690556002820160086101000a81549067ffffffffffffffff0219169055505050565b600061271060025483028115156115cd57fe5b049050919050565b60008060008085851015156115ec5786935061160a565b8787039250858584028115156115fe57fe5b05915081880190508093505b505050949350505050565b60a060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff16815250905600a165627a7a72305820a7e0dcb0ba6b30bc244fc3a1fb1e2909ccda4306f3ad3767e9142549747f6d5b0029", - "deployedBytecode": "0x6060604052600436106100fc576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806327ebe40a146101015780633f4ba83a1461015e578063454a2ab31461018b578063484eccb4146101a35780635c975abb146101da5780635fd8c7101461020757806378bd79351461021c57806383b5ff8b1461029b5780638456cb59146102c457806385b86188146102f1578063878eb3681461031e5780638a98a9cc146103415780638da5cb5b1461036a57806396b5a755146103bf578063c55d0f56146103e2578063dd1b7a0f14610419578063eac9d94c1461046e578063f2fde38b14610497575b600080fd5b341561010c57600080fd5b61015c600480803590602001909190803590602001909190803590602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506104d0565b005b341561016957600080fd5b610171610620565b604051808215151515815260200191505060405180910390f35b6101a160048080359060200190919050506106e5565b005b34156101ae57600080fd5b6101c460048080359060200190919050506107c7565b6040518082815260200191505060405180910390f35b34156101e557600080fd5b6101ed6107e1565b604051808215151515815260200191505060405180910390f35b341561021257600080fd5b61021a6107f4565b005b341561022757600080fd5b61023d60048080359060200190919050506108ff565b604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b34156102a657600080fd5b6102ae610a22565b6040518082815260200191505060405180910390f35b34156102cf57600080fd5b6102d7610a28565b604051808215151515815260200191505060405180910390f35b34156102fc57600080fd5b610304610aef565b604051808215151515815260200191505060405180910390f35b341561032957600080fd5b61033f6004808035906020019091905050610b02565b005b341561034c57600080fd5b610354610bd4565b6040518082815260200191505060405180910390f35b341561037557600080fd5b61037d610bda565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103ca57600080fd5b6103e06004808035906020019091905050610bff565b005b34156103ed57600080fd5b6104036004808035906020019091905050610c9b565b6040518082815260200191505060405180910390f35b341561042457600080fd5b61042c610cd8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561047957600080fd5b610481610cfe565b6040518082815260200191505060405180910390f35b34156104a257600080fd5b6104ce600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610d4a565b005b6104d8611615565b846fffffffffffffffffffffffffffffffff16851415156104f857600080fd5b836fffffffffffffffffffffffffffffffff168414151561051857600080fd5b8267ffffffffffffffff168314151561053057600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561058c57600080fd5b6105968287610e1f565b60a0604051908101604052808373ffffffffffffffffffffffffffffffffffffffff168152602001866fffffffffffffffffffffffffffffffff168152602001856fffffffffffffffffffffffffffffffff1681526020018467ffffffffffffffff1681526020014267ffffffffffffffff1681525090506106188682610f2f565b505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561067d57600080fd5b600060149054906101000a900460ff16151561069857600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a16001905090565b6000806003600084815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915061072b8334611114565b905061073733846112b3565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156107c2578060066005805481151561079d57fe5b066005811015156107aa57fe5b01819055506005600081548092919060010191905055505b505050565b6006816005811015156107d657fe5b016000915090505481565b600060149054906101000a900460ff1681565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806108a257508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156108ad57600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505090505050565b6000806000806000806003600088815260200190815260200160002090506109268161138f565b151561093157600080fd5b8060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a90046fffffffffffffffffffffffffffffffff168260010160109054906101000a90046fffffffffffffffffffffffffffffffff168360020160009054906101000a900467ffffffffffffffff168460020160089054906101000a900467ffffffffffffffff16836fffffffffffffffffffffffffffffffff169350826fffffffffffffffffffffffffffffffff1692508167ffffffffffffffff1691508067ffffffffffffffff169050955095509550955095505091939590929450565b60025481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a8557600080fd5b600060149054906101000a900460ff16151515610aa157600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a16001905090565b600460009054906101000a900460ff1681565b60008060149054906101000a900460ff161515610b1e57600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610b7957600080fd5b600360008381526020019081526020016000209050610b978161138f565b1515610ba257600080fd5b610bd0828260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166113bd565b5050565b60055481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600360008481526020019081526020016000209150610c208261138f565b1515610c2b57600080fd5b8160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610c8c57600080fd5b610c9683826113bd565b505050565b600080600360008481526020019081526020016000209050610cbc8161138f565b1515610cc757600080fd5b610cd08161140b565b915050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000809150600090505b6005811015610d3657600681600581101515610d2357fe5b0154820191508080600101915050610d0b565b600582811515610d4257fe5b049250505090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610da557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515610e1c57806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8330846040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1515610f1757600080fd5b6102c65a03f11515610f2857600080fd5b5050505050565b603c816060015167ffffffffffffffff1610151515610f4d57600080fd5b806003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060408201518160010160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160020160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050507fa9c8dfcda5664a5a124c713e386da27de87432d5b668e79458501eb296389ba78282602001516fffffffffffffffffffffffffffffffff1683604001516fffffffffffffffffffffffffffffffff16846060015167ffffffffffffffff166040518085815260200184815260200183815260200182815260200194505050505060405180910390a15050565b6000806000806000806000600360008a8152602001908152602001600020955061113d8661138f565b151561114857600080fd5b6111518661140b565b945084881015151561116257600080fd5b8560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169350611192896114fe565b60008511156111ec576111a4856115ba565b925082850391508373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015156111eb57600080fd5b5b84880390503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561123157600080fd5b7f4fcc30d90a842164dd58501ab874a101a3749c3d4747139cefe7c876f4ccebd2898633604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a184965050505050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b151561137757600080fd5b6102c65a03f1151561138857600080fd5b5050505050565b6000808260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16119050919050565b6113c6826114fe565b6113d081836112b3565b7f2809c7e17bf978fbc7194c0a694b638c4215e9140cacc6c38ca36010b45697df826040518082815260200191505060405180910390a15050565b600080600090508260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16421115611464578260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16420390505b6114f68360010160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168460010160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168560020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16846115d5565b915050919050565b60036000828152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160006101000a8154906fffffffffffffffffffffffffffffffff02191690556001820160106101000a8154906fffffffffffffffffffffffffffffffff02191690556002820160006101000a81549067ffffffffffffffff02191690556002820160086101000a81549067ffffffffffffffff0219169055505050565b600061271060025483028115156115cd57fe5b049050919050565b60008060008085851015156115ec5786935061160a565b8787039250858584028115156115fe57fe5b05915081880190508093505b505050949350505050565b60a060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff16815250905600a165627a7a72305820a7e0dcb0ba6b30bc244fc3a1fb1e2909ccda4306f3ad3767e9142549747f6d5b0029", + "bytecode": "0x606060405260008060146101000a81548160ff0219169083151502179055506001600460006101000a81548160ff021916908315150217905550341561004457600080fd5b6040516040806118da8339810160405280805190602001909190805190602001909190505081816000336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061271082111515156100be57600080fd5b816002819055508290508073ffffffffffffffffffffffffffffffffffffffff166301ffc9a7639a20483d7c0100000000000000000000000000000000000000000000000000000000026000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001915050602060405180830381600087803b15156101a057600080fd5b6102c65a03f115156101b157600080fd5b5050506040518051905015156101c657600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050506116bf8061021b6000396000f3006060604052600436106100fc576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806327ebe40a146101015780633f4ba83a1461015e578063454a2ab31461018b578063484eccb4146101a35780635c975abb146101da5780635fd8c7101461020757806378bd79351461021c57806383b5ff8b1461029b5780638456cb59146102c457806385b86188146102f1578063878eb3681461031e5780638a98a9cc146103415780638da5cb5b1461036a57806396b5a755146103bf578063c55d0f56146103e2578063dd1b7a0f14610419578063eac9d94c1461046e578063f2fde38b14610497575b600080fd5b341561010c57600080fd5b61015c600480803590602001909190803590602001909190803590602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506104d0565b005b341561016957600080fd5b610171610620565b604051808215151515815260200191505060405180910390f35b6101a160048080359060200190919050506106e5565b005b34156101ae57600080fd5b6101c460048080359060200190919050506107c7565b6040518082815260200191505060405180910390f35b34156101e557600080fd5b6101ed6107e1565b604051808215151515815260200191505060405180910390f35b341561021257600080fd5b61021a6107f4565b005b341561022757600080fd5b61023d60048080359060200190919050506108ff565b604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b34156102a657600080fd5b6102ae610a22565b6040518082815260200191505060405180910390f35b34156102cf57600080fd5b6102d7610a28565b604051808215151515815260200191505060405180910390f35b34156102fc57600080fd5b610304610aef565b604051808215151515815260200191505060405180910390f35b341561032957600080fd5b61033f6004808035906020019091905050610b02565b005b341561034c57600080fd5b610354610bd4565b6040518082815260200191505060405180910390f35b341561037557600080fd5b61037d610bda565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103ca57600080fd5b6103e06004808035906020019091905050610bff565b005b34156103ed57600080fd5b6104036004808035906020019091905050610c9b565b6040518082815260200191505060405180910390f35b341561042457600080fd5b61042c610cd8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561047957600080fd5b610481610cfe565b6040518082815260200191505060405180910390f35b34156104a257600080fd5b6104ce600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610d4a565b005b6104d8611615565b846fffffffffffffffffffffffffffffffff16851415156104f857600080fd5b836fffffffffffffffffffffffffffffffff168414151561051857600080fd5b8267ffffffffffffffff168314151561053057600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561058c57600080fd5b6105968287610e1f565b60a0604051908101604052808373ffffffffffffffffffffffffffffffffffffffff168152602001866fffffffffffffffffffffffffffffffff168152602001856fffffffffffffffffffffffffffffffff1681526020018467ffffffffffffffff1681526020014267ffffffffffffffff1681525090506106188682610f2f565b505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561067d57600080fd5b600060149054906101000a900460ff16151561069857600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a16001905090565b6000806003600084815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915061072b8334611114565b905061073733846112b3565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156107c2578060066005805481151561079d57fe5b066005811015156107aa57fe5b01819055506005600081548092919060010191905055505b505050565b6006816005811015156107d657fe5b016000915090505481565b600060149054906101000a900460ff1681565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806108a257508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156108ad57600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505090505050565b6000806000806000806003600088815260200190815260200160002090506109268161138f565b151561093157600080fd5b8060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a90046fffffffffffffffffffffffffffffffff168260010160109054906101000a90046fffffffffffffffffffffffffffffffff168360020160009054906101000a900467ffffffffffffffff168460020160089054906101000a900467ffffffffffffffff16836fffffffffffffffffffffffffffffffff169350826fffffffffffffffffffffffffffffffff1692508167ffffffffffffffff1691508067ffffffffffffffff169050955095509550955095505091939590929450565b60025481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a8557600080fd5b600060149054906101000a900460ff16151515610aa157600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a16001905090565b600460009054906101000a900460ff1681565b60008060149054906101000a900460ff161515610b1e57600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610b7957600080fd5b600360008381526020019081526020016000209050610b978161138f565b1515610ba257600080fd5b610bd0828260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166113bd565b5050565b60055481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600360008481526020019081526020016000209150610c208261138f565b1515610c2b57600080fd5b8160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610c8c57600080fd5b610c9683826113bd565b505050565b600080600360008481526020019081526020016000209050610cbc8161138f565b1515610cc757600080fd5b610cd08161140b565b915050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000809150600090505b6005811015610d3657600681600581101515610d2357fe5b0154820191508080600101915050610d0b565b600582811515610d4257fe5b049250505090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610da557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515610e1c57806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8330846040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1515610f1757600080fd5b6102c65a03f11515610f2857600080fd5b5050505050565b603c816060015167ffffffffffffffff1610151515610f4d57600080fd5b806003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060408201518160010160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160020160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050507fa9c8dfcda5664a5a124c713e386da27de87432d5b668e79458501eb296389ba78282602001516fffffffffffffffffffffffffffffffff1683604001516fffffffffffffffffffffffffffffffff16846060015167ffffffffffffffff166040518085815260200184815260200183815260200182815260200194505050505060405180910390a15050565b6000806000806000806000600360008a8152602001908152602001600020955061113d8661138f565b151561114857600080fd5b6111518661140b565b945084881015151561116257600080fd5b8560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169350611192896114fe565b60008511156111ec576111a4856115ba565b925082850391508373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015156111eb57600080fd5b5b84880390503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561123157600080fd5b7f4fcc30d90a842164dd58501ab874a101a3749c3d4747139cefe7c876f4ccebd2898633604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a184965050505050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b151561137757600080fd5b6102c65a03f1151561138857600080fd5b5050505050565b6000808260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16119050919050565b6113c6826114fe565b6113d081836112b3565b7f2809c7e17bf978fbc7194c0a694b638c4215e9140cacc6c38ca36010b45697df826040518082815260200191505060405180910390a15050565b600080600090508260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16421115611464578260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16420390505b6114f68360010160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168460010160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168560020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16846115d5565b915050919050565b60036000828152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160006101000a8154906fffffffffffffffffffffffffffffffff02191690556001820160106101000a8154906fffffffffffffffffffffffffffffffff02191690556002820160006101000a81549067ffffffffffffffff02191690556002820160086101000a81549067ffffffffffffffff0219169055505050565b600061271060025483028115156115cd57fe5b049050919050565b60008060008085851015156115ec5786935061160a565b8787039250858584028115156115fe57fe5b05915081880190508093505b505050949350505050565b60a060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff16815250905600a165627a7a723058209512a82347e542708ddfb7341c529368998654489e8b12d849bd429cfb4cb6cb0029", + "deployedBytecode": "0x6060604052600436106100fc576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806327ebe40a146101015780633f4ba83a1461015e578063454a2ab31461018b578063484eccb4146101a35780635c975abb146101da5780635fd8c7101461020757806378bd79351461021c57806383b5ff8b1461029b5780638456cb59146102c457806385b86188146102f1578063878eb3681461031e5780638a98a9cc146103415780638da5cb5b1461036a57806396b5a755146103bf578063c55d0f56146103e2578063dd1b7a0f14610419578063eac9d94c1461046e578063f2fde38b14610497575b600080fd5b341561010c57600080fd5b61015c600480803590602001909190803590602001909190803590602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506104d0565b005b341561016957600080fd5b610171610620565b604051808215151515815260200191505060405180910390f35b6101a160048080359060200190919050506106e5565b005b34156101ae57600080fd5b6101c460048080359060200190919050506107c7565b6040518082815260200191505060405180910390f35b34156101e557600080fd5b6101ed6107e1565b604051808215151515815260200191505060405180910390f35b341561021257600080fd5b61021a6107f4565b005b341561022757600080fd5b61023d60048080359060200190919050506108ff565b604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b34156102a657600080fd5b6102ae610a22565b6040518082815260200191505060405180910390f35b34156102cf57600080fd5b6102d7610a28565b604051808215151515815260200191505060405180910390f35b34156102fc57600080fd5b610304610aef565b604051808215151515815260200191505060405180910390f35b341561032957600080fd5b61033f6004808035906020019091905050610b02565b005b341561034c57600080fd5b610354610bd4565b6040518082815260200191505060405180910390f35b341561037557600080fd5b61037d610bda565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103ca57600080fd5b6103e06004808035906020019091905050610bff565b005b34156103ed57600080fd5b6104036004808035906020019091905050610c9b565b6040518082815260200191505060405180910390f35b341561042457600080fd5b61042c610cd8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561047957600080fd5b610481610cfe565b6040518082815260200191505060405180910390f35b34156104a257600080fd5b6104ce600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610d4a565b005b6104d8611615565b846fffffffffffffffffffffffffffffffff16851415156104f857600080fd5b836fffffffffffffffffffffffffffffffff168414151561051857600080fd5b8267ffffffffffffffff168314151561053057600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561058c57600080fd5b6105968287610e1f565b60a0604051908101604052808373ffffffffffffffffffffffffffffffffffffffff168152602001866fffffffffffffffffffffffffffffffff168152602001856fffffffffffffffffffffffffffffffff1681526020018467ffffffffffffffff1681526020014267ffffffffffffffff1681525090506106188682610f2f565b505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561067d57600080fd5b600060149054906101000a900460ff16151561069857600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a16001905090565b6000806003600084815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915061072b8334611114565b905061073733846112b3565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156107c2578060066005805481151561079d57fe5b066005811015156107aa57fe5b01819055506005600081548092919060010191905055505b505050565b6006816005811015156107d657fe5b016000915090505481565b600060149054906101000a900460ff1681565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806108a257508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156108ad57600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505090505050565b6000806000806000806003600088815260200190815260200160002090506109268161138f565b151561093157600080fd5b8060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a90046fffffffffffffffffffffffffffffffff168260010160109054906101000a90046fffffffffffffffffffffffffffffffff168360020160009054906101000a900467ffffffffffffffff168460020160089054906101000a900467ffffffffffffffff16836fffffffffffffffffffffffffffffffff169350826fffffffffffffffffffffffffffffffff1692508167ffffffffffffffff1691508067ffffffffffffffff169050955095509550955095505091939590929450565b60025481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a8557600080fd5b600060149054906101000a900460ff16151515610aa157600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a16001905090565b600460009054906101000a900460ff1681565b60008060149054906101000a900460ff161515610b1e57600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610b7957600080fd5b600360008381526020019081526020016000209050610b978161138f565b1515610ba257600080fd5b610bd0828260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166113bd565b5050565b60055481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600360008481526020019081526020016000209150610c208261138f565b1515610c2b57600080fd5b8160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610c8c57600080fd5b610c9683826113bd565b505050565b600080600360008481526020019081526020016000209050610cbc8161138f565b1515610cc757600080fd5b610cd08161140b565b915050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000809150600090505b6005811015610d3657600681600581101515610d2357fe5b0154820191508080600101915050610d0b565b600582811515610d4257fe5b049250505090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610da557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515610e1c57806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8330846040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1515610f1757600080fd5b6102c65a03f11515610f2857600080fd5b5050505050565b603c816060015167ffffffffffffffff1610151515610f4d57600080fd5b806003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060408201518160010160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160020160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050507fa9c8dfcda5664a5a124c713e386da27de87432d5b668e79458501eb296389ba78282602001516fffffffffffffffffffffffffffffffff1683604001516fffffffffffffffffffffffffffffffff16846060015167ffffffffffffffff166040518085815260200184815260200183815260200182815260200194505050505060405180910390a15050565b6000806000806000806000600360008a8152602001908152602001600020955061113d8661138f565b151561114857600080fd5b6111518661140b565b945084881015151561116257600080fd5b8560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169350611192896114fe565b60008511156111ec576111a4856115ba565b925082850391508373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015156111eb57600080fd5b5b84880390503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561123157600080fd5b7f4fcc30d90a842164dd58501ab874a101a3749c3d4747139cefe7c876f4ccebd2898633604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a184965050505050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b151561137757600080fd5b6102c65a03f1151561138857600080fd5b5050505050565b6000808260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16119050919050565b6113c6826114fe565b6113d081836112b3565b7f2809c7e17bf978fbc7194c0a694b638c4215e9140cacc6c38ca36010b45697df826040518082815260200191505060405180910390a15050565b600080600090508260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16421115611464578260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16420390505b6114f68360010160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168460010160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168560020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16846115d5565b915050919050565b60036000828152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160006101000a8154906fffffffffffffffffffffffffffffffff02191690556001820160106101000a8154906fffffffffffffffffffffffffffffffff02191690556002820160006101000a81549067ffffffffffffffff02191690556002820160086101000a81549067ffffffffffffffff0219169055505050565b600061271060025483028115156115cd57fe5b049050919050565b60008060008085851015156115ec5786935061160a565b8787039250858584028115156115fe57fe5b05915081880190508093505b505050949350505050565b60a060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff16815250905600a165627a7a723058209512a82347e542708ddfb7341c529368998654489e8b12d849bd429cfb4cb6cb0029", "sourceMap": "63192:2571:18:-;;;54337:5;54316:26;;;;;;;;;;;;;;;;;;;;63411:4;63378:37;;;;;;;;;;;;;;;;;;;;63579:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63661:8;63671:4;55996:31;816:10;808:5;;:18;;;;;;;;;;;;;;;;;;55954:5;55946:4;:13;;55938:22;;;;;;;;55981:4;55970:8;:15;;;;56044:11;55996:60;;56074:17;:35;;;55501:10;55494:18;;56074:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56066:71;;;;;;;;56169:17;56147:19;;:39;;;;;;;;;;;;;;;;;;55864:329;;;63579:100;;63192:2571;;;;;;", "deployedSourceMap": "63192:2571:18:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64074:850;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54943:126;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65052:488;;;;;;;;;;;;;;;;;;63508:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54316:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56458:352;;;;;;;;;;;;;;59705:493;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45099:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54735:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63378:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59338:256;;;;;;;;;;;;;;;;;;;;;;;;;;63474:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;622:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58796:289;;;;;;;;;;;;;;;;;;;;;;;;;;60323:239;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44927:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65546:214;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1156:140;;;;;;;;;;;;;;;;;;;;;;;;;;;;64074:850;64686:22;;:::i;:::-;64438:14;64422:32;;64404:14;:50;64396:59;;;;;;;;64505:12;64489:30;;64473:12;:46;64465:55;;;;;;;;64566:9;64551:26;;64538:9;:39;64530:48;;;;;;;;64619:19;;;;;;;;;;;64597:42;;:10;:42;;;64589:51;;;;;;;;64650:26;64658:7;64667:8;64650:7;:26::i;:::-;64711:166;;;;;;;;;64732:7;64711:166;;;;;;64761:14;64711:166;;;;;;64798:12;64711:166;;;;;;64832:9;64711:166;;;;;;64863:3;64711:166;;;;;64686:191;;64887:30;64899:8;64909:7;64887:11;:30::i;:::-;64074:850;;;;;;:::o;54943:126::-;54992:4;969:5;;;;;;;;;;;955:19;;:10;:19;;;947:28;;;;;;;;54629:6;;;;;;;;;;;54621:15;;;;;;;;55017:5;55008:6;;:14;;;;;;;;;;;;;;;;;;55032:9;;;;;;;;;;55058:4;55051:11;;54943:126;:::o;65052:488::-;65161:14;65221:13;65178:16;:26;65195:8;65178:26;;;;;;;;;;;:33;;;;;;;;;;;;65161:50;;65237:25;65242:8;65252:9;65237:4;:25::i;:::-;65221:41;;65272:31;65282:10;65294:8;65272:9;:31::i;:::-;65375:19;;;;;;;;;;;65357:38;;:6;:38;;;65353:181;;;65489:5;65449:18;65484:1;65468:13;;:17;;;;;;;;65449:37;;;;;;;;;;:45;;;;65508:13;;:15;;;;;;;;;;;;;65353:181;65052:488;;;:::o;63508:36::-;;;;;;;;;;;;;;;;;;;;:::o;54316:26::-;;;;;;;;;;;;;:::o;56458:352::-;56504:18;56763:8;56533:19;;;;;;;;;;;56504:49;;56599:5;;;;;;;;;;;56585:19;;:10;:19;;;:59;;;;56634:10;56620:24;;:10;:24;;;56585:59;56564:90;;;;;;;;56774:10;:15;;:29;56790:4;:12;;;56774:29;;;;;;;;;;;;;;;;;;;;;;;56763:40;;56458:352;;:::o;59705:493::-;59791:14;59815:21;59846:19;59875:16;59901:17;59935:23;59961:16;:26;59978:8;59961:26;;;;;;;;;;;59935:52;;60005:21;60018:7;60005:12;:21::i;:::-;59997:30;;;;;;;;60054:7;:14;;;;;;;;;;;;60078:7;:21;;;;;;;;;;;;60109:7;:19;;;;;;;;;;;;60138:7;:16;;;;;;;;;;;;60164:7;:17;;;;;;;;;;;;60037:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59705:493;;;;;;;;:::o;45099:23::-;;;;:::o;54735:124::-;54785:4;969:5;;;;;;;;;;;955:19;;:10;:19;;;947:28;;;;;;;;54475:6;;;;;;;;;;;54474:7;54466:16;;;;;;;;54810:4;54801:6;;:13;;;;;;;;;;;;;;;;;;54824:7;;;;;;;;;;54848:4;54841:11;;54735:124;:::o;63378:37::-;;;;;;;;;;;;;:::o;59338:256::-;59445:23;54629:6;;;;;;;;;;;54621:15;;;;;;;;969:5;;;;;;;;;;;955:19;;:10;:19;;;947:28;;;;;;;;59471:16;:26;59488:8;59471:26;;;;;;;;;;;59445:52;;59515:21;59528:7;59515:12;:21::i;:::-;59507:30;;;;;;;;59547:40;59562:8;59572:7;:14;;;;;;;;;;;;59547;:40::i;:::-;59338:256;;:::o;63474:28::-;;;;:::o;622:20::-;;;;;;;;;;;;;:::o;58796:289::-;58864:23;58966:14;58890:16;:26;58907:8;58890:26;;;;;;;;;;;58864:52;;58934:21;58947:7;58934:12;:21::i;:::-;58926:30;;;;;;;;58983:7;:14;;;;;;;;;;;;58966:31;;59029:6;59015:20;;:10;:20;;;59007:29;;;;;;;;59046:32;59061:8;59071:6;59046:14;:32::i;:::-;58796:289;;;:::o;60323:239::-;60401:7;60424:23;60450:16;:26;60467:8;60450:26;;;;;;;;;;;60424:52;;60494:21;60507:7;60494:12;:21::i;:::-;60486:30;;;;;;;;60533:22;60547:7;60533:13;:22::i;:::-;60526:29;;60323:239;;;;:::o;44927:40::-;;;;;;;;;;;;;:::o;65546:214::-;65601:7;65620:11;65650:9;65634:1;65620:15;;65662:1;65650:13;;65645:85;65669:1;65665;:5;65645:85;;;65698:18;65717:1;65698:21;;;;;;;;;;;65691:28;;;;65672:3;;;;;;;65645:85;;;65752:1;65746:3;:7;;;;;;;;65739:14;;65546:214;;;:::o;1156:140::-;969:5;;;;;;;;;;;955:19;;:10;:19;;;947:28;;;;;;;;1245:1;1225:22;;:8;:22;;;;1221:69;;;1271:8;1263:5;;:16;;;;;;;;;;;;;;;;;;1221:69;1156:140;:::o;46053:176::-;46166:19;;;;;;;;;;;:32;;;46199:6;46207:4;46213:8;46166:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46053:176;;:::o;46852:489::-;47082:9;47061:8;:17;;;:30;;;;47053:39;;;;;;;;47132:8;47103:16;:26;47120:8;47103:26;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47151:183;47187:8;47218;:22;;;47210:31;;47263:8;:20;;;47255:29;;47306:8;:17;;;47298:26;;47151:183;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46852:489;;:::o;47687:2629::-;47765:7;47837:23;48279:13;48459:14;48938:21;48994:22;49934:17;47863:16;:26;47880:8;47863:26;;;;;;;;;;;47837:52;;48170:21;48183:7;48170:12;:21::i;:::-;48162:30;;;;;;;;48295:22;48309:7;48295:13;:22::i;:::-;48279:38;;48349:5;48335:10;:19;;48327:28;;;;;;;;48476:7;:14;;;;;;;;;;;;48459:31;;48635:24;48650:8;48635:14;:24::i;:::-;48741:1;48733:5;:9;48729:918;;;48962:18;48974:5;48962:11;:18::i;:::-;48938:42;;49027:13;49019:5;:21;48994:46;;49605:6;:15;;:31;49621:14;49605:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48729:918;49967:5;49954:10;:18;49934:38;;50172:10;:19;;:30;50192:9;50172:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50240:46;50258:8;50268:5;50275:10;50240:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50304:5;50297:12;;47687:2629;;;;;;;;;;:::o;46461:174::-;46579:19;;;;;;;;;;;:28;;;46608:9;46619:8;46579:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46461:174;;:::o;50637:125::-;50708:4;50753:1;50732:8;:18;;;;;;;;;;;;:22;;;50724:31;;50637:125;;;:::o;47396:183::-;47474:24;47489:8;47474:14;:24::i;:::-;47508:28;47518:7;47527:8;47508:9;:28::i;:::-;47546:26;47563:8;47546:26;;;;;;;;;;;;;;;;;;47396:183;;:::o;51057:613::-;51141:7;51164:21;51188:1;51164:25;;51403:8;:18;;;;;;;;;;;;51397:24;;:3;:24;51393:95;;;51459:8;:18;;;;;;;;;;;;51453:24;;:3;:24;51437:40;;51393:95;51505:158;51539:8;:22;;;;;;;;;;;;51505:158;;51575:8;:20;;;;;;;;;;;;51505:158;;51609:8;:17;;;;;;;;;;;;51505:158;;51640:13;51505:20;:158::i;:::-;51498:165;;51057:613;;;;:::o;50434:101::-;50502:16;:26;50519:8;50502:26;;;;;;;;;;;;50495:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50434:101;:::o;53613:482::-;53673:7;54083:5;54072:8;;54063:6;:17;:25;;;;;;;;54056:32;;53613:482;;;:::o;51918:1601::-;52110:7;52803:23;53118:25;53394:19;52477:9;52459:14;:27;;52455:1058;;;52635:12;52628:19;;;;52455:1058;52859:14;52836:12;52829:45;52803:71;;53197:9;53172:14;53146:16;:41;:61;;;;;;;;53118:89;;53441:18;53423:14;53416:43;53394:65;;53489:12;53474:28;;51918:1601;;;;;;;;;;:::o;63192:2571::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", "source": "pragma solidity 0.4.18;\n\n/**\n The following contract code, titled KittyCore, was written by Cryptokitties and published\n and retrieved from https://etherscan.io/address/0x06012c8cf97bead5deae237070f9587f8e7a266d#code.\n\n It is included in the current project for test purposes, to ensure that our collateralizer can\n handle ERC721 tokens created by the KittyCore contract.\n*/\n\n/**\n * @title KittiesOwnable\n * @dev The KittiesOwnable contract has an owner address, and provides basic authorization control\n * functions, this simplifies the implementation of \"user permissions\".\n */\ncontract KittiesOwnable {\n address public owner;\n\n\n /**\n\t * @dev The KittiesOwnable constructor sets the original `owner` of the contract to the sender\n\t * account.\n\t */\n function KittiesOwnable() {\n owner = msg.sender;\n }\n\n\n /**\n\t * @dev Throws if called by any account other than the owner.\n\t */\n modifier onlyOwner() {\n require(msg.sender == owner);\n _;\n }\n\n\n /**\n\t * @dev Allows the current owner to transfer control of the contract to a newOwner.\n\t * @param newOwner The address to transfer ownership to.\n\t */\n function transferOwnership(address newOwner) onlyOwner {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n\n}\n\n\n\n/// @title Interface for contracts conforming to ERC-721: Non-Fungible Tokens\n/// @author Dieter Shirley (https://github.com/dete)\ncontract KittiesERC721 {\n // Required methods\n function totalSupply() public view returns (uint256 total);\n function balanceOf(address _owner) public view returns (uint256 balance);\n function ownerOf(uint256 _tokenId) external view returns (address owner);\n function approve(address _to, uint256 _tokenId) external;\n function transfer(address _to, uint256 _tokenId) external;\n function transferFrom(address _from, address _to, uint256 _tokenId) external;\n\n // Events\n event Transfer(address from, address to, uint256 tokenId);\n event Approval(address owner, address approved, uint256 tokenId);\n\n // Optional\n // function name() public view returns (string name);\n // function symbol() public view returns (string symbol);\n // function tokensOfOwner(address _owner) external view returns (uint256[] tokenIds);\n // function tokenMetadata(uint256 _tokenId, string _preferredTransport) public view returns (string infoUrl);\n\n // ERC-165 Compatibility (https://github.com/ethereum/EIPs/issues/165)\n function supportsInterface(bytes4 _interfaceID) external view returns (bool);\n}\n\n\n// // Auction wrapper functions\n\n\n// Auction wrapper functions\n\n\n\n\n\n\n\n/// @title SEKRETOOOO\ncontract GeneScienceInterface {\n /// @dev simply a boolean to indicate this is the contract we expect to be\n function isGeneScience() public pure returns (bool);\n\n /// @dev given genes of kitten 1 & 2, return a genetic combination - may have a random factor\n /// @param genes1 genes of mom\n /// @param genes2 genes of sire\n /// @return the genes that are supposed to be passed down the child\n function mixGenes(uint256 genes1, uint256 genes2, uint256 targetBlock) public returns (uint256);\n}\n\n\n\n\n\n\n\n/// @title A facet of KittyCore that manages special access privileges.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyAccessControl {\n // This facet controls access control for CryptoKitties. There are four roles managed here:\n //\n // - The CEO: The CEO can reassign other roles and change the addresses of our dependent smart\n // contracts. It is also the only role that can unpause the smart contract. It is initially\n // set to the address that created the smart contract in the KittyCore constructor.\n //\n // - The CFO: The CFO can withdraw funds from KittyCore and its auction contracts.\n //\n // - The COO: The COO can release gen0 kitties to auction, and mint promo cats.\n //\n // It should be noted that these roles are distinct without overlap in their access abilities, the\n // abilities listed for each role above are exhaustive. In particular, while the CEO can assign any\n // address to any role, the CEO address itself doesn't have the ability to act in those roles. This\n // restriction is intentional so that we aren't tempted to use the CEO address frequently out of\n // convenience. The less we use an address, the less likely it is that we somehow compromise the\n // account.\n\n /// @dev Emited when contract is upgraded - See README.md for updgrade plan\n event ContractUpgrade(address newContract);\n\n // The addresses of the accounts (or contracts) that can execute actions within each roles.\n address public ceoAddress;\n address public cfoAddress;\n address public cooAddress;\n\n // @dev Keeps track whether the contract is paused. When that is true, most actions are blocked\n bool public paused = false;\n\n /// @dev Access modifier for CEO-only functionality\n modifier onlyCEO() {\n require(msg.sender == ceoAddress);\n _;\n }\n\n /// @dev Access modifier for CFO-only functionality\n modifier onlyCFO() {\n require(msg.sender == cfoAddress);\n _;\n }\n\n /// @dev Access modifier for COO-only functionality\n modifier onlyCOO() {\n require(msg.sender == cooAddress);\n _;\n }\n\n modifier onlyCLevel() {\n require(\n msg.sender == cooAddress ||\n msg.sender == ceoAddress ||\n msg.sender == cfoAddress\n );\n _;\n }\n\n /// @dev Assigns a new address to act as the CEO. Only available to the current CEO.\n /// @param _newCEO The address of the new CEO\n function setCEO(address _newCEO) external onlyCEO {\n require(_newCEO != address(0));\n\n ceoAddress = _newCEO;\n }\n\n /// @dev Assigns a new address to act as the CFO. Only available to the current CEO.\n /// @param _newCFO The address of the new CFO\n function setCFO(address _newCFO) external onlyCEO {\n require(_newCFO != address(0));\n\n cfoAddress = _newCFO;\n }\n\n /// @dev Assigns a new address to act as the COO. Only available to the current CEO.\n /// @param _newCOO The address of the new COO\n function setCOO(address _newCOO) external onlyCEO {\n require(_newCOO != address(0));\n\n cooAddress = _newCOO;\n }\n\n /*** KittiesPausable functionality adapted from OpenZeppelin ***/\n\n /// @dev Modifier to allow actions only when the contract IS NOT paused\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /// @dev Modifier to allow actions only when the contract IS paused\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /// @dev Called by any \"C-level\" role to pause the contract. Used only when\n /// a bug or exploit is detected and we need to limit damage.\n function pause() external onlyCLevel whenNotPaused {\n paused = true;\n }\n\n /// @dev Unpauses the smart contract. Can only be called by the CEO, since\n /// one reason we may pause the contract is when CFO or COO accounts are\n /// compromised.\n /// @notice This is public rather than external so it can be called by\n /// derived contracts.\n function unpause() public onlyCEO whenPaused {\n // can't unpause if contract was upgraded\n paused = false;\n }\n}\n\n\n\n\n/// @title Base contract for CryptoKitties. Holds all common structs, events and base variables.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBase is KittyAccessControl {\n /*** EVENTS ***/\n\n /// @dev The Birth event is fired whenever a new kitten comes into existence. This obviously\n /// includes any time a cat is created through the giveBirth method, but it is also called\n /// when a new gen0 cat is created.\n event Birth(address owner, uint256 kittyId, uint256 matronId, uint256 sireId, uint256 genes);\n\n /// @dev Transfer event as defined in current draft of ERC721. Emitted every time a kitten\n /// ownership is assigned, including births.\n event Transfer(address from, address to, uint256 tokenId);\n\n /*** DATA TYPES ***/\n\n /// @dev The main Kitty struct. Every cat in CryptoKitties is represented by a copy\n /// of this structure, so great care was taken to ensure that it fits neatly into\n /// exactly two 256-bit words. Note that the order of the members in this structure\n /// is important because of the byte-packing rules used by Ethereum.\n /// Ref: http://solidity.readthedocs.io/en/develop/miscellaneous.html\n struct Kitty {\n // The Kitty's genetic code is packed into these 256-bits, the format is\n // sooper-sekret! A cat's genes never change.\n uint256 genes;\n\n // The timestamp from the block when this cat came into existence.\n uint64 birthTime;\n\n // The minimum timestamp after which this cat can engage in breeding\n // activities again. This same timestamp is used for the pregnancy\n // timer (for matrons) as well as the siring cooldown.\n uint64 cooldownEndBlock;\n\n // The ID of the parents of this kitty, set to 0 for gen0 cats.\n // Note that using 32-bit unsigned integers limits us to a \"mere\"\n // 4 billion cats. This number might seem small until you realize\n // that Ethereum currently has a limit of about 500 million\n // transactions per year! So, this definitely won't be a problem\n // for several years (even as Ethereum learns to scale).\n uint32 matronId;\n uint32 sireId;\n\n // Set to the ID of the sire cat for matrons that are pregnant,\n // zero otherwise. A non-zero value here is how we know a cat\n // is pregnant. Used to retrieve the genetic material for the new\n // kitten when the birth transpires.\n uint32 siringWithId;\n\n // Set to the index in the cooldown array (see below) that represents\n // the current cooldown duration for this Kitty. This starts at zero\n // for gen0 cats, and is initialized to floor(generation/2) for others.\n // Incremented by one for each successful breeding action, regardless\n // of whether this cat is acting as matron or sire.\n uint16 cooldownIndex;\n\n // The \"generation number\" of this cat. Cats minted by the CK contract\n // for sale are called \"gen0\" and have a generation number of 0. The\n // generation number of all other cats is the larger of the two generation\n // numbers of their parents, plus one.\n // (i.e. max(matron.generation, sire.generation) + 1)\n uint16 generation;\n }\n\n /*** CONSTANTS ***/\n\n /// @dev A lookup table indicating the cooldown duration after any successful\n /// breeding action, called \"pregnancy time\" for matrons and \"siring cooldown\"\n /// for sires. Designed such that the cooldown roughly doubles each time a cat\n /// is bred, encouraging owners not to just keep breeding the same cat over\n /// and over again. Caps out at one week (a cat can breed an unbounded number\n /// of times, and the maximum cooldown is always seven days).\n uint32[14] public cooldowns = [\n uint32(1 minutes),\n uint32(2 minutes),\n uint32(5 minutes),\n uint32(10 minutes),\n uint32(30 minutes),\n uint32(1 hours),\n uint32(2 hours),\n uint32(4 hours),\n uint32(8 hours),\n uint32(16 hours),\n uint32(1 days),\n uint32(2 days),\n uint32(4 days),\n uint32(7 days)\n ];\n\n // An approximation of currently how many seconds are in between blocks.\n uint256 public secondsPerBlock = 15;\n\n /*** STORAGE ***/\n\n /// @dev An array containing the Kitty struct for all Kitties in existence. The ID\n /// of each cat is actually an index into this array. Note that ID 0 is a negacat,\n /// the unKitty, the mythical beast that is the parent of all gen0 cats. A bizarre\n /// creature that is both matron and sire... to itself! Has an invalid genetic code.\n /// In other words, cat ID 0 is invalid... ;-)\n Kitty[] kitties;\n\n /// @dev A mapping from cat IDs to the address that owns them. All cats have\n /// some valid owner address, even gen0 cats are created with a non-zero owner.\n mapping (uint256 => address) public kittyIndexToOwner;\n\n // @dev A mapping from owner address to count of tokens that address owns.\n // Used internally inside balanceOf() to resolve ownership count.\n mapping (address => uint256) ownershipTokenCount;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to call\n /// transferFrom(). Each Kitty can only have one approved address for transfer\n /// at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public kittyIndexToApproved;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to use\n /// this Kitty for siring via breedWith(). Each Kitty can only have one approved\n /// address for siring at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public sireAllowedToAddress;\n\n /// @dev The address of the ClockAuction contract that handles sales of Kitties. This\n /// same contract handles both peer-to-peer sales as well as the gen0 sales which are\n /// initiated every 15 minutes.\n SaleClockAuction public saleAuction;\n\n /// @dev The address of a custom ClockAuction subclassed contract that handles siring\n /// auctions. Needs to be separate from saleAuction because the actions taken on success\n /// after a sales and siring auction are quite different.\n SiringClockAuction public siringAuction;\n\n /// @dev Assigns ownership of a specific Kitty to an address.\n function _transfer(address _from, address _to, uint256 _tokenId) internal {\n // Since the number of kittens is capped to 2^32 we can't overflow this\n ownershipTokenCount[_to]++;\n // transfer ownership\n kittyIndexToOwner[_tokenId] = _to;\n // When creating new kittens _from is 0x0, but we can't account that address.\n if (_from != address(0)) {\n ownershipTokenCount[_from]--;\n // once the kitten is transferred also clear sire allowances\n delete sireAllowedToAddress[_tokenId];\n // clear any previously approved ownership exchange\n delete kittyIndexToApproved[_tokenId];\n }\n // Emit the transfer event.\n Transfer(_from, _to, _tokenId);\n }\n\n /// @dev An internal method that creates a new kitty and stores it. This\n /// method doesn't do any checking and should only be called when the\n /// input data is known to be valid. Will generate both a Birth event\n /// and a Transfer event.\n /// @param _matronId The kitty ID of the matron of this cat (zero for gen0)\n /// @param _sireId The kitty ID of the sire of this cat (zero for gen0)\n /// @param _generation The generation number of this cat, must be computed by caller.\n /// @param _genes The kitty's genetic code.\n /// @param _owner The inital owner of this cat, must be non-zero (except for the unKitty, ID 0)\n function _createKitty(\n uint256 _matronId,\n uint256 _sireId,\n uint256 _generation,\n uint256 _genes,\n address _owner\n )\n internal\n returns (uint)\n {\n // These requires are not strictly necessary, our calling code should make\n // sure that these conditions are never broken. However! _createKitty() is already\n // an expensive call (for storage), and it doesn't hurt to be especially careful\n // to ensure our data structures are always valid.\n require(_matronId == uint256(uint32(_matronId)));\n require(_sireId == uint256(uint32(_sireId)));\n require(_generation == uint256(uint16(_generation)));\n\n // New kitty starts with the same cooldown as parent gen/2\n uint16 cooldownIndex = uint16(_generation / 2);\n if (cooldownIndex > 13) {\n cooldownIndex = 13;\n }\n\n Kitty memory _kitty = Kitty({\n genes: _genes,\n birthTime: uint64(now),\n cooldownEndBlock: 0,\n matronId: uint32(_matronId),\n sireId: uint32(_sireId),\n siringWithId: 0,\n cooldownIndex: cooldownIndex,\n generation: uint16(_generation)\n });\n uint256 newKittenId = kitties.push(_kitty) - 1;\n\n // It's probably never going to happen, 4 billion cats is A LOT, but\n // let's just be 100% sure we never let this happen.\n require(newKittenId == uint256(uint32(newKittenId)));\n\n // emit the birth event\n Birth(\n _owner,\n newKittenId,\n uint256(_kitty.matronId),\n uint256(_kitty.sireId),\n _kitty.genes\n );\n\n // This will assign ownership, and also emit the Transfer event as\n // per ERC721 draft\n _transfer(0, _owner, newKittenId);\n\n return newKittenId;\n }\n\n // Any C-level can fix how many seconds per blocks are currently observed.\n function setSecondsPerBlock(uint256 secs) external onlyCLevel {\n require(secs < cooldowns[0]);\n secondsPerBlock = secs;\n }\n}\n\n\n\n\n\n/// @title The external contract that is responsible for generating metadata for the kitties,\n/// it has one function that will return the data as bytes.\ncontract KittiesERC721Metadata {\n /// @dev Given a token Id, returns a byte array that is supposed to be converted into string.\n function getMetadata(uint256 _tokenId, string) public view returns (bytes32[4] buffer, uint256 count) {\n if (_tokenId == 1) {\n buffer[0] = \"Hello World! :D\";\n count = 15;\n } else if (_tokenId == 2) {\n buffer[0] = \"I would definitely choose a medi\";\n buffer[1] = \"um length string.\";\n count = 49;\n } else if (_tokenId == 3) {\n buffer[0] = \"Lorem ipsum dolor sit amet, mi e\";\n buffer[1] = \"st accumsan dapibus augue lorem,\";\n buffer[2] = \" tristique vestibulum id, libero\";\n buffer[3] = \" suscipit varius sapien aliquam.\";\n count = 128;\n }\n }\n}\n\n\n/// @title The facet of the CryptoKitties core contract that manages ownership, ERC-721 (draft) compliant.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev Ref: https://github.com/ethereum/EIPs/issues/721\n/// See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyOwnership is KittyBase, KittiesERC721 {\n\n /// @notice Name and symbol of the non fungible token, as defined in ERC721.\n string public constant name = \"CryptoKitties\";\n string public constant symbol = \"CK\";\n\n // The contract that will return kitty metadata\n KittiesERC721Metadata public erc721Metadata;\n\n bytes4 constant InterfaceSignature_ERC165 =\n bytes4(keccak256('supportsInterface(bytes4)'));\n\n bytes4 constant InterfaceSignature_ERC721 =\n bytes4(keccak256('name()')) ^\n bytes4(keccak256('symbol()')) ^\n bytes4(keccak256('totalSupply()')) ^\n bytes4(keccak256('balanceOf(address)')) ^\n bytes4(keccak256('ownerOf(uint256)')) ^\n bytes4(keccak256('approve(address,uint256)')) ^\n bytes4(keccak256('transfer(address,uint256)')) ^\n bytes4(keccak256('transferFrom(address,address,uint256)')) ^\n bytes4(keccak256('tokensOfOwner(address)')) ^\n bytes4(keccak256('tokenMetadata(uint256,string)'));\n\n /// @notice Introspection interface as per ERC-165 (https://github.com/ethereum/EIPs/issues/165).\n /// Returns true for any standardized interfaces implemented by this contract. We implement\n /// ERC-165 (obviously!) and ERC-721.\n function supportsInterface(bytes4 _interfaceID) external view returns (bool)\n {\n // DEBUG ONLY\n //require((InterfaceSignature_ERC165 == 0x01ffc9a7) && (InterfaceSignature_ERC721 == 0x9a20483d));\n\n return ((_interfaceID == InterfaceSignature_ERC165) || (_interfaceID == InterfaceSignature_ERC721));\n }\n\n /// @dev Set the address of the sibling contract that tracks metadata.\n /// CEO only.\n function setMetadataAddress(address _contractAddress) public onlyCEO {\n erc721Metadata = KittiesERC721Metadata(_contractAddress);\n }\n\n // Internal utility functions: These functions all assume that their input arguments\n // are valid. We leave it to public methods to sanitize their inputs and follow\n // the required logic.\n\n /// @dev Checks if a given address is the current owner of a particular Kitty.\n /// @param _claimant the address we are validating against.\n /// @param _tokenId kitten id, only valid when > 0\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToOwner[_tokenId] == _claimant;\n }\n\n /// @dev Checks if a given address currently has transferApproval for a particular Kitty.\n /// @param _claimant the address we are confirming kitten is approved for.\n /// @param _tokenId kitten id, only valid when > 0\n function _approvedFor(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToApproved[_tokenId] == _claimant;\n }\n\n /// @dev Marks an address as being approved for transferFrom(), overwriting any previous\n /// approval. Setting _approved to address(0) clears all transfer approval.\n /// NOTE: _approve() does NOT send the Approval event. This is intentional because\n /// _approve() and transferFrom() are used together for putting Kitties on auction, and\n /// there is no value in spamming the log with Approval events in that case.\n function _approve(uint256 _tokenId, address _approved) internal {\n kittyIndexToApproved[_tokenId] = _approved;\n }\n\n /// @notice Returns the number of Kitties owned by a specific address.\n /// @param _owner The owner address to check.\n /// @dev Required for ERC-721 compliance\n function balanceOf(address _owner) public view returns (uint256 count) {\n return ownershipTokenCount[_owner];\n }\n\n /// @notice Transfers a Kitty to another address. If transferring to a smart\n /// contract be VERY CAREFUL to ensure that it is aware of ERC-721 (or\n /// CryptoKitties specifically) or your Kitty may be lost forever. Seriously.\n /// @param _to The address of the recipient, can be a user or contract.\n /// @param _tokenId The ID of the Kitty to transfer.\n /// @dev Required for ERC-721 compliance.\n function transfer(\n address _to,\n uint256 _tokenId\n )\n external\n whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Disallow transfers to the auction contracts to prevent accidental\n // misuse. Auction contracts should only take ownership of kitties\n // through the allow + transferFrom flow.\n require(_to != address(saleAuction));\n require(_to != address(siringAuction));\n\n // You can only send your own cat.\n require(_owns(msg.sender, _tokenId));\n\n // Reassign ownership, clear pending approvals, emit Transfer event.\n _transfer(msg.sender, _to, _tokenId);\n }\n\n /// @notice Grant another address the right to transfer a specific Kitty via\n /// transferFrom(). This is the preferred flow for transfering NFTs to contracts.\n /// @param _to The address to be granted transfer approval. Pass address(0) to\n /// clear all approvals.\n /// @param _tokenId The ID of the Kitty that can be transferred if this call succeeds.\n /// @dev Required for ERC-721 compliance.\n function approve(\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Only an owner can grant transfer approval.\n require(_owns(msg.sender, _tokenId));\n\n // Register the approval (replacing any previous approval).\n _approve(_tokenId, _to);\n\n // Emit approval event.\n Approval(msg.sender, _to, _tokenId);\n }\n\n /// @notice Transfer a Kitty owned by another address, for which the calling address\n /// has previously been granted transfer approval by the owner.\n /// @param _from The address that owns the Kitty to be transfered.\n /// @param _to The address that should take ownership of the Kitty. Can be any address,\n /// including the caller.\n /// @param _tokenId The ID of the Kitty to be transferred.\n /// @dev Required for ERC-721 compliance.\n function transferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Check for approval and valid ownership\n require(_approvedFor(msg.sender, _tokenId));\n require(_owns(_from, _tokenId));\n\n // Reassign ownership (also clears pending approvals and emits Transfer event).\n _transfer(_from, _to, _tokenId);\n }\n\n /// @notice Returns the total number of Kitties currently in existence.\n /// @dev Required for ERC-721 compliance.\n function totalSupply() public view returns (uint) {\n return kitties.length - 1;\n }\n\n /// @notice Returns the address currently assigned ownership of a given Kitty.\n /// @dev Required for ERC-721 compliance.\n function ownerOf(uint256 _tokenId)\n external\n view\n returns (address owner)\n {\n owner = kittyIndexToOwner[_tokenId];\n\n require(owner != address(0));\n }\n\n /// @notice Returns a list of all Kitty IDs assigned to an address.\n /// @param _owner The owner whose Kitties we are interested in.\n /// @dev This method MUST NEVER be called by smart contract code. First, it's fairly\n /// expensive (it walks the entire Kitty array looking for cats belonging to owner),\n /// but it also returns a dynamic array, which is only supported for web3 calls, and\n /// not contract-to-contract calls.\n function tokensOfOwner(address _owner) external view returns(uint256[] ownerTokens) {\n uint256 tokenCount = balanceOf(_owner);\n\n if (tokenCount == 0) {\n // Return an empty array\n return new uint256[](0);\n } else {\n uint256[] memory result = new uint256[](tokenCount);\n uint256 totalCats = totalSupply();\n uint256 resultIndex = 0;\n\n // We count on the fact that all cats have IDs starting at 1 and increasing\n // sequentially up to the totalCat count.\n uint256 catId;\n\n for (catId = 1; catId <= totalCats; catId++) {\n if (kittyIndexToOwner[catId] == _owner) {\n result[resultIndex] = catId;\n resultIndex++;\n }\n }\n\n return result;\n }\n }\n\n /// @dev Adapted from memcpy() by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _memcpy(uint _dest, uint _src, uint _len) private view {\n // Copy word-length chunks while possible\n for(; _len >= 32; _len -= 32) {\n assembly {\n mstore(_dest, mload(_src))\n }\n _dest += 32;\n _src += 32;\n }\n\n // Copy remaining bytes\n uint256 mask = 256 ** (32 - _len) - 1;\n assembly {\n let srcpart := and(mload(_src), not(mask))\n let destpart := and(mload(_dest), mask)\n mstore(_dest, or(destpart, srcpart))\n }\n }\n\n /// @dev Adapted from toString(slice) by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _toString(bytes32[4] _rawBytes, uint256 _stringLength) private view returns (string) {\n var outputString = new string(_stringLength);\n uint256 outputPtr;\n uint256 bytesPtr;\n\n assembly {\n outputPtr := add(outputString, 32)\n bytesPtr := _rawBytes\n }\n\n _memcpy(outputPtr, bytesPtr, _stringLength);\n\n return outputString;\n }\n\n /// @notice Returns a URI pointing to a metadata package for this token conforming to\n /// ERC-721 (https://github.com/ethereum/EIPs/issues/721)\n /// @param _tokenId The ID number of the Kitty whose metadata should be returned.\n function tokenMetadata(uint256 _tokenId, string _preferredTransport) external view returns (string infoUrl) {\n require(erc721Metadata != address(0));\n bytes32[4] memory buffer;\n uint256 count;\n (buffer, count) = erc721Metadata.getMetadata(_tokenId, _preferredTransport);\n\n return _toString(buffer, count);\n }\n}\n\n\n\n/// @title A facet of KittyCore that manages Kitty siring, gestation, and birth.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBreeding is KittyOwnership {\n\n /// @dev The Pregnant event is fired when two cats successfully breed and the pregnancy\n /// timer begins for the matron.\n event Pregnant(address owner, uint256 matronId, uint256 sireId, uint256 cooldownEndBlock);\n\n /// @notice The minimum payment required to use breedWithAuto(). This fee goes towards\n /// the gas cost paid by whatever calls giveBirth(), and can be dynamically updated by\n /// the COO role as the gas price changes.\n uint256 public autoBirthFee = 2 finney;\n\n // Keeps track of number of pregnant kitties.\n uint256 public pregnantKitties;\n\n /// @dev The address of the sibling contract that is used to implement the sooper-sekret\n /// genetic combination algorithm.\n GeneScienceInterface public geneScience;\n\n /// @dev Update the address of the genetic contract, can only be called by the CEO.\n /// @param _address An address of a GeneScience contract instance to be used from this point forward.\n function setGeneScienceAddress(address _address) external onlyCEO {\n GeneScienceInterface candidateContract = GeneScienceInterface(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isGeneScience());\n\n // Set the new contract address\n geneScience = candidateContract;\n }\n\n /// @dev Checks that a given kitten is able to breed. Requires that the\n /// current cooldown is finished (for sires) and also checks that there is\n /// no pending pregnancy.\n function _isReadyToBreed(Kitty _kit) internal view returns (bool) {\n // In addition to checking the cooldownEndBlock, we also need to check to see if\n // the cat has a pending birth; there can be some period of time between the end\n // of the pregnacy timer and the birth event.\n return (_kit.siringWithId == 0) && (_kit.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @dev Check if a sire has authorized breeding with this matron. True if both sire\n /// and matron have the same owner, or if the sire has given siring permission to\n /// the matron's owner (via approveSiring()).\n function _isSiringPermitted(uint256 _sireId, uint256 _matronId) internal view returns (bool) {\n address matronOwner = kittyIndexToOwner[_matronId];\n address sireOwner = kittyIndexToOwner[_sireId];\n\n // Siring is okay if they have same owner, or if the matron's owner was given\n // permission to breed with this sire.\n return (matronOwner == sireOwner || sireAllowedToAddress[_sireId] == matronOwner);\n }\n\n /// @dev Set the cooldownEndTime for the given Kitty, based on its current cooldownIndex.\n /// Also increments the cooldownIndex (unless it has hit the cap).\n /// @param _kitten A reference to the Kitty in storage which needs its timer started.\n function _triggerCooldown(Kitty storage _kitten) internal {\n // Compute an estimation of the cooldown time in blocks (based on current cooldownIndex).\n _kitten.cooldownEndBlock = uint64((cooldowns[_kitten.cooldownIndex]/secondsPerBlock) + block.number);\n\n // Increment the breeding count, clamping it at 13, which is the length of the\n // cooldowns array. We could check the array size dynamically, but hard-coding\n // this as a constant saves gas. Yay, Solidity!\n if (_kitten.cooldownIndex < 13) {\n _kitten.cooldownIndex += 1;\n }\n }\n\n /// @notice Grants approval to another user to sire with one of your Kitties.\n /// @param _addr The address that will be able to sire with your Kitty. Set to\n /// address(0) to clear all siring approvals for this Kitty.\n /// @param _sireId A Kitty that you own that _addr will now be able to sire with.\n function approveSiring(address _addr, uint256 _sireId)\n external\n whenNotPaused\n {\n require(_owns(msg.sender, _sireId));\n sireAllowedToAddress[_sireId] = _addr;\n }\n\n /// @dev Updates the minimum payment required for calling giveBirthAuto(). Can only\n /// be called by the COO address. (This fee is used to offset the gas cost incurred\n /// by the autobirth daemon).\n function setAutoBirthFee(uint256 val) external onlyCOO {\n autoBirthFee = val;\n }\n\n /// @dev Checks to see if a given Kitty is pregnant and (if so) if the gestation\n /// period has passed.\n function _isReadyToGiveBirth(Kitty _matron) private view returns (bool) {\n return (_matron.siringWithId != 0) && (_matron.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @notice Checks that a given kitten is able to breed (i.e. it is not pregnant or\n /// in the middle of a siring cooldown).\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isReadyToBreed(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n Kitty storage kit = kitties[_kittyId];\n return _isReadyToBreed(kit);\n }\n\n /// @dev Checks whether a kitty is currently pregnant.\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isPregnant(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n // A kitty is pregnant if and only if this field is set\n return kitties[_kittyId].siringWithId != 0;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair. DOES NOT\n /// check ownership permissions (that is up to the caller).\n /// @param _matron A reference to the Kitty struct of the potential matron.\n /// @param _matronId The matron's ID.\n /// @param _sire A reference to the Kitty struct of the potential sire.\n /// @param _sireId The sire's ID\n function _isValidMatingPair(\n Kitty storage _matron,\n uint256 _matronId,\n Kitty storage _sire,\n uint256 _sireId\n )\n private\n view\n returns(bool)\n {\n // A Kitty can't breed with itself!\n if (_matronId == _sireId) {\n return false;\n }\n\n // Kitties can't breed with their parents.\n if (_matron.matronId == _sireId || _matron.sireId == _sireId) {\n return false;\n }\n if (_sire.matronId == _matronId || _sire.sireId == _matronId) {\n return false;\n }\n\n // We can short circuit the sibling check (below) if either cat is\n // gen zero (has a matron ID of zero).\n if (_sire.matronId == 0 || _matron.matronId == 0) {\n return true;\n }\n\n // Kitties can't breed with full or half siblings.\n if (_sire.matronId == _matron.matronId || _sire.matronId == _matron.sireId) {\n return false;\n }\n if (_sire.sireId == _matron.matronId || _sire.sireId == _matron.sireId) {\n return false;\n }\n\n // Everything seems cool! Let's get DTF.\n return true;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair for\n /// breeding via auction (i.e. skips ownership and siring approval checks).\n function _canBreedWithViaAuction(uint256 _matronId, uint256 _sireId)\n internal\n view\n returns (bool)\n {\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId);\n }\n\n /// @notice Checks to see if two cats can breed together, including checks for\n /// ownership and siring approvals. Does NOT check that both cats are ready for\n /// breeding (i.e. breedWith could still fail until the cooldowns are finished).\n /// TODO: Shouldn't this check pregnancy and cooldowns?!?\n /// @param _matronId The ID of the proposed matron.\n /// @param _sireId The ID of the proposed sire.\n function canBreedWith(uint256 _matronId, uint256 _sireId)\n external\n view\n returns(bool)\n {\n require(_matronId > 0);\n require(_sireId > 0);\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId) &&\n _isSiringPermitted(_sireId, _matronId);\n }\n\n /// @dev Internal utility function to initiate breeding, assumes that all breeding\n /// requirements have been checked.\n function _breedWith(uint256 _matronId, uint256 _sireId) internal {\n // Grab a reference to the Kitties from storage.\n Kitty storage sire = kitties[_sireId];\n Kitty storage matron = kitties[_matronId];\n\n // Mark the matron as pregnant, keeping track of who the sire is.\n matron.siringWithId = uint32(_sireId);\n\n // Trigger the cooldown for both parents.\n _triggerCooldown(sire);\n _triggerCooldown(matron);\n\n // Clear siring permission for both parents. This may not be strictly necessary\n // but it's likely to avoid confusion!\n delete sireAllowedToAddress[_matronId];\n delete sireAllowedToAddress[_sireId];\n\n // Every time a kitty gets pregnant, counter is incremented.\n pregnantKitties++;\n\n // Emit the pregnancy event.\n Pregnant(kittyIndexToOwner[_matronId], _matronId, _sireId, matron.cooldownEndBlock);\n }\n\n /// @notice Breed a Kitty you own (as matron) with a sire that you own, or for which you\n /// have previously been given Siring approval. Will either make your cat pregnant, or will\n /// fail entirely. Requires a pre-payment of the fee given out to the first caller of giveBirth()\n /// @param _matronId The ID of the Kitty acting as matron (will end up pregnant if successful)\n /// @param _sireId The ID of the Kitty acting as sire (will begin its siring cooldown if successful)\n function breedWithAuto(uint256 _matronId, uint256 _sireId)\n external\n payable\n whenNotPaused\n {\n // Checks for payment.\n require(msg.value >= autoBirthFee);\n\n // Caller must own the matron.\n require(_owns(msg.sender, _matronId));\n\n // Neither sire nor matron are allowed to be on auction during a normal\n // breeding operation, but we don't need to check that explicitly.\n // For matron: The caller of this function can't be the owner of the matron\n // because the owner of a Kitty on auction is the auction house, and the\n // auction house will never call breedWith().\n // For sire: Similarly, a sire on auction will be owned by the auction house\n // and the act of transferring ownership will have cleared any oustanding\n // siring approval.\n // Thus we don't need to spend gas explicitly checking to see if either cat\n // is on auction.\n\n // Check that matron and sire are both owned by caller, or that the sire\n // has given siring permission to caller (i.e. matron's owner).\n // Will fail for _sireId = 0\n require(_isSiringPermitted(_sireId, _matronId));\n\n // Grab a reference to the potential matron\n Kitty storage matron = kitties[_matronId];\n\n // Make sure matron isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(matron));\n\n // Grab a reference to the potential sire\n Kitty storage sire = kitties[_sireId];\n\n // Make sure sire isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(sire));\n\n // Test that these cats are a valid mating pair.\n require(_isValidMatingPair(\n matron,\n _matronId,\n sire,\n _sireId\n ));\n\n // All checks passed, kitty gets pregnant!\n _breedWith(_matronId, _sireId);\n }\n\n /// @notice Have a pregnant Kitty give birth!\n /// @param _matronId A Kitty ready to give birth.\n /// @return The Kitty ID of the new kitten.\n /// @dev Looks at a given Kitty and, if pregnant and if the gestation period has passed,\n /// combines the genes of the two parents to create a new kitten. The new Kitty is assigned\n /// to the current owner of the matron. Upon successful completion, both the matron and the\n /// new kitten will be ready to breed again. Note that anyone can call this function (if they\n /// are willing to pay the gas!), but the new kitten always goes to the mother's owner.\n function giveBirth(uint256 _matronId)\n external\n whenNotPaused\n returns(uint256)\n {\n // Grab a reference to the matron in storage.\n Kitty storage matron = kitties[_matronId];\n\n // Check that the matron is a valid cat.\n require(matron.birthTime != 0);\n\n // Check that the matron is pregnant, and that its time has come!\n require(_isReadyToGiveBirth(matron));\n\n // Grab a reference to the sire in storage.\n uint256 sireId = matron.siringWithId;\n Kitty storage sire = kitties[sireId];\n\n // Determine the higher generation number of the two parents\n uint16 parentGen = matron.generation;\n if (sire.generation > matron.generation) {\n parentGen = sire.generation;\n }\n\n // Call the sooper-sekret gene mixing operation.\n uint256 childGenes = geneScience.mixGenes(matron.genes, sire.genes, matron.cooldownEndBlock - 1);\n\n // Make the new kitten!\n address owner = kittyIndexToOwner[_matronId];\n uint256 kittenId = _createKitty(_matronId, matron.siringWithId, parentGen + 1, childGenes, owner);\n\n // Clear the reference to sire from the matron (REQUIRED! Having siringWithId\n // set is what marks a matron as being pregnant.)\n delete matron.siringWithId;\n\n // Every time a kitty gives birth counter is decremented.\n pregnantKitties--;\n\n // Send the balance fee to the person who made birth happen.\n msg.sender.send(autoBirthFee);\n\n // return the new kitten's ID\n return kittenId;\n }\n}\n\n\n\n\n\n\n\n\n\n\n/// @title Auction Core\n/// @dev Contains models, variables, and internal methods for the auction.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuctionBase {\n\n // Represents an auction on an NFT\n struct Auction {\n // Current owner of NFT\n address seller;\n // Price (in wei) at beginning of auction\n uint128 startingPrice;\n // Price (in wei) at end of auction\n uint128 endingPrice;\n // Duration (in seconds) of auction\n uint64 duration;\n // Time when auction started\n // NOTE: 0 if this auction has been concluded\n uint64 startedAt;\n }\n\n // Reference to contract tracking NFT ownership\n KittiesERC721 public nonFungibleContract;\n\n // Cut owner takes on each auction, measured in basis points (1/100 of a percent).\n // Values 0-10,000 map to 0%-100%\n uint256 public ownerCut;\n\n // Map from token ID to their corresponding auction.\n mapping (uint256 => Auction) tokenIdToAuction;\n\n event AuctionCreated(uint256 tokenId, uint256 startingPrice, uint256 endingPrice, uint256 duration);\n event AuctionSuccessful(uint256 tokenId, uint256 totalPrice, address winner);\n event AuctionCancelled(uint256 tokenId);\n\n /// @dev Returns true if the claimant owns the token.\n /// @param _claimant - Address claiming to own the token.\n /// @param _tokenId - ID of token whose ownership to verify.\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return (nonFungibleContract.ownerOf(_tokenId) == _claimant);\n }\n\n /// @dev Escrows the NFT, assigning ownership to this contract.\n /// Throws if the escrow fails.\n /// @param _owner - Current owner address of token to escrow.\n /// @param _tokenId - ID of token whose approval to verify.\n function _escrow(address _owner, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transferFrom(_owner, this, _tokenId);\n }\n\n /// @dev Transfers an NFT owned by this contract to another address.\n /// Returns true if the transfer succeeds.\n /// @param _receiver - Address to transfer NFT to.\n /// @param _tokenId - ID of token to transfer.\n function _transfer(address _receiver, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transfer(_receiver, _tokenId);\n }\n\n /// @dev Adds an auction to the list of open auctions. Also fires the\n /// AuctionCreated event.\n /// @param _tokenId The ID of the token to be put on auction.\n /// @param _auction Auction to add.\n function _addAuction(uint256 _tokenId, Auction _auction) internal {\n // Require that all auctions have a duration of\n // at least one minute. (Keeps our math from getting hairy!)\n require(_auction.duration >= 1 minutes);\n\n tokenIdToAuction[_tokenId] = _auction;\n\n AuctionCreated(\n uint256(_tokenId),\n uint256(_auction.startingPrice),\n uint256(_auction.endingPrice),\n uint256(_auction.duration)\n );\n }\n\n /// @dev Cancels an auction unconditionally.\n function _cancelAuction(uint256 _tokenId, address _seller) internal {\n _removeAuction(_tokenId);\n _transfer(_seller, _tokenId);\n AuctionCancelled(_tokenId);\n }\n\n /// @dev Computes the price and transfers winnings.\n /// Does NOT transfer ownership of token.\n function _bid(uint256 _tokenId, uint256 _bidAmount)\n internal\n returns (uint256)\n {\n // Get a reference to the auction struct\n Auction storage auction = tokenIdToAuction[_tokenId];\n\n // Explicitly check that this auction is currently live.\n // (Because of how Ethereum mappings work, we can't just count\n // on the lookup above failing. An invalid _tokenId will just\n // return an auction object that is all zeros.)\n require(_isOnAuction(auction));\n\n // Check that the bid is greater than or equal to the current price\n uint256 price = _currentPrice(auction);\n require(_bidAmount >= price);\n\n // Grab a reference to the seller before the auction struct\n // gets deleted.\n address seller = auction.seller;\n\n // The bid is good! Remove the auction before sending the fees\n // to the sender so we can't have a reentrancy attack.\n _removeAuction(_tokenId);\n\n // Transfer proceeds to seller (if there are any!)\n if (price > 0) {\n // Calculate the auctioneer's cut.\n // (NOTE: _computeCut() is guaranteed to return a\n // value <= price, so this subtraction can't go negative.)\n uint256 auctioneerCut = _computeCut(price);\n uint256 sellerProceeds = price - auctioneerCut;\n\n // NOTE: Doing a transfer() in the middle of a complex\n // method like this is generally discouraged because of\n // reentrancy attacks and DoS attacks if the seller is\n // a contract with an invalid fallback function. We explicitly\n // guard against reentrancy attacks by removing the auction\n // before calling transfer(), and the only thing the seller\n // can DoS is the sale of their own asset! (And if it's an\n // accident, they can call cancelAuction(). )\n seller.transfer(sellerProceeds);\n }\n\n // Calculate any excess funds included with the bid. If the excess\n // is anything worth worrying about, transfer it back to bidder.\n // NOTE: We checked above that the bid amount is greater than or\n // equal to the price so this cannot underflow.\n uint256 bidExcess = _bidAmount - price;\n\n // Return the funds. Similar to the previous transfer, this is\n // not susceptible to a re-entry attack because the auction is\n // removed before any transfers occur.\n msg.sender.transfer(bidExcess);\n\n // Tell the world!\n AuctionSuccessful(_tokenId, price, msg.sender);\n\n return price;\n }\n\n /// @dev Removes an auction from the list of open auctions.\n /// @param _tokenId - ID of NFT on auction.\n function _removeAuction(uint256 _tokenId) internal {\n delete tokenIdToAuction[_tokenId];\n }\n\n /// @dev Returns true if the NFT is on auction.\n /// @param _auction - Auction to check.\n function _isOnAuction(Auction storage _auction) internal view returns (bool) {\n return (_auction.startedAt > 0);\n }\n\n /// @dev Returns current price of an NFT on auction. Broken into two\n /// functions (this one, that computes the duration from the auction\n /// structure, and the other that does the price computation) so we\n /// can easily test that the price computation works correctly.\n function _currentPrice(Auction storage _auction)\n internal\n view\n returns (uint256)\n {\n uint256 secondsPassed = 0;\n\n // A bit of insurance against negative values (or wraparound).\n // Probably not necessary (since Ethereum guarnatees that the\n // now variable doesn't ever go backwards).\n if (now > _auction.startedAt) {\n secondsPassed = now - _auction.startedAt;\n }\n\n return _computeCurrentPrice(\n _auction.startingPrice,\n _auction.endingPrice,\n _auction.duration,\n secondsPassed\n );\n }\n\n /// @dev Computes the current price of an auction. Factored out\n /// from _currentPrice so we can run extensive unit tests.\n /// When testing, make this function public and turn on\n /// `Current price computation` test suite.\n function _computeCurrentPrice(\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n uint256 _secondsPassed\n )\n internal\n pure\n returns (uint256)\n {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our public functions carefully cap the maximum values for\n // time (at 64-bits) and currency (at 128-bits). _duration is\n // also known to be non-zero (see the require() statement in\n // _addAuction())\n if (_secondsPassed >= _duration) {\n // We've reached the end of the dynamic pricing portion\n // of the auction, just return the end price.\n return _endingPrice;\n } else {\n // Starting price can be higher than ending price (and often is!), so\n // this delta can be negative.\n int256 totalPriceChange = int256(_endingPrice) - int256(_startingPrice);\n\n // This multiplication can't overflow, _secondsPassed will easily fit within\n // 64-bits, and totalPriceChange will easily fit within 128-bits, their product\n // will always fit within 256-bits.\n int256 currentPriceChange = totalPriceChange * int256(_secondsPassed) / int256(_duration);\n\n // currentPriceChange can be negative, but if so, will have a magnitude\n // less that _startingPrice. Thus, this result will always end up positive.\n int256 currentPrice = int256(_startingPrice) + currentPriceChange;\n\n return uint256(currentPrice);\n }\n }\n\n /// @dev Computes owner's cut of a sale.\n /// @param _price - Sale price of NFT.\n function _computeCut(uint256 _price) internal view returns (uint256) {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our entry functions carefully cap the maximum values for\n // currency (at 128-bits), and ownerCut <= 10000 (see the require()\n // statement in the ClockAuction constructor). The result of this\n // function is always guaranteed to be <= _price.\n return _price * ownerCut / 10000;\n }\n\n}\n\n\n\n\n\n\n\n/**\n * @title KittiesPausable\n * @dev Base contract which allows children to implement an emergency stop mechanism.\n */\ncontract KittiesPausable is KittiesOwnable {\n event Pause();\n event Unpause();\n\n bool public paused = false;\n\n\n /**\n\t * @dev modifier to allow actions only when the contract IS paused\n\t */\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /**\n\t * @dev modifier to allow actions only when the contract IS NOT paused\n\t */\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /**\n\t * @dev called by the owner to pause, triggers stopped state\n\t */\n function pause() onlyOwner whenNotPaused returns (bool) {\n paused = true;\n Pause();\n return true;\n }\n\n /**\n\t * @dev called by the owner to unpause, returns to normal state\n\t */\n function unpause() onlyOwner whenPaused returns (bool) {\n paused = false;\n Unpause();\n return true;\n }\n}\n\n\n/// @title Clock auction for non-fungible tokens.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuction is KittiesPausable, ClockAuctionBase {\n\n /// @dev The ERC-165 interface signature for ERC-721.\n /// Ref: https://github.com/ethereum/EIPs/issues/165\n /// Ref: https://github.com/ethereum/EIPs/issues/721\n bytes4 constant InterfaceSignature_ERC721 = bytes4(0x9a20483d);\n\n /// @dev Constructor creates a reference to the NFT ownership contract\n /// and verifies the owner cut is in the valid range.\n /// @param _nftAddress - address of a deployed contract implementing\n /// the Nonfungible Interface.\n /// @param _cut - percent cut the owner takes on each auction, must be\n /// between 0-10,000.\n function ClockAuction(address _nftAddress, uint256 _cut) public {\n require(_cut <= 10000);\n ownerCut = _cut;\n\n KittiesERC721 candidateContract = KittiesERC721(_nftAddress);\n require(candidateContract.supportsInterface(InterfaceSignature_ERC721));\n nonFungibleContract = candidateContract;\n }\n\n /// @dev Remove all Ether from the contract, which is the owner's cuts\n /// as well as any Ether sent directly to the contract address.\n /// Always transfers to the NFT contract, but can be called either by\n /// the owner or the NFT contract.\n function withdrawBalance() external {\n address nftAddress = address(nonFungibleContract);\n\n require(\n msg.sender == owner ||\n msg.sender == nftAddress\n );\n // We are using this boolean method to make sure that even if one fails it will still work\n bool res = nftAddress.send(this.balance);\n }\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of time to move between starting\n /// price and ending price (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n whenNotPaused\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(_owns(msg.sender, _tokenId));\n _escrow(msg.sender, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Bids on an open auction, completing the auction and transferring\n /// ownership of the NFT if enough Ether is supplied.\n /// @param _tokenId - ID of token to bid on.\n function bid(uint256 _tokenId)\n external\n payable\n whenNotPaused\n {\n // _bid will throw if the bid or funds transfer fails\n _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n }\n\n /// @dev Cancels an auction that hasn't been won yet.\n /// Returns the NFT to original owner.\n /// @notice This is a state-modifying function that can\n /// be called while the contract is paused.\n /// @param _tokenId - ID of token on auction\n function cancelAuction(uint256 _tokenId)\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n address seller = auction.seller;\n require(msg.sender == seller);\n _cancelAuction(_tokenId, seller);\n }\n\n /// @dev Cancels an auction when the contract is paused.\n /// Only the owner may do this, and NFTs are returned to\n /// the seller. This should only be used in emergencies.\n /// @param _tokenId - ID of the NFT on auction to cancel.\n function cancelAuctionWhenPaused(uint256 _tokenId)\n whenPaused\n onlyOwner\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n _cancelAuction(_tokenId, auction.seller);\n }\n\n /// @dev Returns auction info for an NFT on auction.\n /// @param _tokenId - ID of NFT on auction.\n function getAuction(uint256 _tokenId)\n external\n view\n returns\n (\n address seller,\n uint256 startingPrice,\n uint256 endingPrice,\n uint256 duration,\n uint256 startedAt\n ) {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return (\n auction.seller,\n auction.startingPrice,\n auction.endingPrice,\n auction.duration,\n auction.startedAt\n );\n }\n\n /// @dev Returns the current price of an auction.\n /// @param _tokenId - ID of the token price we are checking.\n function getCurrentPrice(uint256 _tokenId)\n external\n view\n returns (uint256)\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return _currentPrice(auction);\n }\n\n}\n\n\n/// @title Reverse auction modified for siring\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SiringClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSiringAuctionAddress() call.\n bool public isSiringClockAuction = true;\n\n // Delegate constructor\n function SiringClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction. Since this function is wrapped,\n /// require sender to be KittyCore contract.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Places a bid for siring. Requires the sender\n /// is the KittyCore contract because all bid methods\n /// should be wrapped. Also returns the kitty to the\n /// seller rather than the winner.\n function bid(uint256 _tokenId)\n external\n payable\n {\n require(msg.sender == address(nonFungibleContract));\n address seller = tokenIdToAuction[_tokenId].seller;\n // _bid checks that token ID is valid and will throw if bid fails\n _bid(_tokenId, msg.value);\n // We transfer the kitty back to the seller, the winner will get\n // the offspring\n _transfer(seller, _tokenId);\n }\n\n}\n\n\n\n\n\n/// @title Clock auction modified for sale of kitties\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SaleClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSaleAuctionAddress() call.\n bool public isSaleClockAuction = true;\n\n // Tracks last 5 sale price of gen0 kitty sales\n uint256 public gen0SaleCount;\n uint256[5] public lastGen0SalePrices;\n\n // Delegate constructor\n function SaleClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Updates lastSalePrice if seller is the nft contract\n /// Otherwise, works the same as default bid method.\n function bid(uint256 _tokenId)\n external\n payable\n {\n // _bid verifies token ID size\n address seller = tokenIdToAuction[_tokenId].seller;\n uint256 price = _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n\n // If not a gen0 auction, exit\n if (seller == address(nonFungibleContract)) {\n // Track gen0 sale prices\n lastGen0SalePrices[gen0SaleCount % 5] = price;\n gen0SaleCount++;\n }\n }\n\n function averageGen0SalePrice() external view returns (uint256) {\n uint256 sum = 0;\n for (uint256 i = 0; i < 5; i++) {\n sum += lastGen0SalePrices[i];\n }\n return sum / 5;\n }\n\n}\n\n\n/// @title Handles creating auctions for sale and siring of kitties.\n/// This wrapper of ReverseAuction exists only so that users can create\n/// auctions with only one transaction.\ncontract KittyAuction is KittyBreeding {\n\n // @notice The auction contract variables are defined in KittyBase to allow\n // us to refer to them in KittyOwnership to prevent accidental transfers.\n // `saleAuction` refers to the auction for gen0 and p2p sale of kitties.\n // `siringAuction` refers to the auction for siring rights of kitties.\n\n /// @dev Sets the reference to the sale auction.\n /// @param _address - Address of sale contract.\n function setSaleAuctionAddress(address _address) external onlyCEO {\n SaleClockAuction candidateContract = SaleClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSaleClockAuction());\n\n // Set the new contract address\n saleAuction = candidateContract;\n }\n\n /// @dev Sets the reference to the siring auction.\n /// @param _address - Address of siring contract.\n function setSiringAuctionAddress(address _address) external onlyCEO {\n SiringClockAuction candidateContract = SiringClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSiringClockAuction());\n\n // Set the new contract address\n siringAuction = candidateContract;\n }\n\n /// @dev Put a kitty up for auction.\n /// Does some ownership trickery to create auctions in one tx.\n function createSaleAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n // Ensure the kitty is not pregnant to prevent the auction\n // contract accidentally receiving ownership of the child.\n // NOTE: the kitty IS allowed to be in a cooldown.\n require(!isPregnant(_kittyId));\n _approve(_kittyId, saleAuction);\n // Sale auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n saleAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Put a kitty up for auction to be sire.\n /// Performs checks to ensure the kitty can be sired, then\n /// delegates to reverse auction.\n function createSiringAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n require(isReadyToBreed(_kittyId));\n _approve(_kittyId, siringAuction);\n // Siring auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n siringAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Completes a siring auction by bidding.\n /// Immediately breeds the winning matron with the sire on auction.\n /// @param _sireId - ID of the sire on auction.\n /// @param _matronId - ID of the matron owned by the bidder.\n function bidOnSiringAuction(\n uint256 _sireId,\n uint256 _matronId\n )\n external\n payable\n whenNotPaused\n {\n // Auction contract checks input sizes\n require(_owns(msg.sender, _matronId));\n require(isReadyToBreed(_matronId));\n require(_canBreedWithViaAuction(_matronId, _sireId));\n\n // Define the current price of the auction.\n uint256 currentPrice = siringAuction.getCurrentPrice(_sireId);\n require(msg.value >= currentPrice + autoBirthFee);\n\n // Siring auction will throw if the bid fails.\n siringAuction.bid.value(msg.value - autoBirthFee)(_sireId);\n _breedWith(uint32(_matronId), uint32(_sireId));\n }\n\n /// @dev Transfers the balance of the sale auction contract\n /// to the KittyCore contract. We use two-step withdrawal to\n /// prevent two transfer calls in the auction bid function.\n function withdrawAuctionBalances() external onlyCLevel {\n saleAuction.withdrawBalance();\n siringAuction.withdrawBalance();\n }\n}\n\n\n/// @title all functions related to creating kittens\ncontract KittyMinting is KittyAuction {\n\n // Limits the number of cats the contract owner can ever create.\n uint256 public constant PROMO_CREATION_LIMIT = 5000;\n uint256 public constant GEN0_CREATION_LIMIT = 45000;\n\n // Constants for gen0 auctions.\n uint256 public constant GEN0_STARTING_PRICE = 10 finney;\n uint256 public constant GEN0_AUCTION_DURATION = 1 days;\n\n // Counts the number of cats the contract owner has created.\n uint256 public promoCreatedCount;\n uint256 public gen0CreatedCount;\n\n /// @dev we can create promo kittens, up to a limit. Only callable by COO\n /// @param _genes the encoded genes of the kitten to be created, any value is accepted\n /// @param _owner the future owner of the created kittens. Default to contract COO\n function createPromoKitty(uint256 _genes, address _owner) external onlyCOO {\n address kittyOwner = _owner;\n if (kittyOwner == address(0)) {\n kittyOwner = cooAddress;\n }\n require(promoCreatedCount < PROMO_CREATION_LIMIT);\n\n promoCreatedCount++;\n _createKitty(0, 0, 0, _genes, kittyOwner);\n }\n\n /// @dev Creates a new gen0 kitty with the given genes and\n /// creates an auction for it.\n function createGen0Auction(uint256 _genes) external onlyCOO {\n require(gen0CreatedCount < GEN0_CREATION_LIMIT);\n\n uint256 kittyId = _createKitty(0, 0, 0, _genes, address(this));\n _approve(kittyId, saleAuction);\n\n saleAuction.createAuction(\n kittyId,\n _computeNextGen0Price(),\n 0,\n GEN0_AUCTION_DURATION,\n address(this)\n );\n\n gen0CreatedCount++;\n }\n\n /// @dev Computes the next gen0 auction starting price, given\n /// the average of the past 5 prices + 50%.\n function _computeNextGen0Price() internal view returns (uint256) {\n uint256 avePrice = saleAuction.averageGen0SalePrice();\n\n // Sanity check to ensure we don't overflow arithmetic\n require(avePrice == uint256(uint128(avePrice)));\n\n uint256 nextPrice = avePrice + (avePrice / 2);\n\n // We never auction for less than starting price\n if (nextPrice < GEN0_STARTING_PRICE) {\n nextPrice = GEN0_STARTING_PRICE;\n }\n\n return nextPrice;\n }\n}\n\n\n/// @title CryptoKitties: Collectible, breedable, and oh-so-adorable cats on the Ethereum blockchain.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev The main CryptoKitties contract, keeps track of kittens so they don't wander around and get lost.\ncontract KittyCore is KittyMinting {\n\n // This is the main CryptoKitties contract. In order to keep our code seperated into logical sections,\n // we've broken it up in two ways. First, we have several seperately-instantiated sibling contracts\n // that handle auctions and our super-top-secret genetic combination algorithm. The auctions are\n // seperate since their logic is somewhat complex and there's always a risk of subtle bugs. By keeping\n // them in their own contracts, we can upgrade them without disrupting the main contract that tracks\n // kitty ownership. The genetic combination algorithm is kept seperate so we can open-source all of\n // the rest of our code without making it _too_ easy for folks to figure out how the genetics work.\n // Don't worry, I'm sure someone will reverse engineer it soon enough!\n //\n // Secondly, we break the core contract into multiple files using inheritence, one for each major\n // facet of functionality of CK. This allows us to keep related code bundled together while still\n // avoiding a single giant file with everything in it. The breakdown is as follows:\n //\n // - KittyBase: This is where we define the most fundamental code shared throughout the core\n // functionality. This includes our main data storage, constants and data types, plus\n // internal functions for managing these items.\n //\n // - KittyAccessControl: This contract manages the various addresses and constraints for operations\n // that can be executed only by specific roles. Namely CEO, CFO and COO.\n //\n // - KittyOwnership: This provides the methods required for basic non-fungible token\n // transactions, following the draft ERC-721 spec (https://github.com/ethereum/EIPs/issues/721).\n //\n // - KittyBreeding: This file contains the methods necessary to breed cats together, including\n // keeping track of siring offers, and relies on an external genetic combination contract.\n //\n // - KittyAuctions: Here we have the public methods for auctioning or bidding on cats or siring\n // services. The actual auction functionality is handled in two sibling contracts (one\n // for sales and one for siring), while auction creation and bidding is mostly mediated\n // through this facet of the core contract.\n //\n // - KittyMinting: This final facet contains the functionality we use for creating new gen0 cats.\n // We can make up to 5000 \"promo\" cats that can be given away (especially important when\n // the community is new), and all others can only be created and then immediately put up\n // for auction via an algorithmically determined starting price. Regardless of how they\n // are created, there is a hard limit of 50k gen0 cats. After that, it's all up to the\n // community to breed, breed, breed!\n\n // Set in case the core contract is broken and an upgrade is required\n address public newContractAddress;\n\n /// @notice Creates the main CryptoKitties smart contract instance.\n function KittyCore() public {\n // Starts paused.\n paused = true;\n\n // the creator of the contract is the initial CEO\n ceoAddress = msg.sender;\n\n // the creator of the contract is also the initial COO\n cooAddress = msg.sender;\n\n // start with the mythical kitten 0 - so we don't have generation-0 parent issues\n _createKitty(0, 0, 0, uint256(-1), address(0));\n }\n\n /// @dev Used to mark the smart contract as upgraded, in case there is a serious\n /// breaking bug. This method does nothing but keep track of the new contract and\n /// emit a message indicating that the new address is set. It's up to clients of this\n /// contract to update to the new contract address in that case. (This contract will\n /// be paused indefinitely if such an upgrade takes place.)\n /// @param _v2Address new address\n function setNewAddress(address _v2Address) external onlyCEO whenPaused {\n // See README.md for updgrade plan\n newContractAddress = _v2Address;\n ContractUpgrade(_v2Address);\n }\n\n /// @notice No tipping!\n /// @dev Reject all Ether from being sent here, unless it's from one of the\n /// two auction contracts. (Hopefully, we can prevent user accidents.)\n function() external payable {\n require(\n msg.sender == address(saleAuction) ||\n msg.sender == address(siringAuction)\n );\n }\n\n /// @notice Returns all the relevant information about a specific kitty.\n /// @param _id The ID of the kitty of interest.\n function getKitty(uint256 _id)\n external\n view\n returns (\n bool isGestating,\n bool isReady,\n uint256 cooldownIndex,\n uint256 nextActionAt,\n uint256 siringWithId,\n uint256 birthTime,\n uint256 matronId,\n uint256 sireId,\n uint256 generation,\n uint256 genes\n ) {\n Kitty storage kit = kitties[_id];\n\n // if this variable is 0 then it's not gestating\n isGestating = (kit.siringWithId != 0);\n isReady = (kit.cooldownEndBlock <= block.number);\n cooldownIndex = uint256(kit.cooldownIndex);\n nextActionAt = uint256(kit.cooldownEndBlock);\n siringWithId = uint256(kit.siringWithId);\n birthTime = uint256(kit.birthTime);\n matronId = uint256(kit.matronId);\n sireId = uint256(kit.sireId);\n generation = uint256(kit.generation);\n genes = kit.genes;\n }\n\n /// @dev Override unpause so it requires all external contract addresses\n /// to be set before contract can be unpaused. Also, we can't have\n /// newContractAddress set either, because then the contract was upgraded.\n /// @notice This is public rather than external so we can call super.unpause\n /// without using an expensive CALL.\n function unpause() public onlyCEO whenPaused {\n require(saleAuction != address(0));\n require(siringAuction != address(0));\n require(geneScience != address(0));\n require(newContractAddress == address(0));\n\n // Actually unpause the contract.\n super.unpause();\n }\n\n // @dev Allows the CFO to capture the balance available to the contract.\n function withdrawBalance() external onlyCFO {\n uint256 balance = this.balance;\n // Subtract all the currently pregnant kittens we have, plus 1 of margin.\n uint256 subtractFees = (pregnantKitties + 1) * autoBirthFee;\n\n if (balance > subtractFees) {\n cfoAddress.send(balance - subtractFees);\n }\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "exportedSymbols": { "ClockAuction": [ 8872 @@ -52024,5 +52024,5 @@ }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:48.006Z" + "updatedAt": "2018-10-09T17:45:36.391Z" } \ No newline at end of file diff --git a/artifacts/json/SimpleInterestTermsContract.json b/artifacts/json/SimpleInterestTermsContract.json index 0e9a0191..cf58cc19 100644 --- a/artifacts/json/SimpleInterestTermsContract.json +++ b/artifacts/json/SimpleInterestTermsContract.json @@ -381,15 +381,15 @@ "type": "event" } ], - "bytecode": "0x6060604052341561000f57600080fd5b6040516020806117e78339810160405280805190602001909190505080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505061176b8061007c6000396000f3006060604052600436106100e6576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a896a1146100eb5780630776298214610126578063208638941461014f5780632762dd8c1461017857806340018a0d146101b35780635f0280ba146101dc5780636f69c96f146102815780638b47e58a146102aa57806393529cdf146102d3578063977a5e64146102fc57806399114d841461035a578063abf410e51461039e578063de53a13c146103f3578063ed8907d71461041c578063fd127a4114610473578063fd40d52e1461049c575b600080fd5b34156100f657600080fd5b6101106004808035600019169060200190919050506104d7565b6040518082815260200191505060405180910390f35b341561013157600080fd5b6101396104fb565b6040518082815260200191505060405180910390f35b341561015a57600080fd5b610162610504565b6040518082815260200191505060405180910390f35b341561018357600080fd5b61019d600480803560001916906020019091905050610510565b6040518082815260200191505060405180910390f35b34156101be57600080fd5b6101c6610532565b6040518082815260200191505060405180910390f35b34156101e757600080fd5b61026760048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061053e565b604051808215151515815260200191505060405180910390f35b341561028c57600080fd5b6102946107b3565b6040518082815260200191505060405180910390f35b34156102b557600080fd5b6102bd6107b9565b6040518082815260200191505060405180910390f35b34156102de57600080fd5b6102e66107be565b6040518082815260200191505060405180910390f35b341561030757600080fd5b61034060048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506107c4565b604051808215151515815260200191505060405180910390f35b341561036557600080fd5b610388600480803560001916906020019091908035906020019091905050610c55565b6040518082815260200191505060405180910390f35b34156103a957600080fd5b6103b1610e61565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103fe57600080fd5b610406610e87565b6040518082815260200191505060405180910390f35b341561042757600080fd5b610441600480803560001916906020019091905050610e90565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b341561047e57600080fd5b610486610f88565b6040518082815260200191505060405180910390f35b34156104a757600080fd5b6104c1600480803560001916906020019091905050610f95565b6040518082815260200191505060405180910390f35b60008060008360001916600019168152602001908152602001600020549050919050565b6018610e100281565b601e6018610e10020281565b600061051a6116e0565b61052383610fad565b90508060600151915050919050565b60076018610e10020281565b60006105486116e0565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636fa9d0566000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156105d657600080fd5b6102c65a03f115156105e757600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561062a57600080fd5b61063387610fad565b9050806000015173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107a45761069a846000808a60001916600019168152602001908152602001600020546114a990919063ffffffff16565b6000808960001916600019168152602001908152602001600020819055507ff1a888d220228f843ac3044ef257c80642e6434d1ddc7ebee0a2813cced3406c87878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405180910390a1600191506107a9565b600091505b5095945050505050565b610e1081565b600581565b61271081565b6000806000806000806000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663079dd4b76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561086057600080fd5b6102c65a03f1151561087157600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108b457600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561094257600080fd5b6102c65a03f1151561095357600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16636be39bda8c6000604051604001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082600019166000191681526020019150506040805180830381600087803b15156109da57600080fd5b6102c65a03f115156109eb57600080fd5b505050604051805190602001805190508098508199505050610a0c87610e90565b809650819750829850839950849a505050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d23c4c76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610aae57600080fd5b6102c65a03f11515610abf57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16635715c5b7876000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515610b3f57600080fd5b6102c65a03f11515610b5057600080fd5b505050604051805190509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015610b995750600583105b8015610bd057503073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b15610c4257828173ffffffffffffffffffffffffffffffffffffffff168c600019167f2c500aaec6833a053693d8c2a18a3ed5649a4609699abaf7778c3d389cc40c0588888760405180848152602001838152602001828152602001935050505060405180910390a460019850610c47565b600098505b505050505050505092915050565b6000610c5f6116e0565b60008085600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610cf157600080fd5b6102c65a03f11515610d0257600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663f6f494c9826000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610d8a57600080fd5b6102c65a03f11515610d9b57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16141515610dde57600080fd5b610de787610fad565b9350610df2846114c7565b9250836040015186111515610e0a5760009450610e57565b836060015186101515610e1f57829450610e57565b610e29868561151d565b9150610e548460a00151610e46848661156790919063ffffffff16565b6115a290919063ffffffff16565b94505b5050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60646127100281565b6000806000806000806000806000807fff000000000000000000000000000000000000000000000000000000000000006001028b1694507effffffffffffffffffffffff000000000000000000000000000000000000006001028b16935072ffffff000000000000000000000000000000006001028b1692506ff00000000000000000000000000000006001028b1691506f0ffff0000000000000000000000000006001028b169050610f448560f86115bd565b610f4f8560986115bd565b610f5a8560806115bd565b610f6585607c6115bd565b610f7085606c6115bd565b99509950995099509950505050505091939590929450565b61016d6018610e10020281565b60006020528060005260406000206000915090505481565b610fb56116e0565b600080600080600080600080600080600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561105557600080fd5b6102c65a03f1151561106657600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663314a522e8f6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156110ee57600080fd5b6102c65a03f115156110ff57600080fd5b505050604051805190509b506111148c610e90565b809b50819c50829d50839e50849f505050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d23c4c76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156111b657600080fd5b6102c65a03f115156111c757600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16635715c5b78c6000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561124757600080fd5b6102c65a03f1151561125857600080fd5b505050604051805190509550600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16141515156112a057600080fd5b6004808111156112ac57fe5b88111515156112ba57600080fd5b8760048111156112c657fe5b94506112d1856115da565b9350600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561136157600080fd5b6102c65a03f1151561137257600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663d69dbf638f6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156113fa57600080fd5b6102c65a03f1151561140b57600080fd5b50505060405180519050925061142a848861156790919063ffffffff16565b915061143f83836114a990919063ffffffff16565b905060e0604051908101604052808773ffffffffffffffffffffffffffffffffffffffff1681526020018b815260200184815260200182815260200186600481111561148757fe5b81526020018881526020018a8152509c50505050505050505050505050919050565b60008082840190508381101515156114bd57fe5b8091505092915050565b6000806114fc6064612710026114ee8560c00151866020015161156790919063ffffffff16565b6115a290919063ffffffff16565b90506115158184602001516114a990919063ffffffff16565b915050919050565b60008060006115398460400151866116c790919063ffffffff16565b915061154884608001516115da565b905061155d81836115a290919063ffffffff16565b9250505092915050565b600080600084141561157c576000915061159b565b828402905082848281151561158d57fe5b0414151561159757fe5b8091505b5092915050565b60008082848115156115b057fe5b0490508091505092915050565b60008160020a83600190048115156115d157fe5b04905092915050565b60008060048111156115e857fe5b8260048111156115f457fe5b141561160457610e1090506116c2565b6001600481111561161157fe5b82600481111561161d57fe5b1415611630576018610e100290506116c2565b6002600481111561163d57fe5b82600481111561164957fe5b141561165f5760076018610e10020290506116c2565b6003600481111561166c57fe5b82600481111561167857fe5b141561168e57601e6018610e10020290506116c2565b60048081111561169a57fe5b8260048111156116a657fe5b14156116bd5761016d6018610e10020290506116c2565b600080fd5b919050565b60008282111515156116d557fe5b818303905092915050565b60e060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600081526020016000600481111561172b57fe5b8152602001600081526020016000815250905600a165627a7a7230582040cb6bb30b94ef3877a45b4fb18801bd9f1d591eb0fcf6008d2a3ed54eaf48db0029", - "deployedBytecode": "0x6060604052600436106100e6576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a896a1146100eb5780630776298214610126578063208638941461014f5780632762dd8c1461017857806340018a0d146101b35780635f0280ba146101dc5780636f69c96f146102815780638b47e58a146102aa57806393529cdf146102d3578063977a5e64146102fc57806399114d841461035a578063abf410e51461039e578063de53a13c146103f3578063ed8907d71461041c578063fd127a4114610473578063fd40d52e1461049c575b600080fd5b34156100f657600080fd5b6101106004808035600019169060200190919050506104d7565b6040518082815260200191505060405180910390f35b341561013157600080fd5b6101396104fb565b6040518082815260200191505060405180910390f35b341561015a57600080fd5b610162610504565b6040518082815260200191505060405180910390f35b341561018357600080fd5b61019d600480803560001916906020019091905050610510565b6040518082815260200191505060405180910390f35b34156101be57600080fd5b6101c6610532565b6040518082815260200191505060405180910390f35b34156101e757600080fd5b61026760048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061053e565b604051808215151515815260200191505060405180910390f35b341561028c57600080fd5b6102946107b3565b6040518082815260200191505060405180910390f35b34156102b557600080fd5b6102bd6107b9565b6040518082815260200191505060405180910390f35b34156102de57600080fd5b6102e66107be565b6040518082815260200191505060405180910390f35b341561030757600080fd5b61034060048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506107c4565b604051808215151515815260200191505060405180910390f35b341561036557600080fd5b610388600480803560001916906020019091908035906020019091905050610c55565b6040518082815260200191505060405180910390f35b34156103a957600080fd5b6103b1610e61565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103fe57600080fd5b610406610e87565b6040518082815260200191505060405180910390f35b341561042757600080fd5b610441600480803560001916906020019091905050610e90565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b341561047e57600080fd5b610486610f88565b6040518082815260200191505060405180910390f35b34156104a757600080fd5b6104c1600480803560001916906020019091905050610f95565b6040518082815260200191505060405180910390f35b60008060008360001916600019168152602001908152602001600020549050919050565b6018610e100281565b601e6018610e10020281565b600061051a6116e0565b61052383610fad565b90508060600151915050919050565b60076018610e10020281565b60006105486116e0565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636fa9d0566000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156105d657600080fd5b6102c65a03f115156105e757600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561062a57600080fd5b61063387610fad565b9050806000015173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107a45761069a846000808a60001916600019168152602001908152602001600020546114a990919063ffffffff16565b6000808960001916600019168152602001908152602001600020819055507ff1a888d220228f843ac3044ef257c80642e6434d1ddc7ebee0a2813cced3406c87878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405180910390a1600191506107a9565b600091505b5095945050505050565b610e1081565b600581565b61271081565b6000806000806000806000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663079dd4b76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561086057600080fd5b6102c65a03f1151561087157600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108b457600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561094257600080fd5b6102c65a03f1151561095357600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16636be39bda8c6000604051604001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082600019166000191681526020019150506040805180830381600087803b15156109da57600080fd5b6102c65a03f115156109eb57600080fd5b505050604051805190602001805190508098508199505050610a0c87610e90565b809650819750829850839950849a505050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d23c4c76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610aae57600080fd5b6102c65a03f11515610abf57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16635715c5b7876000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515610b3f57600080fd5b6102c65a03f11515610b5057600080fd5b505050604051805190509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015610b995750600583105b8015610bd057503073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b15610c4257828173ffffffffffffffffffffffffffffffffffffffff168c600019167f2c500aaec6833a053693d8c2a18a3ed5649a4609699abaf7778c3d389cc40c0588888760405180848152602001838152602001828152602001935050505060405180910390a460019850610c47565b600098505b505050505050505092915050565b6000610c5f6116e0565b60008085600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610cf157600080fd5b6102c65a03f11515610d0257600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663f6f494c9826000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610d8a57600080fd5b6102c65a03f11515610d9b57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16141515610dde57600080fd5b610de787610fad565b9350610df2846114c7565b9250836040015186111515610e0a5760009450610e57565b836060015186101515610e1f57829450610e57565b610e29868561151d565b9150610e548460a00151610e46848661156790919063ffffffff16565b6115a290919063ffffffff16565b94505b5050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60646127100281565b6000806000806000806000806000807fff000000000000000000000000000000000000000000000000000000000000006001028b1694507effffffffffffffffffffffff000000000000000000000000000000000000006001028b16935072ffffff000000000000000000000000000000006001028b1692506ff00000000000000000000000000000006001028b1691506f0ffff0000000000000000000000000006001028b169050610f448560f86115bd565b610f4f8560986115bd565b610f5a8560806115bd565b610f6585607c6115bd565b610f7085606c6115bd565b99509950995099509950505050505091939590929450565b61016d6018610e10020281565b60006020528060005260406000206000915090505481565b610fb56116e0565b600080600080600080600080600080600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561105557600080fd5b6102c65a03f1151561106657600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663314a522e8f6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156110ee57600080fd5b6102c65a03f115156110ff57600080fd5b505050604051805190509b506111148c610e90565b809b50819c50829d50839e50849f505050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d23c4c76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156111b657600080fd5b6102c65a03f115156111c757600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16635715c5b78c6000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561124757600080fd5b6102c65a03f1151561125857600080fd5b505050604051805190509550600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16141515156112a057600080fd5b6004808111156112ac57fe5b88111515156112ba57600080fd5b8760048111156112c657fe5b94506112d1856115da565b9350600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561136157600080fd5b6102c65a03f1151561137257600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663d69dbf638f6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156113fa57600080fd5b6102c65a03f1151561140b57600080fd5b50505060405180519050925061142a848861156790919063ffffffff16565b915061143f83836114a990919063ffffffff16565b905060e0604051908101604052808773ffffffffffffffffffffffffffffffffffffffff1681526020018b815260200184815260200182815260200186600481111561148757fe5b81526020018881526020018a8152509c50505050505050505050505050919050565b60008082840190508381101515156114bd57fe5b8091505092915050565b6000806114fc6064612710026114ee8560c00151866020015161156790919063ffffffff16565b6115a290919063ffffffff16565b90506115158184602001516114a990919063ffffffff16565b915050919050565b60008060006115398460400151866116c790919063ffffffff16565b915061154884608001516115da565b905061155d81836115a290919063ffffffff16565b9250505092915050565b600080600084141561157c576000915061159b565b828402905082848281151561158d57fe5b0414151561159757fe5b8091505b5092915050565b60008082848115156115b057fe5b0490508091505092915050565b60008160020a83600190048115156115d157fe5b04905092915050565b60008060048111156115e857fe5b8260048111156115f457fe5b141561160457610e1090506116c2565b6001600481111561161157fe5b82600481111561161d57fe5b1415611630576018610e100290506116c2565b6002600481111561163d57fe5b82600481111561164957fe5b141561165f5760076018610e10020290506116c2565b6003600481111561166c57fe5b82600481111561167857fe5b141561168e57601e6018610e10020290506116c2565b60048081111561169a57fe5b8260048111156116a657fe5b14156116bd5761016d6018610e10020290506116c2565b600080fd5b919050565b60008282111515156116d557fe5b818303905092915050565b60e060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600081526020016000600481111561172b57fe5b8152602001600081526020016000815250905600a165627a7a7230582040cb6bb30b94ef3877a45b4fb18801bd9f1d591eb0fcf6008d2a3ed54eaf48db0029", + "bytecode": "0x6060604052341561000f57600080fd5b6040516020806117e78339810160405280805190602001909190505080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505061176b8061007c6000396000f3006060604052600436106100e6576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a896a1146100eb5780630776298214610126578063208638941461014f5780632762dd8c1461017857806340018a0d146101b35780635f0280ba146101dc5780636f69c96f146102815780638b47e58a146102aa57806393529cdf146102d3578063977a5e64146102fc57806399114d841461035a578063abf410e51461039e578063de53a13c146103f3578063ed8907d71461041c578063fd127a4114610473578063fd40d52e1461049c575b600080fd5b34156100f657600080fd5b6101106004808035600019169060200190919050506104d7565b6040518082815260200191505060405180910390f35b341561013157600080fd5b6101396104fb565b6040518082815260200191505060405180910390f35b341561015a57600080fd5b610162610504565b6040518082815260200191505060405180910390f35b341561018357600080fd5b61019d600480803560001916906020019091905050610510565b6040518082815260200191505060405180910390f35b34156101be57600080fd5b6101c6610532565b6040518082815260200191505060405180910390f35b34156101e757600080fd5b61026760048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061053e565b604051808215151515815260200191505060405180910390f35b341561028c57600080fd5b6102946107b3565b6040518082815260200191505060405180910390f35b34156102b557600080fd5b6102bd6107b9565b6040518082815260200191505060405180910390f35b34156102de57600080fd5b6102e66107be565b6040518082815260200191505060405180910390f35b341561030757600080fd5b61034060048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506107c4565b604051808215151515815260200191505060405180910390f35b341561036557600080fd5b610388600480803560001916906020019091908035906020019091905050610c55565b6040518082815260200191505060405180910390f35b34156103a957600080fd5b6103b1610e61565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103fe57600080fd5b610406610e87565b6040518082815260200191505060405180910390f35b341561042757600080fd5b610441600480803560001916906020019091905050610e90565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b341561047e57600080fd5b610486610f88565b6040518082815260200191505060405180910390f35b34156104a757600080fd5b6104c1600480803560001916906020019091905050610f95565b6040518082815260200191505060405180910390f35b60008060008360001916600019168152602001908152602001600020549050919050565b6018610e100281565b601e6018610e10020281565b600061051a6116e0565b61052383610fad565b90508060600151915050919050565b60076018610e10020281565b60006105486116e0565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636fa9d0566000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156105d657600080fd5b6102c65a03f115156105e757600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561062a57600080fd5b61063387610fad565b9050806000015173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107a45761069a846000808a60001916600019168152602001908152602001600020546114a990919063ffffffff16565b6000808960001916600019168152602001908152602001600020819055507ff1a888d220228f843ac3044ef257c80642e6434d1ddc7ebee0a2813cced3406c87878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405180910390a1600191506107a9565b600091505b5095945050505050565b610e1081565b600581565b61271081565b6000806000806000806000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663079dd4b76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561086057600080fd5b6102c65a03f1151561087157600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108b457600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561094257600080fd5b6102c65a03f1151561095357600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16636be39bda8c6000604051604001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082600019166000191681526020019150506040805180830381600087803b15156109da57600080fd5b6102c65a03f115156109eb57600080fd5b505050604051805190602001805190508098508199505050610a0c87610e90565b809650819750829850839950849a505050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d23c4c76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610aae57600080fd5b6102c65a03f11515610abf57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16635715c5b7876000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515610b3f57600080fd5b6102c65a03f11515610b5057600080fd5b505050604051805190509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015610b995750600583105b8015610bd057503073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b15610c4257828173ffffffffffffffffffffffffffffffffffffffff168c600019167f2c500aaec6833a053693d8c2a18a3ed5649a4609699abaf7778c3d389cc40c0588888760405180848152602001838152602001828152602001935050505060405180910390a460019850610c47565b600098505b505050505050505092915050565b6000610c5f6116e0565b60008085600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610cf157600080fd5b6102c65a03f11515610d0257600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663f6f494c9826000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610d8a57600080fd5b6102c65a03f11515610d9b57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16141515610dde57600080fd5b610de787610fad565b9350610df2846114c7565b9250836040015186111515610e0a5760009450610e57565b836060015186101515610e1f57829450610e57565b610e29868561151d565b9150610e548460a00151610e46848661156790919063ffffffff16565b6115a290919063ffffffff16565b94505b5050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60646127100281565b6000806000806000806000806000807fff000000000000000000000000000000000000000000000000000000000000006001028b1694507effffffffffffffffffffffff000000000000000000000000000000000000006001028b16935072ffffff000000000000000000000000000000006001028b1692506ff00000000000000000000000000000006001028b1691506f0ffff0000000000000000000000000006001028b169050610f448560f86115bd565b610f4f8560986115bd565b610f5a8560806115bd565b610f6585607c6115bd565b610f7085606c6115bd565b99509950995099509950505050505091939590929450565b61016d6018610e10020281565b60006020528060005260406000206000915090505481565b610fb56116e0565b600080600080600080600080600080600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561105557600080fd5b6102c65a03f1151561106657600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663314a522e8f6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156110ee57600080fd5b6102c65a03f115156110ff57600080fd5b505050604051805190509b506111148c610e90565b809b50819c50829d50839e50849f505050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d23c4c76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156111b657600080fd5b6102c65a03f115156111c757600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16635715c5b78c6000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561124757600080fd5b6102c65a03f1151561125857600080fd5b505050604051805190509550600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16141515156112a057600080fd5b6004808111156112ac57fe5b88111515156112ba57600080fd5b8760048111156112c657fe5b94506112d1856115da565b9350600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561136157600080fd5b6102c65a03f1151561137257600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663d69dbf638f6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156113fa57600080fd5b6102c65a03f1151561140b57600080fd5b50505060405180519050925061142a848861156790919063ffffffff16565b915061143f83836114a990919063ffffffff16565b905060e0604051908101604052808773ffffffffffffffffffffffffffffffffffffffff1681526020018b815260200184815260200182815260200186600481111561148757fe5b81526020018881526020018a8152509c50505050505050505050505050919050565b60008082840190508381101515156114bd57fe5b8091505092915050565b6000806114fc6064612710026114ee8560c00151866020015161156790919063ffffffff16565b6115a290919063ffffffff16565b90506115158184602001516114a990919063ffffffff16565b915050919050565b60008060006115398460400151866116c790919063ffffffff16565b915061154884608001516115da565b905061155d81836115a290919063ffffffff16565b9250505092915050565b600080600084141561157c576000915061159b565b828402905082848281151561158d57fe5b0414151561159757fe5b8091505b5092915050565b60008082848115156115b057fe5b0490508091505092915050565b60008160020a83600190048115156115d157fe5b04905092915050565b60008060048111156115e857fe5b8260048111156115f457fe5b141561160457610e1090506116c2565b6001600481111561161157fe5b82600481111561161d57fe5b1415611630576018610e100290506116c2565b6002600481111561163d57fe5b82600481111561164957fe5b141561165f5760076018610e10020290506116c2565b6003600481111561166c57fe5b82600481111561167857fe5b141561168e57601e6018610e10020290506116c2565b60048081111561169a57fe5b8260048111156116a657fe5b14156116bd5761016d6018610e10020290506116c2565b600080fd5b919050565b60008282111515156116d557fe5b818303905092915050565b60e060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600081526020016000600481111561172b57fe5b8152602001600081526020016000815250905600a165627a7a7230582015d8c2fa565deace648d986e19b0648d2d92ea39ca6a9f59110808654cfeb02e0029", + "deployedBytecode": "0x6060604052600436106100e6576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a896a1146100eb5780630776298214610126578063208638941461014f5780632762dd8c1461017857806340018a0d146101b35780635f0280ba146101dc5780636f69c96f146102815780638b47e58a146102aa57806393529cdf146102d3578063977a5e64146102fc57806399114d841461035a578063abf410e51461039e578063de53a13c146103f3578063ed8907d71461041c578063fd127a4114610473578063fd40d52e1461049c575b600080fd5b34156100f657600080fd5b6101106004808035600019169060200190919050506104d7565b6040518082815260200191505060405180910390f35b341561013157600080fd5b6101396104fb565b6040518082815260200191505060405180910390f35b341561015a57600080fd5b610162610504565b6040518082815260200191505060405180910390f35b341561018357600080fd5b61019d600480803560001916906020019091905050610510565b6040518082815260200191505060405180910390f35b34156101be57600080fd5b6101c6610532565b6040518082815260200191505060405180910390f35b34156101e757600080fd5b61026760048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061053e565b604051808215151515815260200191505060405180910390f35b341561028c57600080fd5b6102946107b3565b6040518082815260200191505060405180910390f35b34156102b557600080fd5b6102bd6107b9565b6040518082815260200191505060405180910390f35b34156102de57600080fd5b6102e66107be565b6040518082815260200191505060405180910390f35b341561030757600080fd5b61034060048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506107c4565b604051808215151515815260200191505060405180910390f35b341561036557600080fd5b610388600480803560001916906020019091908035906020019091905050610c55565b6040518082815260200191505060405180910390f35b34156103a957600080fd5b6103b1610e61565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103fe57600080fd5b610406610e87565b6040518082815260200191505060405180910390f35b341561042757600080fd5b610441600480803560001916906020019091905050610e90565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b341561047e57600080fd5b610486610f88565b6040518082815260200191505060405180910390f35b34156104a757600080fd5b6104c1600480803560001916906020019091905050610f95565b6040518082815260200191505060405180910390f35b60008060008360001916600019168152602001908152602001600020549050919050565b6018610e100281565b601e6018610e10020281565b600061051a6116e0565b61052383610fad565b90508060600151915050919050565b60076018610e10020281565b60006105486116e0565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636fa9d0566000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156105d657600080fd5b6102c65a03f115156105e757600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561062a57600080fd5b61063387610fad565b9050806000015173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107a45761069a846000808a60001916600019168152602001908152602001600020546114a990919063ffffffff16565b6000808960001916600019168152602001908152602001600020819055507ff1a888d220228f843ac3044ef257c80642e6434d1ddc7ebee0a2813cced3406c87878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405180910390a1600191506107a9565b600091505b5095945050505050565b610e1081565b600581565b61271081565b6000806000806000806000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663079dd4b76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561086057600080fd5b6102c65a03f1151561087157600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108b457600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561094257600080fd5b6102c65a03f1151561095357600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16636be39bda8c6000604051604001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082600019166000191681526020019150506040805180830381600087803b15156109da57600080fd5b6102c65a03f115156109eb57600080fd5b505050604051805190602001805190508098508199505050610a0c87610e90565b809650819750829850839950849a505050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d23c4c76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610aae57600080fd5b6102c65a03f11515610abf57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16635715c5b7876000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515610b3f57600080fd5b6102c65a03f11515610b5057600080fd5b505050604051805190509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015610b995750600583105b8015610bd057503073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b15610c4257828173ffffffffffffffffffffffffffffffffffffffff168c600019167f2c500aaec6833a053693d8c2a18a3ed5649a4609699abaf7778c3d389cc40c0588888760405180848152602001838152602001828152602001935050505060405180910390a460019850610c47565b600098505b505050505050505092915050565b6000610c5f6116e0565b60008085600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610cf157600080fd5b6102c65a03f11515610d0257600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663f6f494c9826000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610d8a57600080fd5b6102c65a03f11515610d9b57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16141515610dde57600080fd5b610de787610fad565b9350610df2846114c7565b9250836040015186111515610e0a5760009450610e57565b836060015186101515610e1f57829450610e57565b610e29868561151d565b9150610e548460a00151610e46848661156790919063ffffffff16565b6115a290919063ffffffff16565b94505b5050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60646127100281565b6000806000806000806000806000807fff000000000000000000000000000000000000000000000000000000000000006001028b1694507effffffffffffffffffffffff000000000000000000000000000000000000006001028b16935072ffffff000000000000000000000000000000006001028b1692506ff00000000000000000000000000000006001028b1691506f0ffff0000000000000000000000000006001028b169050610f448560f86115bd565b610f4f8560986115bd565b610f5a8560806115bd565b610f6585607c6115bd565b610f7085606c6115bd565b99509950995099509950505050505091939590929450565b61016d6018610e10020281565b60006020528060005260406000206000915090505481565b610fb56116e0565b600080600080600080600080600080600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561105557600080fd5b6102c65a03f1151561106657600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663314a522e8f6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156110ee57600080fd5b6102c65a03f115156110ff57600080fd5b505050604051805190509b506111148c610e90565b809b50819c50829d50839e50849f505050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d23c4c76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156111b657600080fd5b6102c65a03f115156111c757600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16635715c5b78c6000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561124757600080fd5b6102c65a03f1151561125857600080fd5b505050604051805190509550600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16141515156112a057600080fd5b6004808111156112ac57fe5b88111515156112ba57600080fd5b8760048111156112c657fe5b94506112d1856115da565b9350600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561136157600080fd5b6102c65a03f1151561137257600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663d69dbf638f6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156113fa57600080fd5b6102c65a03f1151561140b57600080fd5b50505060405180519050925061142a848861156790919063ffffffff16565b915061143f83836114a990919063ffffffff16565b905060e0604051908101604052808773ffffffffffffffffffffffffffffffffffffffff1681526020018b815260200184815260200182815260200186600481111561148757fe5b81526020018881526020018a8152509c50505050505050505050505050919050565b60008082840190508381101515156114bd57fe5b8091505092915050565b6000806114fc6064612710026114ee8560c00151866020015161156790919063ffffffff16565b6115a290919063ffffffff16565b90506115158184602001516114a990919063ffffffff16565b915050919050565b60008060006115398460400151866116c790919063ffffffff16565b915061154884608001516115da565b905061155d81836115a290919063ffffffff16565b9250505092915050565b600080600084141561157c576000915061159b565b828402905082848281151561158d57fe5b0414151561159757fe5b8091505b5092915050565b60008082848115156115b057fe5b0490508091505092915050565b60008160020a83600190048115156115d157fe5b04905092915050565b60008060048111156115e857fe5b8260048111156115f457fe5b141561160457610e1090506116c2565b6001600481111561161157fe5b82600481111561161d57fe5b1415611630576018610e100290506116c2565b6002600481111561163d57fe5b82600481111561164957fe5b141561165f5760076018610e10020290506116c2565b6003600481111561166c57fe5b82600481111561167857fe5b141561168e57601e6018610e10020290506116c2565b60048081111561169a57fe5b8260048111156116a657fe5b14156116bd5761016d6018610e10020290506116c2565b600080fd5b919050565b60008282111515156116d557fe5b818303905092915050565b60e060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600081526020016000600481111561172b57fe5b8152602001600081526020016000815250905600a165627a7a7230582015d8c2fa565deace648d986e19b0648d2d92ea39ca6a9f59110808654cfeb02e0029", "sourceMap": "702:16668:16:-;;;3408:168;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3551:17;3515:16;;:54;;;;;;;;;;;;;;;;;;3408:168;702:16668;;;;;;", "deployedSourceMap": "702:16668:16:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9334:167;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1532:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1687:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12303:235;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1610:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6636:742;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1473:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;860:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2025:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4229:1696;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7987:1066;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2492:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2329:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9507:2790;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1766:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2441:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9334:167;9430:17;9470:11;:24;9482:11;9470:24;;;;;;;;;;;;;;;;;;9463:31;;9334:167;;;:::o;1532:72::-;1602:2;1519:7;1577:27;1532:72;:::o;1687:73::-;1758:2;1602;1519:7;1577:27;1734:26;1687:73;:::o;12303:235::-;12389:4;12409:34;;:::i;:::-;12446:40;12473:12;12446:26;:40::i;:::-;12409:77;;12504:6;:27;;;12497:34;;12303:235;;;;:::o;1610:71::-;1680:1;1602:2;1519:7;1577:27;1656:25;1610:71;:::o;6636:742::-;6865:13;6894:34;;:::i;:::-;3051:16;;;;;;;;;;;:32;;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3029:57;;:10;:57;;;3021:66;;;;;;;;6931:39;6958:11;6931:26;:39::i;:::-;6894:76;;7001:6;:28;;;6985:44;;:12;:44;;;6981:368;;;7072:46;7101:16;7072:11;:24;7084:11;7072:24;;;;;;;;;;;;;;;;;;:28;;:46;;;;:::i;:::-;7045:11;:24;7057:11;7045:24;;;;;;;;;;;;;;;;;:73;;;;7133:179;7171:11;7200:5;7223:11;7252:16;7286:12;7133:179;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7334:4;7327:11;;;;6981:368;7366:5;7359:12;;3097:1;6636:742;;;;;;;;:::o;1473:53::-;1519:7;1473:53;:::o;860:52::-;911:1;860:52;:::o;2025:67::-;2085:7;2025:67;:::o;4229:1696::-;4370:13;4399:21;4430:31;4579:24;4613:20;4643:17;4670:25;4705:34;4931:29;3353:16;;;;;;;;;;;:27;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3331:52;;:10;:52;;;3323:61;;;;;;;;4515:16;;;;;;;;;;;:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:40;;;4556:11;4515:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4472:96;;;;;;;;4870:50;4896:23;4870:25;:50::i;:::-;4750:170;;;;;;;;;;;;;;;;;;;;4975:16;;;;;;;;;;;:30;;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:55;;;5031:19;4975:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4931:120;;5473:1;5440:35;;:21;:35;;;;:101;;;;;911:1;5491:20;:50;5440:101;:147;;;;;5582:4;5557:30;;:13;:30;;;5440:147;5436:460;;;5778:20;5676:21;5603:256;;5647:11;5603:256;;;;5715:15;5748:12;5816:29;5603:256;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5881:4;5874:11;;;;5436:460;5913:5;5906:12;;3394:1;4229:1696;;;;;;;;;;;;:::o;7987:1066::-;8175:28;8219:34;;:::i;:::-;8305:26;8871:13;8145:11;3201:16;;;;;;;;;;;:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:48;;;3250:11;3201:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3184:78;;3192:4;3184:78;;;3176:87;;;;;;;;8256:39;8283:11;8256:26;:39::i;:::-;8219:76;;8334:43;8370:6;8334:35;:43::i;:::-;8305:72;;8405:6;:29;;;8392:9;:42;;8388:659;;;8587:1;8580:8;;;;8388:659;8622:6;:27;;;8609:9;:40;;8605:442;;;8819:21;8812:28;;;;8605:442;8887:51;8920:9;8931:6;8887:32;:51::i;:::-;8871:67;;8959:77;8999:6;:36;;;8959:35;8985:8;8959:21;:25;;:35;;;;:::i;:::-;:39;;:77;;;;:::i;:::-;8952:84;;3273:1;7987:1066;;;;;;;;:::o;2492:40::-;;;;;;;;;;;;;:::o;2329:105::-;2431:3;2085:7;2392:42;2329:105;:::o;9507:2790::-;9620:25;9659:21;9694:18;9726:26;9766:35;9940:34;10160:30;10372:27;10588:35;10845:44;10002:66;9989:79;;:10;:79;9940:128;;10218:66;10205:79;;:10;:79;10160:124;;10427:66;10414:79;;:10;:79;10372:121;;10651:66;10638:79;;:10;:79;10588:129;;10917:66;10904:79;;:10;:79;10845:138;;11994:46;12008:26;12036:3;11994:13;:46::i;:::-;12054:42;12068:22;12092:3;12054:13;:42::i;:::-;12110:39;12124:19;12145:3;12110:13;:39::i;:::-;12163:47;12177:27;12206:3;12163:13;:47::i;:::-;12224:56;12238:36;12276:3;12224:13;:56::i;:::-;11973:317;;;;;;;;;;9507:2790;;;;;;;;;;;;:::o;1766:73::-;1836:3;1602:2;1519:7;1577:27;1812;1766:73;:::o;2441:44::-;;;;;;;;;;;;;;;;;:::o;14136:2420::-;14241:27;;:::i;:::-;14284:18;14467:24;14574:20;14664:17;14782:28;14917:34;15133:29;15568:41;15668:36;15785:27;15907:24;16022:25;14305:16;;;;;;;;;;;:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:58;;;14364:11;14305:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14284:92;;15085:37;15111:10;15085:25;:37::i;:::-;14962:160;;;;;;;;;;;;;;;;;;;;15177:16;;;;;;;;;;;:30;;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:55;;;15233:19;15177:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15133:120;;15373:1;15340:35;;:21;:35;;;;15332:44;;;;;;;;15529:26;15524:32;;;;;;;;15497:23;:59;;15489:68;;;;;;;;15633:23;15612:45;;;;;;;;15568:89;;15719:56;15754:20;15719:34;:56::i;:::-;15668:107;;15827:16;;;;;;;;;;;:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:57;;;15885:11;15827:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15785:112;;15946:66;15980:31;15946:29;:33;;:66;;;;:::i;:::-;15907:105;;16062:47;16086:22;16062:19;:23;;:47;;;;:::i;:::-;16022:87;;16127:422;;;;;;;;;16185:21;16127:422;;;;;;16237:15;16127:422;;;;16330:22;16127:422;;;;16388:20;16127:422;;;;16444:20;16127:422;;;;;;;;;;;;16509:29;16127:422;;;;16280:12;16127:422;;;16120:429;;14136:2420;;;;;;;;;;;;;;;:::o;1007:129:38:-;1065:7;1080:9;1096:1;1092;:5;1080:17;;1115:1;1110;:6;;1103:14;;;;;;1130:1;1123:8;;1007:129;;;;;:::o;13492:638:16:-;13614:27;13925:18;13946:118;2431:3;2085:7;2392:42;13946:60;13986:6;:19;;;13946:6;:22;;;:39;;:60;;;;:::i;:::-;:77;;:118;;;;:::i;:::-;13925:139;;14082:41;14109:13;14082:6;:22;;;:26;;:41;;;;:::i;:::-;14075:48;;13492:638;;;;:::o;12707:404::-;12850:10;12876;12943:36;12889:44;12903:6;:29;;;12889:9;:13;;:44;;;;:::i;:::-;12876:57;;12982:63;13017:6;:27;;;12982:34;:63::i;:::-;12943:102;;13062:42;13072:31;13062:5;:9;;:42;;;;:::i;:::-;13055:49;;12707:404;;;;;;:::o;203:173:38:-;261:7;316:9;285:1;280;:6;276:35;;;303:1;296:8;;;;276:35;332:1;328;:5;316:17;;355:1;350;346;:5;;;;;;;;:10;339:18;;;;;;370:1;363:8;;203:173;;;;;;:::o;458:265::-;516:7;605:9;621:1;617;:5;;;;;;;;605:17;;717:1;710:8;;458:265;;;;;:::o;12544:157:16:-;12642:4;12688:6;12683:1;:11;12674:5;12669:11;;;:25;;;;;;;;12662:32;;12544:157;;;;:::o;16562:806::-;16696:37;16777:26;16753:50;;;;;;;;:20;:50;;;;;;;;;16749:613;;;1519:7;16819:29;;;;16749:613;16893:25;16869:49;;;;;;;;:20;:49;;;;;;;;;16865:497;;;1602:2;1519:7;1577:27;16934:28;;;;16865:497;17007:26;16983:50;;;;;;;;:20;:50;;;;;;;;;16979:383;;;1680:1;1602:2;1519:7;1577:27;1656:25;17049:29;;;;16979:383;17123:27;17099:51;;;;;;;;:20;:51;;;;;;;;;17095:267;;;1758:2;1602;1519:7;1577:27;1734:26;17166:30;;;;17095:267;17241:26;17217:50;;;;;;;;:20;:50;;;;;;;;;17213:149;;;1836:3;1602:2;1519:7;1577:27;1812;17283:29;;;;17213:149;17343:8;;;16562:806;;;;:::o;835:110:38:-;893:7;920:1;915;:6;;908:14;;;;;;939:1;935;:5;928:12;;835:110;;;;:::o;702:16668:16:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\nimport \"zeppelin-solidity/contracts/math/SafeMath.sol\";\n\nimport \"../ContractRegistry.sol\";\n\n\ncontract SimpleInterestTermsContract is TermsContract {\n using SafeMath for uint;\n\n enum AmortizationUnitType { HOURS, DAYS, WEEKS, MONTHS, YEARS }\n uint public constant NUM_AMORTIZATION_UNIT_TYPES = 5;\n\n struct SimpleInterestParams {\n address principalTokenAddress;\n uint principalAmount;\n uint termStartUnixTimestamp;\n uint termEndUnixTimestamp;\n AmortizationUnitType amortizationUnitType;\n uint termLengthInAmortizationUnits;\n\n // Given that Solidity does not support floating points, we encode\n // interest rates as percentages scaled up by a factor of 10,000\n // As such, interest rates can, at a maximum, have 4 decimal places\n // of precision.\n uint interestRate;\n }\n\n uint public constant HOUR_LENGTH_IN_SECONDS = 60 * 60;\n uint public constant DAY_LENGTH_IN_SECONDS = HOUR_LENGTH_IN_SECONDS * 24;\n uint public constant WEEK_LENGTH_IN_SECONDS = DAY_LENGTH_IN_SECONDS * 7;\n uint public constant MONTH_LENGTH_IN_SECONDS = DAY_LENGTH_IN_SECONDS * 30;\n uint public constant YEAR_LENGTH_IN_SECONDS = DAY_LENGTH_IN_SECONDS * 365;\n\n // To convert an encoded interest rate into its equivalent in percents,\n // divide it by INTEREST_RATE_SCALING_FACTOR_PERCENT -- e.g.\n // 10,000 => 1% interest rate\n uint public constant INTEREST_RATE_SCALING_FACTOR_PERCENT = 10 ** 4;\n // To convert an encoded interest rate into its equivalent multiplier\n // (for purposes of calculating total interest), divide it by INTEREST_RATE_SCALING_FACTOR_PERCENT -- e.g.\n // 10,000 => 0.01 interest multiplier\n uint public constant INTEREST_RATE_SCALING_FACTOR_MULTIPLIER = INTEREST_RATE_SCALING_FACTOR_PERCENT * 100;\n\n mapping (bytes32 => uint) public valueRepaid;\n\n ContractRegistry public contractRegistry;\n\n event LogSimpleInterestTermStart(\n bytes32 indexed agreementId,\n address indexed principalToken,\n uint principalAmount,\n uint interestRate,\n uint indexed amortizationUnitType,\n uint termLengthInAmortizationUnits\n );\n\n event LogRegisterRepayment(\n bytes32 agreementId,\n address payer,\n address beneficiary,\n uint256 unitsOfRepayment,\n address tokenAddress\n );\n\n modifier onlyRouter() {\n require(msg.sender == address(contractRegistry.repaymentRouter()));\n _;\n }\n\n modifier onlyMappedToThisContract(bytes32 agreementId) {\n require(address(this) == contractRegistry.debtRegistry().getTermsContract(agreementId));\n _;\n }\n\n modifier onlyDebtKernel() {\n require(msg.sender == address(contractRegistry.debtKernel()));\n _;\n }\n\n function SimpleInterestTermsContract(\n address _contractRegistry\n )\n public\n {\n contractRegistry = ContractRegistry(_contractRegistry);\n }\n\n /// When called, the registerTermStart function registers the fact that\n /// the debt agreement has begun. Given that the SimpleInterestTermsContract\n /// doesn't rely on taking any sorts of actions when the loan term begins,\n /// we simply validate DebtKernel is the transaction sender, and return\n /// `true` if the debt agreement is associated with this terms contract.\n /// @param agreementId bytes32. The agreement id (issuance hash) of the debt agreement to which this pertains.\n /// @param debtor address. The debtor in this particular issuance.\n /// @return _success bool. Acknowledgment of whether\n function registerTermStart(\n bytes32 agreementId,\n address debtor\n )\n public\n onlyDebtKernel\n returns (bool _success)\n {\n address termsContract;\n bytes32 termsContractParameters;\n\n (termsContract, termsContractParameters) = contractRegistry.debtRegistry().getTerms(agreementId);\n\n uint principalTokenIndex;\n uint principalAmount;\n uint interestRate;\n uint amortizationUnitType;\n uint termLengthInAmortizationUnits;\n\n (principalTokenIndex, principalAmount, interestRate, amortizationUnitType, termLengthInAmortizationUnits) =\n unpackParametersFromBytes(termsContractParameters);\n\n address principalTokenAddress =\n contractRegistry.tokenRegistry().getTokenAddressByIndex(principalTokenIndex);\n\n // Returns true (i.e. valid) if the specified principal token is valid,\n // the specified amortization unit type is valid, and the terms contract\n // associated with the agreement is this one. We need not check\n // if any of the other simple interest parameters are valid, because\n // it is impossible to encode invalid values for them.\n if (principalTokenAddress != address(0) &&\n amortizationUnitType < NUM_AMORTIZATION_UNIT_TYPES &&\n termsContract == address(this)) {\n LogSimpleInterestTermStart(\n agreementId,\n principalTokenAddress,\n principalAmount,\n interestRate,\n amortizationUnitType,\n termLengthInAmortizationUnits\n );\n\n return true;\n }\n\n return false;\n }\n\n /// When called, the registerRepayment function records the debtor's\n /// repayment, as well as any auxiliary metadata needed by the contract\n /// to determine ex post facto the value repaid (e.g. current USD\n /// exchange rate)\n /// @param agreementId bytes32. The agreement id (issuance hash) of the debt agreement to which this pertains.\n /// @param payer address. The address of the payer.\n /// @param beneficiary address. The address of the payment's beneficiary.\n /// @param unitsOfRepayment uint. The units-of-value repaid in the transaction.\n /// @param tokenAddress address. The address of the token with which the repayment transaction was executed.\n function registerRepayment(\n bytes32 agreementId,\n address payer,\n address beneficiary,\n uint256 unitsOfRepayment,\n address tokenAddress\n )\n public\n onlyRouter\n returns (bool _success)\n {\n SimpleInterestParams memory params = unpackParamsForAgreementID(agreementId);\n\n if (tokenAddress == params.principalTokenAddress) {\n valueRepaid[agreementId] = valueRepaid[agreementId].add(unitsOfRepayment);\n\n LogRegisterRepayment(\n agreementId,\n payer,\n beneficiary,\n unitsOfRepayment,\n tokenAddress\n );\n\n return true;\n }\n\n return false;\n }\n\n /// Returns the cumulative units-of-value expected to be repaid given a block's timestamp.\n /// Note this is not a constant function -- this value can vary on basis of any number of\n /// conditions (e.g. interest rates can be renegotiated if repayments are delinquent).\n /// @param agreementId bytes32. The agreement id (issuance hash) of the debt agreement to which this pertains.\n /// @param timestamp uint. The timestamp for which repayment expectation is being queried.\n /// @return uint256 The cumulative units-of-value expected to be repaid given a block's timestamp.\n function getExpectedRepaymentValue(\n bytes32 agreementId,\n uint256 timestamp\n )\n public\n view\n onlyMappedToThisContract(agreementId)\n returns (uint _expectedRepaymentValue)\n {\n SimpleInterestParams memory params = unpackParamsForAgreementID(agreementId);\n uint principalPlusInterest = calculateTotalPrincipalPlusInterest(params);\n\n if (timestamp <= params.termStartUnixTimestamp) {\n /* The query occurs before the contract was even initialized so the\n expected value of repayments is 0. */\n return 0;\n } else if (timestamp >= params.termEndUnixTimestamp) {\n /* the query occurs beyond the contract's term, so the expected\n value of repayment is the full principal plus interest. */\n return principalPlusInterest;\n } else {\n uint numUnits = numAmortizationUnitsForTimestamp(timestamp, params);\n return principalPlusInterest.mul(numUnits).div(params.termLengthInAmortizationUnits);\n }\n }\n\n /// Returns the cumulative units-of-value repaid to date.\n /// @param agreementId bytes32. The agreement id (issuance hash) of the debt agreement to which this pertains.\n /// @return uint256 The cumulative units-of-value repaid by the specified block timestamp.\n function getValueRepaidToDate(bytes32 agreementId)\n public\n view\n returns (uint _valueRepaid)\n {\n return valueRepaid[agreementId];\n }\n\n function unpackParametersFromBytes(bytes32 parameters)\n public\n pure\n returns (\n uint _principalTokenIndex,\n uint _principalAmount,\n uint _interestRate,\n uint _amortizationUnitType,\n uint _termLengthInAmortizationUnits\n )\n {\n // The first byte of the parameters encodes the principal token's index in the\n // token registry.\n bytes32 principalTokenIndexShifted =\n parameters & 0xff00000000000000000000000000000000000000000000000000000000000000;\n // The subsequent 12 bytes of the parameters encode the principal amount.\n bytes32 principalAmountShifted =\n parameters & 0x00ffffffffffffffffffffffff00000000000000000000000000000000000000;\n // The subsequent 3 bytes of the parameters encode the interest rate.\n bytes32 interestRateShifted =\n parameters & 0x00000000000000000000000000ffffff00000000000000000000000000000000;\n // The subsequent 4 bits (half byte) encode the amortization unit type code.\n bytes32 amortizationUnitTypeShifted =\n parameters & 0x00000000000000000000000000000000f0000000000000000000000000000000;\n // The subsequent 2 bytes encode the term length, as denominated in\n // the encoded amortization unit.\n bytes32 termLengthInAmortizationUnitsShifted =\n parameters & 0x000000000000000000000000000000000ffff000000000000000000000000000;\n\n // Note that the remaining 108 bits are reserved for any parameters relevant to a\n // collateralized terms contracts.\n\n /*\n We then bit shift left each of these values so that the 32-byte uint\n counterpart correctly represents the value that was originally packed\n into the 32 byte string.\n\n The below chart summarizes where in the 32 byte string each value\n terminates -- which indicates the extent to which each value must be bit\n shifted left.\n\n Location (bytes)\tLocation (bits)\n 32 256\n principalTokenIndex\t 31\t 248\n principalAmount\t 19 152\n interestRate 16 128\n amortizationUnitType 15.5 124\n termLengthInAmortizationUnits 13.5 108\n */\n return (\n bitShiftRight(principalTokenIndexShifted, 248),\n bitShiftRight(principalAmountShifted, 152),\n bitShiftRight(interestRateShifted, 128),\n bitShiftRight(amortizationUnitTypeShifted, 124),\n bitShiftRight(termLengthInAmortizationUnitsShifted, 108)\n );\n }\n\n function getTermEndTimestamp(\n bytes32 _agreementId\n ) public view returns (uint)\n {\n SimpleInterestParams memory params = unpackParamsForAgreementID(_agreementId);\n\n return params.termEndUnixTimestamp;\n }\n\n function bitShiftRight(bytes32 value, uint amount)\n internal\n pure\n returns (uint)\n {\n return uint(value) / 2 ** amount;\n }\n\n function numAmortizationUnitsForTimestamp(\n uint timestamp,\n SimpleInterestParams params\n )\n internal\n returns (uint units)\n {\n uint delta = timestamp.sub(params.termStartUnixTimestamp);\n uint amortizationUnitLengthInSeconds = getAmortizationUnitLengthInSeconds(params.amortizationUnitType);\n return delta.div(amortizationUnitLengthInSeconds);\n }\n\n /**\n * Calculates the total repayment value expected at the end of the loan's term.\n *\n * This computation assumes that interest is paid per amortization period.\n *\n * @param params SimpleInterestParams. The parameters that define the simple interest loan.\n * @return uint The total repayment value expected at the end of the loan's term.\n */\n function calculateTotalPrincipalPlusInterest(\n SimpleInterestParams params\n )\n internal\n returns (uint _principalPlusInterest)\n {\n // Since we represent decimal interest rates using their\n // scaled-up, fixed point representation, we have to\n // downscale the result of the interest payment computation\n // by the multiplier scaling factor we choose for interest rates.\n uint totalInterest = params.principalAmount\n .mul(params.interestRate)\n .div(INTEREST_RATE_SCALING_FACTOR_MULTIPLIER);\n\n return params.principalAmount.add(totalInterest);\n }\n\n function unpackParamsForAgreementID(\n bytes32 agreementId\n )\n internal\n returns (SimpleInterestParams params)\n {\n bytes32 parameters = contractRegistry.debtRegistry().getTermsContractParameters(agreementId);\n\n // Index of the token used for principal payments in the Token Registry\n uint principalTokenIndex;\n // The principal amount denominated in the aforementioned token.\n uint principalAmount;\n // The interest rate accrued per amortization unit.\n uint interestRate;\n // The amortization unit in which the repayments installments schedule is defined.\n uint rawAmortizationUnitType;\n // The debt's entire term's length, denominated in the aforementioned amortization units\n uint termLengthInAmortizationUnits;\n\n (principalTokenIndex, principalAmount, interestRate, rawAmortizationUnitType, termLengthInAmortizationUnits) =\n unpackParametersFromBytes(parameters);\n\n address principalTokenAddress =\n contractRegistry.tokenRegistry().getTokenAddressByIndex(principalTokenIndex);\n\n // Ensure that the encoded principal token address is valid\n require(principalTokenAddress != address(0));\n\n // Before we cast to `AmortizationUnitType`, ensure that the raw value being stored is valid.\n require(rawAmortizationUnitType <= uint(AmortizationUnitType.YEARS));\n\n AmortizationUnitType amortizationUnitType = AmortizationUnitType(rawAmortizationUnitType);\n\n uint amortizationUnitLengthInSeconds =\n getAmortizationUnitLengthInSeconds(amortizationUnitType);\n uint issuanceBlockTimestamp =\n contractRegistry.debtRegistry().getIssuanceBlockTimestamp(agreementId);\n uint termLengthInSeconds =\n termLengthInAmortizationUnits.mul(amortizationUnitLengthInSeconds);\n uint termEndUnixTimestamp =\n termLengthInSeconds.add(issuanceBlockTimestamp);\n\n return SimpleInterestParams({\n principalTokenAddress: principalTokenAddress,\n principalAmount: principalAmount,\n interestRate: interestRate,\n termStartUnixTimestamp: issuanceBlockTimestamp,\n termEndUnixTimestamp: termEndUnixTimestamp,\n amortizationUnitType: amortizationUnitType,\n termLengthInAmortizationUnits: termLengthInAmortizationUnits\n });\n }\n\n function getAmortizationUnitLengthInSeconds(AmortizationUnitType amortizationUnitType)\n internal\n pure\n returns (uint _amortizationUnitLengthInSeconds)\n {\n if (amortizationUnitType == AmortizationUnitType.HOURS) {\n return HOUR_LENGTH_IN_SECONDS;\n } else if (amortizationUnitType == AmortizationUnitType.DAYS) {\n return DAY_LENGTH_IN_SECONDS;\n } else if (amortizationUnitType == AmortizationUnitType.WEEKS) {\n return WEEK_LENGTH_IN_SECONDS;\n } else if (amortizationUnitType == AmortizationUnitType.MONTHS) {\n return MONTH_LENGTH_IN_SECONDS;\n } else if (amortizationUnitType == AmortizationUnitType.YEARS) {\n return YEAR_LENGTH_IN_SECONDS;\n } else {\n revert();\n }\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/examples/SimpleInterestTermsContract.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/examples/SimpleInterestTermsContract.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/examples/SimpleInterestTermsContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/examples/SimpleInterestTermsContract.sol", "exportedSymbols": { "SimpleInterestTermsContract": [ 6052 @@ -427,7 +427,7 @@ { "attributes": { "SourceUnit": 924, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/ContractRegistry.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/ContractRegistry.sol", "file": "../ContractRegistry.sol", "scope": 6053, "symbolAliases": [ @@ -10512,7 +10512,7 @@ "42": { "events": {}, "links": {}, - "address": "0xe929d2b2fdd53531b8e11d85a4c249e504dd5868" + "address": "0x1cde816b6e0437f5b1b49edb58c4a8bf1dbda2d3" }, "70": { "events": {}, @@ -10521,5 +10521,5 @@ } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:13:36.862Z" + "updatedAt": "2018-10-09T17:50:25.381Z" } \ No newline at end of file diff --git a/artifacts/json/SiringClockAuction.json b/artifacts/json/SiringClockAuction.json index e900ca4a..0f127197 100644 --- a/artifacts/json/SiringClockAuction.json +++ b/artifacts/json/SiringClockAuction.json @@ -337,15 +337,15 @@ "type": "event" } ], - "bytecode": "0x606060405260008060146101000a81548160ff0219169083151502179055506001600460006101000a81548160ff021916908315150217905550341561004457600080fd5b6040516040806117928339810160405280805190602001909190805190602001909190505081816000336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061271082111515156100be57600080fd5b816002819055508290508073ffffffffffffffffffffffffffffffffffffffff166301ffc9a7639a20483d7c0100000000000000000000000000000000000000000000000000000000026000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001915050602060405180830381600087803b15156101a057600080fd5b6102c65a03f115156101b157600080fd5b5050506040518051905015156101c657600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050506115778061021b6000396000f3006060604052600436106100db576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806327ebe40a146100e05780633f4ba83a1461013d578063454a2ab31461016a5780635c975abb146101825780635fd8c710146101af57806376190f8f146101c457806378bd7935146101f157806383b5ff8b146102705780638456cb5914610299578063878eb368146102c65780638da5cb5b146102e957806396b5a7551461033e578063c55d0f5614610361578063dd1b7a0f14610398578063f2fde38b146103ed575b600080fd5b34156100eb57600080fd5b61013b600480803590602001909190803590602001909190803590602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610426565b005b341561014857600080fd5b610150610576565b604051808215151515815260200191505060405180910390f35b610180600480803590602001909190505061063b565b005b341561018d57600080fd5b6101956106eb565b604051808215151515815260200191505060405180910390f35b34156101ba57600080fd5b6101c26106fe565b005b34156101cf57600080fd5b6101d7610809565b604051808215151515815260200191505060405180910390f35b34156101fc57600080fd5b610212600480803590602001909190505061081c565b604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b341561027b57600080fd5b61028361093f565b6040518082815260200191505060405180910390f35b34156102a457600080fd5b6102ac610945565b604051808215151515815260200191505060405180910390f35b34156102d157600080fd5b6102e76004808035906020019091905050610a0c565b005b34156102f457600080fd5b6102fc610ade565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561034957600080fd5b61035f6004808035906020019091905050610b03565b005b341561036c57600080fd5b6103826004808035906020019091905050610b9f565b6040518082815260200191505060405180910390f35b34156103a357600080fd5b6103ab610bdc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103f857600080fd5b610424600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610c02565b005b61042e6114cd565b846fffffffffffffffffffffffffffffffff168514151561044e57600080fd5b836fffffffffffffffffffffffffffffffff168414151561046e57600080fd5b8267ffffffffffffffff168314151561048657600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156104e257600080fd5b6104ec8287610cd7565b60a0604051908101604052808373ffffffffffffffffffffffffffffffffffffffff168152602001866fffffffffffffffffffffffffffffffff168152602001856fffffffffffffffffffffffffffffffff1681526020018467ffffffffffffffff1681526020014267ffffffffffffffff16815250905061056e8682610de7565b505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156105d357600080fd5b600060149054906101000a900460ff1615156105ee57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a16001905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561069957600080fd5b6003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506106dc8234610fcc565b506106e7818361116b565b5050565b600060149054906101000a900460ff1681565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806107ac57508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156107b757600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505090505050565b600460009054906101000a900460ff1681565b60008060008060008060036000888152602001908152602001600020905061084381611247565b151561084e57600080fd5b8060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a90046fffffffffffffffffffffffffffffffff168260010160109054906101000a90046fffffffffffffffffffffffffffffffff168360020160009054906101000a900467ffffffffffffffff168460020160089054906101000a900467ffffffffffffffff16836fffffffffffffffffffffffffffffffff169350826fffffffffffffffffffffffffffffffff1692508167ffffffffffffffff1691508067ffffffffffffffff169050955095509550955095505091939590929450565b60025481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156109a257600080fd5b600060149054906101000a900460ff161515156109be57600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a16001905090565b60008060149054906101000a900460ff161515610a2857600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a8357600080fd5b600360008381526020019081526020016000209050610aa181611247565b1515610aac57600080fd5b610ada828260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611275565b5050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600360008481526020019081526020016000209150610b2482611247565b1515610b2f57600080fd5b8160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610b9057600080fd5b610b9a8382611275565b505050565b600080600360008481526020019081526020016000209050610bc081611247565b1515610bcb57600080fd5b610bd4816112c3565b915050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610c5d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515610cd457806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8330846040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1515610dcf57600080fd5b6102c65a03f11515610de057600080fd5b5050505050565b603c816060015167ffffffffffffffff1610151515610e0557600080fd5b806003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060408201518160010160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160020160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050507fa9c8dfcda5664a5a124c713e386da27de87432d5b668e79458501eb296389ba78282602001516fffffffffffffffffffffffffffffffff1683604001516fffffffffffffffffffffffffffffffff16846060015167ffffffffffffffff166040518085815260200184815260200183815260200182815260200194505050505060405180910390a15050565b6000806000806000806000600360008a81526020019081526020016000209550610ff586611247565b151561100057600080fd5b611009866112c3565b945084881015151561101a57600080fd5b8560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16935061104a896113b6565b60008511156110a45761105c85611472565b925082850391508373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015156110a357600080fd5b5b84880390503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015156110e957600080fd5b7f4fcc30d90a842164dd58501ab874a101a3749c3d4747139cefe7c876f4ccebd2898633604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a184965050505050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b151561122f57600080fd5b6102c65a03f1151561124057600080fd5b5050505050565b6000808260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16119050919050565b61127e826113b6565b611288818361116b565b7f2809c7e17bf978fbc7194c0a694b638c4215e9140cacc6c38ca36010b45697df826040518082815260200191505060405180910390a15050565b600080600090508260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1642111561131c578260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16420390505b6113ae8360010160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168460010160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168560020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff168461148d565b915050919050565b60036000828152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160006101000a8154906fffffffffffffffffffffffffffffffff02191690556001820160106101000a8154906fffffffffffffffffffffffffffffffff02191690556002820160006101000a81549067ffffffffffffffff02191690556002820160086101000a81549067ffffffffffffffff0219169055505050565b6000612710600254830281151561148557fe5b049050919050565b60008060008085851015156114a4578693506114c2565b8787039250858584028115156114b657fe5b05915081880190508093505b505050949350505050565b60a060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff16815250905600a165627a7a7230582077092e47a5e90d456efea39c135a00d579d263816be12c8845ca68968b6feb610029", - "deployedBytecode": "0x6060604052600436106100db576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806327ebe40a146100e05780633f4ba83a1461013d578063454a2ab31461016a5780635c975abb146101825780635fd8c710146101af57806376190f8f146101c457806378bd7935146101f157806383b5ff8b146102705780638456cb5914610299578063878eb368146102c65780638da5cb5b146102e957806396b5a7551461033e578063c55d0f5614610361578063dd1b7a0f14610398578063f2fde38b146103ed575b600080fd5b34156100eb57600080fd5b61013b600480803590602001909190803590602001909190803590602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610426565b005b341561014857600080fd5b610150610576565b604051808215151515815260200191505060405180910390f35b610180600480803590602001909190505061063b565b005b341561018d57600080fd5b6101956106eb565b604051808215151515815260200191505060405180910390f35b34156101ba57600080fd5b6101c26106fe565b005b34156101cf57600080fd5b6101d7610809565b604051808215151515815260200191505060405180910390f35b34156101fc57600080fd5b610212600480803590602001909190505061081c565b604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b341561027b57600080fd5b61028361093f565b6040518082815260200191505060405180910390f35b34156102a457600080fd5b6102ac610945565b604051808215151515815260200191505060405180910390f35b34156102d157600080fd5b6102e76004808035906020019091905050610a0c565b005b34156102f457600080fd5b6102fc610ade565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561034957600080fd5b61035f6004808035906020019091905050610b03565b005b341561036c57600080fd5b6103826004808035906020019091905050610b9f565b6040518082815260200191505060405180910390f35b34156103a357600080fd5b6103ab610bdc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103f857600080fd5b610424600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610c02565b005b61042e6114cd565b846fffffffffffffffffffffffffffffffff168514151561044e57600080fd5b836fffffffffffffffffffffffffffffffff168414151561046e57600080fd5b8267ffffffffffffffff168314151561048657600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156104e257600080fd5b6104ec8287610cd7565b60a0604051908101604052808373ffffffffffffffffffffffffffffffffffffffff168152602001866fffffffffffffffffffffffffffffffff168152602001856fffffffffffffffffffffffffffffffff1681526020018467ffffffffffffffff1681526020014267ffffffffffffffff16815250905061056e8682610de7565b505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156105d357600080fd5b600060149054906101000a900460ff1615156105ee57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a16001905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561069957600080fd5b6003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506106dc8234610fcc565b506106e7818361116b565b5050565b600060149054906101000a900460ff1681565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806107ac57508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156107b757600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505090505050565b600460009054906101000a900460ff1681565b60008060008060008060036000888152602001908152602001600020905061084381611247565b151561084e57600080fd5b8060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a90046fffffffffffffffffffffffffffffffff168260010160109054906101000a90046fffffffffffffffffffffffffffffffff168360020160009054906101000a900467ffffffffffffffff168460020160089054906101000a900467ffffffffffffffff16836fffffffffffffffffffffffffffffffff169350826fffffffffffffffffffffffffffffffff1692508167ffffffffffffffff1691508067ffffffffffffffff169050955095509550955095505091939590929450565b60025481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156109a257600080fd5b600060149054906101000a900460ff161515156109be57600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a16001905090565b60008060149054906101000a900460ff161515610a2857600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a8357600080fd5b600360008381526020019081526020016000209050610aa181611247565b1515610aac57600080fd5b610ada828260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611275565b5050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600360008481526020019081526020016000209150610b2482611247565b1515610b2f57600080fd5b8160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610b9057600080fd5b610b9a8382611275565b505050565b600080600360008481526020019081526020016000209050610bc081611247565b1515610bcb57600080fd5b610bd4816112c3565b915050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610c5d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515610cd457806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8330846040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1515610dcf57600080fd5b6102c65a03f11515610de057600080fd5b5050505050565b603c816060015167ffffffffffffffff1610151515610e0557600080fd5b806003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060408201518160010160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160020160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050507fa9c8dfcda5664a5a124c713e386da27de87432d5b668e79458501eb296389ba78282602001516fffffffffffffffffffffffffffffffff1683604001516fffffffffffffffffffffffffffffffff16846060015167ffffffffffffffff166040518085815260200184815260200183815260200182815260200194505050505060405180910390a15050565b6000806000806000806000600360008a81526020019081526020016000209550610ff586611247565b151561100057600080fd5b611009866112c3565b945084881015151561101a57600080fd5b8560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16935061104a896113b6565b60008511156110a45761105c85611472565b925082850391508373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015156110a357600080fd5b5b84880390503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015156110e957600080fd5b7f4fcc30d90a842164dd58501ab874a101a3749c3d4747139cefe7c876f4ccebd2898633604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a184965050505050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b151561122f57600080fd5b6102c65a03f1151561124057600080fd5b5050505050565b6000808260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16119050919050565b61127e826113b6565b611288818361116b565b7f2809c7e17bf978fbc7194c0a694b638c4215e9140cacc6c38ca36010b45697df826040518082815260200191505060405180910390a15050565b600080600090508260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1642111561131c578260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16420390505b6113ae8360010160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168460010160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168560020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff168461148d565b915050919050565b60036000828152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160006101000a8154906fffffffffffffffffffffffffffffffff02191690556001820160106101000a8154906fffffffffffffffffffffffffffffffff02191690556002820160006101000a81549067ffffffffffffffff02191690556002820160086101000a81549067ffffffffffffffff0219169055505050565b6000612710600254830281151561148557fe5b049050919050565b60008060008085851015156114a4578693506114c2565b8787039250858584028115156114b657fe5b05915081880190508093505b505050949350505050565b60a060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff16815250905600a165627a7a7230582077092e47a5e90d456efea39c135a00d579d263816be12c8845ca68968b6feb610029", + "bytecode": "0x606060405260008060146101000a81548160ff0219169083151502179055506001600460006101000a81548160ff021916908315150217905550341561004457600080fd5b6040516040806117928339810160405280805190602001909190805190602001909190505081816000336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061271082111515156100be57600080fd5b816002819055508290508073ffffffffffffffffffffffffffffffffffffffff166301ffc9a7639a20483d7c0100000000000000000000000000000000000000000000000000000000026000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001915050602060405180830381600087803b15156101a057600080fd5b6102c65a03f115156101b157600080fd5b5050506040518051905015156101c657600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050506115778061021b6000396000f3006060604052600436106100db576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806327ebe40a146100e05780633f4ba83a1461013d578063454a2ab31461016a5780635c975abb146101825780635fd8c710146101af57806376190f8f146101c457806378bd7935146101f157806383b5ff8b146102705780638456cb5914610299578063878eb368146102c65780638da5cb5b146102e957806396b5a7551461033e578063c55d0f5614610361578063dd1b7a0f14610398578063f2fde38b146103ed575b600080fd5b34156100eb57600080fd5b61013b600480803590602001909190803590602001909190803590602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610426565b005b341561014857600080fd5b610150610576565b604051808215151515815260200191505060405180910390f35b610180600480803590602001909190505061063b565b005b341561018d57600080fd5b6101956106eb565b604051808215151515815260200191505060405180910390f35b34156101ba57600080fd5b6101c26106fe565b005b34156101cf57600080fd5b6101d7610809565b604051808215151515815260200191505060405180910390f35b34156101fc57600080fd5b610212600480803590602001909190505061081c565b604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b341561027b57600080fd5b61028361093f565b6040518082815260200191505060405180910390f35b34156102a457600080fd5b6102ac610945565b604051808215151515815260200191505060405180910390f35b34156102d157600080fd5b6102e76004808035906020019091905050610a0c565b005b34156102f457600080fd5b6102fc610ade565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561034957600080fd5b61035f6004808035906020019091905050610b03565b005b341561036c57600080fd5b6103826004808035906020019091905050610b9f565b6040518082815260200191505060405180910390f35b34156103a357600080fd5b6103ab610bdc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103f857600080fd5b610424600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610c02565b005b61042e6114cd565b846fffffffffffffffffffffffffffffffff168514151561044e57600080fd5b836fffffffffffffffffffffffffffffffff168414151561046e57600080fd5b8267ffffffffffffffff168314151561048657600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156104e257600080fd5b6104ec8287610cd7565b60a0604051908101604052808373ffffffffffffffffffffffffffffffffffffffff168152602001866fffffffffffffffffffffffffffffffff168152602001856fffffffffffffffffffffffffffffffff1681526020018467ffffffffffffffff1681526020014267ffffffffffffffff16815250905061056e8682610de7565b505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156105d357600080fd5b600060149054906101000a900460ff1615156105ee57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a16001905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561069957600080fd5b6003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506106dc8234610fcc565b506106e7818361116b565b5050565b600060149054906101000a900460ff1681565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806107ac57508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156107b757600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505090505050565b600460009054906101000a900460ff1681565b60008060008060008060036000888152602001908152602001600020905061084381611247565b151561084e57600080fd5b8060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a90046fffffffffffffffffffffffffffffffff168260010160109054906101000a90046fffffffffffffffffffffffffffffffff168360020160009054906101000a900467ffffffffffffffff168460020160089054906101000a900467ffffffffffffffff16836fffffffffffffffffffffffffffffffff169350826fffffffffffffffffffffffffffffffff1692508167ffffffffffffffff1691508067ffffffffffffffff169050955095509550955095505091939590929450565b60025481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156109a257600080fd5b600060149054906101000a900460ff161515156109be57600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a16001905090565b60008060149054906101000a900460ff161515610a2857600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a8357600080fd5b600360008381526020019081526020016000209050610aa181611247565b1515610aac57600080fd5b610ada828260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611275565b5050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600360008481526020019081526020016000209150610b2482611247565b1515610b2f57600080fd5b8160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610b9057600080fd5b610b9a8382611275565b505050565b600080600360008481526020019081526020016000209050610bc081611247565b1515610bcb57600080fd5b610bd4816112c3565b915050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610c5d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515610cd457806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8330846040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1515610dcf57600080fd5b6102c65a03f11515610de057600080fd5b5050505050565b603c816060015167ffffffffffffffff1610151515610e0557600080fd5b806003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060408201518160010160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160020160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050507fa9c8dfcda5664a5a124c713e386da27de87432d5b668e79458501eb296389ba78282602001516fffffffffffffffffffffffffffffffff1683604001516fffffffffffffffffffffffffffffffff16846060015167ffffffffffffffff166040518085815260200184815260200183815260200182815260200194505050505060405180910390a15050565b6000806000806000806000600360008a81526020019081526020016000209550610ff586611247565b151561100057600080fd5b611009866112c3565b945084881015151561101a57600080fd5b8560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16935061104a896113b6565b60008511156110a45761105c85611472565b925082850391508373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015156110a357600080fd5b5b84880390503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015156110e957600080fd5b7f4fcc30d90a842164dd58501ab874a101a3749c3d4747139cefe7c876f4ccebd2898633604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a184965050505050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b151561122f57600080fd5b6102c65a03f1151561124057600080fd5b5050505050565b6000808260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16119050919050565b61127e826113b6565b611288818361116b565b7f2809c7e17bf978fbc7194c0a694b638c4215e9140cacc6c38ca36010b45697df826040518082815260200191505060405180910390a15050565b600080600090508260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1642111561131c578260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16420390505b6113ae8360010160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168460010160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168560020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff168461148d565b915050919050565b60036000828152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160006101000a8154906fffffffffffffffffffffffffffffffff02191690556001820160106101000a8154906fffffffffffffffffffffffffffffffff02191690556002820160006101000a81549067ffffffffffffffff02191690556002820160086101000a81549067ffffffffffffffff0219169055505050565b6000612710600254830281151561148557fe5b049050919050565b60008060008085851015156114a4578693506114c2565b8787039250858584028115156114b657fe5b05915081880190508093505b505050949350505050565b60a060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff16815250905600a165627a7a7230582088346814195bef8734c8500f678baa663ba91a4f22f3a8eca9142aaf4263986b0029", + "deployedBytecode": "0x6060604052600436106100db576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806327ebe40a146100e05780633f4ba83a1461013d578063454a2ab31461016a5780635c975abb146101825780635fd8c710146101af57806376190f8f146101c457806378bd7935146101f157806383b5ff8b146102705780638456cb5914610299578063878eb368146102c65780638da5cb5b146102e957806396b5a7551461033e578063c55d0f5614610361578063dd1b7a0f14610398578063f2fde38b146103ed575b600080fd5b34156100eb57600080fd5b61013b600480803590602001909190803590602001909190803590602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610426565b005b341561014857600080fd5b610150610576565b604051808215151515815260200191505060405180910390f35b610180600480803590602001909190505061063b565b005b341561018d57600080fd5b6101956106eb565b604051808215151515815260200191505060405180910390f35b34156101ba57600080fd5b6101c26106fe565b005b34156101cf57600080fd5b6101d7610809565b604051808215151515815260200191505060405180910390f35b34156101fc57600080fd5b610212600480803590602001909190505061081c565b604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b341561027b57600080fd5b61028361093f565b6040518082815260200191505060405180910390f35b34156102a457600080fd5b6102ac610945565b604051808215151515815260200191505060405180910390f35b34156102d157600080fd5b6102e76004808035906020019091905050610a0c565b005b34156102f457600080fd5b6102fc610ade565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561034957600080fd5b61035f6004808035906020019091905050610b03565b005b341561036c57600080fd5b6103826004808035906020019091905050610b9f565b6040518082815260200191505060405180910390f35b34156103a357600080fd5b6103ab610bdc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103f857600080fd5b610424600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610c02565b005b61042e6114cd565b846fffffffffffffffffffffffffffffffff168514151561044e57600080fd5b836fffffffffffffffffffffffffffffffff168414151561046e57600080fd5b8267ffffffffffffffff168314151561048657600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156104e257600080fd5b6104ec8287610cd7565b60a0604051908101604052808373ffffffffffffffffffffffffffffffffffffffff168152602001866fffffffffffffffffffffffffffffffff168152602001856fffffffffffffffffffffffffffffffff1681526020018467ffffffffffffffff1681526020014267ffffffffffffffff16815250905061056e8682610de7565b505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156105d357600080fd5b600060149054906101000a900460ff1615156105ee57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a16001905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561069957600080fd5b6003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506106dc8234610fcc565b506106e7818361116b565b5050565b600060149054906101000a900460ff1681565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806107ac57508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156107b757600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505090505050565b600460009054906101000a900460ff1681565b60008060008060008060036000888152602001908152602001600020905061084381611247565b151561084e57600080fd5b8060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a90046fffffffffffffffffffffffffffffffff168260010160109054906101000a90046fffffffffffffffffffffffffffffffff168360020160009054906101000a900467ffffffffffffffff168460020160089054906101000a900467ffffffffffffffff16836fffffffffffffffffffffffffffffffff169350826fffffffffffffffffffffffffffffffff1692508167ffffffffffffffff1691508067ffffffffffffffff169050955095509550955095505091939590929450565b60025481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156109a257600080fd5b600060149054906101000a900460ff161515156109be57600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a16001905090565b60008060149054906101000a900460ff161515610a2857600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a8357600080fd5b600360008381526020019081526020016000209050610aa181611247565b1515610aac57600080fd5b610ada828260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611275565b5050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600360008481526020019081526020016000209150610b2482611247565b1515610b2f57600080fd5b8160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610b9057600080fd5b610b9a8382611275565b505050565b600080600360008481526020019081526020016000209050610bc081611247565b1515610bcb57600080fd5b610bd4816112c3565b915050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610c5d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515610cd457806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8330846040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1515610dcf57600080fd5b6102c65a03f11515610de057600080fd5b5050505050565b603c816060015167ffffffffffffffff1610151515610e0557600080fd5b806003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060408201518160010160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160020160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050507fa9c8dfcda5664a5a124c713e386da27de87432d5b668e79458501eb296389ba78282602001516fffffffffffffffffffffffffffffffff1683604001516fffffffffffffffffffffffffffffffff16846060015167ffffffffffffffff166040518085815260200184815260200183815260200182815260200194505050505060405180910390a15050565b6000806000806000806000600360008a81526020019081526020016000209550610ff586611247565b151561100057600080fd5b611009866112c3565b945084881015151561101a57600080fd5b8560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16935061104a896113b6565b60008511156110a45761105c85611472565b925082850391508373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015156110a357600080fd5b5b84880390503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015156110e957600080fd5b7f4fcc30d90a842164dd58501ab874a101a3749c3d4747139cefe7c876f4ccebd2898633604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a184965050505050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b151561122f57600080fd5b6102c65a03f1151561124057600080fd5b5050505050565b6000808260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16119050919050565b61127e826113b6565b611288818361116b565b7f2809c7e17bf978fbc7194c0a694b638c4215e9140cacc6c38ca36010b45697df826040518082815260200191505060405180910390a15050565b600080600090508260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1642111561131c578260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16420390505b6113ae8360010160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168460010160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168560020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff168461148d565b915050919050565b60036000828152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160006101000a8154906fffffffffffffffffffffffffffffffff02191690556001820160106101000a8154906fffffffffffffffffffffffffffffffff02191690556002820160006101000a81549067ffffffffffffffff02191690556002820160086101000a81549067ffffffffffffffff0219169055505050565b6000612710600254830281151561148557fe5b049050919050565b60008060008085851015156114a4578693506114c2565b8787039250858584028115156114b657fe5b05915081880190508093505b505050949350505050565b60a060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff16815250905600a165627a7a7230582088346814195bef8734c8500f678baa663ba91a4f22f3a8eca9142aaf4263986b0029", "sourceMap": "60701:2345:18:-;;;54337:5;54316:26;;;;;;;;;;;;;;;;;;;;60926:4;60891:39;;;;;;;;;;;;;;;;;;;;60965:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61049:8;61059:4;55996:31;816:10;808:5;;:18;;;;;;;;;;;;;;;;;;55954:5;55946:4;:13;;55938:22;;;;;;;;55981:4;55970:8;:15;;;;56044:11;55996:60;;56074:17;:35;;;55501:10;55494:18;;56074:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56066:71;;;;;;;;56169:17;56147:19;;:39;;;;;;;;;;;;;;;;;;55864:329;;;60965:102;;60701:2345;;;;;;", "deployedSourceMap": "60701:2345:18:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61543:850;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54943:126;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62611:432;;;;;;;;;;;;;;;;;;54316:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56458:352;;;;;;;;;;;;;;60891:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59705:493;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45099:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54735:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59338:256;;;;;;;;;;;;;;;;;;;;;;;;;;622:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58796:289;;;;;;;;;;;;;;;;;;;;;;;;;;60323:239;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44927:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1156:140;;;;;;;;;;;;;;;;;;;;;;;;;;;;61543:850;62155:22;;:::i;:::-;61907:14;61891:32;;61873:14;:50;61865:59;;;;;;;;61974:12;61958:30;;61942:12;:46;61934:55;;;;;;;;62035:9;62020:26;;62007:9;:39;61999:48;;;;;;;;62088:19;;;;;;;;;;;62066:42;;:10;:42;;;62058:51;;;;;;;;62119:26;62127:7;62136:8;62119:7;:26::i;:::-;62180:166;;;;;;;;;62201:7;62180:166;;;;;;62230:14;62180:166;;;;;;62267:12;62180:166;;;;;;62301:9;62180:166;;;;;;62332:3;62180:166;;;;;62155:191;;62356:30;62368:8;62378:7;62356:11;:30::i;:::-;61543:850;;;;;;:::o;54943:126::-;54992:4;969:5;;;;;;;;;;;955:19;;:10;:19;;;947:28;;;;;;;;54629:6;;;;;;;;;;;54621:15;;;;;;;;55017:5;55008:6;;:14;;;;;;;;;;;;;;;;;;55032:9;;;;;;;;;;55058:4;55051:11;;54943:126;:::o;62611:432::-;62742:14;62711:19;;;;;;;;;;;62689:42;;:10;:42;;;62681:51;;;;;;;;62759:16;:26;62776:8;62759:26;;;;;;;;;;;:33;;;;;;;;;;;;62742:50;;62876:25;62881:8;62891:9;62876:4;:25::i;:::-;;63009:27;63019:6;63027:8;63009:9;:27::i;:::-;62611:432;;:::o;54316:26::-;;;;;;;;;;;;;:::o;56458:352::-;56504:18;56763:8;56533:19;;;;;;;;;;;56504:49;;56599:5;;;;;;;;;;;56585:19;;:10;:19;;;:59;;;;56634:10;56620:24;;:10;:24;;;56585:59;56564:90;;;;;;;;56774:10;:15;;:29;56790:4;:12;;;56774:29;;;;;;;;;;;;;;;;;;;;;;;56763:40;;56458:352;;:::o;60891:39::-;;;;;;;;;;;;;:::o;59705:493::-;59791:14;59815:21;59846:19;59875:16;59901:17;59935:23;59961:16;:26;59978:8;59961:26;;;;;;;;;;;59935:52;;60005:21;60018:7;60005:12;:21::i;:::-;59997:30;;;;;;;;60054:7;:14;;;;;;;;;;;;60078:7;:21;;;;;;;;;;;;60109:7;:19;;;;;;;;;;;;60138:7;:16;;;;;;;;;;;;60164:7;:17;;;;;;;;;;;;60037:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59705:493;;;;;;;;:::o;45099:23::-;;;;:::o;54735:124::-;54785:4;969:5;;;;;;;;;;;955:19;;:10;:19;;;947:28;;;;;;;;54475:6;;;;;;;;;;;54474:7;54466:16;;;;;;;;54810:4;54801:6;;:13;;;;;;;;;;;;;;;;;;54824:7;;;;;;;;;;54848:4;54841:11;;54735:124;:::o;59338:256::-;59445:23;54629:6;;;;;;;;;;;54621:15;;;;;;;;969:5;;;;;;;;;;;955:19;;:10;:19;;;947:28;;;;;;;;59471:16;:26;59488:8;59471:26;;;;;;;;;;;59445:52;;59515:21;59528:7;59515:12;:21::i;:::-;59507:30;;;;;;;;59547:40;59562:8;59572:7;:14;;;;;;;;;;;;59547;:40::i;:::-;59338:256;;:::o;622:20::-;;;;;;;;;;;;;:::o;58796:289::-;58864:23;58966:14;58890:16;:26;58907:8;58890:26;;;;;;;;;;;58864:52;;58934:21;58947:7;58934:12;:21::i;:::-;58926:30;;;;;;;;58983:7;:14;;;;;;;;;;;;58966:31;;59029:6;59015:20;;:10;:20;;;59007:29;;;;;;;;59046:32;59061:8;59071:6;59046:14;:32::i;:::-;58796:289;;;:::o;60323:239::-;60401:7;60424:23;60450:16;:26;60467:8;60450:26;;;;;;;;;;;60424:52;;60494:21;60507:7;60494:12;:21::i;:::-;60486:30;;;;;;;;60533:22;60547:7;60533:13;:22::i;:::-;60526:29;;60323:239;;;;:::o;44927:40::-;;;;;;;;;;;;;:::o;1156:140::-;969:5;;;;;;;;;;;955:19;;:10;:19;;;947:28;;;;;;;;1245:1;1225:22;;:8;:22;;;;1221:69;;;1271:8;1263:5;;:16;;;;;;;;;;;;;;;;;;1221:69;1156:140;:::o;46053:176::-;46166:19;;;;;;;;;;;:32;;;46199:6;46207:4;46213:8;46166:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46053:176;;:::o;46852:489::-;47082:9;47061:8;:17;;;:30;;;;47053:39;;;;;;;;47132:8;47103:16;:26;47120:8;47103:26;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47151:183;47187:8;47218;:22;;;47210:31;;47263:8;:20;;;47255:29;;47306:8;:17;;;47298:26;;47151:183;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46852:489;;:::o;47687:2629::-;47765:7;47837:23;48279:13;48459:14;48938:21;48994:22;49934:17;47863:16;:26;47880:8;47863:26;;;;;;;;;;;47837:52;;48170:21;48183:7;48170:12;:21::i;:::-;48162:30;;;;;;;;48295:22;48309:7;48295:13;:22::i;:::-;48279:38;;48349:5;48335:10;:19;;48327:28;;;;;;;;48476:7;:14;;;;;;;;;;;;48459:31;;48635:24;48650:8;48635:14;:24::i;:::-;48741:1;48733:5;:9;48729:918;;;48962:18;48974:5;48962:11;:18::i;:::-;48938:42;;49027:13;49019:5;:21;48994:46;;49605:6;:15;;:31;49621:14;49605:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48729:918;49967:5;49954:10;:18;49934:38;;50172:10;:19;;:30;50192:9;50172:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50240:46;50258:8;50268:5;50275:10;50240:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50304:5;50297:12;;47687:2629;;;;;;;;;;:::o;46461:174::-;46579:19;;;;;;;;;;;:28;;;46608:9;46619:8;46579:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46461:174;;:::o;50637:125::-;50708:4;50753:1;50732:8;:18;;;;;;;;;;;;:22;;;50724:31;;50637:125;;;:::o;47396:183::-;47474:24;47489:8;47474:14;:24::i;:::-;47508:28;47518:7;47527:8;47508:9;:28::i;:::-;47546:26;47563:8;47546:26;;;;;;;;;;;;;;;;;;47396:183;;:::o;51057:613::-;51141:7;51164:21;51188:1;51164:25;;51403:8;:18;;;;;;;;;;;;51397:24;;:3;:24;51393:95;;;51459:8;:18;;;;;;;;;;;;51453:24;;:3;:24;51437:40;;51393:95;51505:158;51539:8;:22;;;;;;;;;;;;51505:158;;51575:8;:20;;;;;;;;;;;;51505:158;;51609:8;:17;;;;;;;;;;;;51505:158;;51640:13;51505:20;:158::i;:::-;51498:165;;51057:613;;;;:::o;50434:101::-;50502:16;:26;50519:8;50502:26;;;;;;;;;;;;50495:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50434:101;:::o;53613:482::-;53673:7;54083:5;54072:8;;54063:6;:17;:25;;;;;;;;54056:32;;53613:482;;;:::o;51918:1601::-;52110:7;52803:23;53118:25;53394:19;52477:9;52459:14;:27;;52455:1058;;;52635:12;52628:19;;;;52455:1058;52859:14;52836:12;52829:45;52803:71;;53197:9;53172:14;53146:16;:41;:61;;;;;;;;53118:89;;53441:18;53423:14;53416:43;53394:65;;53489:12;53474:28;;51918:1601;;;;;;;;;;:::o;60701:2345::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", "source": "pragma solidity 0.4.18;\n\n/**\n The following contract code, titled KittyCore, was written by Cryptokitties and published\n and retrieved from https://etherscan.io/address/0x06012c8cf97bead5deae237070f9587f8e7a266d#code.\n\n It is included in the current project for test purposes, to ensure that our collateralizer can\n handle ERC721 tokens created by the KittyCore contract.\n*/\n\n/**\n * @title KittiesOwnable\n * @dev The KittiesOwnable contract has an owner address, and provides basic authorization control\n * functions, this simplifies the implementation of \"user permissions\".\n */\ncontract KittiesOwnable {\n address public owner;\n\n\n /**\n\t * @dev The KittiesOwnable constructor sets the original `owner` of the contract to the sender\n\t * account.\n\t */\n function KittiesOwnable() {\n owner = msg.sender;\n }\n\n\n /**\n\t * @dev Throws if called by any account other than the owner.\n\t */\n modifier onlyOwner() {\n require(msg.sender == owner);\n _;\n }\n\n\n /**\n\t * @dev Allows the current owner to transfer control of the contract to a newOwner.\n\t * @param newOwner The address to transfer ownership to.\n\t */\n function transferOwnership(address newOwner) onlyOwner {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n\n}\n\n\n\n/// @title Interface for contracts conforming to ERC-721: Non-Fungible Tokens\n/// @author Dieter Shirley (https://github.com/dete)\ncontract KittiesERC721 {\n // Required methods\n function totalSupply() public view returns (uint256 total);\n function balanceOf(address _owner) public view returns (uint256 balance);\n function ownerOf(uint256 _tokenId) external view returns (address owner);\n function approve(address _to, uint256 _tokenId) external;\n function transfer(address _to, uint256 _tokenId) external;\n function transferFrom(address _from, address _to, uint256 _tokenId) external;\n\n // Events\n event Transfer(address from, address to, uint256 tokenId);\n event Approval(address owner, address approved, uint256 tokenId);\n\n // Optional\n // function name() public view returns (string name);\n // function symbol() public view returns (string symbol);\n // function tokensOfOwner(address _owner) external view returns (uint256[] tokenIds);\n // function tokenMetadata(uint256 _tokenId, string _preferredTransport) public view returns (string infoUrl);\n\n // ERC-165 Compatibility (https://github.com/ethereum/EIPs/issues/165)\n function supportsInterface(bytes4 _interfaceID) external view returns (bool);\n}\n\n\n// // Auction wrapper functions\n\n\n// Auction wrapper functions\n\n\n\n\n\n\n\n/// @title SEKRETOOOO\ncontract GeneScienceInterface {\n /// @dev simply a boolean to indicate this is the contract we expect to be\n function isGeneScience() public pure returns (bool);\n\n /// @dev given genes of kitten 1 & 2, return a genetic combination - may have a random factor\n /// @param genes1 genes of mom\n /// @param genes2 genes of sire\n /// @return the genes that are supposed to be passed down the child\n function mixGenes(uint256 genes1, uint256 genes2, uint256 targetBlock) public returns (uint256);\n}\n\n\n\n\n\n\n\n/// @title A facet of KittyCore that manages special access privileges.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyAccessControl {\n // This facet controls access control for CryptoKitties. There are four roles managed here:\n //\n // - The CEO: The CEO can reassign other roles and change the addresses of our dependent smart\n // contracts. It is also the only role that can unpause the smart contract. It is initially\n // set to the address that created the smart contract in the KittyCore constructor.\n //\n // - The CFO: The CFO can withdraw funds from KittyCore and its auction contracts.\n //\n // - The COO: The COO can release gen0 kitties to auction, and mint promo cats.\n //\n // It should be noted that these roles are distinct without overlap in their access abilities, the\n // abilities listed for each role above are exhaustive. In particular, while the CEO can assign any\n // address to any role, the CEO address itself doesn't have the ability to act in those roles. This\n // restriction is intentional so that we aren't tempted to use the CEO address frequently out of\n // convenience. The less we use an address, the less likely it is that we somehow compromise the\n // account.\n\n /// @dev Emited when contract is upgraded - See README.md for updgrade plan\n event ContractUpgrade(address newContract);\n\n // The addresses of the accounts (or contracts) that can execute actions within each roles.\n address public ceoAddress;\n address public cfoAddress;\n address public cooAddress;\n\n // @dev Keeps track whether the contract is paused. When that is true, most actions are blocked\n bool public paused = false;\n\n /// @dev Access modifier for CEO-only functionality\n modifier onlyCEO() {\n require(msg.sender == ceoAddress);\n _;\n }\n\n /// @dev Access modifier for CFO-only functionality\n modifier onlyCFO() {\n require(msg.sender == cfoAddress);\n _;\n }\n\n /// @dev Access modifier for COO-only functionality\n modifier onlyCOO() {\n require(msg.sender == cooAddress);\n _;\n }\n\n modifier onlyCLevel() {\n require(\n msg.sender == cooAddress ||\n msg.sender == ceoAddress ||\n msg.sender == cfoAddress\n );\n _;\n }\n\n /// @dev Assigns a new address to act as the CEO. Only available to the current CEO.\n /// @param _newCEO The address of the new CEO\n function setCEO(address _newCEO) external onlyCEO {\n require(_newCEO != address(0));\n\n ceoAddress = _newCEO;\n }\n\n /// @dev Assigns a new address to act as the CFO. Only available to the current CEO.\n /// @param _newCFO The address of the new CFO\n function setCFO(address _newCFO) external onlyCEO {\n require(_newCFO != address(0));\n\n cfoAddress = _newCFO;\n }\n\n /// @dev Assigns a new address to act as the COO. Only available to the current CEO.\n /// @param _newCOO The address of the new COO\n function setCOO(address _newCOO) external onlyCEO {\n require(_newCOO != address(0));\n\n cooAddress = _newCOO;\n }\n\n /*** KittiesPausable functionality adapted from OpenZeppelin ***/\n\n /// @dev Modifier to allow actions only when the contract IS NOT paused\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /// @dev Modifier to allow actions only when the contract IS paused\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /// @dev Called by any \"C-level\" role to pause the contract. Used only when\n /// a bug or exploit is detected and we need to limit damage.\n function pause() external onlyCLevel whenNotPaused {\n paused = true;\n }\n\n /// @dev Unpauses the smart contract. Can only be called by the CEO, since\n /// one reason we may pause the contract is when CFO or COO accounts are\n /// compromised.\n /// @notice This is public rather than external so it can be called by\n /// derived contracts.\n function unpause() public onlyCEO whenPaused {\n // can't unpause if contract was upgraded\n paused = false;\n }\n}\n\n\n\n\n/// @title Base contract for CryptoKitties. Holds all common structs, events and base variables.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBase is KittyAccessControl {\n /*** EVENTS ***/\n\n /// @dev The Birth event is fired whenever a new kitten comes into existence. This obviously\n /// includes any time a cat is created through the giveBirth method, but it is also called\n /// when a new gen0 cat is created.\n event Birth(address owner, uint256 kittyId, uint256 matronId, uint256 sireId, uint256 genes);\n\n /// @dev Transfer event as defined in current draft of ERC721. Emitted every time a kitten\n /// ownership is assigned, including births.\n event Transfer(address from, address to, uint256 tokenId);\n\n /*** DATA TYPES ***/\n\n /// @dev The main Kitty struct. Every cat in CryptoKitties is represented by a copy\n /// of this structure, so great care was taken to ensure that it fits neatly into\n /// exactly two 256-bit words. Note that the order of the members in this structure\n /// is important because of the byte-packing rules used by Ethereum.\n /// Ref: http://solidity.readthedocs.io/en/develop/miscellaneous.html\n struct Kitty {\n // The Kitty's genetic code is packed into these 256-bits, the format is\n // sooper-sekret! A cat's genes never change.\n uint256 genes;\n\n // The timestamp from the block when this cat came into existence.\n uint64 birthTime;\n\n // The minimum timestamp after which this cat can engage in breeding\n // activities again. This same timestamp is used for the pregnancy\n // timer (for matrons) as well as the siring cooldown.\n uint64 cooldownEndBlock;\n\n // The ID of the parents of this kitty, set to 0 for gen0 cats.\n // Note that using 32-bit unsigned integers limits us to a \"mere\"\n // 4 billion cats. This number might seem small until you realize\n // that Ethereum currently has a limit of about 500 million\n // transactions per year! So, this definitely won't be a problem\n // for several years (even as Ethereum learns to scale).\n uint32 matronId;\n uint32 sireId;\n\n // Set to the ID of the sire cat for matrons that are pregnant,\n // zero otherwise. A non-zero value here is how we know a cat\n // is pregnant. Used to retrieve the genetic material for the new\n // kitten when the birth transpires.\n uint32 siringWithId;\n\n // Set to the index in the cooldown array (see below) that represents\n // the current cooldown duration for this Kitty. This starts at zero\n // for gen0 cats, and is initialized to floor(generation/2) for others.\n // Incremented by one for each successful breeding action, regardless\n // of whether this cat is acting as matron or sire.\n uint16 cooldownIndex;\n\n // The \"generation number\" of this cat. Cats minted by the CK contract\n // for sale are called \"gen0\" and have a generation number of 0. The\n // generation number of all other cats is the larger of the two generation\n // numbers of their parents, plus one.\n // (i.e. max(matron.generation, sire.generation) + 1)\n uint16 generation;\n }\n\n /*** CONSTANTS ***/\n\n /// @dev A lookup table indicating the cooldown duration after any successful\n /// breeding action, called \"pregnancy time\" for matrons and \"siring cooldown\"\n /// for sires. Designed such that the cooldown roughly doubles each time a cat\n /// is bred, encouraging owners not to just keep breeding the same cat over\n /// and over again. Caps out at one week (a cat can breed an unbounded number\n /// of times, and the maximum cooldown is always seven days).\n uint32[14] public cooldowns = [\n uint32(1 minutes),\n uint32(2 minutes),\n uint32(5 minutes),\n uint32(10 minutes),\n uint32(30 minutes),\n uint32(1 hours),\n uint32(2 hours),\n uint32(4 hours),\n uint32(8 hours),\n uint32(16 hours),\n uint32(1 days),\n uint32(2 days),\n uint32(4 days),\n uint32(7 days)\n ];\n\n // An approximation of currently how many seconds are in between blocks.\n uint256 public secondsPerBlock = 15;\n\n /*** STORAGE ***/\n\n /// @dev An array containing the Kitty struct for all Kitties in existence. The ID\n /// of each cat is actually an index into this array. Note that ID 0 is a negacat,\n /// the unKitty, the mythical beast that is the parent of all gen0 cats. A bizarre\n /// creature that is both matron and sire... to itself! Has an invalid genetic code.\n /// In other words, cat ID 0 is invalid... ;-)\n Kitty[] kitties;\n\n /// @dev A mapping from cat IDs to the address that owns them. All cats have\n /// some valid owner address, even gen0 cats are created with a non-zero owner.\n mapping (uint256 => address) public kittyIndexToOwner;\n\n // @dev A mapping from owner address to count of tokens that address owns.\n // Used internally inside balanceOf() to resolve ownership count.\n mapping (address => uint256) ownershipTokenCount;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to call\n /// transferFrom(). Each Kitty can only have one approved address for transfer\n /// at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public kittyIndexToApproved;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to use\n /// this Kitty for siring via breedWith(). Each Kitty can only have one approved\n /// address for siring at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public sireAllowedToAddress;\n\n /// @dev The address of the ClockAuction contract that handles sales of Kitties. This\n /// same contract handles both peer-to-peer sales as well as the gen0 sales which are\n /// initiated every 15 minutes.\n SaleClockAuction public saleAuction;\n\n /// @dev The address of a custom ClockAuction subclassed contract that handles siring\n /// auctions. Needs to be separate from saleAuction because the actions taken on success\n /// after a sales and siring auction are quite different.\n SiringClockAuction public siringAuction;\n\n /// @dev Assigns ownership of a specific Kitty to an address.\n function _transfer(address _from, address _to, uint256 _tokenId) internal {\n // Since the number of kittens is capped to 2^32 we can't overflow this\n ownershipTokenCount[_to]++;\n // transfer ownership\n kittyIndexToOwner[_tokenId] = _to;\n // When creating new kittens _from is 0x0, but we can't account that address.\n if (_from != address(0)) {\n ownershipTokenCount[_from]--;\n // once the kitten is transferred also clear sire allowances\n delete sireAllowedToAddress[_tokenId];\n // clear any previously approved ownership exchange\n delete kittyIndexToApproved[_tokenId];\n }\n // Emit the transfer event.\n Transfer(_from, _to, _tokenId);\n }\n\n /// @dev An internal method that creates a new kitty and stores it. This\n /// method doesn't do any checking and should only be called when the\n /// input data is known to be valid. Will generate both a Birth event\n /// and a Transfer event.\n /// @param _matronId The kitty ID of the matron of this cat (zero for gen0)\n /// @param _sireId The kitty ID of the sire of this cat (zero for gen0)\n /// @param _generation The generation number of this cat, must be computed by caller.\n /// @param _genes The kitty's genetic code.\n /// @param _owner The inital owner of this cat, must be non-zero (except for the unKitty, ID 0)\n function _createKitty(\n uint256 _matronId,\n uint256 _sireId,\n uint256 _generation,\n uint256 _genes,\n address _owner\n )\n internal\n returns (uint)\n {\n // These requires are not strictly necessary, our calling code should make\n // sure that these conditions are never broken. However! _createKitty() is already\n // an expensive call (for storage), and it doesn't hurt to be especially careful\n // to ensure our data structures are always valid.\n require(_matronId == uint256(uint32(_matronId)));\n require(_sireId == uint256(uint32(_sireId)));\n require(_generation == uint256(uint16(_generation)));\n\n // New kitty starts with the same cooldown as parent gen/2\n uint16 cooldownIndex = uint16(_generation / 2);\n if (cooldownIndex > 13) {\n cooldownIndex = 13;\n }\n\n Kitty memory _kitty = Kitty({\n genes: _genes,\n birthTime: uint64(now),\n cooldownEndBlock: 0,\n matronId: uint32(_matronId),\n sireId: uint32(_sireId),\n siringWithId: 0,\n cooldownIndex: cooldownIndex,\n generation: uint16(_generation)\n });\n uint256 newKittenId = kitties.push(_kitty) - 1;\n\n // It's probably never going to happen, 4 billion cats is A LOT, but\n // let's just be 100% sure we never let this happen.\n require(newKittenId == uint256(uint32(newKittenId)));\n\n // emit the birth event\n Birth(\n _owner,\n newKittenId,\n uint256(_kitty.matronId),\n uint256(_kitty.sireId),\n _kitty.genes\n );\n\n // This will assign ownership, and also emit the Transfer event as\n // per ERC721 draft\n _transfer(0, _owner, newKittenId);\n\n return newKittenId;\n }\n\n // Any C-level can fix how many seconds per blocks are currently observed.\n function setSecondsPerBlock(uint256 secs) external onlyCLevel {\n require(secs < cooldowns[0]);\n secondsPerBlock = secs;\n }\n}\n\n\n\n\n\n/// @title The external contract that is responsible for generating metadata for the kitties,\n/// it has one function that will return the data as bytes.\ncontract KittiesERC721Metadata {\n /// @dev Given a token Id, returns a byte array that is supposed to be converted into string.\n function getMetadata(uint256 _tokenId, string) public view returns (bytes32[4] buffer, uint256 count) {\n if (_tokenId == 1) {\n buffer[0] = \"Hello World! :D\";\n count = 15;\n } else if (_tokenId == 2) {\n buffer[0] = \"I would definitely choose a medi\";\n buffer[1] = \"um length string.\";\n count = 49;\n } else if (_tokenId == 3) {\n buffer[0] = \"Lorem ipsum dolor sit amet, mi e\";\n buffer[1] = \"st accumsan dapibus augue lorem,\";\n buffer[2] = \" tristique vestibulum id, libero\";\n buffer[3] = \" suscipit varius sapien aliquam.\";\n count = 128;\n }\n }\n}\n\n\n/// @title The facet of the CryptoKitties core contract that manages ownership, ERC-721 (draft) compliant.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev Ref: https://github.com/ethereum/EIPs/issues/721\n/// See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyOwnership is KittyBase, KittiesERC721 {\n\n /// @notice Name and symbol of the non fungible token, as defined in ERC721.\n string public constant name = \"CryptoKitties\";\n string public constant symbol = \"CK\";\n\n // The contract that will return kitty metadata\n KittiesERC721Metadata public erc721Metadata;\n\n bytes4 constant InterfaceSignature_ERC165 =\n bytes4(keccak256('supportsInterface(bytes4)'));\n\n bytes4 constant InterfaceSignature_ERC721 =\n bytes4(keccak256('name()')) ^\n bytes4(keccak256('symbol()')) ^\n bytes4(keccak256('totalSupply()')) ^\n bytes4(keccak256('balanceOf(address)')) ^\n bytes4(keccak256('ownerOf(uint256)')) ^\n bytes4(keccak256('approve(address,uint256)')) ^\n bytes4(keccak256('transfer(address,uint256)')) ^\n bytes4(keccak256('transferFrom(address,address,uint256)')) ^\n bytes4(keccak256('tokensOfOwner(address)')) ^\n bytes4(keccak256('tokenMetadata(uint256,string)'));\n\n /// @notice Introspection interface as per ERC-165 (https://github.com/ethereum/EIPs/issues/165).\n /// Returns true for any standardized interfaces implemented by this contract. We implement\n /// ERC-165 (obviously!) and ERC-721.\n function supportsInterface(bytes4 _interfaceID) external view returns (bool)\n {\n // DEBUG ONLY\n //require((InterfaceSignature_ERC165 == 0x01ffc9a7) && (InterfaceSignature_ERC721 == 0x9a20483d));\n\n return ((_interfaceID == InterfaceSignature_ERC165) || (_interfaceID == InterfaceSignature_ERC721));\n }\n\n /// @dev Set the address of the sibling contract that tracks metadata.\n /// CEO only.\n function setMetadataAddress(address _contractAddress) public onlyCEO {\n erc721Metadata = KittiesERC721Metadata(_contractAddress);\n }\n\n // Internal utility functions: These functions all assume that their input arguments\n // are valid. We leave it to public methods to sanitize their inputs and follow\n // the required logic.\n\n /// @dev Checks if a given address is the current owner of a particular Kitty.\n /// @param _claimant the address we are validating against.\n /// @param _tokenId kitten id, only valid when > 0\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToOwner[_tokenId] == _claimant;\n }\n\n /// @dev Checks if a given address currently has transferApproval for a particular Kitty.\n /// @param _claimant the address we are confirming kitten is approved for.\n /// @param _tokenId kitten id, only valid when > 0\n function _approvedFor(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToApproved[_tokenId] == _claimant;\n }\n\n /// @dev Marks an address as being approved for transferFrom(), overwriting any previous\n /// approval. Setting _approved to address(0) clears all transfer approval.\n /// NOTE: _approve() does NOT send the Approval event. This is intentional because\n /// _approve() and transferFrom() are used together for putting Kitties on auction, and\n /// there is no value in spamming the log with Approval events in that case.\n function _approve(uint256 _tokenId, address _approved) internal {\n kittyIndexToApproved[_tokenId] = _approved;\n }\n\n /// @notice Returns the number of Kitties owned by a specific address.\n /// @param _owner The owner address to check.\n /// @dev Required for ERC-721 compliance\n function balanceOf(address _owner) public view returns (uint256 count) {\n return ownershipTokenCount[_owner];\n }\n\n /// @notice Transfers a Kitty to another address. If transferring to a smart\n /// contract be VERY CAREFUL to ensure that it is aware of ERC-721 (or\n /// CryptoKitties specifically) or your Kitty may be lost forever. Seriously.\n /// @param _to The address of the recipient, can be a user or contract.\n /// @param _tokenId The ID of the Kitty to transfer.\n /// @dev Required for ERC-721 compliance.\n function transfer(\n address _to,\n uint256 _tokenId\n )\n external\n whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Disallow transfers to the auction contracts to prevent accidental\n // misuse. Auction contracts should only take ownership of kitties\n // through the allow + transferFrom flow.\n require(_to != address(saleAuction));\n require(_to != address(siringAuction));\n\n // You can only send your own cat.\n require(_owns(msg.sender, _tokenId));\n\n // Reassign ownership, clear pending approvals, emit Transfer event.\n _transfer(msg.sender, _to, _tokenId);\n }\n\n /// @notice Grant another address the right to transfer a specific Kitty via\n /// transferFrom(). This is the preferred flow for transfering NFTs to contracts.\n /// @param _to The address to be granted transfer approval. Pass address(0) to\n /// clear all approvals.\n /// @param _tokenId The ID of the Kitty that can be transferred if this call succeeds.\n /// @dev Required for ERC-721 compliance.\n function approve(\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Only an owner can grant transfer approval.\n require(_owns(msg.sender, _tokenId));\n\n // Register the approval (replacing any previous approval).\n _approve(_tokenId, _to);\n\n // Emit approval event.\n Approval(msg.sender, _to, _tokenId);\n }\n\n /// @notice Transfer a Kitty owned by another address, for which the calling address\n /// has previously been granted transfer approval by the owner.\n /// @param _from The address that owns the Kitty to be transfered.\n /// @param _to The address that should take ownership of the Kitty. Can be any address,\n /// including the caller.\n /// @param _tokenId The ID of the Kitty to be transferred.\n /// @dev Required for ERC-721 compliance.\n function transferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Check for approval and valid ownership\n require(_approvedFor(msg.sender, _tokenId));\n require(_owns(_from, _tokenId));\n\n // Reassign ownership (also clears pending approvals and emits Transfer event).\n _transfer(_from, _to, _tokenId);\n }\n\n /// @notice Returns the total number of Kitties currently in existence.\n /// @dev Required for ERC-721 compliance.\n function totalSupply() public view returns (uint) {\n return kitties.length - 1;\n }\n\n /// @notice Returns the address currently assigned ownership of a given Kitty.\n /// @dev Required for ERC-721 compliance.\n function ownerOf(uint256 _tokenId)\n external\n view\n returns (address owner)\n {\n owner = kittyIndexToOwner[_tokenId];\n\n require(owner != address(0));\n }\n\n /// @notice Returns a list of all Kitty IDs assigned to an address.\n /// @param _owner The owner whose Kitties we are interested in.\n /// @dev This method MUST NEVER be called by smart contract code. First, it's fairly\n /// expensive (it walks the entire Kitty array looking for cats belonging to owner),\n /// but it also returns a dynamic array, which is only supported for web3 calls, and\n /// not contract-to-contract calls.\n function tokensOfOwner(address _owner) external view returns(uint256[] ownerTokens) {\n uint256 tokenCount = balanceOf(_owner);\n\n if (tokenCount == 0) {\n // Return an empty array\n return new uint256[](0);\n } else {\n uint256[] memory result = new uint256[](tokenCount);\n uint256 totalCats = totalSupply();\n uint256 resultIndex = 0;\n\n // We count on the fact that all cats have IDs starting at 1 and increasing\n // sequentially up to the totalCat count.\n uint256 catId;\n\n for (catId = 1; catId <= totalCats; catId++) {\n if (kittyIndexToOwner[catId] == _owner) {\n result[resultIndex] = catId;\n resultIndex++;\n }\n }\n\n return result;\n }\n }\n\n /// @dev Adapted from memcpy() by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _memcpy(uint _dest, uint _src, uint _len) private view {\n // Copy word-length chunks while possible\n for(; _len >= 32; _len -= 32) {\n assembly {\n mstore(_dest, mload(_src))\n }\n _dest += 32;\n _src += 32;\n }\n\n // Copy remaining bytes\n uint256 mask = 256 ** (32 - _len) - 1;\n assembly {\n let srcpart := and(mload(_src), not(mask))\n let destpart := and(mload(_dest), mask)\n mstore(_dest, or(destpart, srcpart))\n }\n }\n\n /// @dev Adapted from toString(slice) by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _toString(bytes32[4] _rawBytes, uint256 _stringLength) private view returns (string) {\n var outputString = new string(_stringLength);\n uint256 outputPtr;\n uint256 bytesPtr;\n\n assembly {\n outputPtr := add(outputString, 32)\n bytesPtr := _rawBytes\n }\n\n _memcpy(outputPtr, bytesPtr, _stringLength);\n\n return outputString;\n }\n\n /// @notice Returns a URI pointing to a metadata package for this token conforming to\n /// ERC-721 (https://github.com/ethereum/EIPs/issues/721)\n /// @param _tokenId The ID number of the Kitty whose metadata should be returned.\n function tokenMetadata(uint256 _tokenId, string _preferredTransport) external view returns (string infoUrl) {\n require(erc721Metadata != address(0));\n bytes32[4] memory buffer;\n uint256 count;\n (buffer, count) = erc721Metadata.getMetadata(_tokenId, _preferredTransport);\n\n return _toString(buffer, count);\n }\n}\n\n\n\n/// @title A facet of KittyCore that manages Kitty siring, gestation, and birth.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBreeding is KittyOwnership {\n\n /// @dev The Pregnant event is fired when two cats successfully breed and the pregnancy\n /// timer begins for the matron.\n event Pregnant(address owner, uint256 matronId, uint256 sireId, uint256 cooldownEndBlock);\n\n /// @notice The minimum payment required to use breedWithAuto(). This fee goes towards\n /// the gas cost paid by whatever calls giveBirth(), and can be dynamically updated by\n /// the COO role as the gas price changes.\n uint256 public autoBirthFee = 2 finney;\n\n // Keeps track of number of pregnant kitties.\n uint256 public pregnantKitties;\n\n /// @dev The address of the sibling contract that is used to implement the sooper-sekret\n /// genetic combination algorithm.\n GeneScienceInterface public geneScience;\n\n /// @dev Update the address of the genetic contract, can only be called by the CEO.\n /// @param _address An address of a GeneScience contract instance to be used from this point forward.\n function setGeneScienceAddress(address _address) external onlyCEO {\n GeneScienceInterface candidateContract = GeneScienceInterface(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isGeneScience());\n\n // Set the new contract address\n geneScience = candidateContract;\n }\n\n /// @dev Checks that a given kitten is able to breed. Requires that the\n /// current cooldown is finished (for sires) and also checks that there is\n /// no pending pregnancy.\n function _isReadyToBreed(Kitty _kit) internal view returns (bool) {\n // In addition to checking the cooldownEndBlock, we also need to check to see if\n // the cat has a pending birth; there can be some period of time between the end\n // of the pregnacy timer and the birth event.\n return (_kit.siringWithId == 0) && (_kit.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @dev Check if a sire has authorized breeding with this matron. True if both sire\n /// and matron have the same owner, or if the sire has given siring permission to\n /// the matron's owner (via approveSiring()).\n function _isSiringPermitted(uint256 _sireId, uint256 _matronId) internal view returns (bool) {\n address matronOwner = kittyIndexToOwner[_matronId];\n address sireOwner = kittyIndexToOwner[_sireId];\n\n // Siring is okay if they have same owner, or if the matron's owner was given\n // permission to breed with this sire.\n return (matronOwner == sireOwner || sireAllowedToAddress[_sireId] == matronOwner);\n }\n\n /// @dev Set the cooldownEndTime for the given Kitty, based on its current cooldownIndex.\n /// Also increments the cooldownIndex (unless it has hit the cap).\n /// @param _kitten A reference to the Kitty in storage which needs its timer started.\n function _triggerCooldown(Kitty storage _kitten) internal {\n // Compute an estimation of the cooldown time in blocks (based on current cooldownIndex).\n _kitten.cooldownEndBlock = uint64((cooldowns[_kitten.cooldownIndex]/secondsPerBlock) + block.number);\n\n // Increment the breeding count, clamping it at 13, which is the length of the\n // cooldowns array. We could check the array size dynamically, but hard-coding\n // this as a constant saves gas. Yay, Solidity!\n if (_kitten.cooldownIndex < 13) {\n _kitten.cooldownIndex += 1;\n }\n }\n\n /// @notice Grants approval to another user to sire with one of your Kitties.\n /// @param _addr The address that will be able to sire with your Kitty. Set to\n /// address(0) to clear all siring approvals for this Kitty.\n /// @param _sireId A Kitty that you own that _addr will now be able to sire with.\n function approveSiring(address _addr, uint256 _sireId)\n external\n whenNotPaused\n {\n require(_owns(msg.sender, _sireId));\n sireAllowedToAddress[_sireId] = _addr;\n }\n\n /// @dev Updates the minimum payment required for calling giveBirthAuto(). Can only\n /// be called by the COO address. (This fee is used to offset the gas cost incurred\n /// by the autobirth daemon).\n function setAutoBirthFee(uint256 val) external onlyCOO {\n autoBirthFee = val;\n }\n\n /// @dev Checks to see if a given Kitty is pregnant and (if so) if the gestation\n /// period has passed.\n function _isReadyToGiveBirth(Kitty _matron) private view returns (bool) {\n return (_matron.siringWithId != 0) && (_matron.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @notice Checks that a given kitten is able to breed (i.e. it is not pregnant or\n /// in the middle of a siring cooldown).\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isReadyToBreed(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n Kitty storage kit = kitties[_kittyId];\n return _isReadyToBreed(kit);\n }\n\n /// @dev Checks whether a kitty is currently pregnant.\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isPregnant(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n // A kitty is pregnant if and only if this field is set\n return kitties[_kittyId].siringWithId != 0;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair. DOES NOT\n /// check ownership permissions (that is up to the caller).\n /// @param _matron A reference to the Kitty struct of the potential matron.\n /// @param _matronId The matron's ID.\n /// @param _sire A reference to the Kitty struct of the potential sire.\n /// @param _sireId The sire's ID\n function _isValidMatingPair(\n Kitty storage _matron,\n uint256 _matronId,\n Kitty storage _sire,\n uint256 _sireId\n )\n private\n view\n returns(bool)\n {\n // A Kitty can't breed with itself!\n if (_matronId == _sireId) {\n return false;\n }\n\n // Kitties can't breed with their parents.\n if (_matron.matronId == _sireId || _matron.sireId == _sireId) {\n return false;\n }\n if (_sire.matronId == _matronId || _sire.sireId == _matronId) {\n return false;\n }\n\n // We can short circuit the sibling check (below) if either cat is\n // gen zero (has a matron ID of zero).\n if (_sire.matronId == 0 || _matron.matronId == 0) {\n return true;\n }\n\n // Kitties can't breed with full or half siblings.\n if (_sire.matronId == _matron.matronId || _sire.matronId == _matron.sireId) {\n return false;\n }\n if (_sire.sireId == _matron.matronId || _sire.sireId == _matron.sireId) {\n return false;\n }\n\n // Everything seems cool! Let's get DTF.\n return true;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair for\n /// breeding via auction (i.e. skips ownership and siring approval checks).\n function _canBreedWithViaAuction(uint256 _matronId, uint256 _sireId)\n internal\n view\n returns (bool)\n {\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId);\n }\n\n /// @notice Checks to see if two cats can breed together, including checks for\n /// ownership and siring approvals. Does NOT check that both cats are ready for\n /// breeding (i.e. breedWith could still fail until the cooldowns are finished).\n /// TODO: Shouldn't this check pregnancy and cooldowns?!?\n /// @param _matronId The ID of the proposed matron.\n /// @param _sireId The ID of the proposed sire.\n function canBreedWith(uint256 _matronId, uint256 _sireId)\n external\n view\n returns(bool)\n {\n require(_matronId > 0);\n require(_sireId > 0);\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId) &&\n _isSiringPermitted(_sireId, _matronId);\n }\n\n /// @dev Internal utility function to initiate breeding, assumes that all breeding\n /// requirements have been checked.\n function _breedWith(uint256 _matronId, uint256 _sireId) internal {\n // Grab a reference to the Kitties from storage.\n Kitty storage sire = kitties[_sireId];\n Kitty storage matron = kitties[_matronId];\n\n // Mark the matron as pregnant, keeping track of who the sire is.\n matron.siringWithId = uint32(_sireId);\n\n // Trigger the cooldown for both parents.\n _triggerCooldown(sire);\n _triggerCooldown(matron);\n\n // Clear siring permission for both parents. This may not be strictly necessary\n // but it's likely to avoid confusion!\n delete sireAllowedToAddress[_matronId];\n delete sireAllowedToAddress[_sireId];\n\n // Every time a kitty gets pregnant, counter is incremented.\n pregnantKitties++;\n\n // Emit the pregnancy event.\n Pregnant(kittyIndexToOwner[_matronId], _matronId, _sireId, matron.cooldownEndBlock);\n }\n\n /// @notice Breed a Kitty you own (as matron) with a sire that you own, or for which you\n /// have previously been given Siring approval. Will either make your cat pregnant, or will\n /// fail entirely. Requires a pre-payment of the fee given out to the first caller of giveBirth()\n /// @param _matronId The ID of the Kitty acting as matron (will end up pregnant if successful)\n /// @param _sireId The ID of the Kitty acting as sire (will begin its siring cooldown if successful)\n function breedWithAuto(uint256 _matronId, uint256 _sireId)\n external\n payable\n whenNotPaused\n {\n // Checks for payment.\n require(msg.value >= autoBirthFee);\n\n // Caller must own the matron.\n require(_owns(msg.sender, _matronId));\n\n // Neither sire nor matron are allowed to be on auction during a normal\n // breeding operation, but we don't need to check that explicitly.\n // For matron: The caller of this function can't be the owner of the matron\n // because the owner of a Kitty on auction is the auction house, and the\n // auction house will never call breedWith().\n // For sire: Similarly, a sire on auction will be owned by the auction house\n // and the act of transferring ownership will have cleared any oustanding\n // siring approval.\n // Thus we don't need to spend gas explicitly checking to see if either cat\n // is on auction.\n\n // Check that matron and sire are both owned by caller, or that the sire\n // has given siring permission to caller (i.e. matron's owner).\n // Will fail for _sireId = 0\n require(_isSiringPermitted(_sireId, _matronId));\n\n // Grab a reference to the potential matron\n Kitty storage matron = kitties[_matronId];\n\n // Make sure matron isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(matron));\n\n // Grab a reference to the potential sire\n Kitty storage sire = kitties[_sireId];\n\n // Make sure sire isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(sire));\n\n // Test that these cats are a valid mating pair.\n require(_isValidMatingPair(\n matron,\n _matronId,\n sire,\n _sireId\n ));\n\n // All checks passed, kitty gets pregnant!\n _breedWith(_matronId, _sireId);\n }\n\n /// @notice Have a pregnant Kitty give birth!\n /// @param _matronId A Kitty ready to give birth.\n /// @return The Kitty ID of the new kitten.\n /// @dev Looks at a given Kitty and, if pregnant and if the gestation period has passed,\n /// combines the genes of the two parents to create a new kitten. The new Kitty is assigned\n /// to the current owner of the matron. Upon successful completion, both the matron and the\n /// new kitten will be ready to breed again. Note that anyone can call this function (if they\n /// are willing to pay the gas!), but the new kitten always goes to the mother's owner.\n function giveBirth(uint256 _matronId)\n external\n whenNotPaused\n returns(uint256)\n {\n // Grab a reference to the matron in storage.\n Kitty storage matron = kitties[_matronId];\n\n // Check that the matron is a valid cat.\n require(matron.birthTime != 0);\n\n // Check that the matron is pregnant, and that its time has come!\n require(_isReadyToGiveBirth(matron));\n\n // Grab a reference to the sire in storage.\n uint256 sireId = matron.siringWithId;\n Kitty storage sire = kitties[sireId];\n\n // Determine the higher generation number of the two parents\n uint16 parentGen = matron.generation;\n if (sire.generation > matron.generation) {\n parentGen = sire.generation;\n }\n\n // Call the sooper-sekret gene mixing operation.\n uint256 childGenes = geneScience.mixGenes(matron.genes, sire.genes, matron.cooldownEndBlock - 1);\n\n // Make the new kitten!\n address owner = kittyIndexToOwner[_matronId];\n uint256 kittenId = _createKitty(_matronId, matron.siringWithId, parentGen + 1, childGenes, owner);\n\n // Clear the reference to sire from the matron (REQUIRED! Having siringWithId\n // set is what marks a matron as being pregnant.)\n delete matron.siringWithId;\n\n // Every time a kitty gives birth counter is decremented.\n pregnantKitties--;\n\n // Send the balance fee to the person who made birth happen.\n msg.sender.send(autoBirthFee);\n\n // return the new kitten's ID\n return kittenId;\n }\n}\n\n\n\n\n\n\n\n\n\n\n/// @title Auction Core\n/// @dev Contains models, variables, and internal methods for the auction.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuctionBase {\n\n // Represents an auction on an NFT\n struct Auction {\n // Current owner of NFT\n address seller;\n // Price (in wei) at beginning of auction\n uint128 startingPrice;\n // Price (in wei) at end of auction\n uint128 endingPrice;\n // Duration (in seconds) of auction\n uint64 duration;\n // Time when auction started\n // NOTE: 0 if this auction has been concluded\n uint64 startedAt;\n }\n\n // Reference to contract tracking NFT ownership\n KittiesERC721 public nonFungibleContract;\n\n // Cut owner takes on each auction, measured in basis points (1/100 of a percent).\n // Values 0-10,000 map to 0%-100%\n uint256 public ownerCut;\n\n // Map from token ID to their corresponding auction.\n mapping (uint256 => Auction) tokenIdToAuction;\n\n event AuctionCreated(uint256 tokenId, uint256 startingPrice, uint256 endingPrice, uint256 duration);\n event AuctionSuccessful(uint256 tokenId, uint256 totalPrice, address winner);\n event AuctionCancelled(uint256 tokenId);\n\n /// @dev Returns true if the claimant owns the token.\n /// @param _claimant - Address claiming to own the token.\n /// @param _tokenId - ID of token whose ownership to verify.\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return (nonFungibleContract.ownerOf(_tokenId) == _claimant);\n }\n\n /// @dev Escrows the NFT, assigning ownership to this contract.\n /// Throws if the escrow fails.\n /// @param _owner - Current owner address of token to escrow.\n /// @param _tokenId - ID of token whose approval to verify.\n function _escrow(address _owner, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transferFrom(_owner, this, _tokenId);\n }\n\n /// @dev Transfers an NFT owned by this contract to another address.\n /// Returns true if the transfer succeeds.\n /// @param _receiver - Address to transfer NFT to.\n /// @param _tokenId - ID of token to transfer.\n function _transfer(address _receiver, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transfer(_receiver, _tokenId);\n }\n\n /// @dev Adds an auction to the list of open auctions. Also fires the\n /// AuctionCreated event.\n /// @param _tokenId The ID of the token to be put on auction.\n /// @param _auction Auction to add.\n function _addAuction(uint256 _tokenId, Auction _auction) internal {\n // Require that all auctions have a duration of\n // at least one minute. (Keeps our math from getting hairy!)\n require(_auction.duration >= 1 minutes);\n\n tokenIdToAuction[_tokenId] = _auction;\n\n AuctionCreated(\n uint256(_tokenId),\n uint256(_auction.startingPrice),\n uint256(_auction.endingPrice),\n uint256(_auction.duration)\n );\n }\n\n /// @dev Cancels an auction unconditionally.\n function _cancelAuction(uint256 _tokenId, address _seller) internal {\n _removeAuction(_tokenId);\n _transfer(_seller, _tokenId);\n AuctionCancelled(_tokenId);\n }\n\n /// @dev Computes the price and transfers winnings.\n /// Does NOT transfer ownership of token.\n function _bid(uint256 _tokenId, uint256 _bidAmount)\n internal\n returns (uint256)\n {\n // Get a reference to the auction struct\n Auction storage auction = tokenIdToAuction[_tokenId];\n\n // Explicitly check that this auction is currently live.\n // (Because of how Ethereum mappings work, we can't just count\n // on the lookup above failing. An invalid _tokenId will just\n // return an auction object that is all zeros.)\n require(_isOnAuction(auction));\n\n // Check that the bid is greater than or equal to the current price\n uint256 price = _currentPrice(auction);\n require(_bidAmount >= price);\n\n // Grab a reference to the seller before the auction struct\n // gets deleted.\n address seller = auction.seller;\n\n // The bid is good! Remove the auction before sending the fees\n // to the sender so we can't have a reentrancy attack.\n _removeAuction(_tokenId);\n\n // Transfer proceeds to seller (if there are any!)\n if (price > 0) {\n // Calculate the auctioneer's cut.\n // (NOTE: _computeCut() is guaranteed to return a\n // value <= price, so this subtraction can't go negative.)\n uint256 auctioneerCut = _computeCut(price);\n uint256 sellerProceeds = price - auctioneerCut;\n\n // NOTE: Doing a transfer() in the middle of a complex\n // method like this is generally discouraged because of\n // reentrancy attacks and DoS attacks if the seller is\n // a contract with an invalid fallback function. We explicitly\n // guard against reentrancy attacks by removing the auction\n // before calling transfer(), and the only thing the seller\n // can DoS is the sale of their own asset! (And if it's an\n // accident, they can call cancelAuction(). )\n seller.transfer(sellerProceeds);\n }\n\n // Calculate any excess funds included with the bid. If the excess\n // is anything worth worrying about, transfer it back to bidder.\n // NOTE: We checked above that the bid amount is greater than or\n // equal to the price so this cannot underflow.\n uint256 bidExcess = _bidAmount - price;\n\n // Return the funds. Similar to the previous transfer, this is\n // not susceptible to a re-entry attack because the auction is\n // removed before any transfers occur.\n msg.sender.transfer(bidExcess);\n\n // Tell the world!\n AuctionSuccessful(_tokenId, price, msg.sender);\n\n return price;\n }\n\n /// @dev Removes an auction from the list of open auctions.\n /// @param _tokenId - ID of NFT on auction.\n function _removeAuction(uint256 _tokenId) internal {\n delete tokenIdToAuction[_tokenId];\n }\n\n /// @dev Returns true if the NFT is on auction.\n /// @param _auction - Auction to check.\n function _isOnAuction(Auction storage _auction) internal view returns (bool) {\n return (_auction.startedAt > 0);\n }\n\n /// @dev Returns current price of an NFT on auction. Broken into two\n /// functions (this one, that computes the duration from the auction\n /// structure, and the other that does the price computation) so we\n /// can easily test that the price computation works correctly.\n function _currentPrice(Auction storage _auction)\n internal\n view\n returns (uint256)\n {\n uint256 secondsPassed = 0;\n\n // A bit of insurance against negative values (or wraparound).\n // Probably not necessary (since Ethereum guarnatees that the\n // now variable doesn't ever go backwards).\n if (now > _auction.startedAt) {\n secondsPassed = now - _auction.startedAt;\n }\n\n return _computeCurrentPrice(\n _auction.startingPrice,\n _auction.endingPrice,\n _auction.duration,\n secondsPassed\n );\n }\n\n /// @dev Computes the current price of an auction. Factored out\n /// from _currentPrice so we can run extensive unit tests.\n /// When testing, make this function public and turn on\n /// `Current price computation` test suite.\n function _computeCurrentPrice(\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n uint256 _secondsPassed\n )\n internal\n pure\n returns (uint256)\n {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our public functions carefully cap the maximum values for\n // time (at 64-bits) and currency (at 128-bits). _duration is\n // also known to be non-zero (see the require() statement in\n // _addAuction())\n if (_secondsPassed >= _duration) {\n // We've reached the end of the dynamic pricing portion\n // of the auction, just return the end price.\n return _endingPrice;\n } else {\n // Starting price can be higher than ending price (and often is!), so\n // this delta can be negative.\n int256 totalPriceChange = int256(_endingPrice) - int256(_startingPrice);\n\n // This multiplication can't overflow, _secondsPassed will easily fit within\n // 64-bits, and totalPriceChange will easily fit within 128-bits, their product\n // will always fit within 256-bits.\n int256 currentPriceChange = totalPriceChange * int256(_secondsPassed) / int256(_duration);\n\n // currentPriceChange can be negative, but if so, will have a magnitude\n // less that _startingPrice. Thus, this result will always end up positive.\n int256 currentPrice = int256(_startingPrice) + currentPriceChange;\n\n return uint256(currentPrice);\n }\n }\n\n /// @dev Computes owner's cut of a sale.\n /// @param _price - Sale price of NFT.\n function _computeCut(uint256 _price) internal view returns (uint256) {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our entry functions carefully cap the maximum values for\n // currency (at 128-bits), and ownerCut <= 10000 (see the require()\n // statement in the ClockAuction constructor). The result of this\n // function is always guaranteed to be <= _price.\n return _price * ownerCut / 10000;\n }\n\n}\n\n\n\n\n\n\n\n/**\n * @title KittiesPausable\n * @dev Base contract which allows children to implement an emergency stop mechanism.\n */\ncontract KittiesPausable is KittiesOwnable {\n event Pause();\n event Unpause();\n\n bool public paused = false;\n\n\n /**\n\t * @dev modifier to allow actions only when the contract IS paused\n\t */\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /**\n\t * @dev modifier to allow actions only when the contract IS NOT paused\n\t */\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /**\n\t * @dev called by the owner to pause, triggers stopped state\n\t */\n function pause() onlyOwner whenNotPaused returns (bool) {\n paused = true;\n Pause();\n return true;\n }\n\n /**\n\t * @dev called by the owner to unpause, returns to normal state\n\t */\n function unpause() onlyOwner whenPaused returns (bool) {\n paused = false;\n Unpause();\n return true;\n }\n}\n\n\n/// @title Clock auction for non-fungible tokens.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuction is KittiesPausable, ClockAuctionBase {\n\n /// @dev The ERC-165 interface signature for ERC-721.\n /// Ref: https://github.com/ethereum/EIPs/issues/165\n /// Ref: https://github.com/ethereum/EIPs/issues/721\n bytes4 constant InterfaceSignature_ERC721 = bytes4(0x9a20483d);\n\n /// @dev Constructor creates a reference to the NFT ownership contract\n /// and verifies the owner cut is in the valid range.\n /// @param _nftAddress - address of a deployed contract implementing\n /// the Nonfungible Interface.\n /// @param _cut - percent cut the owner takes on each auction, must be\n /// between 0-10,000.\n function ClockAuction(address _nftAddress, uint256 _cut) public {\n require(_cut <= 10000);\n ownerCut = _cut;\n\n KittiesERC721 candidateContract = KittiesERC721(_nftAddress);\n require(candidateContract.supportsInterface(InterfaceSignature_ERC721));\n nonFungibleContract = candidateContract;\n }\n\n /// @dev Remove all Ether from the contract, which is the owner's cuts\n /// as well as any Ether sent directly to the contract address.\n /// Always transfers to the NFT contract, but can be called either by\n /// the owner or the NFT contract.\n function withdrawBalance() external {\n address nftAddress = address(nonFungibleContract);\n\n require(\n msg.sender == owner ||\n msg.sender == nftAddress\n );\n // We are using this boolean method to make sure that even if one fails it will still work\n bool res = nftAddress.send(this.balance);\n }\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of time to move between starting\n /// price and ending price (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n whenNotPaused\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(_owns(msg.sender, _tokenId));\n _escrow(msg.sender, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Bids on an open auction, completing the auction and transferring\n /// ownership of the NFT if enough Ether is supplied.\n /// @param _tokenId - ID of token to bid on.\n function bid(uint256 _tokenId)\n external\n payable\n whenNotPaused\n {\n // _bid will throw if the bid or funds transfer fails\n _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n }\n\n /// @dev Cancels an auction that hasn't been won yet.\n /// Returns the NFT to original owner.\n /// @notice This is a state-modifying function that can\n /// be called while the contract is paused.\n /// @param _tokenId - ID of token on auction\n function cancelAuction(uint256 _tokenId)\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n address seller = auction.seller;\n require(msg.sender == seller);\n _cancelAuction(_tokenId, seller);\n }\n\n /// @dev Cancels an auction when the contract is paused.\n /// Only the owner may do this, and NFTs are returned to\n /// the seller. This should only be used in emergencies.\n /// @param _tokenId - ID of the NFT on auction to cancel.\n function cancelAuctionWhenPaused(uint256 _tokenId)\n whenPaused\n onlyOwner\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n _cancelAuction(_tokenId, auction.seller);\n }\n\n /// @dev Returns auction info for an NFT on auction.\n /// @param _tokenId - ID of NFT on auction.\n function getAuction(uint256 _tokenId)\n external\n view\n returns\n (\n address seller,\n uint256 startingPrice,\n uint256 endingPrice,\n uint256 duration,\n uint256 startedAt\n ) {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return (\n auction.seller,\n auction.startingPrice,\n auction.endingPrice,\n auction.duration,\n auction.startedAt\n );\n }\n\n /// @dev Returns the current price of an auction.\n /// @param _tokenId - ID of the token price we are checking.\n function getCurrentPrice(uint256 _tokenId)\n external\n view\n returns (uint256)\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return _currentPrice(auction);\n }\n\n}\n\n\n/// @title Reverse auction modified for siring\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SiringClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSiringAuctionAddress() call.\n bool public isSiringClockAuction = true;\n\n // Delegate constructor\n function SiringClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction. Since this function is wrapped,\n /// require sender to be KittyCore contract.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Places a bid for siring. Requires the sender\n /// is the KittyCore contract because all bid methods\n /// should be wrapped. Also returns the kitty to the\n /// seller rather than the winner.\n function bid(uint256 _tokenId)\n external\n payable\n {\n require(msg.sender == address(nonFungibleContract));\n address seller = tokenIdToAuction[_tokenId].seller;\n // _bid checks that token ID is valid and will throw if bid fails\n _bid(_tokenId, msg.value);\n // We transfer the kitty back to the seller, the winner will get\n // the offspring\n _transfer(seller, _tokenId);\n }\n\n}\n\n\n\n\n\n/// @title Clock auction modified for sale of kitties\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SaleClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSaleAuctionAddress() call.\n bool public isSaleClockAuction = true;\n\n // Tracks last 5 sale price of gen0 kitty sales\n uint256 public gen0SaleCount;\n uint256[5] public lastGen0SalePrices;\n\n // Delegate constructor\n function SaleClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Updates lastSalePrice if seller is the nft contract\n /// Otherwise, works the same as default bid method.\n function bid(uint256 _tokenId)\n external\n payable\n {\n // _bid verifies token ID size\n address seller = tokenIdToAuction[_tokenId].seller;\n uint256 price = _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n\n // If not a gen0 auction, exit\n if (seller == address(nonFungibleContract)) {\n // Track gen0 sale prices\n lastGen0SalePrices[gen0SaleCount % 5] = price;\n gen0SaleCount++;\n }\n }\n\n function averageGen0SalePrice() external view returns (uint256) {\n uint256 sum = 0;\n for (uint256 i = 0; i < 5; i++) {\n sum += lastGen0SalePrices[i];\n }\n return sum / 5;\n }\n\n}\n\n\n/// @title Handles creating auctions for sale and siring of kitties.\n/// This wrapper of ReverseAuction exists only so that users can create\n/// auctions with only one transaction.\ncontract KittyAuction is KittyBreeding {\n\n // @notice The auction contract variables are defined in KittyBase to allow\n // us to refer to them in KittyOwnership to prevent accidental transfers.\n // `saleAuction` refers to the auction for gen0 and p2p sale of kitties.\n // `siringAuction` refers to the auction for siring rights of kitties.\n\n /// @dev Sets the reference to the sale auction.\n /// @param _address - Address of sale contract.\n function setSaleAuctionAddress(address _address) external onlyCEO {\n SaleClockAuction candidateContract = SaleClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSaleClockAuction());\n\n // Set the new contract address\n saleAuction = candidateContract;\n }\n\n /// @dev Sets the reference to the siring auction.\n /// @param _address - Address of siring contract.\n function setSiringAuctionAddress(address _address) external onlyCEO {\n SiringClockAuction candidateContract = SiringClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSiringClockAuction());\n\n // Set the new contract address\n siringAuction = candidateContract;\n }\n\n /// @dev Put a kitty up for auction.\n /// Does some ownership trickery to create auctions in one tx.\n function createSaleAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n // Ensure the kitty is not pregnant to prevent the auction\n // contract accidentally receiving ownership of the child.\n // NOTE: the kitty IS allowed to be in a cooldown.\n require(!isPregnant(_kittyId));\n _approve(_kittyId, saleAuction);\n // Sale auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n saleAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Put a kitty up for auction to be sire.\n /// Performs checks to ensure the kitty can be sired, then\n /// delegates to reverse auction.\n function createSiringAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n require(isReadyToBreed(_kittyId));\n _approve(_kittyId, siringAuction);\n // Siring auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n siringAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Completes a siring auction by bidding.\n /// Immediately breeds the winning matron with the sire on auction.\n /// @param _sireId - ID of the sire on auction.\n /// @param _matronId - ID of the matron owned by the bidder.\n function bidOnSiringAuction(\n uint256 _sireId,\n uint256 _matronId\n )\n external\n payable\n whenNotPaused\n {\n // Auction contract checks input sizes\n require(_owns(msg.sender, _matronId));\n require(isReadyToBreed(_matronId));\n require(_canBreedWithViaAuction(_matronId, _sireId));\n\n // Define the current price of the auction.\n uint256 currentPrice = siringAuction.getCurrentPrice(_sireId);\n require(msg.value >= currentPrice + autoBirthFee);\n\n // Siring auction will throw if the bid fails.\n siringAuction.bid.value(msg.value - autoBirthFee)(_sireId);\n _breedWith(uint32(_matronId), uint32(_sireId));\n }\n\n /// @dev Transfers the balance of the sale auction contract\n /// to the KittyCore contract. We use two-step withdrawal to\n /// prevent two transfer calls in the auction bid function.\n function withdrawAuctionBalances() external onlyCLevel {\n saleAuction.withdrawBalance();\n siringAuction.withdrawBalance();\n }\n}\n\n\n/// @title all functions related to creating kittens\ncontract KittyMinting is KittyAuction {\n\n // Limits the number of cats the contract owner can ever create.\n uint256 public constant PROMO_CREATION_LIMIT = 5000;\n uint256 public constant GEN0_CREATION_LIMIT = 45000;\n\n // Constants for gen0 auctions.\n uint256 public constant GEN0_STARTING_PRICE = 10 finney;\n uint256 public constant GEN0_AUCTION_DURATION = 1 days;\n\n // Counts the number of cats the contract owner has created.\n uint256 public promoCreatedCount;\n uint256 public gen0CreatedCount;\n\n /// @dev we can create promo kittens, up to a limit. Only callable by COO\n /// @param _genes the encoded genes of the kitten to be created, any value is accepted\n /// @param _owner the future owner of the created kittens. Default to contract COO\n function createPromoKitty(uint256 _genes, address _owner) external onlyCOO {\n address kittyOwner = _owner;\n if (kittyOwner == address(0)) {\n kittyOwner = cooAddress;\n }\n require(promoCreatedCount < PROMO_CREATION_LIMIT);\n\n promoCreatedCount++;\n _createKitty(0, 0, 0, _genes, kittyOwner);\n }\n\n /// @dev Creates a new gen0 kitty with the given genes and\n /// creates an auction for it.\n function createGen0Auction(uint256 _genes) external onlyCOO {\n require(gen0CreatedCount < GEN0_CREATION_LIMIT);\n\n uint256 kittyId = _createKitty(0, 0, 0, _genes, address(this));\n _approve(kittyId, saleAuction);\n\n saleAuction.createAuction(\n kittyId,\n _computeNextGen0Price(),\n 0,\n GEN0_AUCTION_DURATION,\n address(this)\n );\n\n gen0CreatedCount++;\n }\n\n /// @dev Computes the next gen0 auction starting price, given\n /// the average of the past 5 prices + 50%.\n function _computeNextGen0Price() internal view returns (uint256) {\n uint256 avePrice = saleAuction.averageGen0SalePrice();\n\n // Sanity check to ensure we don't overflow arithmetic\n require(avePrice == uint256(uint128(avePrice)));\n\n uint256 nextPrice = avePrice + (avePrice / 2);\n\n // We never auction for less than starting price\n if (nextPrice < GEN0_STARTING_PRICE) {\n nextPrice = GEN0_STARTING_PRICE;\n }\n\n return nextPrice;\n }\n}\n\n\n/// @title CryptoKitties: Collectible, breedable, and oh-so-adorable cats on the Ethereum blockchain.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev The main CryptoKitties contract, keeps track of kittens so they don't wander around and get lost.\ncontract KittyCore is KittyMinting {\n\n // This is the main CryptoKitties contract. In order to keep our code seperated into logical sections,\n // we've broken it up in two ways. First, we have several seperately-instantiated sibling contracts\n // that handle auctions and our super-top-secret genetic combination algorithm. The auctions are\n // seperate since their logic is somewhat complex and there's always a risk of subtle bugs. By keeping\n // them in their own contracts, we can upgrade them without disrupting the main contract that tracks\n // kitty ownership. The genetic combination algorithm is kept seperate so we can open-source all of\n // the rest of our code without making it _too_ easy for folks to figure out how the genetics work.\n // Don't worry, I'm sure someone will reverse engineer it soon enough!\n //\n // Secondly, we break the core contract into multiple files using inheritence, one for each major\n // facet of functionality of CK. This allows us to keep related code bundled together while still\n // avoiding a single giant file with everything in it. The breakdown is as follows:\n //\n // - KittyBase: This is where we define the most fundamental code shared throughout the core\n // functionality. This includes our main data storage, constants and data types, plus\n // internal functions for managing these items.\n //\n // - KittyAccessControl: This contract manages the various addresses and constraints for operations\n // that can be executed only by specific roles. Namely CEO, CFO and COO.\n //\n // - KittyOwnership: This provides the methods required for basic non-fungible token\n // transactions, following the draft ERC-721 spec (https://github.com/ethereum/EIPs/issues/721).\n //\n // - KittyBreeding: This file contains the methods necessary to breed cats together, including\n // keeping track of siring offers, and relies on an external genetic combination contract.\n //\n // - KittyAuctions: Here we have the public methods for auctioning or bidding on cats or siring\n // services. The actual auction functionality is handled in two sibling contracts (one\n // for sales and one for siring), while auction creation and bidding is mostly mediated\n // through this facet of the core contract.\n //\n // - KittyMinting: This final facet contains the functionality we use for creating new gen0 cats.\n // We can make up to 5000 \"promo\" cats that can be given away (especially important when\n // the community is new), and all others can only be created and then immediately put up\n // for auction via an algorithmically determined starting price. Regardless of how they\n // are created, there is a hard limit of 50k gen0 cats. After that, it's all up to the\n // community to breed, breed, breed!\n\n // Set in case the core contract is broken and an upgrade is required\n address public newContractAddress;\n\n /// @notice Creates the main CryptoKitties smart contract instance.\n function KittyCore() public {\n // Starts paused.\n paused = true;\n\n // the creator of the contract is the initial CEO\n ceoAddress = msg.sender;\n\n // the creator of the contract is also the initial COO\n cooAddress = msg.sender;\n\n // start with the mythical kitten 0 - so we don't have generation-0 parent issues\n _createKitty(0, 0, 0, uint256(-1), address(0));\n }\n\n /// @dev Used to mark the smart contract as upgraded, in case there is a serious\n /// breaking bug. This method does nothing but keep track of the new contract and\n /// emit a message indicating that the new address is set. It's up to clients of this\n /// contract to update to the new contract address in that case. (This contract will\n /// be paused indefinitely if such an upgrade takes place.)\n /// @param _v2Address new address\n function setNewAddress(address _v2Address) external onlyCEO whenPaused {\n // See README.md for updgrade plan\n newContractAddress = _v2Address;\n ContractUpgrade(_v2Address);\n }\n\n /// @notice No tipping!\n /// @dev Reject all Ether from being sent here, unless it's from one of the\n /// two auction contracts. (Hopefully, we can prevent user accidents.)\n function() external payable {\n require(\n msg.sender == address(saleAuction) ||\n msg.sender == address(siringAuction)\n );\n }\n\n /// @notice Returns all the relevant information about a specific kitty.\n /// @param _id The ID of the kitty of interest.\n function getKitty(uint256 _id)\n external\n view\n returns (\n bool isGestating,\n bool isReady,\n uint256 cooldownIndex,\n uint256 nextActionAt,\n uint256 siringWithId,\n uint256 birthTime,\n uint256 matronId,\n uint256 sireId,\n uint256 generation,\n uint256 genes\n ) {\n Kitty storage kit = kitties[_id];\n\n // if this variable is 0 then it's not gestating\n isGestating = (kit.siringWithId != 0);\n isReady = (kit.cooldownEndBlock <= block.number);\n cooldownIndex = uint256(kit.cooldownIndex);\n nextActionAt = uint256(kit.cooldownEndBlock);\n siringWithId = uint256(kit.siringWithId);\n birthTime = uint256(kit.birthTime);\n matronId = uint256(kit.matronId);\n sireId = uint256(kit.sireId);\n generation = uint256(kit.generation);\n genes = kit.genes;\n }\n\n /// @dev Override unpause so it requires all external contract addresses\n /// to be set before contract can be unpaused. Also, we can't have\n /// newContractAddress set either, because then the contract was upgraded.\n /// @notice This is public rather than external so we can call super.unpause\n /// without using an expensive CALL.\n function unpause() public onlyCEO whenPaused {\n require(saleAuction != address(0));\n require(siringAuction != address(0));\n require(geneScience != address(0));\n require(newContractAddress == address(0));\n\n // Actually unpause the contract.\n super.unpause();\n }\n\n // @dev Allows the CFO to capture the balance available to the contract.\n function withdrawBalance() external onlyCFO {\n uint256 balance = this.balance;\n // Subtract all the currently pregnant kittens we have, plus 1 of margin.\n uint256 subtractFees = (pregnantKitties + 1) * autoBirthFee;\n\n if (balance > subtractFees) {\n cfoAddress.send(balance - subtractFees);\n }\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "exportedSymbols": { "ClockAuction": [ 8872 @@ -51977,5 +51977,5 @@ }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:47.968Z" + "updatedAt": "2018-10-09T17:45:36.126Z" } \ No newline at end of file diff --git a/artifacts/json/StandardToken.json b/artifacts/json/StandardToken.json index ae26e235..09add3c9 100644 --- a/artifacts/json/StandardToken.json +++ b/artifacts/json/StandardToken.json @@ -3732,5 +3732,5 @@ }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:48.051Z" + "updatedAt": "2018-10-09T17:45:35.529Z" } \ No newline at end of file diff --git a/artifacts/json/TermsContract.json b/artifacts/json/TermsContract.json index 9faa414b..fe2279b1 100644 --- a/artifacts/json/TermsContract.json +++ b/artifacts/json/TermsContract.json @@ -126,10 +126,10 @@ "sourceMap": "", "deployedSourceMap": "", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\n\ninterface TermsContract {\n /// When called, the registerTermStart function registers the fact that\n /// the debt agreement has begun. This method is called as a hook by the\n /// DebtKernel when a debt order associated with `agreementId` is filled.\n /// Method is not required to make any sort of internal state change\n /// upon the debt agreement's start, but MUST return `true` in order to\n /// acknowledge receipt of the transaction. If, for any reason, the\n /// debt agreement stored at `agreementId` is incompatible with this contract,\n /// MUST return `false`, which will cause the pertinent order fill to fail.\n /// If this method is called for a debt agreement whose term has already begun,\n /// must THROW. Similarly, if this method is called by any contract other\n /// than the current DebtKernel, must THROW.\n /// @param agreementId bytes32. The agreement id (issuance hash) of the debt agreement to which this pertains.\n /// @param debtor address. The debtor in this particular issuance.\n /// @return _success bool. Acknowledgment of whether\n function registerTermStart(\n bytes32 agreementId,\n address debtor\n ) public returns (bool _success);\n\n /// When called, the registerRepayment function records the debtor's\n /// repayment, as well as any auxiliary metadata needed by the contract\n /// to determine ex post facto the value repaid (e.g. current USD\n /// exchange rate)\n /// @param agreementId bytes32. The agreement id (issuance hash) of the debt agreement to which this pertains.\n /// @param payer address. The address of the payer.\n /// @param beneficiary address. The address of the payment's beneficiary.\n /// @param unitsOfRepayment uint. The units-of-value repaid in the transaction.\n /// @param tokenAddress address. The address of the token with which the repayment transaction was executed.\n function registerRepayment(\n bytes32 agreementId,\n address payer,\n address beneficiary,\n uint256 unitsOfRepayment,\n address tokenAddress\n ) public returns (bool _success);\n\n /// Returns the cumulative units-of-value expected to be repaid by a given block timestamp.\n /// Note this is not a constant function -- this value can vary on basis of any number of\n /// conditions (e.g. interest rates can be renegotiated if repayments are delinquent).\n /// @param agreementId bytes32. The agreement id (issuance hash) of the debt agreement to which this pertains.\n /// @param timestamp uint. The timestamp of the block for which repayment expectation is being queried.\n /// @return uint256 The cumulative units-of-value expected to be repaid by the time the given timestamp lapses.\n function getExpectedRepaymentValue(\n bytes32 agreementId,\n uint256 timestamp\n ) public view returns (uint256);\n\n /// Returns the cumulative units-of-value repaid by the point at which this method is called.\n /// @param agreementId bytes32. The agreement id (issuance hash) of the debt agreement to which this pertains.\n /// @return uint256 The cumulative units-of-value repaid up until now.\n function getValueRepaidToDate(\n bytes32 agreementId\n ) public view returns (uint256);\n\n /**\n * A method that returns a Unix timestamp representing the end of the debt agreement's term.\n * contract.\n */\n function getTermEndTimestamp(\n bytes32 _agreementId\n ) public view returns (uint);\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/TermsContract.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/TermsContract.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/TermsContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/TermsContract.sol", "exportedSymbols": { "TermsContract": [ 4757 @@ -779,5 +779,5 @@ }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:47.591Z" + "updatedAt": "2018-10-09T17:45:35.436Z" } \ No newline at end of file diff --git a/artifacts/json/TokenRegistry.json b/artifacts/json/TokenRegistry.json index af08e14f..a4bdebb7 100644 --- a/artifacts/json/TokenRegistry.json +++ b/artifacts/json/TokenRegistry.json @@ -351,15 +351,15 @@ "type": "event" } ], - "bytecode": "0x6060604052336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611b4a806100536000396000f3006060604052600436106100e6576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680631e71f8d1146100eb5780632e1e1bb3146102335780633550b6d9146102a45780633dbe284a1461034157806351d658d2146104455780635715c5b7146105105780636e7cbb0d146105735780638052348b1461060f57806380ec85871461072657806382f694301461079d5780638da5cb5b146107da57806395f121bf1461082f578063bd7b564d146108cb578063c51ccb40146109a1578063f2fde38b146109d0578063fa7f369714610a09575b600080fd5b34156100f657600080fd5b61010c6004808035906020019091905050610aa5565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001806020018460ff1660ff168152602001838103835286818151815260200191508051906020019080838360005b8381101561018e578082015181840152602081019050610173565b50505050905090810190601f1680156101bb5780820380516001836020036101000a031916815260200191505b50838103825285818151815260200191508051906020019080838360005b838110156101f45780820151818401526020810190506101d9565b50505050905090810190601f1680156102215780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390f35b341561023e57600080fd5b61028e600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610c3b565b6040518082815260200191505060405180910390f35b34156102af57600080fd5b6102ff600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610cd0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561034c57600080fd5b610366600480803560001916906020019091905050610d85565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018360ff1660ff1681526020018281038252848181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156104335780601f1061040857610100808354040283529160200191610433565b820191906000526020600020905b81548152906001019060200180831161041657829003601f168201915b50509550505050505060405180910390f35b341561045057600080fd5b61050e600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560ff16906020019091905050610de1565b005b341561051b57600080fd5b6105316004808035906020019091905050611217565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561057e57600080fd5b61059460048080359060200190919050506112d7565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156105d45780820151818401526020810190506105b9565b50505050905090810190601f1680156106015780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561061a57600080fd5b61066a600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611390565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200184815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156106e85780820151818401526020810190506106cd565b50505050905090810190601f1680156107155780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b341561073157600080fd5b610781600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611515565b604051808260ff1660ff16815260200191505060405180910390f35b34156107a857600080fd5b6107be60048080359060200190919050506115b7565b604051808260ff1660ff16815260200191505060405180910390f35b34156107e557600080fd5b6107ed6115dd565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561083a57600080fd5b6108506004808035906020019091905050611602565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610890578082015181840152602081019050610875565b50505050905090810190601f1680156108bd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156108d657600080fd5b610926600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506116b5565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561096657808201518184015260208101905061094b565b50505050905090810190601f1680156109935780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156109ac57600080fd5b6109b46117e8565b604051808260ff1660ff16815260200191505060405180910390f35b34156109db57600080fd5b610a07600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506117fc565b005b3415610a1457600080fd5b610a2a6004808035906020019091905050611951565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610a6a578082015181840152602081019050610a4f565b50505050905090810190601f168015610a975780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000610aaf611989565b610ab7611989565b6000610ac1611989565b600080610acd886112d7565b9250826040518082805190602001908083835b602083101515610b055780518252602082019150602081019050602083039250610ae0565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683826002018360030160009054906101000a900460ff16818054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610c225780601f10610bf757610100808354040283529160200191610c22565b820191906000526020600020905b815481529060010190602001808311610c0557829003601f168201915b5050505050915096509650965096505050509193509193565b6000806000836040518082805190602001908083835b602083101515610c765780518252602082019150602081019050602083039250610c51565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902091506001600083600019166000191681526020019081526020016000209050806001015492505050919050565b6000806000836040518082805190602001908083835b602083101515610d0b5780518252602082019150602081019050602083039250610ce6565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692505050919050565b60016020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201908060030160009054906101000a900460ff16905084565b6000610deb61199d565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610e4657600080fd5b856040518082805190602001908083835b602083101515610e7c5780518252602082019150602081019050602083039250610e57565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209150600160008360001916600019168152602001908152602001600020608060405190810160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610fcb5780601f10610fa057610100808354040283529160200191610fcb565b820191906000526020600020905b815481529060010190602001808311610fae57829003601f168201915b505050505081526020016003820160009054906101000a900460ff1660ff1660ff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16141561110d5784816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505082816060019060ff16908160ff168152505083816040018190525061010260009054906101000a900460ff1660ff1681602001818152505085600261010260009054906101000a900460ff1660ff16610100811015156110c057fe5b0190805190602001906110d49291906119e5565b50610102600081819054906101000a900460ff168092919060010191906101000a81548160ff021916908360ff16021790555050611161565b84816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505082816060019060ff16908160ff16815250508381604001819052505b8060016000846000191660001916815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020190805190602001906111ea929190611a65565b5060608201518160030160006101000a81548160ff021916908360ff160217905550905050505050505050565b6000806002836101008110151561122a57fe5b0190506112cf818054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156112c55780601f1061129a576101008083540402835291602001916112c5565b820191906000526020600020905b8154815290600101906020018083116112a857829003601f168201915b5050505050610cd0565b915050919050565b6112df611989565b600282610100811015156112ef57fe5b018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113845780601f1061135957610100808354040283529160200191611384565b820191906000526020600020905b81548152906001019060200180831161136757829003601f168201915b50505050509050919050565b60008061139b611989565b6000806000866040518082805190602001908083835b6020831015156113d657805182526020820191506020810190506020830392506113b1565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160010154826002018360030160009054906101000a900460ff16818054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114f75780601f106114cc576101008083540402835291602001916114f7565b820191906000526020600020905b8154815290600101906020018083116114da57829003601f168201915b505050505091508060ff169050955095509550955050509193509193565b6000806000836040518082805190602001908083835b602083101515611550578051825260208201915060208101905060208303925061152b565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060030160009054906101000a900460ff1692505050919050565b60006115c1611989565b6115ca836112d7565b90506115d581611515565b915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6002816101008110151561161257fe5b016000915090508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116ad5780601f10611682576101008083540402835291602001916116ad565b820191906000526020600020905b81548152906001019060200180831161169057829003601f168201915b505050505081565b6116bd611989565b600080836040518082805190602001908083835b6020831015156116f657805182526020820191506020810190506020830392506116d1565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902091506001600083600019166000191681526020019081526020016000209050806002018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156117da5780601f106117af576101008083540402835291602001916117da565b820191906000526020600020905b8154815290600101906020018083116117bd57829003601f168201915b505050505092505050919050565b61010260009054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561185757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561189357600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611959611989565b611961611989565b611969611989565b611972846112d7565b915061197d826116b5565b90508092505050919050565b602060405190810160405280600081525090565b608060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016119d5611ae5565b8152602001600060ff1681525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611a2657805160ff1916838001178555611a54565b82800160010185558215611a54579182015b82811115611a53578251825591602001919060010190611a38565b5b509050611a619190611af9565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611aa657805160ff1916838001178555611ad4565b82800160010185558215611ad4579182015b82811115611ad3578251825591602001919060010190611ab8565b5b509050611ae19190611af9565b5090565b602060405190810160405280600081525090565b611b1b91905b80821115611b17576000816000905550600101611aff565b5090565b905600a165627a7a723058204d982a9c1a4b043f378126db2a600bd5789bdcacb95f71450120c3e1ca13995f0029", - "deployedBytecode": "0x6060604052600436106100e6576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680631e71f8d1146100eb5780632e1e1bb3146102335780633550b6d9146102a45780633dbe284a1461034157806351d658d2146104455780635715c5b7146105105780636e7cbb0d146105735780638052348b1461060f57806380ec85871461072657806382f694301461079d5780638da5cb5b146107da57806395f121bf1461082f578063bd7b564d146108cb578063c51ccb40146109a1578063f2fde38b146109d0578063fa7f369714610a09575b600080fd5b34156100f657600080fd5b61010c6004808035906020019091905050610aa5565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001806020018460ff1660ff168152602001838103835286818151815260200191508051906020019080838360005b8381101561018e578082015181840152602081019050610173565b50505050905090810190601f1680156101bb5780820380516001836020036101000a031916815260200191505b50838103825285818151815260200191508051906020019080838360005b838110156101f45780820151818401526020810190506101d9565b50505050905090810190601f1680156102215780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390f35b341561023e57600080fd5b61028e600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610c3b565b6040518082815260200191505060405180910390f35b34156102af57600080fd5b6102ff600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610cd0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561034c57600080fd5b610366600480803560001916906020019091905050610d85565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018360ff1660ff1681526020018281038252848181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156104335780601f1061040857610100808354040283529160200191610433565b820191906000526020600020905b81548152906001019060200180831161041657829003601f168201915b50509550505050505060405180910390f35b341561045057600080fd5b61050e600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560ff16906020019091905050610de1565b005b341561051b57600080fd5b6105316004808035906020019091905050611217565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561057e57600080fd5b61059460048080359060200190919050506112d7565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156105d45780820151818401526020810190506105b9565b50505050905090810190601f1680156106015780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561061a57600080fd5b61066a600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611390565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200184815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156106e85780820151818401526020810190506106cd565b50505050905090810190601f1680156107155780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b341561073157600080fd5b610781600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611515565b604051808260ff1660ff16815260200191505060405180910390f35b34156107a857600080fd5b6107be60048080359060200190919050506115b7565b604051808260ff1660ff16815260200191505060405180910390f35b34156107e557600080fd5b6107ed6115dd565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561083a57600080fd5b6108506004808035906020019091905050611602565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610890578082015181840152602081019050610875565b50505050905090810190601f1680156108bd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156108d657600080fd5b610926600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506116b5565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561096657808201518184015260208101905061094b565b50505050905090810190601f1680156109935780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156109ac57600080fd5b6109b46117e8565b604051808260ff1660ff16815260200191505060405180910390f35b34156109db57600080fd5b610a07600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506117fc565b005b3415610a1457600080fd5b610a2a6004808035906020019091905050611951565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610a6a578082015181840152602081019050610a4f565b50505050905090810190601f168015610a975780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000610aaf611989565b610ab7611989565b6000610ac1611989565b600080610acd886112d7565b9250826040518082805190602001908083835b602083101515610b055780518252602082019150602081019050602083039250610ae0565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683826002018360030160009054906101000a900460ff16818054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610c225780601f10610bf757610100808354040283529160200191610c22565b820191906000526020600020905b815481529060010190602001808311610c0557829003601f168201915b5050505050915096509650965096505050509193509193565b6000806000836040518082805190602001908083835b602083101515610c765780518252602082019150602081019050602083039250610c51565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902091506001600083600019166000191681526020019081526020016000209050806001015492505050919050565b6000806000836040518082805190602001908083835b602083101515610d0b5780518252602082019150602081019050602083039250610ce6565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692505050919050565b60016020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201908060030160009054906101000a900460ff16905084565b6000610deb61199d565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610e4657600080fd5b856040518082805190602001908083835b602083101515610e7c5780518252602082019150602081019050602083039250610e57565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209150600160008360001916600019168152602001908152602001600020608060405190810160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610fcb5780601f10610fa057610100808354040283529160200191610fcb565b820191906000526020600020905b815481529060010190602001808311610fae57829003601f168201915b505050505081526020016003820160009054906101000a900460ff1660ff1660ff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16141561110d5784816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505082816060019060ff16908160ff168152505083816040018190525061010260009054906101000a900460ff1660ff1681602001818152505085600261010260009054906101000a900460ff1660ff16610100811015156110c057fe5b0190805190602001906110d49291906119e5565b50610102600081819054906101000a900460ff168092919060010191906101000a81548160ff021916908360ff16021790555050611161565b84816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505082816060019060ff16908160ff16815250508381604001819052505b8060016000846000191660001916815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020190805190602001906111ea929190611a65565b5060608201518160030160006101000a81548160ff021916908360ff160217905550905050505050505050565b6000806002836101008110151561122a57fe5b0190506112cf818054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156112c55780601f1061129a576101008083540402835291602001916112c5565b820191906000526020600020905b8154815290600101906020018083116112a857829003601f168201915b5050505050610cd0565b915050919050565b6112df611989565b600282610100811015156112ef57fe5b018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113845780601f1061135957610100808354040283529160200191611384565b820191906000526020600020905b81548152906001019060200180831161136757829003601f168201915b50505050509050919050565b60008061139b611989565b6000806000866040518082805190602001908083835b6020831015156113d657805182526020820191506020810190506020830392506113b1565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160010154826002018360030160009054906101000a900460ff16818054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114f75780601f106114cc576101008083540402835291602001916114f7565b820191906000526020600020905b8154815290600101906020018083116114da57829003601f168201915b505050505091508060ff169050955095509550955050509193509193565b6000806000836040518082805190602001908083835b602083101515611550578051825260208201915060208101905060208303925061152b565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060030160009054906101000a900460ff1692505050919050565b60006115c1611989565b6115ca836112d7565b90506115d581611515565b915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6002816101008110151561161257fe5b016000915090508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116ad5780601f10611682576101008083540402835291602001916116ad565b820191906000526020600020905b81548152906001019060200180831161169057829003601f168201915b505050505081565b6116bd611989565b600080836040518082805190602001908083835b6020831015156116f657805182526020820191506020810190506020830392506116d1565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902091506001600083600019166000191681526020019081526020016000209050806002018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156117da5780601f106117af576101008083540402835291602001916117da565b820191906000526020600020905b8154815290600101906020018083116117bd57829003601f168201915b505050505092505050919050565b61010260009054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561185757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561189357600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611959611989565b611961611989565b611969611989565b611972846112d7565b915061197d826116b5565b90508092505050919050565b602060405190810160405280600081525090565b608060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016119d5611ae5565b8152602001600060ff1681525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611a2657805160ff1916838001178555611a54565b82800160010185558215611a54579182015b82811115611a53578251825591602001919060010190611a38565b5b509050611a619190611af9565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611aa657805160ff1916838001178555611ad4565b82800160010185558215611ad4579182015b82811115611ad3578251825591602001919060010190611ab8565b5b509050611ae19190611af9565b5090565b602060405190810160405280600081525090565b611b1b91905b80821115611b17576000816000905550600101611aff565b5090565b905600a165627a7a723058204d982a9c1a4b043f378126db2a600bd5789bdcacb95f71450120c3e1ca13995f0029", + "bytecode": "0x6060604052336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611b4a806100536000396000f3006060604052600436106100e6576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680631e71f8d1146100eb5780632e1e1bb3146102335780633550b6d9146102a45780633dbe284a1461034157806351d658d2146104455780635715c5b7146105105780636e7cbb0d146105735780638052348b1461060f57806380ec85871461072657806382f694301461079d5780638da5cb5b146107da57806395f121bf1461082f578063bd7b564d146108cb578063c51ccb40146109a1578063f2fde38b146109d0578063fa7f369714610a09575b600080fd5b34156100f657600080fd5b61010c6004808035906020019091905050610aa5565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001806020018460ff1660ff168152602001838103835286818151815260200191508051906020019080838360005b8381101561018e578082015181840152602081019050610173565b50505050905090810190601f1680156101bb5780820380516001836020036101000a031916815260200191505b50838103825285818151815260200191508051906020019080838360005b838110156101f45780820151818401526020810190506101d9565b50505050905090810190601f1680156102215780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390f35b341561023e57600080fd5b61028e600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610c3b565b6040518082815260200191505060405180910390f35b34156102af57600080fd5b6102ff600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610cd0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561034c57600080fd5b610366600480803560001916906020019091905050610d85565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018360ff1660ff1681526020018281038252848181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156104335780601f1061040857610100808354040283529160200191610433565b820191906000526020600020905b81548152906001019060200180831161041657829003601f168201915b50509550505050505060405180910390f35b341561045057600080fd5b61050e600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560ff16906020019091905050610de1565b005b341561051b57600080fd5b6105316004808035906020019091905050611217565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561057e57600080fd5b61059460048080359060200190919050506112d7565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156105d45780820151818401526020810190506105b9565b50505050905090810190601f1680156106015780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561061a57600080fd5b61066a600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611390565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200184815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156106e85780820151818401526020810190506106cd565b50505050905090810190601f1680156107155780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b341561073157600080fd5b610781600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611515565b604051808260ff1660ff16815260200191505060405180910390f35b34156107a857600080fd5b6107be60048080359060200190919050506115b7565b604051808260ff1660ff16815260200191505060405180910390f35b34156107e557600080fd5b6107ed6115dd565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561083a57600080fd5b6108506004808035906020019091905050611602565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610890578082015181840152602081019050610875565b50505050905090810190601f1680156108bd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156108d657600080fd5b610926600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506116b5565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561096657808201518184015260208101905061094b565b50505050905090810190601f1680156109935780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156109ac57600080fd5b6109b46117e8565b604051808260ff1660ff16815260200191505060405180910390f35b34156109db57600080fd5b610a07600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506117fc565b005b3415610a1457600080fd5b610a2a6004808035906020019091905050611951565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610a6a578082015181840152602081019050610a4f565b50505050905090810190601f168015610a975780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000610aaf611989565b610ab7611989565b6000610ac1611989565b600080610acd886112d7565b9250826040518082805190602001908083835b602083101515610b055780518252602082019150602081019050602083039250610ae0565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683826002018360030160009054906101000a900460ff16818054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610c225780601f10610bf757610100808354040283529160200191610c22565b820191906000526020600020905b815481529060010190602001808311610c0557829003601f168201915b5050505050915096509650965096505050509193509193565b6000806000836040518082805190602001908083835b602083101515610c765780518252602082019150602081019050602083039250610c51565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902091506001600083600019166000191681526020019081526020016000209050806001015492505050919050565b6000806000836040518082805190602001908083835b602083101515610d0b5780518252602082019150602081019050602083039250610ce6565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692505050919050565b60016020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201908060030160009054906101000a900460ff16905084565b6000610deb61199d565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610e4657600080fd5b856040518082805190602001908083835b602083101515610e7c5780518252602082019150602081019050602083039250610e57565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209150600160008360001916600019168152602001908152602001600020608060405190810160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610fcb5780601f10610fa057610100808354040283529160200191610fcb565b820191906000526020600020905b815481529060010190602001808311610fae57829003601f168201915b505050505081526020016003820160009054906101000a900460ff1660ff1660ff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16141561110d5784816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505082816060019060ff16908160ff168152505083816040018190525061010260009054906101000a900460ff1660ff1681602001818152505085600261010260009054906101000a900460ff1660ff16610100811015156110c057fe5b0190805190602001906110d49291906119e5565b50610102600081819054906101000a900460ff168092919060010191906101000a81548160ff021916908360ff16021790555050611161565b84816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505082816060019060ff16908160ff16815250508381604001819052505b8060016000846000191660001916815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020190805190602001906111ea929190611a65565b5060608201518160030160006101000a81548160ff021916908360ff160217905550905050505050505050565b6000806002836101008110151561122a57fe5b0190506112cf818054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156112c55780601f1061129a576101008083540402835291602001916112c5565b820191906000526020600020905b8154815290600101906020018083116112a857829003601f168201915b5050505050610cd0565b915050919050565b6112df611989565b600282610100811015156112ef57fe5b018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113845780601f1061135957610100808354040283529160200191611384565b820191906000526020600020905b81548152906001019060200180831161136757829003601f168201915b50505050509050919050565b60008061139b611989565b6000806000866040518082805190602001908083835b6020831015156113d657805182526020820191506020810190506020830392506113b1565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160010154826002018360030160009054906101000a900460ff16818054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114f75780601f106114cc576101008083540402835291602001916114f7565b820191906000526020600020905b8154815290600101906020018083116114da57829003601f168201915b505050505091508060ff169050955095509550955050509193509193565b6000806000836040518082805190602001908083835b602083101515611550578051825260208201915060208101905060208303925061152b565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060030160009054906101000a900460ff1692505050919050565b60006115c1611989565b6115ca836112d7565b90506115d581611515565b915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6002816101008110151561161257fe5b016000915090508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116ad5780601f10611682576101008083540402835291602001916116ad565b820191906000526020600020905b81548152906001019060200180831161169057829003601f168201915b505050505081565b6116bd611989565b600080836040518082805190602001908083835b6020831015156116f657805182526020820191506020810190506020830392506116d1565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902091506001600083600019166000191681526020019081526020016000209050806002018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156117da5780601f106117af576101008083540402835291602001916117da565b820191906000526020600020905b8154815290600101906020018083116117bd57829003601f168201915b505050505092505050919050565b61010260009054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561185757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561189357600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611959611989565b611961611989565b611969611989565b611972846112d7565b915061197d826116b5565b90508092505050919050565b602060405190810160405280600081525090565b608060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016119d5611ae5565b8152602001600060ff1681525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611a2657805160ff1916838001178555611a54565b82800160010185558215611a54579182015b82811115611a53578251825591602001919060010190611a38565b5b509050611a619190611af9565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611aa657805160ff1916838001178555611ad4565b82800160010185558215611ad4579182015b82811115611ad3578251825591602001919060010190611ab8565b5b509050611ae19190611af9565b5090565b602060405190810160405280600081525090565b611b1b91905b80821115611b17576000816000905550600101611aff565b5090565b905600a165627a7a723058204dac033c7dcd66d826eb4b13efc993d432221f481a8b4ec8dc82bdf92095dec70029", + "deployedBytecode": "0x6060604052600436106100e6576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680631e71f8d1146100eb5780632e1e1bb3146102335780633550b6d9146102a45780633dbe284a1461034157806351d658d2146104455780635715c5b7146105105780636e7cbb0d146105735780638052348b1461060f57806380ec85871461072657806382f694301461079d5780638da5cb5b146107da57806395f121bf1461082f578063bd7b564d146108cb578063c51ccb40146109a1578063f2fde38b146109d0578063fa7f369714610a09575b600080fd5b34156100f657600080fd5b61010c6004808035906020019091905050610aa5565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001806020018460ff1660ff168152602001838103835286818151815260200191508051906020019080838360005b8381101561018e578082015181840152602081019050610173565b50505050905090810190601f1680156101bb5780820380516001836020036101000a031916815260200191505b50838103825285818151815260200191508051906020019080838360005b838110156101f45780820151818401526020810190506101d9565b50505050905090810190601f1680156102215780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390f35b341561023e57600080fd5b61028e600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610c3b565b6040518082815260200191505060405180910390f35b34156102af57600080fd5b6102ff600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610cd0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561034c57600080fd5b610366600480803560001916906020019091905050610d85565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018360ff1660ff1681526020018281038252848181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156104335780601f1061040857610100808354040283529160200191610433565b820191906000526020600020905b81548152906001019060200180831161041657829003601f168201915b50509550505050505060405180910390f35b341561045057600080fd5b61050e600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560ff16906020019091905050610de1565b005b341561051b57600080fd5b6105316004808035906020019091905050611217565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561057e57600080fd5b61059460048080359060200190919050506112d7565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156105d45780820151818401526020810190506105b9565b50505050905090810190601f1680156106015780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561061a57600080fd5b61066a600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611390565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200184815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156106e85780820151818401526020810190506106cd565b50505050905090810190601f1680156107155780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b341561073157600080fd5b610781600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611515565b604051808260ff1660ff16815260200191505060405180910390f35b34156107a857600080fd5b6107be60048080359060200190919050506115b7565b604051808260ff1660ff16815260200191505060405180910390f35b34156107e557600080fd5b6107ed6115dd565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561083a57600080fd5b6108506004808035906020019091905050611602565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610890578082015181840152602081019050610875565b50505050905090810190601f1680156108bd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156108d657600080fd5b610926600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506116b5565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561096657808201518184015260208101905061094b565b50505050905090810190601f1680156109935780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156109ac57600080fd5b6109b46117e8565b604051808260ff1660ff16815260200191505060405180910390f35b34156109db57600080fd5b610a07600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506117fc565b005b3415610a1457600080fd5b610a2a6004808035906020019091905050611951565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610a6a578082015181840152602081019050610a4f565b50505050905090810190601f168015610a975780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000610aaf611989565b610ab7611989565b6000610ac1611989565b600080610acd886112d7565b9250826040518082805190602001908083835b602083101515610b055780518252602082019150602081019050602083039250610ae0565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683826002018360030160009054906101000a900460ff16818054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610c225780601f10610bf757610100808354040283529160200191610c22565b820191906000526020600020905b815481529060010190602001808311610c0557829003601f168201915b5050505050915096509650965096505050509193509193565b6000806000836040518082805190602001908083835b602083101515610c765780518252602082019150602081019050602083039250610c51565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902091506001600083600019166000191681526020019081526020016000209050806001015492505050919050565b6000806000836040518082805190602001908083835b602083101515610d0b5780518252602082019150602081019050602083039250610ce6565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692505050919050565b60016020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201908060030160009054906101000a900460ff16905084565b6000610deb61199d565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610e4657600080fd5b856040518082805190602001908083835b602083101515610e7c5780518252602082019150602081019050602083039250610e57565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209150600160008360001916600019168152602001908152602001600020608060405190810160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610fcb5780601f10610fa057610100808354040283529160200191610fcb565b820191906000526020600020905b815481529060010190602001808311610fae57829003601f168201915b505050505081526020016003820160009054906101000a900460ff1660ff1660ff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16141561110d5784816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505082816060019060ff16908160ff168152505083816040018190525061010260009054906101000a900460ff1660ff1681602001818152505085600261010260009054906101000a900460ff1660ff16610100811015156110c057fe5b0190805190602001906110d49291906119e5565b50610102600081819054906101000a900460ff168092919060010191906101000a81548160ff021916908360ff16021790555050611161565b84816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505082816060019060ff16908160ff16815250508381604001819052505b8060016000846000191660001916815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020190805190602001906111ea929190611a65565b5060608201518160030160006101000a81548160ff021916908360ff160217905550905050505050505050565b6000806002836101008110151561122a57fe5b0190506112cf818054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156112c55780601f1061129a576101008083540402835291602001916112c5565b820191906000526020600020905b8154815290600101906020018083116112a857829003601f168201915b5050505050610cd0565b915050919050565b6112df611989565b600282610100811015156112ef57fe5b018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113845780601f1061135957610100808354040283529160200191611384565b820191906000526020600020905b81548152906001019060200180831161136757829003601f168201915b50505050509050919050565b60008061139b611989565b6000806000866040518082805190602001908083835b6020831015156113d657805182526020820191506020810190506020830392506113b1565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160010154826002018360030160009054906101000a900460ff16818054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114f75780601f106114cc576101008083540402835291602001916114f7565b820191906000526020600020905b8154815290600101906020018083116114da57829003601f168201915b505050505091508060ff169050955095509550955050509193509193565b6000806000836040518082805190602001908083835b602083101515611550578051825260208201915060208101905060208303925061152b565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060030160009054906101000a900460ff1692505050919050565b60006115c1611989565b6115ca836112d7565b90506115d581611515565b915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6002816101008110151561161257fe5b016000915090508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116ad5780601f10611682576101008083540402835291602001916116ad565b820191906000526020600020905b81548152906001019060200180831161169057829003601f168201915b505050505081565b6116bd611989565b600080836040518082805190602001908083835b6020831015156116f657805182526020820191506020810190506020830392506116d1565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902091506001600083600019166000191681526020019081526020016000209050806002018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156117da5780601f106117af576101008083540402835291602001916117da565b820191906000526020600020905b8154815290600101906020018083116117bd57829003601f168201915b505050505092505050919050565b61010260009054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561185757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561189357600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611959611989565b611961611989565b611969611989565b611972846112d7565b915061197d826116b5565b90508092505050919050565b602060405190810160405280600081525090565b608060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016119d5611ae5565b8152602001600060ff1681525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611a2657805160ff1916838001178555611a54565b82800160010185558215611a54579182015b82811115611a53578251825591602001919060010190611a38565b5b509050611a619190611af9565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611aa657805160ff1916838001178555611ad4565b82800160010185558215611ad4579182015b82811115611ad3578251825591602001919060010190611ab8565b5b509050611ae19190611af9565b5090565b602060405190810160405280600081525090565b611b1b91905b80821115611b17576000816000905550600101611aff565b5090565b905600a165627a7a723058204dac033c7dcd66d826eb4b13efc993d432221f481a8b4ec8dc82bdf92095dec70029", "sourceMap": "717:7105:12:-;;;509:10:39;501:5;;:18;;;;;;;;;;;;;;;;;;717:7105:12;;;;;;", "deployedSourceMap": "717:7105:12:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7278:542;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3738:256:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2703:263;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;757:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1416:1175;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3407:188;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4130:120;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6427:496:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4873:261:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5373:191;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;238:20:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;834:34:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4391:251:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;874:34:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;832:169:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;5823:232:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7278:542:12;7384:7;7405:6;;:::i;:::-;7425;;:::i;:::-;7445:5;7475:20;;:::i;:::-;7538:18;7587:34;7498:29;7520:6;7498:21;:29::i;:::-;7475:52;;7569:6;7559:17;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;7538:38:12;;7624:27;:39;7652:10;7624:39;;;;;;;;;;;;;;;;;7587:76;;7695:10;:23;;;;;;;;;;;;7732:6;7752:10;:15;;7781:10;:22;;;;;;;;;;;;7674:139;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7278:542;;;;;;;;:::o;3738:256::-;3806:4;3822:18;3872:34;3853:7;3843:18;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;3822:39:12;;3909:27;:39;3937:10;3909:39;;;;;;;;;;;;;;;;;3872:76;;3966:10;:21;;;3959:28;;3738:256;;;;;:::o;2703:263::-;2773:7;2792:18;2842:34;2823:7;2813:18;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;2792:39:12;;2879:27;:39;2907:10;2879:39;;;;;;;;;;;;;;;;;2842:76;;2936:10;:23;;;;;;;;;;;;2929:30;;2703:263;;;;;:::o;757:71::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1416:1175::-;1599:18;1722:33;;:::i;:::-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;1630:7:12;1620:18;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;1599:39:12;;1758:27;:39;1786:10;1758:39;;;;;;;;;;;;;;;;;1722:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1847:1;1812:37;;:10;:23;;;:37;;;1808:671;;;1956:13;1930:10;:23;;:39;;;;;;;;;;;2008:12;1983:10;:22;;:37;;;;;;;;;;;2052:10;2034;:15;;:28;;;;2100:21;;;;;;;;;;;2076:45;;:10;:21;;:45;;;;;2177:7;2136:15;2152:21;;;;;;;;;;;2136:38;;;;;;;;;;;;:48;;;;;;;;;;;;:::i;:::-;;2198:21;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1808:671;;;2362:13;2336:10;:23;;:39;;;;;;;;;;;2414:12;2389:10;:22;;:37;;;;;;;;;;;2458:10;2440;:15;;:28;;;;1808:671;2574:10;2532:27;:39;2560:10;2532:39;;;;;;;;;;;;;;;;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1416:1175;;;;;;:::o;3407:188::-;3473:7;3492:21;3516:15;3532:6;3516:23;;;;;;;;;;3492:47;;3557:31;3581:6;3557:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:23;:31::i;:::-;3550:38;;3407:188;;;;:::o;4130:120::-;4195:6;;:::i;:::-;4220:15;4236:6;4220:23;;;;;;;;;;4213:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4130:120;;;:::o;6427:496::-;6537:7;6558:4;6576:6;;:::i;:::-;6596:4;6625:18;6675:34;6656:7;6646:18;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;6625:39:12;;6712:27;:39;6740:10;6712:39;;;;;;;;;;;;;;;;;6675:76;;6783:10;:23;;;;;;;;;;;;6820:10;:21;;;6855:10;:15;;6884:10;:22;;;;;;;;;;;;6762:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6427:496;;;;;;;:::o;4873:261::-;4944:5;4961:18;5011:34;4992:7;4982:18;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;4961:39:12;;5048:27;:39;5076:10;5048:39;;;;;;;;;;;;;;;;;5011:76;;5105:10;:22;;;;;;;;;;;;5098:29;;4873:261;;;;;:::o;5373:191::-;5438:5;5455:20;;:::i;:::-;5478:29;5500:6;5478:21;:29::i;:::-;5455:52;;5525:32;5550:6;5525:24;:32::i;:::-;5518:39;;5373:191;;;;:::o;238:20:39:-;;;;;;;;;;;;;:::o;834:34:12:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4391:251::-;4458:6;;:::i;:::-;4476:18;4526:34;4507:7;4497:18;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;4476:39:12;;4563:27;:39;4591:10;4563:39;;;;;;;;;;;;;;;;;4526:76;;4620:10;:15;;4613:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4391:251;;;;;:::o;874:34::-;;;;;;;;;;;;;:::o;832:169:39:-;653:5;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;928:1;908:22;;:8;:22;;;;900:31;;;;;;;;965:8;937:37;;958:5;;;;;;;;;;;937:37;;;;;;;;;;;;988:8;980:5;;:16;;;;;;;;;;;;;;;;;;832:169;:::o;5823:232:12:-;5886:6;;:::i;:::-;5904:20;;:::i;:::-;5967:23;;:::i;:::-;5927:29;5949:6;5927:21;:29::i;:::-;5904:52;;5993:28;6014:6;5993:20;:28::i;:::-;5967:54;;6039:9;6032:16;;5823:232;;;;;:::o;717:7105::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", "source": "pragma solidity 0.4.18;\n\nimport \"zeppelin-solidity/contracts/ownership/Ownable.sol\";\n\n\n/**\n * The TokenRegistry is a basic registry mapping token symbols\n * to their known, deployed addresses on the current blockchain.\n *\n * Note that the TokenRegistry does *not* mediate any of the\n * core protocol's business logic, but, rather, is a helpful\n * utility for Terms Contracts to use in encoding, decoding, and\n * resolving the addresses of currently deployed tokens.\n *\n * At this point in time, administration of the Token Registry is\n * under Dharma Labs' control. With more sophisticated decentralized\n * governance mechanisms, we intend to shift ownership of this utility\n * contract to the Dharma community.\n */\ncontract TokenRegistry is Ownable {\n mapping (bytes32 => TokenAttributes) public symbolHashToTokenAttributes;\n string[256] public tokenSymbolList;\n uint8 public tokenSymbolListLength;\n\n struct TokenAttributes {\n // The ERC20 contract address.\n address tokenAddress;\n // The index in `tokenSymbolList` where the token's symbol can be found.\n uint tokenIndex;\n // The name of the given token, e.g. \"Canonical Wrapped Ether\"\n string name;\n // The number of digits that come after the decimal place when displaying token value.\n uint8 numDecimals;\n }\n\n /**\n * Maps the given symbol to the given token attributes.\n */\n function setTokenAttributes(\n string _symbol,\n address _tokenAddress,\n string _tokenName,\n uint8 _numDecimals\n )\n public onlyOwner\n {\n bytes32 symbolHash = keccak256(_symbol);\n\n // Attempt to retrieve the token's attributes from the registry.\n TokenAttributes memory attributes = symbolHashToTokenAttributes[symbolHash];\n\n if (attributes.tokenAddress == address(0)) {\n // The token has not yet been added to the registry.\n attributes.tokenAddress = _tokenAddress;\n attributes.numDecimals = _numDecimals;\n attributes.name = _tokenName;\n attributes.tokenIndex = tokenSymbolListLength;\n\n tokenSymbolList[tokenSymbolListLength] = _symbol;\n tokenSymbolListLength++;\n } else {\n // The token has already been added to the registry; update attributes.\n attributes.tokenAddress = _tokenAddress;\n attributes.numDecimals = _numDecimals;\n attributes.name = _tokenName;\n }\n\n // Update this contract's storage.\n symbolHashToTokenAttributes[symbolHash] = attributes;\n }\n\n /**\n * Given a symbol, resolves the current address of the token the symbol is mapped to.\n */\n function getTokenAddressBySymbol(string _symbol) public view returns (address) {\n bytes32 symbolHash = keccak256(_symbol);\n\n TokenAttributes storage attributes = symbolHashToTokenAttributes[symbolHash];\n\n return attributes.tokenAddress;\n }\n\n /**\n * Given the known index of a token within the registry's symbol list,\n * returns the address of the token mapped to the symbol at that index.\n *\n * This is a useful utility for compactly encoding the address of a token into a\n * TermsContractParameters string -- by encoding a token by its index in a\n * a 256 slot array, we can represent a token by a 1 byte uint instead of a 20 byte address.\n */\n function getTokenAddressByIndex(uint _index) public view returns (address) {\n string storage symbol = tokenSymbolList[_index];\n\n return getTokenAddressBySymbol(symbol);\n }\n\n /**\n * Given a symbol, resolves the index of the token the symbol is mapped to within the registry's\n * symbol list.\n */\n function getTokenIndexBySymbol(string _symbol) public view returns (uint) {\n bytes32 symbolHash = keccak256(_symbol);\n\n TokenAttributes storage attributes = symbolHashToTokenAttributes[symbolHash];\n\n return attributes.tokenIndex;\n }\n\n /**\n * Given an index, resolves the symbol of the token at that index in the registry's\n * token symbol list.\n */\n function getTokenSymbolByIndex(uint _index) public view returns (string) {\n return tokenSymbolList[_index];\n }\n\n /**\n * Given a symbol, returns the name of the token the symbol is mapped to within the registry's\n * symbol list.\n */\n function getTokenNameBySymbol(string _symbol) public view returns (string) {\n bytes32 symbolHash = keccak256(_symbol);\n\n TokenAttributes storage attributes = symbolHashToTokenAttributes[symbolHash];\n\n return attributes.name;\n }\n\n /**\n * Given the symbol for a token, returns the number of decimals as provided in\n * the associated TokensAttribute struct.\n *\n * Example:\n * getNumDecimalsFromSymbol(\"REP\");\n * => 18\n */\n function getNumDecimalsFromSymbol(string _symbol) public view returns (uint8) {\n bytes32 symbolHash = keccak256(_symbol);\n\n TokenAttributes storage attributes = symbolHashToTokenAttributes[symbolHash];\n\n return attributes.numDecimals;\n }\n\n /**\n * Given the index for a token in the registry, returns the number of decimals as provided in\n * the associated TokensAttribute struct.\n *\n * Example:\n * getNumDecimalsByIndex(1);\n * => 18\n */\n function getNumDecimalsByIndex(uint _index) public view returns (uint8) {\n string memory symbol = getTokenSymbolByIndex(_index);\n\n return getNumDecimalsFromSymbol(symbol);\n }\n\n /**\n * Given the index for a token in the registry, returns the name of the token as provided in\n * the associated TokensAttribute struct.\n *\n * Example:\n * getTokenNameByIndex(1);\n * => \"Canonical Wrapped Ether\"\n */\n function getTokenNameByIndex(uint _index) public view returns (string) {\n string memory symbol = getTokenSymbolByIndex(_index);\n\n string memory tokenName = getTokenNameBySymbol(symbol);\n\n return tokenName;\n }\n\n /**\n * Given the symbol for a token in the registry, returns a tuple containing the token's address,\n * the token's index in the registry, the token's name, and the number of decimals.\n *\n * Example:\n * getTokenAttributesBySymbol(\"WETH\");\n * => [\"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2\", 1, \"Canonical Wrapped Ether\", 18]\n */\n function getTokenAttributesBySymbol(string _symbol)\n public\n view\n returns (\n address,\n uint,\n string,\n uint\n )\n {\n bytes32 symbolHash = keccak256(_symbol);\n\n TokenAttributes storage attributes = symbolHashToTokenAttributes[symbolHash];\n\n return (\n attributes.tokenAddress,\n attributes.tokenIndex,\n attributes.name,\n attributes.numDecimals\n );\n }\n\n /**\n * Given the index for a token in the registry, returns a tuple containing the token's address,\n * the token's symbol, the token's name, and the number of decimals.\n *\n * Example:\n * getTokenAttributesByIndex(1);\n * => [\"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2\", \"WETH\", \"Canonical Wrapped Ether\", 18]\n */\n function getTokenAttributesByIndex(uint _index)\n public\n view\n returns (\n address,\n string,\n string,\n uint8\n )\n {\n string memory symbol = getTokenSymbolByIndex(_index);\n\n bytes32 symbolHash = keccak256(symbol);\n\n TokenAttributes storage attributes = symbolHashToTokenAttributes[symbolHash];\n\n return (\n attributes.tokenAddress,\n symbol,\n attributes.name,\n attributes.numDecimals\n );\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/TokenRegistry.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/TokenRegistry.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/TokenRegistry.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/TokenRegistry.sol", "exportedSymbols": { "TokenRegistry": [ 5113 @@ -5119,7 +5119,7 @@ } }, "links": {}, - "address": "0xa6d8c45bbd164f0b1aacbd24cb18f8b19de9648a" + "address": "0xb6cf5855a7598441e02e7cd4ffffb6e0426984ff" }, "70": { "events": { @@ -5146,5 +5146,5 @@ } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:15:01.336Z" + "updatedAt": "2018-10-09T17:51:53.143Z" } \ No newline at end of file diff --git a/artifacts/json/TokenTransferProxy.json b/artifacts/json/TokenTransferProxy.json index b8235bd7..dadd7ddf 100644 --- a/artifacts/json/TokenTransferProxy.json +++ b/artifacts/json/TokenTransferProxy.json @@ -212,15 +212,15 @@ "type": "event" } ], - "bytecode": "0x606060405260008060146101000a81548160ff021916908315150217905550336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610ff78061006d6000396000f3006060604052600436106100a4576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630a8f7b52146100a957806315dacbea146100e25780632e667c4e1461017a5780633f4ba83a146102085780635c975abb1461021d5780638456cb591461024a5780638da5cb5b1461025f57806394ae6e71146102b45780639c200302146102ed578063f2fde38b14610357575b600080fd5b34156100b457600080fd5b6100e0600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610390565b005b34156100ed57600080fd5b610160600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610439565b604051808215151515815260200191505060405180910390f35b341561018557600080fd5b61018d61055e565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101cd5780820151818401526020810190506101b2565b50505050905090810190601f1680156101fa5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561021357600080fd5b61021b610597565b005b341561022857600080fd5b610230610655565b604051808215151515815260200191505060405180910390f35b341561025557600080fd5b61025d610668565b005b341561026a57600080fd5b610272610728565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102bf57600080fd5b6102eb600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061074d565b005b34156102f857600080fd5b6103006107f6565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610343578082015181840152602081019050610328565b505050509050019250505060405180910390f35b341561036257600080fd5b61038e600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061080d565b005b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156103eb57600080fd5b610436816040805190810160405280601481526020017f746f6b656e2d7472616e736665722d70726f787900000000000000000000000081525060016109629092919063ffffffff16565b50565b600061044f336001610b3e90919063ffffffff16565b151561045a57600080fd5b8473ffffffffffffffffffffffffffffffffffffffff166323b872dd8585856000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b151561053957600080fd5b6102c65a03f1151561054a57600080fd5b505050604051805190509050949350505050565b6040805190810160405280601481526020017f746f6b656e2d7472616e736665722d70726f787900000000000000000000000081525081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156105f257600080fd5b600060149054906101000a900460ff16151561060d57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b600060149054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156106c357600080fd5b600060149054906101000a900460ff161515156106df57600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156107a857600080fd5b6107f3816040805190810160405280601481526020017f746f6b656e2d7472616e736665722d70726f78790000000000000000000000008152506001610b979092919063ffffffff16565b50565b6107fe610f3a565b6108086001610e8d565b905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561086857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156108a457600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61096c8383610f25565b151561097757600080fd5b60018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508260020180548060010182816109e79190610f4e565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060018360020180549050038360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f571925c699f9072cec76b6c6c000571cc8d0bb5c47e5819202e2e9496c6508b5826040518080602001828103825283818151815260200191508051906020019080838360005b83811015610aff578082015181840152602081019050610ae4565b50505050905090810190601f168015610b2c5780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000806000610ba68686610b3e565b1515610bb157600080fd5b8560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600186600201805490500391508560020182815481101515610c1357fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055808660020184815481101515610ca457fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090558560020182815481101515610d8957fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018660020181818054905003915081610dd19190610f7a565b508473ffffffffffffffffffffffffffffffffffffffff167f0814e4ee85854cea446b4a27a460e5ffb41516230dbc02f226c07907e432241c856040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e4b578082015181840152602081019050610e30565b50505050905090810190601f168015610e785780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050505050565b610e95610f3a565b81600201805480602002602001604051908101604052809291908181526020018280548015610f1957602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610ecf575b50505050509050919050565b6000610f318383610b3e565b15905092915050565b602060405190810160405280600081525090565b815481835581811511610f7557818360005260206000209182019101610f749190610fa6565b5b505050565b815481835581811511610fa157818360005260206000209182019101610fa09190610fa6565b5b505050565b610fc891905b80821115610fc4576000816000905550600101610fac565b5090565b905600a165627a7a72305820383d85b95b8eb7fcd8d360f3a320d02a110cad60dc66987b14a9756d2c5bcc610029", - "deployedBytecode": "0x6060604052600436106100a4576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630a8f7b52146100a957806315dacbea146100e25780632e667c4e1461017a5780633f4ba83a146102085780635c975abb1461021d5780638456cb591461024a5780638da5cb5b1461025f57806394ae6e71146102b45780639c200302146102ed578063f2fde38b14610357575b600080fd5b34156100b457600080fd5b6100e0600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610390565b005b34156100ed57600080fd5b610160600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610439565b604051808215151515815260200191505060405180910390f35b341561018557600080fd5b61018d61055e565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101cd5780820151818401526020810190506101b2565b50505050905090810190601f1680156101fa5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561021357600080fd5b61021b610597565b005b341561022857600080fd5b610230610655565b604051808215151515815260200191505060405180910390f35b341561025557600080fd5b61025d610668565b005b341561026a57600080fd5b610272610728565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102bf57600080fd5b6102eb600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061074d565b005b34156102f857600080fd5b6103006107f6565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610343578082015181840152602081019050610328565b505050509050019250505060405180910390f35b341561036257600080fd5b61038e600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061080d565b005b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156103eb57600080fd5b610436816040805190810160405280601481526020017f746f6b656e2d7472616e736665722d70726f787900000000000000000000000081525060016109629092919063ffffffff16565b50565b600061044f336001610b3e90919063ffffffff16565b151561045a57600080fd5b8473ffffffffffffffffffffffffffffffffffffffff166323b872dd8585856000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b151561053957600080fd5b6102c65a03f1151561054a57600080fd5b505050604051805190509050949350505050565b6040805190810160405280601481526020017f746f6b656e2d7472616e736665722d70726f787900000000000000000000000081525081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156105f257600080fd5b600060149054906101000a900460ff16151561060d57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b600060149054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156106c357600080fd5b600060149054906101000a900460ff161515156106df57600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156107a857600080fd5b6107f3816040805190810160405280601481526020017f746f6b656e2d7472616e736665722d70726f78790000000000000000000000008152506001610b979092919063ffffffff16565b50565b6107fe610f3a565b6108086001610e8d565b905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561086857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156108a457600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61096c8383610f25565b151561097757600080fd5b60018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508260020180548060010182816109e79190610f4e565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060018360020180549050038360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f571925c699f9072cec76b6c6c000571cc8d0bb5c47e5819202e2e9496c6508b5826040518080602001828103825283818151815260200191508051906020019080838360005b83811015610aff578082015181840152602081019050610ae4565b50505050905090810190601f168015610b2c5780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000806000610ba68686610b3e565b1515610bb157600080fd5b8560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600186600201805490500391508560020182815481101515610c1357fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055808660020184815481101515610ca457fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090558560020182815481101515610d8957fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018660020181818054905003915081610dd19190610f7a565b508473ffffffffffffffffffffffffffffffffffffffff167f0814e4ee85854cea446b4a27a460e5ffb41516230dbc02f226c07907e432241c856040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e4b578082015181840152602081019050610e30565b50505050905090810190601f168015610e785780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050505050565b610e95610f3a565b81600201805480602002602001604051908101604052809291908181526020018280548015610f1957602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610ecf575b50505050509050919050565b6000610f318383610b3e565b15905092915050565b602060405190810160405280600081525090565b815481835581811511610f7557818360005260206000209182019101610f749190610fa6565b5b505050565b815481835581811511610fa157818360005260206000209182019101610fa09190610fa6565b5b505050565b610fc891905b80821115610fc4576000816000905550600101610fac565b5090565b905600a165627a7a72305820383d85b95b8eb7fcd8d360f3a320d02a110cad60dc66987b14a9756d2c5bcc610029", + "bytecode": "0x606060405260008060146101000a81548160ff021916908315150217905550336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610ff78061006d6000396000f3006060604052600436106100a4576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630a8f7b52146100a957806315dacbea146100e25780632e667c4e1461017a5780633f4ba83a146102085780635c975abb1461021d5780638456cb591461024a5780638da5cb5b1461025f57806394ae6e71146102b45780639c200302146102ed578063f2fde38b14610357575b600080fd5b34156100b457600080fd5b6100e0600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610390565b005b34156100ed57600080fd5b610160600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610439565b604051808215151515815260200191505060405180910390f35b341561018557600080fd5b61018d61055e565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101cd5780820151818401526020810190506101b2565b50505050905090810190601f1680156101fa5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561021357600080fd5b61021b610597565b005b341561022857600080fd5b610230610655565b604051808215151515815260200191505060405180910390f35b341561025557600080fd5b61025d610668565b005b341561026a57600080fd5b610272610728565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102bf57600080fd5b6102eb600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061074d565b005b34156102f857600080fd5b6103006107f6565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610343578082015181840152602081019050610328565b505050509050019250505060405180910390f35b341561036257600080fd5b61038e600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061080d565b005b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156103eb57600080fd5b610436816040805190810160405280601481526020017f746f6b656e2d7472616e736665722d70726f787900000000000000000000000081525060016109629092919063ffffffff16565b50565b600061044f336001610b3e90919063ffffffff16565b151561045a57600080fd5b8473ffffffffffffffffffffffffffffffffffffffff166323b872dd8585856000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b151561053957600080fd5b6102c65a03f1151561054a57600080fd5b505050604051805190509050949350505050565b6040805190810160405280601481526020017f746f6b656e2d7472616e736665722d70726f787900000000000000000000000081525081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156105f257600080fd5b600060149054906101000a900460ff16151561060d57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b600060149054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156106c357600080fd5b600060149054906101000a900460ff161515156106df57600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156107a857600080fd5b6107f3816040805190810160405280601481526020017f746f6b656e2d7472616e736665722d70726f78790000000000000000000000008152506001610b979092919063ffffffff16565b50565b6107fe610f3a565b6108086001610e8d565b905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561086857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156108a457600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61096c8383610f25565b151561097757600080fd5b60018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508260020180548060010182816109e79190610f4e565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060018360020180549050038360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f571925c699f9072cec76b6c6c000571cc8d0bb5c47e5819202e2e9496c6508b5826040518080602001828103825283818151815260200191508051906020019080838360005b83811015610aff578082015181840152602081019050610ae4565b50505050905090810190601f168015610b2c5780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000806000610ba68686610b3e565b1515610bb157600080fd5b8560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600186600201805490500391508560020182815481101515610c1357fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055808660020184815481101515610ca457fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090558560020182815481101515610d8957fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018660020181818054905003915081610dd19190610f7a565b508473ffffffffffffffffffffffffffffffffffffffff167f0814e4ee85854cea446b4a27a460e5ffb41516230dbc02f226c07907e432241c856040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e4b578082015181840152602081019050610e30565b50505050905090810190601f168015610e785780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050505050565b610e95610f3a565b81600201805480602002602001604051908101604052809291908181526020018280548015610f1957602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610ecf575b50505050509050919050565b6000610f318383610b3e565b15905092915050565b602060405190810160405280600081525090565b815481835581811511610f7557818360005260206000209182019101610f749190610fa6565b5b505050565b815481835581811511610fa157818360005260206000209182019101610fa09190610fa6565b5b505050565b610fc891905b80821115610fc4576000816000905550600101610fac565b5090565b905600a165627a7a72305820255eb165e17ad9b32f7f35dee0d551e1201b7d032a506235ce86cb342e7ca1560029", + "deployedBytecode": "0x6060604052600436106100a4576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630a8f7b52146100a957806315dacbea146100e25780632e667c4e1461017a5780633f4ba83a146102085780635c975abb1461021d5780638456cb591461024a5780638da5cb5b1461025f57806394ae6e71146102b45780639c200302146102ed578063f2fde38b14610357575b600080fd5b34156100b457600080fd5b6100e0600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610390565b005b34156100ed57600080fd5b610160600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610439565b604051808215151515815260200191505060405180910390f35b341561018557600080fd5b61018d61055e565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101cd5780820151818401526020810190506101b2565b50505050905090810190601f1680156101fa5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561021357600080fd5b61021b610597565b005b341561022857600080fd5b610230610655565b604051808215151515815260200191505060405180910390f35b341561025557600080fd5b61025d610668565b005b341561026a57600080fd5b610272610728565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102bf57600080fd5b6102eb600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061074d565b005b34156102f857600080fd5b6103006107f6565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610343578082015181840152602081019050610328565b505050509050019250505060405180910390f35b341561036257600080fd5b61038e600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061080d565b005b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156103eb57600080fd5b610436816040805190810160405280601481526020017f746f6b656e2d7472616e736665722d70726f787900000000000000000000000081525060016109629092919063ffffffff16565b50565b600061044f336001610b3e90919063ffffffff16565b151561045a57600080fd5b8473ffffffffffffffffffffffffffffffffffffffff166323b872dd8585856000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b151561053957600080fd5b6102c65a03f1151561054a57600080fd5b505050604051805190509050949350505050565b6040805190810160405280601481526020017f746f6b656e2d7472616e736665722d70726f787900000000000000000000000081525081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156105f257600080fd5b600060149054906101000a900460ff16151561060d57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b600060149054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156106c357600080fd5b600060149054906101000a900460ff161515156106df57600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156107a857600080fd5b6107f3816040805190810160405280601481526020017f746f6b656e2d7472616e736665722d70726f78790000000000000000000000008152506001610b979092919063ffffffff16565b50565b6107fe610f3a565b6108086001610e8d565b905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561086857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156108a457600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61096c8383610f25565b151561097757600080fd5b60018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508260020180548060010182816109e79190610f4e565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060018360020180549050038360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f571925c699f9072cec76b6c6c000571cc8d0bb5c47e5819202e2e9496c6508b5826040518080602001828103825283818151815260200191508051906020019080838360005b83811015610aff578082015181840152602081019050610ae4565b50505050905090810190601f168015610b2c5780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000806000610ba68686610b3e565b1515610bb157600080fd5b8560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600186600201805490500391508560020182815481101515610c1357fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055808660020184815481101515610ca457fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090558560020182815481101515610d8957fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018660020181818054905003915081610dd19190610f7a565b508473ffffffffffffffffffffffffffffffffffffffff167f0814e4ee85854cea446b4a27a460e5ffb41516230dbc02f226c07907e432241c856040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e4b578082015181840152602081019050610e30565b50505050905090810190601f168015610e785780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050505050565b610e95610f3a565b81600201805480602002602001604051908101604052809291908181526020018280548015610f1957602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610ecf575b50505050509050919050565b6000610f318383610b3e565b15905092915050565b602060405190810160405280600081525090565b815481835581811511610f7557818360005260206000209182019101610f749190610fa6565b5b505050565b815481835581811511610fa157818360005260206000209182019101610fa09190610fa6565b5b505050565b610fc891905b80821115610fc4576000816000905550600101610fac565b5090565b905600a165627a7a72305820255eb165e17ad9b32f7f35dee0d551e1201b7d032a506235ce86cb342e7ca1560029", "sourceMap": "1330:1487:13:-;;;268:5:37;247:26;;;;;;;;;;;;;;;;;;;;509:10:39;501:5;;:18;;;;;;;;;;;;;;;;;;1330:1487:13;;;;;;", "deployedSourceMap": "1330:1487:13:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1678:157;;;;;;;;;;;;;;;;;;;;;;;;;;;;2506:309;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1519:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;833:87:37;;;;;;;;;;;;;;247:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;666:85;;;;;;;;;;;;;;238:20:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1943:173:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;2211:186;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;832:169:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;1678:157:13;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;1777:51:13;1812:6;1820:7;;;;;;;;;;;;;;;;;;1777:24;:34;;:51;;;;;:::i;:::-;1678:157;:::o;2506:309::-;2656:13;2693:49;2731:10;2693:24;:37;;:49;;;;:::i;:::-;2685:58;;;;;;;;2767:6;2761:26;;;2788:5;2795:3;2800:7;2761:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2754:54;;2506:309;;;;;;:::o;1519:55::-;;;;;;;;;;;;;;;;;;;;:::o;833:87:37:-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;568:6:37;;;;;;;;;;;560:15;;;;;;;;895:5;886:6;;:14;;;;;;;;;;;;;;;;;;906:9;;;;;;;;;;833:87::o;247:26::-;;;;;;;;;;;;;:::o;666:85::-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;729:4;720:6;;:13;;;;;;;;;;;;;;;;;;739:7;;;;;;;;;;666:85::o;238:20:39:-;;;;;;;;;;;;;:::o;1943:173:13:-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;2048:61:13;2093:6;2101:7;;;;;;;;;;;;;;;;;;2048:24;:44;;:61;;;;;:::i;:::-;1943:173;:::o;2211:186::-;2295:26;;:::i;:::-;2344:46;:24;:44;:46::i;:::-;2337:53;;2211:186;:::o;832:169:39:-;653:5;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;928:1;908:22;;:8;:22;;;;900:31;;;;;;;;965:8;937:37;;958:5;;;;;;;;;;;937:37;;;;;;;;;;;;988:8;980:5;;:16;;;;;;;;;;;;;;;;;;832:169;:::o;1732:383:17:-;1884:28;1900:4;1906:5;1884:15;:28::i;:::-;1876:37;;;;;;;;1949:4;1924;:15;;:22;1940:5;1924:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;1963:4;:21;;:33;;;;;;;;;;;:::i;:::-;;;;;;;;;;1990:5;1963:33;;;;;;;;;;;;;;;;;;;;;;;2064:1;2033:4;:21;;:28;;;;:32;2006:4;:17;;:24;2024:5;2006:24;;;;;;;;;;;;;;;:59;;;;2086:5;2075:33;;;2093:14;2075:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1732:383:17;;;:::o;3295:166::-;3405:4;3432;:15;;:22;3448:5;3432:22;;;;;;;;;;;;;;;;;;;;;;;;;3425:29;;3295:166;;;;:::o;2121:1168::-;2489:25;2551:23;2619:19;2452:25;2465:4;2471:5;2452:12;:25::i;:::-;2444:34;;;;;;;;2517:4;:17;;:24;2535:5;2517:24;;;;;;;;;;;;;;;;2489:52;;2608:1;2577:4;:21;;:28;;;;:32;2551:58;;2641:4;:21;;2663:18;2641:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;2619:63;;2745:4;:15;;:22;2761:5;2745:22;;;;;;;;;;;;;;;;2738:29;;;;;;;;;;;2894:11;2848:4;:21;;2870:20;2848:43;;;;;;;;;;;;;;;;;;;:57;;;;;;;;;;;;;;;;;;3009:20;2976:4;:17;;:30;2994:11;2976:30;;;;;;;;;;;;;;;:53;;;;3046:4;:17;;:24;3064:5;3046:24;;;;;;;;;;;;;;;3039:31;;;3144:4;:21;;3166:18;3144:41;;;;;;;;;;;;;;;;;;;3137:48;;;;;;;;;;;3227:1;3195:4;:21;;:33;;;;;;;;;;;;;;:::i;:::-;;3260:5;3239:43;;;3267:14;3239:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2121:1168:17;;;;;;:::o;3646:162::-;3748:9;;:::i;:::-;3780:4;:21;;3773:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3646:162;;;:::o;3467:173::-;3580:4;3608:25;3621:4;3627:5;3608:12;:25::i;:::-;3607:26;3600:33;;3467:173;;;;:::o;1330:1487:13:-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\nimport \"./DebtRegistry.sol\";\nimport { PermissionsLib, PermissionEvents } from \"./libraries/PermissionsLib.sol\";\nimport \"zeppelin-solidity/contracts/lifecycle/Pausable.sol\";\nimport \"zeppelin-solidity/contracts/token/ERC20/ERC20.sol\";\n\n\n/**\n * The TokenTransferProxy is a proxy contract for transfering principal\n * and fee payments and repayments between agents and keepers in the Dharma\n * ecosystem. It is decoupled from the DebtKernel in order to make upgrades to the\n * protocol contracts smoother -- if the DebtKernel or RepyamentRouter is upgraded to a new contract,\n * creditors will not have to grant new transfer approvals to a new contract's address.\n *\n * Author: Nadav Hollander -- Github: nadavhollander\n */\ncontract TokenTransferProxy is Pausable, PermissionEvents {\n using PermissionsLib for PermissionsLib.Permissions;\n\n PermissionsLib.Permissions internal tokenTransferPermissions;\n\n string public constant CONTEXT = \"token-transfer-proxy\";\n\n /**\n * Add address to list of agents authorized to initiate `transferFrom` calls\n */\n function addAuthorizedTransferAgent(address _agent)\n public\n onlyOwner\n {\n tokenTransferPermissions.authorize(_agent, CONTEXT);\n }\n\n /**\n * Remove address from list of agents authorized to initiate `transferFrom` calls\n */\n function revokeTransferAgentAuthorization(address _agent)\n public\n onlyOwner\n {\n tokenTransferPermissions.revokeAuthorization(_agent, CONTEXT);\n }\n\n /**\n * Return list of agents authorized to initiate `transferFrom` calls\n */\n function getAuthorizedTransferAgents()\n public\n view\n returns (address[] authorizedAgents)\n {\n return tokenTransferPermissions.getAuthorizedAgents();\n }\n\n /**\n * Transfer specified token amount from _from address to _to address on give token\n */\n function transferFrom(\n address _token,\n address _from,\n address _to,\n uint _amount\n )\n public\n returns (bool _success)\n {\n require(tokenTransferPermissions.isAuthorized(msg.sender));\n\n return ERC20(_token).transferFrom(_from, _to, _amount);\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/TokenTransferProxy.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/TokenTransferProxy.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/TokenTransferProxy.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/TokenTransferProxy.sol", "exportedSymbols": { "TokenTransferProxy": [ 5206 @@ -243,7 +243,7 @@ { "attributes": { "SourceUnit": 3159, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/DebtRegistry.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/DebtRegistry.sol", "file": "./DebtRegistry.sol", "scope": 5207, "symbolAliases": [ @@ -258,7 +258,7 @@ { "attributes": { "SourceUnit": 6272, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/libraries/PermissionsLib.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/libraries/PermissionsLib.sol", "file": "./libraries/PermissionsLib.sol", "scope": 5207, "symbolAliases": [ @@ -1612,7 +1612,7 @@ } }, "links": {}, - "address": "0xf302f9e270458b4242e7d0cba2f0816ed2193240" + "address": "0xf8181406f844d5c947481ec67c835b1384013c7e" }, "70": { "events": { @@ -1685,5 +1685,5 @@ } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:15:01.329Z" + "updatedAt": "2018-10-09T17:51:53.131Z" } \ No newline at end of file diff --git a/artifacts/ts/AddressUtils.ts b/artifacts/ts/AddressUtils.ts index 0026d0b5..afb47a5e 100644 --- a/artifacts/ts/AddressUtils.ts +++ b/artifacts/ts/AddressUtils.ts @@ -288,5 +288,5 @@ export const AddressUtils = }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:48.037Z" + "updatedAt": "2018-10-09T17:45:35.426Z" } \ No newline at end of file diff --git a/artifacts/ts/BasicToken.ts b/artifacts/ts/BasicToken.ts index 74af6f81..3a1f48c2 100644 --- a/artifacts/ts/BasicToken.ts +++ b/artifacts/ts/BasicToken.ts @@ -1436,5 +1436,5 @@ export const BasicToken = }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:48.048Z" + "updatedAt": "2018-10-09T17:45:35.453Z" } \ No newline at end of file diff --git a/artifacts/ts/ClockAuction.ts b/artifacts/ts/ClockAuction.ts index 61584132..95bf9522 100644 --- a/artifacts/ts/ClockAuction.ts +++ b/artifacts/ts/ClockAuction.ts @@ -324,15 +324,15 @@ export const ClockAuction = "type": "event" } ], - "bytecode": "0x606060405260008060146101000a81548160ff021916908315150217905550341561002957600080fd5b60405160408061176d833981016040528080519060200190919080519060200190919050506000336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061271082111515156100a157600080fd5b816002819055508290508073ffffffffffffffffffffffffffffffffffffffff166301ffc9a7639a20483d7c0100000000000000000000000000000000000000000000000000000000026000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001915050602060405180830381600087803b151561018357600080fd5b6102c65a03f1151561019457600080fd5b5050506040518051905015156101a957600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050611571806101fc6000396000f3006060604052600436106100d0576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806327ebe40a146100d55780633f4ba83a14610132578063454a2ab31461015f5780635c975abb146101775780635fd8c710146101a457806378bd7935146101b957806383b5ff8b146102385780638456cb5914610261578063878eb3681461028e5780638da5cb5b146102b157806396b5a75514610306578063c55d0f5614610329578063dd1b7a0f14610360578063f2fde38b146103b5575b600080fd5b34156100e057600080fd5b610130600480803590602001909190803590602001909190803590602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506103ee565b005b341561013d57600080fd5b610145610513565b604051808215151515815260200191505060405180910390f35b61017560048080359060200190919050506105d8565b005b341561018257600080fd5b61018a61060c565b604051808215151515815260200191505060405180910390f35b34156101af57600080fd5b6101b761061f565b005b34156101c457600080fd5b6101da600480803590602001909190505061072a565b604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b341561024357600080fd5b61024b61084d565b6040518082815260200191505060405180910390f35b341561026c57600080fd5b610274610853565b604051808215151515815260200191505060405180910390f35b341561029957600080fd5b6102af600480803590602001909190505061091a565b005b34156102bc57600080fd5b6102c46109ec565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561031157600080fd5b6103276004808035906020019091905050610a11565b005b341561033457600080fd5b61034a6004808035906020019091905050610aad565b6040518082815260200191505060405180910390f35b341561036b57600080fd5b610373610aea565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103c057600080fd5b6103ec600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b10565b005b6103f66114c7565b600060149054906101000a900460ff1615151561041257600080fd5b846fffffffffffffffffffffffffffffffff168514151561043257600080fd5b836fffffffffffffffffffffffffffffffff168414151561045257600080fd5b8267ffffffffffffffff168314151561046a57600080fd5b6104743387610be5565b151561047f57600080fd5b6104893387610cd1565b60a0604051908101604052808373ffffffffffffffffffffffffffffffffffffffff168152602001866fffffffffffffffffffffffffffffffff168152602001856fffffffffffffffffffffffffffffffff1681526020018467ffffffffffffffff1681526020014267ffffffffffffffff16815250905061050b8682610de1565b505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561057057600080fd5b600060149054906101000a900460ff16151561058b57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a16001905090565b600060149054906101000a900460ff161515156105f457600080fd5b6105fe8134610fc6565b506106093382611165565b50565b600060149054906101000a900460ff1681565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806106cd57508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156106d857600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505090505050565b60008060008060008060036000888152602001908152602001600020905061075181611241565b151561075c57600080fd5b8060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a90046fffffffffffffffffffffffffffffffff168260010160109054906101000a90046fffffffffffffffffffffffffffffffff168360020160009054906101000a900467ffffffffffffffff168460020160089054906101000a900467ffffffffffffffff16836fffffffffffffffffffffffffffffffff169350826fffffffffffffffffffffffffffffffff1692508167ffffffffffffffff1691508067ffffffffffffffff169050955095509550955095505091939590929450565b60025481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108b057600080fd5b600060149054906101000a900460ff161515156108cc57600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a16001905090565b60008060149054906101000a900460ff16151561093657600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561099157600080fd5b6003600083815260200190815260200160002090506109af81611241565b15156109ba57600080fd5b6109e8828260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661126f565b5050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600360008481526020019081526020016000209150610a3282611241565b1515610a3d57600080fd5b8160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a9e57600080fd5b610aa8838261126f565b505050565b600080600360008481526020019081526020016000209050610ace81611241565b1515610ad957600080fd5b610ae2816112bd565b915050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610b6b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515610be257806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b60008273ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e846000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515610c9757600080fd5b6102c65a03f11515610ca857600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8330846040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1515610dc957600080fd5b6102c65a03f11515610dda57600080fd5b5050505050565b603c816060015167ffffffffffffffff1610151515610dff57600080fd5b806003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060408201518160010160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160020160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050507fa9c8dfcda5664a5a124c713e386da27de87432d5b668e79458501eb296389ba78282602001516fffffffffffffffffffffffffffffffff1683604001516fffffffffffffffffffffffffffffffff16846060015167ffffffffffffffff166040518085815260200184815260200183815260200182815260200194505050505060405180910390a15050565b6000806000806000806000600360008a81526020019081526020016000209550610fef86611241565b1515610ffa57600080fd5b611003866112bd565b945084881015151561101457600080fd5b8560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169350611044896113b0565b600085111561109e576110568561146c565b925082850391508373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050151561109d57600080fd5b5b84880390503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015156110e357600080fd5b7f4fcc30d90a842164dd58501ab874a101a3749c3d4747139cefe7c876f4ccebd2898633604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a184965050505050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b151561122957600080fd5b6102c65a03f1151561123a57600080fd5b5050505050565b6000808260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16119050919050565b611278826113b0565b6112828183611165565b7f2809c7e17bf978fbc7194c0a694b638c4215e9140cacc6c38ca36010b45697df826040518082815260200191505060405180910390a15050565b600080600090508260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16421115611316578260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16420390505b6113a88360010160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168460010160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168560020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1684611487565b915050919050565b60036000828152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160006101000a8154906fffffffffffffffffffffffffffffffff02191690556001820160106101000a8154906fffffffffffffffffffffffffffffffff02191690556002820160006101000a81549067ffffffffffffffff02191690556002820160086101000a81549067ffffffffffffffff0219169055505050565b6000612710600254830281151561147f57fe5b049050919050565b600080600080858510151561149e578693506114bc565b8787039250858584028115156114b057fe5b05915081880190508093505b505050949350505050565b60a060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff16815250905600a165627a7a72305820f759c533282cebad644f11849cc385d815d8ac8f5b16a62fd97ebe545108eeb90029", - "deployedBytecode": "0x6060604052600436106100d0576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806327ebe40a146100d55780633f4ba83a14610132578063454a2ab31461015f5780635c975abb146101775780635fd8c710146101a457806378bd7935146101b957806383b5ff8b146102385780638456cb5914610261578063878eb3681461028e5780638da5cb5b146102b157806396b5a75514610306578063c55d0f5614610329578063dd1b7a0f14610360578063f2fde38b146103b5575b600080fd5b34156100e057600080fd5b610130600480803590602001909190803590602001909190803590602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506103ee565b005b341561013d57600080fd5b610145610513565b604051808215151515815260200191505060405180910390f35b61017560048080359060200190919050506105d8565b005b341561018257600080fd5b61018a61060c565b604051808215151515815260200191505060405180910390f35b34156101af57600080fd5b6101b761061f565b005b34156101c457600080fd5b6101da600480803590602001909190505061072a565b604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b341561024357600080fd5b61024b61084d565b6040518082815260200191505060405180910390f35b341561026c57600080fd5b610274610853565b604051808215151515815260200191505060405180910390f35b341561029957600080fd5b6102af600480803590602001909190505061091a565b005b34156102bc57600080fd5b6102c46109ec565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561031157600080fd5b6103276004808035906020019091905050610a11565b005b341561033457600080fd5b61034a6004808035906020019091905050610aad565b6040518082815260200191505060405180910390f35b341561036b57600080fd5b610373610aea565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103c057600080fd5b6103ec600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b10565b005b6103f66114c7565b600060149054906101000a900460ff1615151561041257600080fd5b846fffffffffffffffffffffffffffffffff168514151561043257600080fd5b836fffffffffffffffffffffffffffffffff168414151561045257600080fd5b8267ffffffffffffffff168314151561046a57600080fd5b6104743387610be5565b151561047f57600080fd5b6104893387610cd1565b60a0604051908101604052808373ffffffffffffffffffffffffffffffffffffffff168152602001866fffffffffffffffffffffffffffffffff168152602001856fffffffffffffffffffffffffffffffff1681526020018467ffffffffffffffff1681526020014267ffffffffffffffff16815250905061050b8682610de1565b505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561057057600080fd5b600060149054906101000a900460ff16151561058b57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a16001905090565b600060149054906101000a900460ff161515156105f457600080fd5b6105fe8134610fc6565b506106093382611165565b50565b600060149054906101000a900460ff1681565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806106cd57508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156106d857600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505090505050565b60008060008060008060036000888152602001908152602001600020905061075181611241565b151561075c57600080fd5b8060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a90046fffffffffffffffffffffffffffffffff168260010160109054906101000a90046fffffffffffffffffffffffffffffffff168360020160009054906101000a900467ffffffffffffffff168460020160089054906101000a900467ffffffffffffffff16836fffffffffffffffffffffffffffffffff169350826fffffffffffffffffffffffffffffffff1692508167ffffffffffffffff1691508067ffffffffffffffff169050955095509550955095505091939590929450565b60025481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108b057600080fd5b600060149054906101000a900460ff161515156108cc57600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a16001905090565b60008060149054906101000a900460ff16151561093657600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561099157600080fd5b6003600083815260200190815260200160002090506109af81611241565b15156109ba57600080fd5b6109e8828260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661126f565b5050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600360008481526020019081526020016000209150610a3282611241565b1515610a3d57600080fd5b8160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a9e57600080fd5b610aa8838261126f565b505050565b600080600360008481526020019081526020016000209050610ace81611241565b1515610ad957600080fd5b610ae2816112bd565b915050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610b6b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515610be257806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b60008273ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e846000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515610c9757600080fd5b6102c65a03f11515610ca857600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8330846040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1515610dc957600080fd5b6102c65a03f11515610dda57600080fd5b5050505050565b603c816060015167ffffffffffffffff1610151515610dff57600080fd5b806003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060408201518160010160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160020160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050507fa9c8dfcda5664a5a124c713e386da27de87432d5b668e79458501eb296389ba78282602001516fffffffffffffffffffffffffffffffff1683604001516fffffffffffffffffffffffffffffffff16846060015167ffffffffffffffff166040518085815260200184815260200183815260200182815260200194505050505060405180910390a15050565b6000806000806000806000600360008a81526020019081526020016000209550610fef86611241565b1515610ffa57600080fd5b611003866112bd565b945084881015151561101457600080fd5b8560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169350611044896113b0565b600085111561109e576110568561146c565b925082850391508373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050151561109d57600080fd5b5b84880390503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015156110e357600080fd5b7f4fcc30d90a842164dd58501ab874a101a3749c3d4747139cefe7c876f4ccebd2898633604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a184965050505050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b151561122957600080fd5b6102c65a03f1151561123a57600080fd5b5050505050565b6000808260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16119050919050565b611278826113b0565b6112828183611165565b7f2809c7e17bf978fbc7194c0a694b638c4215e9140cacc6c38ca36010b45697df826040518082815260200191505060405180910390a15050565b600080600090508260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16421115611316578260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16420390505b6113a88360010160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168460010160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168560020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1684611487565b915050919050565b60036000828152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160006101000a8154906fffffffffffffffffffffffffffffffff02191690556001820160106101000a8154906fffffffffffffffffffffffffffffffff02191690556002820160006101000a81549067ffffffffffffffff02191690556002820160086101000a81549067ffffffffffffffff0219169055505050565b6000612710600254830281151561147f57fe5b049050919050565b600080600080858510151561149e578693506114bc565b8787039250858584028115156114b057fe5b05915081880190508093505b505050949350505050565b60a060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff16815250905600a165627a7a72305820f759c533282cebad644f11849cc385d815d8ac8f5b16a62fd97ebe545108eeb90029", + "bytecode": "0x606060405260008060146101000a81548160ff021916908315150217905550341561002957600080fd5b60405160408061176d833981016040528080519060200190919080519060200190919050506000336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061271082111515156100a157600080fd5b816002819055508290508073ffffffffffffffffffffffffffffffffffffffff166301ffc9a7639a20483d7c0100000000000000000000000000000000000000000000000000000000026000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001915050602060405180830381600087803b151561018357600080fd5b6102c65a03f1151561019457600080fd5b5050506040518051905015156101a957600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050611571806101fc6000396000f3006060604052600436106100d0576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806327ebe40a146100d55780633f4ba83a14610132578063454a2ab31461015f5780635c975abb146101775780635fd8c710146101a457806378bd7935146101b957806383b5ff8b146102385780638456cb5914610261578063878eb3681461028e5780638da5cb5b146102b157806396b5a75514610306578063c55d0f5614610329578063dd1b7a0f14610360578063f2fde38b146103b5575b600080fd5b34156100e057600080fd5b610130600480803590602001909190803590602001909190803590602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506103ee565b005b341561013d57600080fd5b610145610513565b604051808215151515815260200191505060405180910390f35b61017560048080359060200190919050506105d8565b005b341561018257600080fd5b61018a61060c565b604051808215151515815260200191505060405180910390f35b34156101af57600080fd5b6101b761061f565b005b34156101c457600080fd5b6101da600480803590602001909190505061072a565b604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b341561024357600080fd5b61024b61084d565b6040518082815260200191505060405180910390f35b341561026c57600080fd5b610274610853565b604051808215151515815260200191505060405180910390f35b341561029957600080fd5b6102af600480803590602001909190505061091a565b005b34156102bc57600080fd5b6102c46109ec565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561031157600080fd5b6103276004808035906020019091905050610a11565b005b341561033457600080fd5b61034a6004808035906020019091905050610aad565b6040518082815260200191505060405180910390f35b341561036b57600080fd5b610373610aea565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103c057600080fd5b6103ec600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b10565b005b6103f66114c7565b600060149054906101000a900460ff1615151561041257600080fd5b846fffffffffffffffffffffffffffffffff168514151561043257600080fd5b836fffffffffffffffffffffffffffffffff168414151561045257600080fd5b8267ffffffffffffffff168314151561046a57600080fd5b6104743387610be5565b151561047f57600080fd5b6104893387610cd1565b60a0604051908101604052808373ffffffffffffffffffffffffffffffffffffffff168152602001866fffffffffffffffffffffffffffffffff168152602001856fffffffffffffffffffffffffffffffff1681526020018467ffffffffffffffff1681526020014267ffffffffffffffff16815250905061050b8682610de1565b505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561057057600080fd5b600060149054906101000a900460ff16151561058b57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a16001905090565b600060149054906101000a900460ff161515156105f457600080fd5b6105fe8134610fc6565b506106093382611165565b50565b600060149054906101000a900460ff1681565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806106cd57508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156106d857600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505090505050565b60008060008060008060036000888152602001908152602001600020905061075181611241565b151561075c57600080fd5b8060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a90046fffffffffffffffffffffffffffffffff168260010160109054906101000a90046fffffffffffffffffffffffffffffffff168360020160009054906101000a900467ffffffffffffffff168460020160089054906101000a900467ffffffffffffffff16836fffffffffffffffffffffffffffffffff169350826fffffffffffffffffffffffffffffffff1692508167ffffffffffffffff1691508067ffffffffffffffff169050955095509550955095505091939590929450565b60025481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108b057600080fd5b600060149054906101000a900460ff161515156108cc57600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a16001905090565b60008060149054906101000a900460ff16151561093657600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561099157600080fd5b6003600083815260200190815260200160002090506109af81611241565b15156109ba57600080fd5b6109e8828260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661126f565b5050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600360008481526020019081526020016000209150610a3282611241565b1515610a3d57600080fd5b8160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a9e57600080fd5b610aa8838261126f565b505050565b600080600360008481526020019081526020016000209050610ace81611241565b1515610ad957600080fd5b610ae2816112bd565b915050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610b6b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515610be257806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b60008273ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e846000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515610c9757600080fd5b6102c65a03f11515610ca857600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8330846040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1515610dc957600080fd5b6102c65a03f11515610dda57600080fd5b5050505050565b603c816060015167ffffffffffffffff1610151515610dff57600080fd5b806003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060408201518160010160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160020160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050507fa9c8dfcda5664a5a124c713e386da27de87432d5b668e79458501eb296389ba78282602001516fffffffffffffffffffffffffffffffff1683604001516fffffffffffffffffffffffffffffffff16846060015167ffffffffffffffff166040518085815260200184815260200183815260200182815260200194505050505060405180910390a15050565b6000806000806000806000600360008a81526020019081526020016000209550610fef86611241565b1515610ffa57600080fd5b611003866112bd565b945084881015151561101457600080fd5b8560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169350611044896113b0565b600085111561109e576110568561146c565b925082850391508373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050151561109d57600080fd5b5b84880390503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015156110e357600080fd5b7f4fcc30d90a842164dd58501ab874a101a3749c3d4747139cefe7c876f4ccebd2898633604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a184965050505050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b151561122957600080fd5b6102c65a03f1151561123a57600080fd5b5050505050565b6000808260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16119050919050565b611278826113b0565b6112828183611165565b7f2809c7e17bf978fbc7194c0a694b638c4215e9140cacc6c38ca36010b45697df826040518082815260200191505060405180910390a15050565b600080600090508260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16421115611316578260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16420390505b6113a88360010160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168460010160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168560020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1684611487565b915050919050565b60036000828152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160006101000a8154906fffffffffffffffffffffffffffffffff02191690556001820160106101000a8154906fffffffffffffffffffffffffffffffff02191690556002820160006101000a81549067ffffffffffffffff02191690556002820160086101000a81549067ffffffffffffffff0219169055505050565b6000612710600254830281151561147f57fe5b049050919050565b600080600080858510151561149e578693506114bc565b8787039250858584028115156114b057fe5b05915081880190508093505b505050949350505050565b60a060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff16815250905600a165627a7a72305820e9a2845f8c846e00135c0d081d4ad724caba24d3df35d5a08e25a3dda738758a0029", + "deployedBytecode": "0x6060604052600436106100d0576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806327ebe40a146100d55780633f4ba83a14610132578063454a2ab31461015f5780635c975abb146101775780635fd8c710146101a457806378bd7935146101b957806383b5ff8b146102385780638456cb5914610261578063878eb3681461028e5780638da5cb5b146102b157806396b5a75514610306578063c55d0f5614610329578063dd1b7a0f14610360578063f2fde38b146103b5575b600080fd5b34156100e057600080fd5b610130600480803590602001909190803590602001909190803590602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506103ee565b005b341561013d57600080fd5b610145610513565b604051808215151515815260200191505060405180910390f35b61017560048080359060200190919050506105d8565b005b341561018257600080fd5b61018a61060c565b604051808215151515815260200191505060405180910390f35b34156101af57600080fd5b6101b761061f565b005b34156101c457600080fd5b6101da600480803590602001909190505061072a565b604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b341561024357600080fd5b61024b61084d565b6040518082815260200191505060405180910390f35b341561026c57600080fd5b610274610853565b604051808215151515815260200191505060405180910390f35b341561029957600080fd5b6102af600480803590602001909190505061091a565b005b34156102bc57600080fd5b6102c46109ec565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561031157600080fd5b6103276004808035906020019091905050610a11565b005b341561033457600080fd5b61034a6004808035906020019091905050610aad565b6040518082815260200191505060405180910390f35b341561036b57600080fd5b610373610aea565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103c057600080fd5b6103ec600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b10565b005b6103f66114c7565b600060149054906101000a900460ff1615151561041257600080fd5b846fffffffffffffffffffffffffffffffff168514151561043257600080fd5b836fffffffffffffffffffffffffffffffff168414151561045257600080fd5b8267ffffffffffffffff168314151561046a57600080fd5b6104743387610be5565b151561047f57600080fd5b6104893387610cd1565b60a0604051908101604052808373ffffffffffffffffffffffffffffffffffffffff168152602001866fffffffffffffffffffffffffffffffff168152602001856fffffffffffffffffffffffffffffffff1681526020018467ffffffffffffffff1681526020014267ffffffffffffffff16815250905061050b8682610de1565b505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561057057600080fd5b600060149054906101000a900460ff16151561058b57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a16001905090565b600060149054906101000a900460ff161515156105f457600080fd5b6105fe8134610fc6565b506106093382611165565b50565b600060149054906101000a900460ff1681565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806106cd57508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156106d857600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505090505050565b60008060008060008060036000888152602001908152602001600020905061075181611241565b151561075c57600080fd5b8060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a90046fffffffffffffffffffffffffffffffff168260010160109054906101000a90046fffffffffffffffffffffffffffffffff168360020160009054906101000a900467ffffffffffffffff168460020160089054906101000a900467ffffffffffffffff16836fffffffffffffffffffffffffffffffff169350826fffffffffffffffffffffffffffffffff1692508167ffffffffffffffff1691508067ffffffffffffffff169050955095509550955095505091939590929450565b60025481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108b057600080fd5b600060149054906101000a900460ff161515156108cc57600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a16001905090565b60008060149054906101000a900460ff16151561093657600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561099157600080fd5b6003600083815260200190815260200160002090506109af81611241565b15156109ba57600080fd5b6109e8828260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661126f565b5050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600360008481526020019081526020016000209150610a3282611241565b1515610a3d57600080fd5b8160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a9e57600080fd5b610aa8838261126f565b505050565b600080600360008481526020019081526020016000209050610ace81611241565b1515610ad957600080fd5b610ae2816112bd565b915050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610b6b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515610be257806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b60008273ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e846000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515610c9757600080fd5b6102c65a03f11515610ca857600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8330846040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1515610dc957600080fd5b6102c65a03f11515610dda57600080fd5b5050505050565b603c816060015167ffffffffffffffff1610151515610dff57600080fd5b806003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060408201518160010160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160020160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050507fa9c8dfcda5664a5a124c713e386da27de87432d5b668e79458501eb296389ba78282602001516fffffffffffffffffffffffffffffffff1683604001516fffffffffffffffffffffffffffffffff16846060015167ffffffffffffffff166040518085815260200184815260200183815260200182815260200194505050505060405180910390a15050565b6000806000806000806000600360008a81526020019081526020016000209550610fef86611241565b1515610ffa57600080fd5b611003866112bd565b945084881015151561101457600080fd5b8560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169350611044896113b0565b600085111561109e576110568561146c565b925082850391508373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050151561109d57600080fd5b5b84880390503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015156110e357600080fd5b7f4fcc30d90a842164dd58501ab874a101a3749c3d4747139cefe7c876f4ccebd2898633604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a184965050505050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b151561122957600080fd5b6102c65a03f1151561123a57600080fd5b5050505050565b6000808260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16119050919050565b611278826113b0565b6112828183611165565b7f2809c7e17bf978fbc7194c0a694b638c4215e9140cacc6c38ca36010b45697df826040518082815260200191505060405180910390a15050565b600080600090508260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16421115611316578260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16420390505b6113a88360010160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168460010160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168560020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1684611487565b915050919050565b60036000828152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160006101000a8154906fffffffffffffffffffffffffffffffff02191690556001820160106101000a8154906fffffffffffffffffffffffffffffffff02191690556002820160006101000a81549067ffffffffffffffff02191690556002820160086101000a81549067ffffffffffffffff0219169055505050565b6000612710600254830281151561147f57fe5b049050919050565b600080600080858510151561149e578693506114bc565b8787039250858584028115156114b057fe5b05915081880190508093505b505050949350505050565b60a060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff16815250905600a165627a7a72305820e9a2845f8c846e00135c0d081d4ad724caba24d3df35d5a08e25a3dda738758a0029", "sourceMap": "55210:5355:18:-;;;54337:5;54316:26;;;;;;;;;;;;;;;;;;;;55864:329;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55996:31;816:10;808:5;;:18;;;;;;;;;;;;;;;;;;55954:5;55946:4;:13;;55938:22;;;;;;;;55981:4;55970:8;:15;;;;56044:11;55996:60;;56074:17;:35;;;55501:10;55494:18;;56074:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56066:71;;;;;;;;56169:17;56147:19;;:39;;;;;;;;;;;;;;;;;;55864:329;;;55210:5355;;;;;;", "deployedSourceMap": "55210:5355:18:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57259:856;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54943:126;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58307:223;;;;;;;;;;;;;;;;;;54316:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56458:352;;;;;;;;;;;;;;59705:493;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45099:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54735:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59338:256;;;;;;;;;;;;;;;;;;;;;;;;;;622:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58796:289;;;;;;;;;;;;;;;;;;;;;;;;;;60323:239;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44927:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1156:140;;;;;;;;;;;;;;;;;;;;;;;;;;;;57259:856;57877:22;;:::i;:::-;54475:6;;;;;;;;;;;54474:7;54466:16;;;;;;;;57641:14;57625:32;;57607:14;:50;57599:59;;;;;;;;57708:12;57692:30;;57676:12;:46;57668:55;;;;;;;;57769:9;57754:26;;57741:9;:39;57733:48;;;;;;;;57800:27;57806:10;57818:8;57800:5;:27::i;:::-;57792:36;;;;;;;;57838:29;57846:10;57858:8;57838:7;:29::i;:::-;57902:166;;;;;;;;;57923:7;57902:166;;;;;;57952:14;57902:166;;;;;;57989:12;57902:166;;;;;;58023:9;57902:166;;;;;;58054:3;57902:166;;;;;57877:191;;58078:30;58090:8;58100:7;58078:11;:30::i;:::-;57259:856;;;;;;:::o;54943:126::-;54992:4;969:5;;;;;;;;;;;955:19;;:10;:19;;;947:28;;;;;;;;54629:6;;;;;;;;;;;54621:15;;;;;;;;55017:5;55008:6;;:14;;;;;;;;;;;;;;;;;;55032:9;;;;;;;;;;55058:4;55051:11;;54943:126;:::o;58307:223::-;54475:6;;;;;;;;;;;54474:7;54466:16;;;;;;;;58457:25;58462:8;58472:9;58457:4;:25::i;:::-;;58492:31;58502:10;58514:8;58492:9;:31::i;:::-;58307:223;:::o;54316:26::-;;;;;;;;;;;;;:::o;56458:352::-;56504:18;56763:8;56533:19;;;;;;;;;;;56504:49;;56599:5;;;;;;;;;;;56585:19;;:10;:19;;;:59;;;;56634:10;56620:24;;:10;:24;;;56585:59;56564:90;;;;;;;;56774:10;:15;;:29;56790:4;:12;;;56774:29;;;;;;;;;;;;;;;;;;;;;;;56763:40;;56458:352;;:::o;59705:493::-;59791:14;59815:21;59846:19;59875:16;59901:17;59935:23;59961:16;:26;59978:8;59961:26;;;;;;;;;;;59935:52;;60005:21;60018:7;60005:12;:21::i;:::-;59997:30;;;;;;;;60054:7;:14;;;;;;;;;;;;60078:7;:21;;;;;;;;;;;;60109:7;:19;;;;;;;;;;;;60138:7;:16;;;;;;;;;;;;60164:7;:17;;;;;;;;;;;;60037:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59705:493;;;;;;;;:::o;45099:23::-;;;;:::o;54735:124::-;54785:4;969:5;;;;;;;;;;;955:19;;:10;:19;;;947:28;;;;;;;;54475:6;;;;;;;;;;;54474:7;54466:16;;;;;;;;54810:4;54801:6;;:13;;;;;;;;;;;;;;;;;;54824:7;;;;;;;;;;54848:4;54841:11;;54735:124;:::o;59338:256::-;59445:23;54629:6;;;;;;;;;;;54621:15;;;;;;;;969:5;;;;;;;;;;;955:19;;:10;:19;;;947:28;;;;;;;;59471:16;:26;59488:8;59471:26;;;;;;;;;;;59445:52;;59515:21;59528:7;59515:12;:21::i;:::-;59507:30;;;;;;;;59547:40;59562:8;59572:7;:14;;;;;;;;;;;;59547;:40::i;:::-;59338:256;;:::o;622:20::-;;;;;;;;;;;;;:::o;58796:289::-;58864:23;58966:14;58890:16;:26;58907:8;58890:26;;;;;;;;;;;58864:52;;58934:21;58947:7;58934:12;:21::i;:::-;58926:30;;;;;;;;58983:7;:14;;;;;;;;;;;;58966:31;;59029:6;59015:20;;:10;:20;;;59007:29;;;;;;;;59046:32;59061:8;59071:6;59046:14;:32::i;:::-;58796:289;;;:::o;60323:239::-;60401:7;60424:23;60450:16;:26;60467:8;60450:26;;;;;;;;;;;60424:52;;60494:21;60507:7;60494:12;:21::i;:::-;60486:30;;;;;;;;60533:22;60547:7;60533:13;:22::i;:::-;60526:29;;60323:239;;;;:::o;44927:40::-;;;;;;;;;;;;;:::o;1156:140::-;969:5;;;;;;;;;;;955:19;;:10;:19;;;947:28;;;;;;;;1245:1;1225:22;;:8;:22;;;;1221:69;;;1271:8;1263:5;;:16;;;;;;;;;;;;;;;;;;1221:69;1156:140;:::o;45656:157::-;45731:4;45796:9;45755:50;;:19;;;;;;;;;;;:27;;;45783:8;45755:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:50;;;45747:59;;45656:157;;;;:::o;46053:176::-;46166:19;;;;;;;;;;;:32;;;46199:6;46207:4;46213:8;46166:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46053:176;;:::o;46852:489::-;47082:9;47061:8;:17;;;:30;;;;47053:39;;;;;;;;47132:8;47103:16;:26;47120:8;47103:26;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47151:183;47187:8;47218;:22;;;47210:31;;47263:8;:20;;;47255:29;;47306:8;:17;;;47298:26;;47151:183;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46852:489;;:::o;47687:2629::-;47765:7;47837:23;48279:13;48459:14;48938:21;48994:22;49934:17;47863:16;:26;47880:8;47863:26;;;;;;;;;;;47837:52;;48170:21;48183:7;48170:12;:21::i;:::-;48162:30;;;;;;;;48295:22;48309:7;48295:13;:22::i;:::-;48279:38;;48349:5;48335:10;:19;;48327:28;;;;;;;;48476:7;:14;;;;;;;;;;;;48459:31;;48635:24;48650:8;48635:14;:24::i;:::-;48741:1;48733:5;:9;48729:918;;;48962:18;48974:5;48962:11;:18::i;:::-;48938:42;;49027:13;49019:5;:21;48994:46;;49605:6;:15;;:31;49621:14;49605:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48729:918;49967:5;49954:10;:18;49934:38;;50172:10;:19;;:30;50192:9;50172:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50240:46;50258:8;50268:5;50275:10;50240:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50304:5;50297:12;;47687:2629;;;;;;;;;;:::o;46461:174::-;46579:19;;;;;;;;;;;:28;;;46608:9;46619:8;46579:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46461:174;;:::o;50637:125::-;50708:4;50753:1;50732:8;:18;;;;;;;;;;;;:22;;;50724:31;;50637:125;;;:::o;47396:183::-;47474:24;47489:8;47474:14;:24::i;:::-;47508:28;47518:7;47527:8;47508:9;:28::i;:::-;47546:26;47563:8;47546:26;;;;;;;;;;;;;;;;;;47396:183;;:::o;51057:613::-;51141:7;51164:21;51188:1;51164:25;;51403:8;:18;;;;;;;;;;;;51397:24;;:3;:24;51393:95;;;51459:8;:18;;;;;;;;;;;;51453:24;;:3;:24;51437:40;;51393:95;51505:158;51539:8;:22;;;;;;;;;;;;51505:158;;51575:8;:20;;;;;;;;;;;;51505:158;;51609:8;:17;;;;;;;;;;;;51505:158;;51640:13;51505:20;:158::i;:::-;51498:165;;51057:613;;;;:::o;50434:101::-;50502:16;:26;50519:8;50502:26;;;;;;;;;;;;50495:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50434:101;:::o;53613:482::-;53673:7;54083:5;54072:8;;54063:6;:17;:25;;;;;;;;54056:32;;53613:482;;;:::o;51918:1601::-;52110:7;52803:23;53118:25;53394:19;52477:9;52459:14;:27;;52455:1058;;;52635:12;52628:19;;;;52455:1058;52859:14;52836:12;52829:45;52803:71;;53197:9;53172:14;53146:16;:41;:61;;;;;;;;53118:89;;53441:18;53423:14;53416:43;53394:65;;53489:12;53474:28;;51918:1601;;;;;;;;;;:::o;55210:5355::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", "source": "pragma solidity 0.4.18;\n\n/**\n The following contract code, titled KittyCore, was written by Cryptokitties and published\n and retrieved from https://etherscan.io/address/0x06012c8cf97bead5deae237070f9587f8e7a266d#code.\n\n It is included in the current project for test purposes, to ensure that our collateralizer can\n handle ERC721 tokens created by the KittyCore contract.\n*/\n\n/**\n * @title KittiesOwnable\n * @dev The KittiesOwnable contract has an owner address, and provides basic authorization control\n * functions, this simplifies the implementation of \"user permissions\".\n */\ncontract KittiesOwnable {\n address public owner;\n\n\n /**\n\t * @dev The KittiesOwnable constructor sets the original `owner` of the contract to the sender\n\t * account.\n\t */\n function KittiesOwnable() {\n owner = msg.sender;\n }\n\n\n /**\n\t * @dev Throws if called by any account other than the owner.\n\t */\n modifier onlyOwner() {\n require(msg.sender == owner);\n _;\n }\n\n\n /**\n\t * @dev Allows the current owner to transfer control of the contract to a newOwner.\n\t * @param newOwner The address to transfer ownership to.\n\t */\n function transferOwnership(address newOwner) onlyOwner {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n\n}\n\n\n\n/// @title Interface for contracts conforming to ERC-721: Non-Fungible Tokens\n/// @author Dieter Shirley (https://github.com/dete)\ncontract KittiesERC721 {\n // Required methods\n function totalSupply() public view returns (uint256 total);\n function balanceOf(address _owner) public view returns (uint256 balance);\n function ownerOf(uint256 _tokenId) external view returns (address owner);\n function approve(address _to, uint256 _tokenId) external;\n function transfer(address _to, uint256 _tokenId) external;\n function transferFrom(address _from, address _to, uint256 _tokenId) external;\n\n // Events\n event Transfer(address from, address to, uint256 tokenId);\n event Approval(address owner, address approved, uint256 tokenId);\n\n // Optional\n // function name() public view returns (string name);\n // function symbol() public view returns (string symbol);\n // function tokensOfOwner(address _owner) external view returns (uint256[] tokenIds);\n // function tokenMetadata(uint256 _tokenId, string _preferredTransport) public view returns (string infoUrl);\n\n // ERC-165 Compatibility (https://github.com/ethereum/EIPs/issues/165)\n function supportsInterface(bytes4 _interfaceID) external view returns (bool);\n}\n\n\n// // Auction wrapper functions\n\n\n// Auction wrapper functions\n\n\n\n\n\n\n\n/// @title SEKRETOOOO\ncontract GeneScienceInterface {\n /// @dev simply a boolean to indicate this is the contract we expect to be\n function isGeneScience() public pure returns (bool);\n\n /// @dev given genes of kitten 1 & 2, return a genetic combination - may have a random factor\n /// @param genes1 genes of mom\n /// @param genes2 genes of sire\n /// @return the genes that are supposed to be passed down the child\n function mixGenes(uint256 genes1, uint256 genes2, uint256 targetBlock) public returns (uint256);\n}\n\n\n\n\n\n\n\n/// @title A facet of KittyCore that manages special access privileges.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyAccessControl {\n // This facet controls access control for CryptoKitties. There are four roles managed here:\n //\n // - The CEO: The CEO can reassign other roles and change the addresses of our dependent smart\n // contracts. It is also the only role that can unpause the smart contract. It is initially\n // set to the address that created the smart contract in the KittyCore constructor.\n //\n // - The CFO: The CFO can withdraw funds from KittyCore and its auction contracts.\n //\n // - The COO: The COO can release gen0 kitties to auction, and mint promo cats.\n //\n // It should be noted that these roles are distinct without overlap in their access abilities, the\n // abilities listed for each role above are exhaustive. In particular, while the CEO can assign any\n // address to any role, the CEO address itself doesn't have the ability to act in those roles. This\n // restriction is intentional so that we aren't tempted to use the CEO address frequently out of\n // convenience. The less we use an address, the less likely it is that we somehow compromise the\n // account.\n\n /// @dev Emited when contract is upgraded - See README.md for updgrade plan\n event ContractUpgrade(address newContract);\n\n // The addresses of the accounts (or contracts) that can execute actions within each roles.\n address public ceoAddress;\n address public cfoAddress;\n address public cooAddress;\n\n // @dev Keeps track whether the contract is paused. When that is true, most actions are blocked\n bool public paused = false;\n\n /// @dev Access modifier for CEO-only functionality\n modifier onlyCEO() {\n require(msg.sender == ceoAddress);\n _;\n }\n\n /// @dev Access modifier for CFO-only functionality\n modifier onlyCFO() {\n require(msg.sender == cfoAddress);\n _;\n }\n\n /// @dev Access modifier for COO-only functionality\n modifier onlyCOO() {\n require(msg.sender == cooAddress);\n _;\n }\n\n modifier onlyCLevel() {\n require(\n msg.sender == cooAddress ||\n msg.sender == ceoAddress ||\n msg.sender == cfoAddress\n );\n _;\n }\n\n /// @dev Assigns a new address to act as the CEO. Only available to the current CEO.\n /// @param _newCEO The address of the new CEO\n function setCEO(address _newCEO) external onlyCEO {\n require(_newCEO != address(0));\n\n ceoAddress = _newCEO;\n }\n\n /// @dev Assigns a new address to act as the CFO. Only available to the current CEO.\n /// @param _newCFO The address of the new CFO\n function setCFO(address _newCFO) external onlyCEO {\n require(_newCFO != address(0));\n\n cfoAddress = _newCFO;\n }\n\n /// @dev Assigns a new address to act as the COO. Only available to the current CEO.\n /// @param _newCOO The address of the new COO\n function setCOO(address _newCOO) external onlyCEO {\n require(_newCOO != address(0));\n\n cooAddress = _newCOO;\n }\n\n /*** KittiesPausable functionality adapted from OpenZeppelin ***/\n\n /// @dev Modifier to allow actions only when the contract IS NOT paused\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /// @dev Modifier to allow actions only when the contract IS paused\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /// @dev Called by any \"C-level\" role to pause the contract. Used only when\n /// a bug or exploit is detected and we need to limit damage.\n function pause() external onlyCLevel whenNotPaused {\n paused = true;\n }\n\n /// @dev Unpauses the smart contract. Can only be called by the CEO, since\n /// one reason we may pause the contract is when CFO or COO accounts are\n /// compromised.\n /// @notice This is public rather than external so it can be called by\n /// derived contracts.\n function unpause() public onlyCEO whenPaused {\n // can't unpause if contract was upgraded\n paused = false;\n }\n}\n\n\n\n\n/// @title Base contract for CryptoKitties. Holds all common structs, events and base variables.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBase is KittyAccessControl {\n /*** EVENTS ***/\n\n /// @dev The Birth event is fired whenever a new kitten comes into existence. This obviously\n /// includes any time a cat is created through the giveBirth method, but it is also called\n /// when a new gen0 cat is created.\n event Birth(address owner, uint256 kittyId, uint256 matronId, uint256 sireId, uint256 genes);\n\n /// @dev Transfer event as defined in current draft of ERC721. Emitted every time a kitten\n /// ownership is assigned, including births.\n event Transfer(address from, address to, uint256 tokenId);\n\n /*** DATA TYPES ***/\n\n /// @dev The main Kitty struct. Every cat in CryptoKitties is represented by a copy\n /// of this structure, so great care was taken to ensure that it fits neatly into\n /// exactly two 256-bit words. Note that the order of the members in this structure\n /// is important because of the byte-packing rules used by Ethereum.\n /// Ref: http://solidity.readthedocs.io/en/develop/miscellaneous.html\n struct Kitty {\n // The Kitty's genetic code is packed into these 256-bits, the format is\n // sooper-sekret! A cat's genes never change.\n uint256 genes;\n\n // The timestamp from the block when this cat came into existence.\n uint64 birthTime;\n\n // The minimum timestamp after which this cat can engage in breeding\n // activities again. This same timestamp is used for the pregnancy\n // timer (for matrons) as well as the siring cooldown.\n uint64 cooldownEndBlock;\n\n // The ID of the parents of this kitty, set to 0 for gen0 cats.\n // Note that using 32-bit unsigned integers limits us to a \"mere\"\n // 4 billion cats. This number might seem small until you realize\n // that Ethereum currently has a limit of about 500 million\n // transactions per year! So, this definitely won't be a problem\n // for several years (even as Ethereum learns to scale).\n uint32 matronId;\n uint32 sireId;\n\n // Set to the ID of the sire cat for matrons that are pregnant,\n // zero otherwise. A non-zero value here is how we know a cat\n // is pregnant. Used to retrieve the genetic material for the new\n // kitten when the birth transpires.\n uint32 siringWithId;\n\n // Set to the index in the cooldown array (see below) that represents\n // the current cooldown duration for this Kitty. This starts at zero\n // for gen0 cats, and is initialized to floor(generation/2) for others.\n // Incremented by one for each successful breeding action, regardless\n // of whether this cat is acting as matron or sire.\n uint16 cooldownIndex;\n\n // The \"generation number\" of this cat. Cats minted by the CK contract\n // for sale are called \"gen0\" and have a generation number of 0. The\n // generation number of all other cats is the larger of the two generation\n // numbers of their parents, plus one.\n // (i.e. max(matron.generation, sire.generation) + 1)\n uint16 generation;\n }\n\n /*** CONSTANTS ***/\n\n /// @dev A lookup table indicating the cooldown duration after any successful\n /// breeding action, called \"pregnancy time\" for matrons and \"siring cooldown\"\n /// for sires. Designed such that the cooldown roughly doubles each time a cat\n /// is bred, encouraging owners not to just keep breeding the same cat over\n /// and over again. Caps out at one week (a cat can breed an unbounded number\n /// of times, and the maximum cooldown is always seven days).\n uint32[14] public cooldowns = [\n uint32(1 minutes),\n uint32(2 minutes),\n uint32(5 minutes),\n uint32(10 minutes),\n uint32(30 minutes),\n uint32(1 hours),\n uint32(2 hours),\n uint32(4 hours),\n uint32(8 hours),\n uint32(16 hours),\n uint32(1 days),\n uint32(2 days),\n uint32(4 days),\n uint32(7 days)\n ];\n\n // An approximation of currently how many seconds are in between blocks.\n uint256 public secondsPerBlock = 15;\n\n /*** STORAGE ***/\n\n /// @dev An array containing the Kitty struct for all Kitties in existence. The ID\n /// of each cat is actually an index into this array. Note that ID 0 is a negacat,\n /// the unKitty, the mythical beast that is the parent of all gen0 cats. A bizarre\n /// creature that is both matron and sire... to itself! Has an invalid genetic code.\n /// In other words, cat ID 0 is invalid... ;-)\n Kitty[] kitties;\n\n /// @dev A mapping from cat IDs to the address that owns them. All cats have\n /// some valid owner address, even gen0 cats are created with a non-zero owner.\n mapping (uint256 => address) public kittyIndexToOwner;\n\n // @dev A mapping from owner address to count of tokens that address owns.\n // Used internally inside balanceOf() to resolve ownership count.\n mapping (address => uint256) ownershipTokenCount;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to call\n /// transferFrom(). Each Kitty can only have one approved address for transfer\n /// at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public kittyIndexToApproved;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to use\n /// this Kitty for siring via breedWith(). Each Kitty can only have one approved\n /// address for siring at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public sireAllowedToAddress;\n\n /// @dev The address of the ClockAuction contract that handles sales of Kitties. This\n /// same contract handles both peer-to-peer sales as well as the gen0 sales which are\n /// initiated every 15 minutes.\n SaleClockAuction public saleAuction;\n\n /// @dev The address of a custom ClockAuction subclassed contract that handles siring\n /// auctions. Needs to be separate from saleAuction because the actions taken on success\n /// after a sales and siring auction are quite different.\n SiringClockAuction public siringAuction;\n\n /// @dev Assigns ownership of a specific Kitty to an address.\n function _transfer(address _from, address _to, uint256 _tokenId) internal {\n // Since the number of kittens is capped to 2^32 we can't overflow this\n ownershipTokenCount[_to]++;\n // transfer ownership\n kittyIndexToOwner[_tokenId] = _to;\n // When creating new kittens _from is 0x0, but we can't account that address.\n if (_from != address(0)) {\n ownershipTokenCount[_from]--;\n // once the kitten is transferred also clear sire allowances\n delete sireAllowedToAddress[_tokenId];\n // clear any previously approved ownership exchange\n delete kittyIndexToApproved[_tokenId];\n }\n // Emit the transfer event.\n Transfer(_from, _to, _tokenId);\n }\n\n /// @dev An internal method that creates a new kitty and stores it. This\n /// method doesn't do any checking and should only be called when the\n /// input data is known to be valid. Will generate both a Birth event\n /// and a Transfer event.\n /// @param _matronId The kitty ID of the matron of this cat (zero for gen0)\n /// @param _sireId The kitty ID of the sire of this cat (zero for gen0)\n /// @param _generation The generation number of this cat, must be computed by caller.\n /// @param _genes The kitty's genetic code.\n /// @param _owner The inital owner of this cat, must be non-zero (except for the unKitty, ID 0)\n function _createKitty(\n uint256 _matronId,\n uint256 _sireId,\n uint256 _generation,\n uint256 _genes,\n address _owner\n )\n internal\n returns (uint)\n {\n // These requires are not strictly necessary, our calling code should make\n // sure that these conditions are never broken. However! _createKitty() is already\n // an expensive call (for storage), and it doesn't hurt to be especially careful\n // to ensure our data structures are always valid.\n require(_matronId == uint256(uint32(_matronId)));\n require(_sireId == uint256(uint32(_sireId)));\n require(_generation == uint256(uint16(_generation)));\n\n // New kitty starts with the same cooldown as parent gen/2\n uint16 cooldownIndex = uint16(_generation / 2);\n if (cooldownIndex > 13) {\n cooldownIndex = 13;\n }\n\n Kitty memory _kitty = Kitty({\n genes: _genes,\n birthTime: uint64(now),\n cooldownEndBlock: 0,\n matronId: uint32(_matronId),\n sireId: uint32(_sireId),\n siringWithId: 0,\n cooldownIndex: cooldownIndex,\n generation: uint16(_generation)\n });\n uint256 newKittenId = kitties.push(_kitty) - 1;\n\n // It's probably never going to happen, 4 billion cats is A LOT, but\n // let's just be 100% sure we never let this happen.\n require(newKittenId == uint256(uint32(newKittenId)));\n\n // emit the birth event\n Birth(\n _owner,\n newKittenId,\n uint256(_kitty.matronId),\n uint256(_kitty.sireId),\n _kitty.genes\n );\n\n // This will assign ownership, and also emit the Transfer event as\n // per ERC721 draft\n _transfer(0, _owner, newKittenId);\n\n return newKittenId;\n }\n\n // Any C-level can fix how many seconds per blocks are currently observed.\n function setSecondsPerBlock(uint256 secs) external onlyCLevel {\n require(secs < cooldowns[0]);\n secondsPerBlock = secs;\n }\n}\n\n\n\n\n\n/// @title The external contract that is responsible for generating metadata for the kitties,\n/// it has one function that will return the data as bytes.\ncontract KittiesERC721Metadata {\n /// @dev Given a token Id, returns a byte array that is supposed to be converted into string.\n function getMetadata(uint256 _tokenId, string) public view returns (bytes32[4] buffer, uint256 count) {\n if (_tokenId == 1) {\n buffer[0] = \"Hello World! :D\";\n count = 15;\n } else if (_tokenId == 2) {\n buffer[0] = \"I would definitely choose a medi\";\n buffer[1] = \"um length string.\";\n count = 49;\n } else if (_tokenId == 3) {\n buffer[0] = \"Lorem ipsum dolor sit amet, mi e\";\n buffer[1] = \"st accumsan dapibus augue lorem,\";\n buffer[2] = \" tristique vestibulum id, libero\";\n buffer[3] = \" suscipit varius sapien aliquam.\";\n count = 128;\n }\n }\n}\n\n\n/// @title The facet of the CryptoKitties core contract that manages ownership, ERC-721 (draft) compliant.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev Ref: https://github.com/ethereum/EIPs/issues/721\n/// See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyOwnership is KittyBase, KittiesERC721 {\n\n /// @notice Name and symbol of the non fungible token, as defined in ERC721.\n string public constant name = \"CryptoKitties\";\n string public constant symbol = \"CK\";\n\n // The contract that will return kitty metadata\n KittiesERC721Metadata public erc721Metadata;\n\n bytes4 constant InterfaceSignature_ERC165 =\n bytes4(keccak256('supportsInterface(bytes4)'));\n\n bytes4 constant InterfaceSignature_ERC721 =\n bytes4(keccak256('name()')) ^\n bytes4(keccak256('symbol()')) ^\n bytes4(keccak256('totalSupply()')) ^\n bytes4(keccak256('balanceOf(address)')) ^\n bytes4(keccak256('ownerOf(uint256)')) ^\n bytes4(keccak256('approve(address,uint256)')) ^\n bytes4(keccak256('transfer(address,uint256)')) ^\n bytes4(keccak256('transferFrom(address,address,uint256)')) ^\n bytes4(keccak256('tokensOfOwner(address)')) ^\n bytes4(keccak256('tokenMetadata(uint256,string)'));\n\n /// @notice Introspection interface as per ERC-165 (https://github.com/ethereum/EIPs/issues/165).\n /// Returns true for any standardized interfaces implemented by this contract. We implement\n /// ERC-165 (obviously!) and ERC-721.\n function supportsInterface(bytes4 _interfaceID) external view returns (bool)\n {\n // DEBUG ONLY\n //require((InterfaceSignature_ERC165 == 0x01ffc9a7) && (InterfaceSignature_ERC721 == 0x9a20483d));\n\n return ((_interfaceID == InterfaceSignature_ERC165) || (_interfaceID == InterfaceSignature_ERC721));\n }\n\n /// @dev Set the address of the sibling contract that tracks metadata.\n /// CEO only.\n function setMetadataAddress(address _contractAddress) public onlyCEO {\n erc721Metadata = KittiesERC721Metadata(_contractAddress);\n }\n\n // Internal utility functions: These functions all assume that their input arguments\n // are valid. We leave it to public methods to sanitize their inputs and follow\n // the required logic.\n\n /// @dev Checks if a given address is the current owner of a particular Kitty.\n /// @param _claimant the address we are validating against.\n /// @param _tokenId kitten id, only valid when > 0\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToOwner[_tokenId] == _claimant;\n }\n\n /// @dev Checks if a given address currently has transferApproval for a particular Kitty.\n /// @param _claimant the address we are confirming kitten is approved for.\n /// @param _tokenId kitten id, only valid when > 0\n function _approvedFor(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToApproved[_tokenId] == _claimant;\n }\n\n /// @dev Marks an address as being approved for transferFrom(), overwriting any previous\n /// approval. Setting _approved to address(0) clears all transfer approval.\n /// NOTE: _approve() does NOT send the Approval event. This is intentional because\n /// _approve() and transferFrom() are used together for putting Kitties on auction, and\n /// there is no value in spamming the log with Approval events in that case.\n function _approve(uint256 _tokenId, address _approved) internal {\n kittyIndexToApproved[_tokenId] = _approved;\n }\n\n /// @notice Returns the number of Kitties owned by a specific address.\n /// @param _owner The owner address to check.\n /// @dev Required for ERC-721 compliance\n function balanceOf(address _owner) public view returns (uint256 count) {\n return ownershipTokenCount[_owner];\n }\n\n /// @notice Transfers a Kitty to another address. If transferring to a smart\n /// contract be VERY CAREFUL to ensure that it is aware of ERC-721 (or\n /// CryptoKitties specifically) or your Kitty may be lost forever. Seriously.\n /// @param _to The address of the recipient, can be a user or contract.\n /// @param _tokenId The ID of the Kitty to transfer.\n /// @dev Required for ERC-721 compliance.\n function transfer(\n address _to,\n uint256 _tokenId\n )\n external\n whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Disallow transfers to the auction contracts to prevent accidental\n // misuse. Auction contracts should only take ownership of kitties\n // through the allow + transferFrom flow.\n require(_to != address(saleAuction));\n require(_to != address(siringAuction));\n\n // You can only send your own cat.\n require(_owns(msg.sender, _tokenId));\n\n // Reassign ownership, clear pending approvals, emit Transfer event.\n _transfer(msg.sender, _to, _tokenId);\n }\n\n /// @notice Grant another address the right to transfer a specific Kitty via\n /// transferFrom(). This is the preferred flow for transfering NFTs to contracts.\n /// @param _to The address to be granted transfer approval. Pass address(0) to\n /// clear all approvals.\n /// @param _tokenId The ID of the Kitty that can be transferred if this call succeeds.\n /// @dev Required for ERC-721 compliance.\n function approve(\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Only an owner can grant transfer approval.\n require(_owns(msg.sender, _tokenId));\n\n // Register the approval (replacing any previous approval).\n _approve(_tokenId, _to);\n\n // Emit approval event.\n Approval(msg.sender, _to, _tokenId);\n }\n\n /// @notice Transfer a Kitty owned by another address, for which the calling address\n /// has previously been granted transfer approval by the owner.\n /// @param _from The address that owns the Kitty to be transfered.\n /// @param _to The address that should take ownership of the Kitty. Can be any address,\n /// including the caller.\n /// @param _tokenId The ID of the Kitty to be transferred.\n /// @dev Required for ERC-721 compliance.\n function transferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Check for approval and valid ownership\n require(_approvedFor(msg.sender, _tokenId));\n require(_owns(_from, _tokenId));\n\n // Reassign ownership (also clears pending approvals and emits Transfer event).\n _transfer(_from, _to, _tokenId);\n }\n\n /// @notice Returns the total number of Kitties currently in existence.\n /// @dev Required for ERC-721 compliance.\n function totalSupply() public view returns (uint) {\n return kitties.length - 1;\n }\n\n /// @notice Returns the address currently assigned ownership of a given Kitty.\n /// @dev Required for ERC-721 compliance.\n function ownerOf(uint256 _tokenId)\n external\n view\n returns (address owner)\n {\n owner = kittyIndexToOwner[_tokenId];\n\n require(owner != address(0));\n }\n\n /// @notice Returns a list of all Kitty IDs assigned to an address.\n /// @param _owner The owner whose Kitties we are interested in.\n /// @dev This method MUST NEVER be called by smart contract code. First, it's fairly\n /// expensive (it walks the entire Kitty array looking for cats belonging to owner),\n /// but it also returns a dynamic array, which is only supported for web3 calls, and\n /// not contract-to-contract calls.\n function tokensOfOwner(address _owner) external view returns(uint256[] ownerTokens) {\n uint256 tokenCount = balanceOf(_owner);\n\n if (tokenCount == 0) {\n // Return an empty array\n return new uint256[](0);\n } else {\n uint256[] memory result = new uint256[](tokenCount);\n uint256 totalCats = totalSupply();\n uint256 resultIndex = 0;\n\n // We count on the fact that all cats have IDs starting at 1 and increasing\n // sequentially up to the totalCat count.\n uint256 catId;\n\n for (catId = 1; catId <= totalCats; catId++) {\n if (kittyIndexToOwner[catId] == _owner) {\n result[resultIndex] = catId;\n resultIndex++;\n }\n }\n\n return result;\n }\n }\n\n /// @dev Adapted from memcpy() by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _memcpy(uint _dest, uint _src, uint _len) private view {\n // Copy word-length chunks while possible\n for(; _len >= 32; _len -= 32) {\n assembly {\n mstore(_dest, mload(_src))\n }\n _dest += 32;\n _src += 32;\n }\n\n // Copy remaining bytes\n uint256 mask = 256 ** (32 - _len) - 1;\n assembly {\n let srcpart := and(mload(_src), not(mask))\n let destpart := and(mload(_dest), mask)\n mstore(_dest, or(destpart, srcpart))\n }\n }\n\n /// @dev Adapted from toString(slice) by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _toString(bytes32[4] _rawBytes, uint256 _stringLength) private view returns (string) {\n var outputString = new string(_stringLength);\n uint256 outputPtr;\n uint256 bytesPtr;\n\n assembly {\n outputPtr := add(outputString, 32)\n bytesPtr := _rawBytes\n }\n\n _memcpy(outputPtr, bytesPtr, _stringLength);\n\n return outputString;\n }\n\n /// @notice Returns a URI pointing to a metadata package for this token conforming to\n /// ERC-721 (https://github.com/ethereum/EIPs/issues/721)\n /// @param _tokenId The ID number of the Kitty whose metadata should be returned.\n function tokenMetadata(uint256 _tokenId, string _preferredTransport) external view returns (string infoUrl) {\n require(erc721Metadata != address(0));\n bytes32[4] memory buffer;\n uint256 count;\n (buffer, count) = erc721Metadata.getMetadata(_tokenId, _preferredTransport);\n\n return _toString(buffer, count);\n }\n}\n\n\n\n/// @title A facet of KittyCore that manages Kitty siring, gestation, and birth.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBreeding is KittyOwnership {\n\n /// @dev The Pregnant event is fired when two cats successfully breed and the pregnancy\n /// timer begins for the matron.\n event Pregnant(address owner, uint256 matronId, uint256 sireId, uint256 cooldownEndBlock);\n\n /// @notice The minimum payment required to use breedWithAuto(). This fee goes towards\n /// the gas cost paid by whatever calls giveBirth(), and can be dynamically updated by\n /// the COO role as the gas price changes.\n uint256 public autoBirthFee = 2 finney;\n\n // Keeps track of number of pregnant kitties.\n uint256 public pregnantKitties;\n\n /// @dev The address of the sibling contract that is used to implement the sooper-sekret\n /// genetic combination algorithm.\n GeneScienceInterface public geneScience;\n\n /// @dev Update the address of the genetic contract, can only be called by the CEO.\n /// @param _address An address of a GeneScience contract instance to be used from this point forward.\n function setGeneScienceAddress(address _address) external onlyCEO {\n GeneScienceInterface candidateContract = GeneScienceInterface(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isGeneScience());\n\n // Set the new contract address\n geneScience = candidateContract;\n }\n\n /// @dev Checks that a given kitten is able to breed. Requires that the\n /// current cooldown is finished (for sires) and also checks that there is\n /// no pending pregnancy.\n function _isReadyToBreed(Kitty _kit) internal view returns (bool) {\n // In addition to checking the cooldownEndBlock, we also need to check to see if\n // the cat has a pending birth; there can be some period of time between the end\n // of the pregnacy timer and the birth event.\n return (_kit.siringWithId == 0) && (_kit.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @dev Check if a sire has authorized breeding with this matron. True if both sire\n /// and matron have the same owner, or if the sire has given siring permission to\n /// the matron's owner (via approveSiring()).\n function _isSiringPermitted(uint256 _sireId, uint256 _matronId) internal view returns (bool) {\n address matronOwner = kittyIndexToOwner[_matronId];\n address sireOwner = kittyIndexToOwner[_sireId];\n\n // Siring is okay if they have same owner, or if the matron's owner was given\n // permission to breed with this sire.\n return (matronOwner == sireOwner || sireAllowedToAddress[_sireId] == matronOwner);\n }\n\n /// @dev Set the cooldownEndTime for the given Kitty, based on its current cooldownIndex.\n /// Also increments the cooldownIndex (unless it has hit the cap).\n /// @param _kitten A reference to the Kitty in storage which needs its timer started.\n function _triggerCooldown(Kitty storage _kitten) internal {\n // Compute an estimation of the cooldown time in blocks (based on current cooldownIndex).\n _kitten.cooldownEndBlock = uint64((cooldowns[_kitten.cooldownIndex]/secondsPerBlock) + block.number);\n\n // Increment the breeding count, clamping it at 13, which is the length of the\n // cooldowns array. We could check the array size dynamically, but hard-coding\n // this as a constant saves gas. Yay, Solidity!\n if (_kitten.cooldownIndex < 13) {\n _kitten.cooldownIndex += 1;\n }\n }\n\n /// @notice Grants approval to another user to sire with one of your Kitties.\n /// @param _addr The address that will be able to sire with your Kitty. Set to\n /// address(0) to clear all siring approvals for this Kitty.\n /// @param _sireId A Kitty that you own that _addr will now be able to sire with.\n function approveSiring(address _addr, uint256 _sireId)\n external\n whenNotPaused\n {\n require(_owns(msg.sender, _sireId));\n sireAllowedToAddress[_sireId] = _addr;\n }\n\n /// @dev Updates the minimum payment required for calling giveBirthAuto(). Can only\n /// be called by the COO address. (This fee is used to offset the gas cost incurred\n /// by the autobirth daemon).\n function setAutoBirthFee(uint256 val) external onlyCOO {\n autoBirthFee = val;\n }\n\n /// @dev Checks to see if a given Kitty is pregnant and (if so) if the gestation\n /// period has passed.\n function _isReadyToGiveBirth(Kitty _matron) private view returns (bool) {\n return (_matron.siringWithId != 0) && (_matron.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @notice Checks that a given kitten is able to breed (i.e. it is not pregnant or\n /// in the middle of a siring cooldown).\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isReadyToBreed(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n Kitty storage kit = kitties[_kittyId];\n return _isReadyToBreed(kit);\n }\n\n /// @dev Checks whether a kitty is currently pregnant.\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isPregnant(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n // A kitty is pregnant if and only if this field is set\n return kitties[_kittyId].siringWithId != 0;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair. DOES NOT\n /// check ownership permissions (that is up to the caller).\n /// @param _matron A reference to the Kitty struct of the potential matron.\n /// @param _matronId The matron's ID.\n /// @param _sire A reference to the Kitty struct of the potential sire.\n /// @param _sireId The sire's ID\n function _isValidMatingPair(\n Kitty storage _matron,\n uint256 _matronId,\n Kitty storage _sire,\n uint256 _sireId\n )\n private\n view\n returns(bool)\n {\n // A Kitty can't breed with itself!\n if (_matronId == _sireId) {\n return false;\n }\n\n // Kitties can't breed with their parents.\n if (_matron.matronId == _sireId || _matron.sireId == _sireId) {\n return false;\n }\n if (_sire.matronId == _matronId || _sire.sireId == _matronId) {\n return false;\n }\n\n // We can short circuit the sibling check (below) if either cat is\n // gen zero (has a matron ID of zero).\n if (_sire.matronId == 0 || _matron.matronId == 0) {\n return true;\n }\n\n // Kitties can't breed with full or half siblings.\n if (_sire.matronId == _matron.matronId || _sire.matronId == _matron.sireId) {\n return false;\n }\n if (_sire.sireId == _matron.matronId || _sire.sireId == _matron.sireId) {\n return false;\n }\n\n // Everything seems cool! Let's get DTF.\n return true;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair for\n /// breeding via auction (i.e. skips ownership and siring approval checks).\n function _canBreedWithViaAuction(uint256 _matronId, uint256 _sireId)\n internal\n view\n returns (bool)\n {\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId);\n }\n\n /// @notice Checks to see if two cats can breed together, including checks for\n /// ownership and siring approvals. Does NOT check that both cats are ready for\n /// breeding (i.e. breedWith could still fail until the cooldowns are finished).\n /// TODO: Shouldn't this check pregnancy and cooldowns?!?\n /// @param _matronId The ID of the proposed matron.\n /// @param _sireId The ID of the proposed sire.\n function canBreedWith(uint256 _matronId, uint256 _sireId)\n external\n view\n returns(bool)\n {\n require(_matronId > 0);\n require(_sireId > 0);\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId) &&\n _isSiringPermitted(_sireId, _matronId);\n }\n\n /// @dev Internal utility function to initiate breeding, assumes that all breeding\n /// requirements have been checked.\n function _breedWith(uint256 _matronId, uint256 _sireId) internal {\n // Grab a reference to the Kitties from storage.\n Kitty storage sire = kitties[_sireId];\n Kitty storage matron = kitties[_matronId];\n\n // Mark the matron as pregnant, keeping track of who the sire is.\n matron.siringWithId = uint32(_sireId);\n\n // Trigger the cooldown for both parents.\n _triggerCooldown(sire);\n _triggerCooldown(matron);\n\n // Clear siring permission for both parents. This may not be strictly necessary\n // but it's likely to avoid confusion!\n delete sireAllowedToAddress[_matronId];\n delete sireAllowedToAddress[_sireId];\n\n // Every time a kitty gets pregnant, counter is incremented.\n pregnantKitties++;\n\n // Emit the pregnancy event.\n Pregnant(kittyIndexToOwner[_matronId], _matronId, _sireId, matron.cooldownEndBlock);\n }\n\n /// @notice Breed a Kitty you own (as matron) with a sire that you own, or for which you\n /// have previously been given Siring approval. Will either make your cat pregnant, or will\n /// fail entirely. Requires a pre-payment of the fee given out to the first caller of giveBirth()\n /// @param _matronId The ID of the Kitty acting as matron (will end up pregnant if successful)\n /// @param _sireId The ID of the Kitty acting as sire (will begin its siring cooldown if successful)\n function breedWithAuto(uint256 _matronId, uint256 _sireId)\n external\n payable\n whenNotPaused\n {\n // Checks for payment.\n require(msg.value >= autoBirthFee);\n\n // Caller must own the matron.\n require(_owns(msg.sender, _matronId));\n\n // Neither sire nor matron are allowed to be on auction during a normal\n // breeding operation, but we don't need to check that explicitly.\n // For matron: The caller of this function can't be the owner of the matron\n // because the owner of a Kitty on auction is the auction house, and the\n // auction house will never call breedWith().\n // For sire: Similarly, a sire on auction will be owned by the auction house\n // and the act of transferring ownership will have cleared any oustanding\n // siring approval.\n // Thus we don't need to spend gas explicitly checking to see if either cat\n // is on auction.\n\n // Check that matron and sire are both owned by caller, or that the sire\n // has given siring permission to caller (i.e. matron's owner).\n // Will fail for _sireId = 0\n require(_isSiringPermitted(_sireId, _matronId));\n\n // Grab a reference to the potential matron\n Kitty storage matron = kitties[_matronId];\n\n // Make sure matron isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(matron));\n\n // Grab a reference to the potential sire\n Kitty storage sire = kitties[_sireId];\n\n // Make sure sire isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(sire));\n\n // Test that these cats are a valid mating pair.\n require(_isValidMatingPair(\n matron,\n _matronId,\n sire,\n _sireId\n ));\n\n // All checks passed, kitty gets pregnant!\n _breedWith(_matronId, _sireId);\n }\n\n /// @notice Have a pregnant Kitty give birth!\n /// @param _matronId A Kitty ready to give birth.\n /// @return The Kitty ID of the new kitten.\n /// @dev Looks at a given Kitty and, if pregnant and if the gestation period has passed,\n /// combines the genes of the two parents to create a new kitten. The new Kitty is assigned\n /// to the current owner of the matron. Upon successful completion, both the matron and the\n /// new kitten will be ready to breed again. Note that anyone can call this function (if they\n /// are willing to pay the gas!), but the new kitten always goes to the mother's owner.\n function giveBirth(uint256 _matronId)\n external\n whenNotPaused\n returns(uint256)\n {\n // Grab a reference to the matron in storage.\n Kitty storage matron = kitties[_matronId];\n\n // Check that the matron is a valid cat.\n require(matron.birthTime != 0);\n\n // Check that the matron is pregnant, and that its time has come!\n require(_isReadyToGiveBirth(matron));\n\n // Grab a reference to the sire in storage.\n uint256 sireId = matron.siringWithId;\n Kitty storage sire = kitties[sireId];\n\n // Determine the higher generation number of the two parents\n uint16 parentGen = matron.generation;\n if (sire.generation > matron.generation) {\n parentGen = sire.generation;\n }\n\n // Call the sooper-sekret gene mixing operation.\n uint256 childGenes = geneScience.mixGenes(matron.genes, sire.genes, matron.cooldownEndBlock - 1);\n\n // Make the new kitten!\n address owner = kittyIndexToOwner[_matronId];\n uint256 kittenId = _createKitty(_matronId, matron.siringWithId, parentGen + 1, childGenes, owner);\n\n // Clear the reference to sire from the matron (REQUIRED! Having siringWithId\n // set is what marks a matron as being pregnant.)\n delete matron.siringWithId;\n\n // Every time a kitty gives birth counter is decremented.\n pregnantKitties--;\n\n // Send the balance fee to the person who made birth happen.\n msg.sender.send(autoBirthFee);\n\n // return the new kitten's ID\n return kittenId;\n }\n}\n\n\n\n\n\n\n\n\n\n\n/// @title Auction Core\n/// @dev Contains models, variables, and internal methods for the auction.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuctionBase {\n\n // Represents an auction on an NFT\n struct Auction {\n // Current owner of NFT\n address seller;\n // Price (in wei) at beginning of auction\n uint128 startingPrice;\n // Price (in wei) at end of auction\n uint128 endingPrice;\n // Duration (in seconds) of auction\n uint64 duration;\n // Time when auction started\n // NOTE: 0 if this auction has been concluded\n uint64 startedAt;\n }\n\n // Reference to contract tracking NFT ownership\n KittiesERC721 public nonFungibleContract;\n\n // Cut owner takes on each auction, measured in basis points (1/100 of a percent).\n // Values 0-10,000 map to 0%-100%\n uint256 public ownerCut;\n\n // Map from token ID to their corresponding auction.\n mapping (uint256 => Auction) tokenIdToAuction;\n\n event AuctionCreated(uint256 tokenId, uint256 startingPrice, uint256 endingPrice, uint256 duration);\n event AuctionSuccessful(uint256 tokenId, uint256 totalPrice, address winner);\n event AuctionCancelled(uint256 tokenId);\n\n /// @dev Returns true if the claimant owns the token.\n /// @param _claimant - Address claiming to own the token.\n /// @param _tokenId - ID of token whose ownership to verify.\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return (nonFungibleContract.ownerOf(_tokenId) == _claimant);\n }\n\n /// @dev Escrows the NFT, assigning ownership to this contract.\n /// Throws if the escrow fails.\n /// @param _owner - Current owner address of token to escrow.\n /// @param _tokenId - ID of token whose approval to verify.\n function _escrow(address _owner, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transferFrom(_owner, this, _tokenId);\n }\n\n /// @dev Transfers an NFT owned by this contract to another address.\n /// Returns true if the transfer succeeds.\n /// @param _receiver - Address to transfer NFT to.\n /// @param _tokenId - ID of token to transfer.\n function _transfer(address _receiver, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transfer(_receiver, _tokenId);\n }\n\n /// @dev Adds an auction to the list of open auctions. Also fires the\n /// AuctionCreated event.\n /// @param _tokenId The ID of the token to be put on auction.\n /// @param _auction Auction to add.\n function _addAuction(uint256 _tokenId, Auction _auction) internal {\n // Require that all auctions have a duration of\n // at least one minute. (Keeps our math from getting hairy!)\n require(_auction.duration >= 1 minutes);\n\n tokenIdToAuction[_tokenId] = _auction;\n\n AuctionCreated(\n uint256(_tokenId),\n uint256(_auction.startingPrice),\n uint256(_auction.endingPrice),\n uint256(_auction.duration)\n );\n }\n\n /// @dev Cancels an auction unconditionally.\n function _cancelAuction(uint256 _tokenId, address _seller) internal {\n _removeAuction(_tokenId);\n _transfer(_seller, _tokenId);\n AuctionCancelled(_tokenId);\n }\n\n /// @dev Computes the price and transfers winnings.\n /// Does NOT transfer ownership of token.\n function _bid(uint256 _tokenId, uint256 _bidAmount)\n internal\n returns (uint256)\n {\n // Get a reference to the auction struct\n Auction storage auction = tokenIdToAuction[_tokenId];\n\n // Explicitly check that this auction is currently live.\n // (Because of how Ethereum mappings work, we can't just count\n // on the lookup above failing. An invalid _tokenId will just\n // return an auction object that is all zeros.)\n require(_isOnAuction(auction));\n\n // Check that the bid is greater than or equal to the current price\n uint256 price = _currentPrice(auction);\n require(_bidAmount >= price);\n\n // Grab a reference to the seller before the auction struct\n // gets deleted.\n address seller = auction.seller;\n\n // The bid is good! Remove the auction before sending the fees\n // to the sender so we can't have a reentrancy attack.\n _removeAuction(_tokenId);\n\n // Transfer proceeds to seller (if there are any!)\n if (price > 0) {\n // Calculate the auctioneer's cut.\n // (NOTE: _computeCut() is guaranteed to return a\n // value <= price, so this subtraction can't go negative.)\n uint256 auctioneerCut = _computeCut(price);\n uint256 sellerProceeds = price - auctioneerCut;\n\n // NOTE: Doing a transfer() in the middle of a complex\n // method like this is generally discouraged because of\n // reentrancy attacks and DoS attacks if the seller is\n // a contract with an invalid fallback function. We explicitly\n // guard against reentrancy attacks by removing the auction\n // before calling transfer(), and the only thing the seller\n // can DoS is the sale of their own asset! (And if it's an\n // accident, they can call cancelAuction(). )\n seller.transfer(sellerProceeds);\n }\n\n // Calculate any excess funds included with the bid. If the excess\n // is anything worth worrying about, transfer it back to bidder.\n // NOTE: We checked above that the bid amount is greater than or\n // equal to the price so this cannot underflow.\n uint256 bidExcess = _bidAmount - price;\n\n // Return the funds. Similar to the previous transfer, this is\n // not susceptible to a re-entry attack because the auction is\n // removed before any transfers occur.\n msg.sender.transfer(bidExcess);\n\n // Tell the world!\n AuctionSuccessful(_tokenId, price, msg.sender);\n\n return price;\n }\n\n /// @dev Removes an auction from the list of open auctions.\n /// @param _tokenId - ID of NFT on auction.\n function _removeAuction(uint256 _tokenId) internal {\n delete tokenIdToAuction[_tokenId];\n }\n\n /// @dev Returns true if the NFT is on auction.\n /// @param _auction - Auction to check.\n function _isOnAuction(Auction storage _auction) internal view returns (bool) {\n return (_auction.startedAt > 0);\n }\n\n /// @dev Returns current price of an NFT on auction. Broken into two\n /// functions (this one, that computes the duration from the auction\n /// structure, and the other that does the price computation) so we\n /// can easily test that the price computation works correctly.\n function _currentPrice(Auction storage _auction)\n internal\n view\n returns (uint256)\n {\n uint256 secondsPassed = 0;\n\n // A bit of insurance against negative values (or wraparound).\n // Probably not necessary (since Ethereum guarnatees that the\n // now variable doesn't ever go backwards).\n if (now > _auction.startedAt) {\n secondsPassed = now - _auction.startedAt;\n }\n\n return _computeCurrentPrice(\n _auction.startingPrice,\n _auction.endingPrice,\n _auction.duration,\n secondsPassed\n );\n }\n\n /// @dev Computes the current price of an auction. Factored out\n /// from _currentPrice so we can run extensive unit tests.\n /// When testing, make this function public and turn on\n /// `Current price computation` test suite.\n function _computeCurrentPrice(\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n uint256 _secondsPassed\n )\n internal\n pure\n returns (uint256)\n {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our public functions carefully cap the maximum values for\n // time (at 64-bits) and currency (at 128-bits). _duration is\n // also known to be non-zero (see the require() statement in\n // _addAuction())\n if (_secondsPassed >= _duration) {\n // We've reached the end of the dynamic pricing portion\n // of the auction, just return the end price.\n return _endingPrice;\n } else {\n // Starting price can be higher than ending price (and often is!), so\n // this delta can be negative.\n int256 totalPriceChange = int256(_endingPrice) - int256(_startingPrice);\n\n // This multiplication can't overflow, _secondsPassed will easily fit within\n // 64-bits, and totalPriceChange will easily fit within 128-bits, their product\n // will always fit within 256-bits.\n int256 currentPriceChange = totalPriceChange * int256(_secondsPassed) / int256(_duration);\n\n // currentPriceChange can be negative, but if so, will have a magnitude\n // less that _startingPrice. Thus, this result will always end up positive.\n int256 currentPrice = int256(_startingPrice) + currentPriceChange;\n\n return uint256(currentPrice);\n }\n }\n\n /// @dev Computes owner's cut of a sale.\n /// @param _price - Sale price of NFT.\n function _computeCut(uint256 _price) internal view returns (uint256) {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our entry functions carefully cap the maximum values for\n // currency (at 128-bits), and ownerCut <= 10000 (see the require()\n // statement in the ClockAuction constructor). The result of this\n // function is always guaranteed to be <= _price.\n return _price * ownerCut / 10000;\n }\n\n}\n\n\n\n\n\n\n\n/**\n * @title KittiesPausable\n * @dev Base contract which allows children to implement an emergency stop mechanism.\n */\ncontract KittiesPausable is KittiesOwnable {\n event Pause();\n event Unpause();\n\n bool public paused = false;\n\n\n /**\n\t * @dev modifier to allow actions only when the contract IS paused\n\t */\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /**\n\t * @dev modifier to allow actions only when the contract IS NOT paused\n\t */\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /**\n\t * @dev called by the owner to pause, triggers stopped state\n\t */\n function pause() onlyOwner whenNotPaused returns (bool) {\n paused = true;\n Pause();\n return true;\n }\n\n /**\n\t * @dev called by the owner to unpause, returns to normal state\n\t */\n function unpause() onlyOwner whenPaused returns (bool) {\n paused = false;\n Unpause();\n return true;\n }\n}\n\n\n/// @title Clock auction for non-fungible tokens.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuction is KittiesPausable, ClockAuctionBase {\n\n /// @dev The ERC-165 interface signature for ERC-721.\n /// Ref: https://github.com/ethereum/EIPs/issues/165\n /// Ref: https://github.com/ethereum/EIPs/issues/721\n bytes4 constant InterfaceSignature_ERC721 = bytes4(0x9a20483d);\n\n /// @dev Constructor creates a reference to the NFT ownership contract\n /// and verifies the owner cut is in the valid range.\n /// @param _nftAddress - address of a deployed contract implementing\n /// the Nonfungible Interface.\n /// @param _cut - percent cut the owner takes on each auction, must be\n /// between 0-10,000.\n function ClockAuction(address _nftAddress, uint256 _cut) public {\n require(_cut <= 10000);\n ownerCut = _cut;\n\n KittiesERC721 candidateContract = KittiesERC721(_nftAddress);\n require(candidateContract.supportsInterface(InterfaceSignature_ERC721));\n nonFungibleContract = candidateContract;\n }\n\n /// @dev Remove all Ether from the contract, which is the owner's cuts\n /// as well as any Ether sent directly to the contract address.\n /// Always transfers to the NFT contract, but can be called either by\n /// the owner or the NFT contract.\n function withdrawBalance() external {\n address nftAddress = address(nonFungibleContract);\n\n require(\n msg.sender == owner ||\n msg.sender == nftAddress\n );\n // We are using this boolean method to make sure that even if one fails it will still work\n bool res = nftAddress.send(this.balance);\n }\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of time to move between starting\n /// price and ending price (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n whenNotPaused\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(_owns(msg.sender, _tokenId));\n _escrow(msg.sender, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Bids on an open auction, completing the auction and transferring\n /// ownership of the NFT if enough Ether is supplied.\n /// @param _tokenId - ID of token to bid on.\n function bid(uint256 _tokenId)\n external\n payable\n whenNotPaused\n {\n // _bid will throw if the bid or funds transfer fails\n _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n }\n\n /// @dev Cancels an auction that hasn't been won yet.\n /// Returns the NFT to original owner.\n /// @notice This is a state-modifying function that can\n /// be called while the contract is paused.\n /// @param _tokenId - ID of token on auction\n function cancelAuction(uint256 _tokenId)\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n address seller = auction.seller;\n require(msg.sender == seller);\n _cancelAuction(_tokenId, seller);\n }\n\n /// @dev Cancels an auction when the contract is paused.\n /// Only the owner may do this, and NFTs are returned to\n /// the seller. This should only be used in emergencies.\n /// @param _tokenId - ID of the NFT on auction to cancel.\n function cancelAuctionWhenPaused(uint256 _tokenId)\n whenPaused\n onlyOwner\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n _cancelAuction(_tokenId, auction.seller);\n }\n\n /// @dev Returns auction info for an NFT on auction.\n /// @param _tokenId - ID of NFT on auction.\n function getAuction(uint256 _tokenId)\n external\n view\n returns\n (\n address seller,\n uint256 startingPrice,\n uint256 endingPrice,\n uint256 duration,\n uint256 startedAt\n ) {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return (\n auction.seller,\n auction.startingPrice,\n auction.endingPrice,\n auction.duration,\n auction.startedAt\n );\n }\n\n /// @dev Returns the current price of an auction.\n /// @param _tokenId - ID of the token price we are checking.\n function getCurrentPrice(uint256 _tokenId)\n external\n view\n returns (uint256)\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return _currentPrice(auction);\n }\n\n}\n\n\n/// @title Reverse auction modified for siring\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SiringClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSiringAuctionAddress() call.\n bool public isSiringClockAuction = true;\n\n // Delegate constructor\n function SiringClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction. Since this function is wrapped,\n /// require sender to be KittyCore contract.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Places a bid for siring. Requires the sender\n /// is the KittyCore contract because all bid methods\n /// should be wrapped. Also returns the kitty to the\n /// seller rather than the winner.\n function bid(uint256 _tokenId)\n external\n payable\n {\n require(msg.sender == address(nonFungibleContract));\n address seller = tokenIdToAuction[_tokenId].seller;\n // _bid checks that token ID is valid and will throw if bid fails\n _bid(_tokenId, msg.value);\n // We transfer the kitty back to the seller, the winner will get\n // the offspring\n _transfer(seller, _tokenId);\n }\n\n}\n\n\n\n\n\n/// @title Clock auction modified for sale of kitties\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SaleClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSaleAuctionAddress() call.\n bool public isSaleClockAuction = true;\n\n // Tracks last 5 sale price of gen0 kitty sales\n uint256 public gen0SaleCount;\n uint256[5] public lastGen0SalePrices;\n\n // Delegate constructor\n function SaleClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Updates lastSalePrice if seller is the nft contract\n /// Otherwise, works the same as default bid method.\n function bid(uint256 _tokenId)\n external\n payable\n {\n // _bid verifies token ID size\n address seller = tokenIdToAuction[_tokenId].seller;\n uint256 price = _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n\n // If not a gen0 auction, exit\n if (seller == address(nonFungibleContract)) {\n // Track gen0 sale prices\n lastGen0SalePrices[gen0SaleCount % 5] = price;\n gen0SaleCount++;\n }\n }\n\n function averageGen0SalePrice() external view returns (uint256) {\n uint256 sum = 0;\n for (uint256 i = 0; i < 5; i++) {\n sum += lastGen0SalePrices[i];\n }\n return sum / 5;\n }\n\n}\n\n\n/// @title Handles creating auctions for sale and siring of kitties.\n/// This wrapper of ReverseAuction exists only so that users can create\n/// auctions with only one transaction.\ncontract KittyAuction is KittyBreeding {\n\n // @notice The auction contract variables are defined in KittyBase to allow\n // us to refer to them in KittyOwnership to prevent accidental transfers.\n // `saleAuction` refers to the auction for gen0 and p2p sale of kitties.\n // `siringAuction` refers to the auction for siring rights of kitties.\n\n /// @dev Sets the reference to the sale auction.\n /// @param _address - Address of sale contract.\n function setSaleAuctionAddress(address _address) external onlyCEO {\n SaleClockAuction candidateContract = SaleClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSaleClockAuction());\n\n // Set the new contract address\n saleAuction = candidateContract;\n }\n\n /// @dev Sets the reference to the siring auction.\n /// @param _address - Address of siring contract.\n function setSiringAuctionAddress(address _address) external onlyCEO {\n SiringClockAuction candidateContract = SiringClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSiringClockAuction());\n\n // Set the new contract address\n siringAuction = candidateContract;\n }\n\n /// @dev Put a kitty up for auction.\n /// Does some ownership trickery to create auctions in one tx.\n function createSaleAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n // Ensure the kitty is not pregnant to prevent the auction\n // contract accidentally receiving ownership of the child.\n // NOTE: the kitty IS allowed to be in a cooldown.\n require(!isPregnant(_kittyId));\n _approve(_kittyId, saleAuction);\n // Sale auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n saleAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Put a kitty up for auction to be sire.\n /// Performs checks to ensure the kitty can be sired, then\n /// delegates to reverse auction.\n function createSiringAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n require(isReadyToBreed(_kittyId));\n _approve(_kittyId, siringAuction);\n // Siring auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n siringAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Completes a siring auction by bidding.\n /// Immediately breeds the winning matron with the sire on auction.\n /// @param _sireId - ID of the sire on auction.\n /// @param _matronId - ID of the matron owned by the bidder.\n function bidOnSiringAuction(\n uint256 _sireId,\n uint256 _matronId\n )\n external\n payable\n whenNotPaused\n {\n // Auction contract checks input sizes\n require(_owns(msg.sender, _matronId));\n require(isReadyToBreed(_matronId));\n require(_canBreedWithViaAuction(_matronId, _sireId));\n\n // Define the current price of the auction.\n uint256 currentPrice = siringAuction.getCurrentPrice(_sireId);\n require(msg.value >= currentPrice + autoBirthFee);\n\n // Siring auction will throw if the bid fails.\n siringAuction.bid.value(msg.value - autoBirthFee)(_sireId);\n _breedWith(uint32(_matronId), uint32(_sireId));\n }\n\n /// @dev Transfers the balance of the sale auction contract\n /// to the KittyCore contract. We use two-step withdrawal to\n /// prevent two transfer calls in the auction bid function.\n function withdrawAuctionBalances() external onlyCLevel {\n saleAuction.withdrawBalance();\n siringAuction.withdrawBalance();\n }\n}\n\n\n/// @title all functions related to creating kittens\ncontract KittyMinting is KittyAuction {\n\n // Limits the number of cats the contract owner can ever create.\n uint256 public constant PROMO_CREATION_LIMIT = 5000;\n uint256 public constant GEN0_CREATION_LIMIT = 45000;\n\n // Constants for gen0 auctions.\n uint256 public constant GEN0_STARTING_PRICE = 10 finney;\n uint256 public constant GEN0_AUCTION_DURATION = 1 days;\n\n // Counts the number of cats the contract owner has created.\n uint256 public promoCreatedCount;\n uint256 public gen0CreatedCount;\n\n /// @dev we can create promo kittens, up to a limit. Only callable by COO\n /// @param _genes the encoded genes of the kitten to be created, any value is accepted\n /// @param _owner the future owner of the created kittens. Default to contract COO\n function createPromoKitty(uint256 _genes, address _owner) external onlyCOO {\n address kittyOwner = _owner;\n if (kittyOwner == address(0)) {\n kittyOwner = cooAddress;\n }\n require(promoCreatedCount < PROMO_CREATION_LIMIT);\n\n promoCreatedCount++;\n _createKitty(0, 0, 0, _genes, kittyOwner);\n }\n\n /// @dev Creates a new gen0 kitty with the given genes and\n /// creates an auction for it.\n function createGen0Auction(uint256 _genes) external onlyCOO {\n require(gen0CreatedCount < GEN0_CREATION_LIMIT);\n\n uint256 kittyId = _createKitty(0, 0, 0, _genes, address(this));\n _approve(kittyId, saleAuction);\n\n saleAuction.createAuction(\n kittyId,\n _computeNextGen0Price(),\n 0,\n GEN0_AUCTION_DURATION,\n address(this)\n );\n\n gen0CreatedCount++;\n }\n\n /// @dev Computes the next gen0 auction starting price, given\n /// the average of the past 5 prices + 50%.\n function _computeNextGen0Price() internal view returns (uint256) {\n uint256 avePrice = saleAuction.averageGen0SalePrice();\n\n // Sanity check to ensure we don't overflow arithmetic\n require(avePrice == uint256(uint128(avePrice)));\n\n uint256 nextPrice = avePrice + (avePrice / 2);\n\n // We never auction for less than starting price\n if (nextPrice < GEN0_STARTING_PRICE) {\n nextPrice = GEN0_STARTING_PRICE;\n }\n\n return nextPrice;\n }\n}\n\n\n/// @title CryptoKitties: Collectible, breedable, and oh-so-adorable cats on the Ethereum blockchain.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev The main CryptoKitties contract, keeps track of kittens so they don't wander around and get lost.\ncontract KittyCore is KittyMinting {\n\n // This is the main CryptoKitties contract. In order to keep our code seperated into logical sections,\n // we've broken it up in two ways. First, we have several seperately-instantiated sibling contracts\n // that handle auctions and our super-top-secret genetic combination algorithm. The auctions are\n // seperate since their logic is somewhat complex and there's always a risk of subtle bugs. By keeping\n // them in their own contracts, we can upgrade them without disrupting the main contract that tracks\n // kitty ownership. The genetic combination algorithm is kept seperate so we can open-source all of\n // the rest of our code without making it _too_ easy for folks to figure out how the genetics work.\n // Don't worry, I'm sure someone will reverse engineer it soon enough!\n //\n // Secondly, we break the core contract into multiple files using inheritence, one for each major\n // facet of functionality of CK. This allows us to keep related code bundled together while still\n // avoiding a single giant file with everything in it. The breakdown is as follows:\n //\n // - KittyBase: This is where we define the most fundamental code shared throughout the core\n // functionality. This includes our main data storage, constants and data types, plus\n // internal functions for managing these items.\n //\n // - KittyAccessControl: This contract manages the various addresses and constraints for operations\n // that can be executed only by specific roles. Namely CEO, CFO and COO.\n //\n // - KittyOwnership: This provides the methods required for basic non-fungible token\n // transactions, following the draft ERC-721 spec (https://github.com/ethereum/EIPs/issues/721).\n //\n // - KittyBreeding: This file contains the methods necessary to breed cats together, including\n // keeping track of siring offers, and relies on an external genetic combination contract.\n //\n // - KittyAuctions: Here we have the public methods for auctioning or bidding on cats or siring\n // services. The actual auction functionality is handled in two sibling contracts (one\n // for sales and one for siring), while auction creation and bidding is mostly mediated\n // through this facet of the core contract.\n //\n // - KittyMinting: This final facet contains the functionality we use for creating new gen0 cats.\n // We can make up to 5000 \"promo\" cats that can be given away (especially important when\n // the community is new), and all others can only be created and then immediately put up\n // for auction via an algorithmically determined starting price. Regardless of how they\n // are created, there is a hard limit of 50k gen0 cats. After that, it's all up to the\n // community to breed, breed, breed!\n\n // Set in case the core contract is broken and an upgrade is required\n address public newContractAddress;\n\n /// @notice Creates the main CryptoKitties smart contract instance.\n function KittyCore() public {\n // Starts paused.\n paused = true;\n\n // the creator of the contract is the initial CEO\n ceoAddress = msg.sender;\n\n // the creator of the contract is also the initial COO\n cooAddress = msg.sender;\n\n // start with the mythical kitten 0 - so we don't have generation-0 parent issues\n _createKitty(0, 0, 0, uint256(-1), address(0));\n }\n\n /// @dev Used to mark the smart contract as upgraded, in case there is a serious\n /// breaking bug. This method does nothing but keep track of the new contract and\n /// emit a message indicating that the new address is set. It's up to clients of this\n /// contract to update to the new contract address in that case. (This contract will\n /// be paused indefinitely if such an upgrade takes place.)\n /// @param _v2Address new address\n function setNewAddress(address _v2Address) external onlyCEO whenPaused {\n // See README.md for updgrade plan\n newContractAddress = _v2Address;\n ContractUpgrade(_v2Address);\n }\n\n /// @notice No tipping!\n /// @dev Reject all Ether from being sent here, unless it's from one of the\n /// two auction contracts. (Hopefully, we can prevent user accidents.)\n function() external payable {\n require(\n msg.sender == address(saleAuction) ||\n msg.sender == address(siringAuction)\n );\n }\n\n /// @notice Returns all the relevant information about a specific kitty.\n /// @param _id The ID of the kitty of interest.\n function getKitty(uint256 _id)\n external\n view\n returns (\n bool isGestating,\n bool isReady,\n uint256 cooldownIndex,\n uint256 nextActionAt,\n uint256 siringWithId,\n uint256 birthTime,\n uint256 matronId,\n uint256 sireId,\n uint256 generation,\n uint256 genes\n ) {\n Kitty storage kit = kitties[_id];\n\n // if this variable is 0 then it's not gestating\n isGestating = (kit.siringWithId != 0);\n isReady = (kit.cooldownEndBlock <= block.number);\n cooldownIndex = uint256(kit.cooldownIndex);\n nextActionAt = uint256(kit.cooldownEndBlock);\n siringWithId = uint256(kit.siringWithId);\n birthTime = uint256(kit.birthTime);\n matronId = uint256(kit.matronId);\n sireId = uint256(kit.sireId);\n generation = uint256(kit.generation);\n genes = kit.genes;\n }\n\n /// @dev Override unpause so it requires all external contract addresses\n /// to be set before contract can be unpaused. Also, we can't have\n /// newContractAddress set either, because then the contract was upgraded.\n /// @notice This is public rather than external so we can call super.unpause\n /// without using an expensive CALL.\n function unpause() public onlyCEO whenPaused {\n require(saleAuction != address(0));\n require(siringAuction != address(0));\n require(geneScience != address(0));\n require(newContractAddress == address(0));\n\n // Actually unpause the contract.\n super.unpause();\n }\n\n // @dev Allows the CFO to capture the balance available to the contract.\n function withdrawBalance() external onlyCFO {\n uint256 balance = this.balance;\n // Subtract all the currently pregnant kittens we have, plus 1 of margin.\n uint256 subtractFees = (pregnantKitties + 1) * autoBirthFee;\n\n if (balance > subtractFees) {\n cfoAddress.send(balance - subtractFees);\n }\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "exportedSymbols": { "ClockAuction": [ 8872 @@ -51964,5 +51964,5 @@ export const ClockAuction = }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:47.614Z" + "updatedAt": "2018-10-09T17:45:36.032Z" } \ No newline at end of file diff --git a/artifacts/ts/ClockAuctionBase.ts b/artifacts/ts/ClockAuctionBase.ts index 538aa066..ceb7b7ff 100644 --- a/artifacts/ts/ClockAuctionBase.ts +++ b/artifacts/ts/ClockAuctionBase.ts @@ -92,15 +92,15 @@ export const ClockAuctionBase = "type": "event" } ], - "bytecode": "0x6060604052341561000f57600080fd5b61011d8061001e6000396000f3006060604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806383b5ff8b14604e578063dd1b7a0f146074575b600080fd5b3415605857600080fd5b605e60c6565b6040518082815260200191505060405180910390f35b3415607e57600080fd5b608460cc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60015481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16815600a165627a7a723058206b944cbdf572d07dea6a872a3e2839b98365d3f4bcbdbcffbf18fab77a6481900029", - "deployedBytecode": "0x6060604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806383b5ff8b14604e578063dd1b7a0f146074575b600080fd5b3415605857600080fd5b605e60c6565b6040518082815260200191505060405180910390f35b3415607e57600080fd5b608460cc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60015481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16815600a165627a7a723058206b944cbdf572d07dea6a872a3e2839b98365d3f4bcbdbcffbf18fab77a6481900029", + "bytecode": "0x6060604052341561000f57600080fd5b61011d8061001e6000396000f3006060604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806383b5ff8b14604e578063dd1b7a0f146074575b600080fd5b3415605857600080fd5b605e60c6565b6040518082815260200191505060405180910390f35b3415607e57600080fd5b608460cc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60015481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16815600a165627a7a723058209a72cd1348e94b6f694fe512101797123261f2d93c61a1e62520701ce6cbae3d0029", + "deployedBytecode": "0x6060604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806383b5ff8b14604e578063dd1b7a0f146074575b600080fd5b3415605857600080fd5b605e60c6565b6040518082815260200191505060405180910390f35b3415607e57600080fd5b608460cc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60015481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16815600a165627a7a723058209a72cd1348e94b6f694fe512101797123261f2d93c61a1e62520701ce6cbae3d0029", "sourceMap": "44379:9719:18:-;;;;;;;;;;;;;;;;;", "deployedSourceMap": "44379:9719:18:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45099:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44927:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45099:23;;;;:::o;44927:40::-;;;;;;;;;;;;;:::o", "source": "pragma solidity 0.4.18;\n\n/**\n The following contract code, titled KittyCore, was written by Cryptokitties and published\n and retrieved from https://etherscan.io/address/0x06012c8cf97bead5deae237070f9587f8e7a266d#code.\n\n It is included in the current project for test purposes, to ensure that our collateralizer can\n handle ERC721 tokens created by the KittyCore contract.\n*/\n\n/**\n * @title KittiesOwnable\n * @dev The KittiesOwnable contract has an owner address, and provides basic authorization control\n * functions, this simplifies the implementation of \"user permissions\".\n */\ncontract KittiesOwnable {\n address public owner;\n\n\n /**\n\t * @dev The KittiesOwnable constructor sets the original `owner` of the contract to the sender\n\t * account.\n\t */\n function KittiesOwnable() {\n owner = msg.sender;\n }\n\n\n /**\n\t * @dev Throws if called by any account other than the owner.\n\t */\n modifier onlyOwner() {\n require(msg.sender == owner);\n _;\n }\n\n\n /**\n\t * @dev Allows the current owner to transfer control of the contract to a newOwner.\n\t * @param newOwner The address to transfer ownership to.\n\t */\n function transferOwnership(address newOwner) onlyOwner {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n\n}\n\n\n\n/// @title Interface for contracts conforming to ERC-721: Non-Fungible Tokens\n/// @author Dieter Shirley (https://github.com/dete)\ncontract KittiesERC721 {\n // Required methods\n function totalSupply() public view returns (uint256 total);\n function balanceOf(address _owner) public view returns (uint256 balance);\n function ownerOf(uint256 _tokenId) external view returns (address owner);\n function approve(address _to, uint256 _tokenId) external;\n function transfer(address _to, uint256 _tokenId) external;\n function transferFrom(address _from, address _to, uint256 _tokenId) external;\n\n // Events\n event Transfer(address from, address to, uint256 tokenId);\n event Approval(address owner, address approved, uint256 tokenId);\n\n // Optional\n // function name() public view returns (string name);\n // function symbol() public view returns (string symbol);\n // function tokensOfOwner(address _owner) external view returns (uint256[] tokenIds);\n // function tokenMetadata(uint256 _tokenId, string _preferredTransport) public view returns (string infoUrl);\n\n // ERC-165 Compatibility (https://github.com/ethereum/EIPs/issues/165)\n function supportsInterface(bytes4 _interfaceID) external view returns (bool);\n}\n\n\n// // Auction wrapper functions\n\n\n// Auction wrapper functions\n\n\n\n\n\n\n\n/// @title SEKRETOOOO\ncontract GeneScienceInterface {\n /// @dev simply a boolean to indicate this is the contract we expect to be\n function isGeneScience() public pure returns (bool);\n\n /// @dev given genes of kitten 1 & 2, return a genetic combination - may have a random factor\n /// @param genes1 genes of mom\n /// @param genes2 genes of sire\n /// @return the genes that are supposed to be passed down the child\n function mixGenes(uint256 genes1, uint256 genes2, uint256 targetBlock) public returns (uint256);\n}\n\n\n\n\n\n\n\n/// @title A facet of KittyCore that manages special access privileges.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyAccessControl {\n // This facet controls access control for CryptoKitties. There are four roles managed here:\n //\n // - The CEO: The CEO can reassign other roles and change the addresses of our dependent smart\n // contracts. It is also the only role that can unpause the smart contract. It is initially\n // set to the address that created the smart contract in the KittyCore constructor.\n //\n // - The CFO: The CFO can withdraw funds from KittyCore and its auction contracts.\n //\n // - The COO: The COO can release gen0 kitties to auction, and mint promo cats.\n //\n // It should be noted that these roles are distinct without overlap in their access abilities, the\n // abilities listed for each role above are exhaustive. In particular, while the CEO can assign any\n // address to any role, the CEO address itself doesn't have the ability to act in those roles. This\n // restriction is intentional so that we aren't tempted to use the CEO address frequently out of\n // convenience. The less we use an address, the less likely it is that we somehow compromise the\n // account.\n\n /// @dev Emited when contract is upgraded - See README.md for updgrade plan\n event ContractUpgrade(address newContract);\n\n // The addresses of the accounts (or contracts) that can execute actions within each roles.\n address public ceoAddress;\n address public cfoAddress;\n address public cooAddress;\n\n // @dev Keeps track whether the contract is paused. When that is true, most actions are blocked\n bool public paused = false;\n\n /// @dev Access modifier for CEO-only functionality\n modifier onlyCEO() {\n require(msg.sender == ceoAddress);\n _;\n }\n\n /// @dev Access modifier for CFO-only functionality\n modifier onlyCFO() {\n require(msg.sender == cfoAddress);\n _;\n }\n\n /// @dev Access modifier for COO-only functionality\n modifier onlyCOO() {\n require(msg.sender == cooAddress);\n _;\n }\n\n modifier onlyCLevel() {\n require(\n msg.sender == cooAddress ||\n msg.sender == ceoAddress ||\n msg.sender == cfoAddress\n );\n _;\n }\n\n /// @dev Assigns a new address to act as the CEO. Only available to the current CEO.\n /// @param _newCEO The address of the new CEO\n function setCEO(address _newCEO) external onlyCEO {\n require(_newCEO != address(0));\n\n ceoAddress = _newCEO;\n }\n\n /// @dev Assigns a new address to act as the CFO. Only available to the current CEO.\n /// @param _newCFO The address of the new CFO\n function setCFO(address _newCFO) external onlyCEO {\n require(_newCFO != address(0));\n\n cfoAddress = _newCFO;\n }\n\n /// @dev Assigns a new address to act as the COO. Only available to the current CEO.\n /// @param _newCOO The address of the new COO\n function setCOO(address _newCOO) external onlyCEO {\n require(_newCOO != address(0));\n\n cooAddress = _newCOO;\n }\n\n /*** KittiesPausable functionality adapted from OpenZeppelin ***/\n\n /// @dev Modifier to allow actions only when the contract IS NOT paused\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /// @dev Modifier to allow actions only when the contract IS paused\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /// @dev Called by any \"C-level\" role to pause the contract. Used only when\n /// a bug or exploit is detected and we need to limit damage.\n function pause() external onlyCLevel whenNotPaused {\n paused = true;\n }\n\n /// @dev Unpauses the smart contract. Can only be called by the CEO, since\n /// one reason we may pause the contract is when CFO or COO accounts are\n /// compromised.\n /// @notice This is public rather than external so it can be called by\n /// derived contracts.\n function unpause() public onlyCEO whenPaused {\n // can't unpause if contract was upgraded\n paused = false;\n }\n}\n\n\n\n\n/// @title Base contract for CryptoKitties. Holds all common structs, events and base variables.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBase is KittyAccessControl {\n /*** EVENTS ***/\n\n /// @dev The Birth event is fired whenever a new kitten comes into existence. This obviously\n /// includes any time a cat is created through the giveBirth method, but it is also called\n /// when a new gen0 cat is created.\n event Birth(address owner, uint256 kittyId, uint256 matronId, uint256 sireId, uint256 genes);\n\n /// @dev Transfer event as defined in current draft of ERC721. Emitted every time a kitten\n /// ownership is assigned, including births.\n event Transfer(address from, address to, uint256 tokenId);\n\n /*** DATA TYPES ***/\n\n /// @dev The main Kitty struct. Every cat in CryptoKitties is represented by a copy\n /// of this structure, so great care was taken to ensure that it fits neatly into\n /// exactly two 256-bit words. Note that the order of the members in this structure\n /// is important because of the byte-packing rules used by Ethereum.\n /// Ref: http://solidity.readthedocs.io/en/develop/miscellaneous.html\n struct Kitty {\n // The Kitty's genetic code is packed into these 256-bits, the format is\n // sooper-sekret! A cat's genes never change.\n uint256 genes;\n\n // The timestamp from the block when this cat came into existence.\n uint64 birthTime;\n\n // The minimum timestamp after which this cat can engage in breeding\n // activities again. This same timestamp is used for the pregnancy\n // timer (for matrons) as well as the siring cooldown.\n uint64 cooldownEndBlock;\n\n // The ID of the parents of this kitty, set to 0 for gen0 cats.\n // Note that using 32-bit unsigned integers limits us to a \"mere\"\n // 4 billion cats. This number might seem small until you realize\n // that Ethereum currently has a limit of about 500 million\n // transactions per year! So, this definitely won't be a problem\n // for several years (even as Ethereum learns to scale).\n uint32 matronId;\n uint32 sireId;\n\n // Set to the ID of the sire cat for matrons that are pregnant,\n // zero otherwise. A non-zero value here is how we know a cat\n // is pregnant. Used to retrieve the genetic material for the new\n // kitten when the birth transpires.\n uint32 siringWithId;\n\n // Set to the index in the cooldown array (see below) that represents\n // the current cooldown duration for this Kitty. This starts at zero\n // for gen0 cats, and is initialized to floor(generation/2) for others.\n // Incremented by one for each successful breeding action, regardless\n // of whether this cat is acting as matron or sire.\n uint16 cooldownIndex;\n\n // The \"generation number\" of this cat. Cats minted by the CK contract\n // for sale are called \"gen0\" and have a generation number of 0. The\n // generation number of all other cats is the larger of the two generation\n // numbers of their parents, plus one.\n // (i.e. max(matron.generation, sire.generation) + 1)\n uint16 generation;\n }\n\n /*** CONSTANTS ***/\n\n /// @dev A lookup table indicating the cooldown duration after any successful\n /// breeding action, called \"pregnancy time\" for matrons and \"siring cooldown\"\n /// for sires. Designed such that the cooldown roughly doubles each time a cat\n /// is bred, encouraging owners not to just keep breeding the same cat over\n /// and over again. Caps out at one week (a cat can breed an unbounded number\n /// of times, and the maximum cooldown is always seven days).\n uint32[14] public cooldowns = [\n uint32(1 minutes),\n uint32(2 minutes),\n uint32(5 minutes),\n uint32(10 minutes),\n uint32(30 minutes),\n uint32(1 hours),\n uint32(2 hours),\n uint32(4 hours),\n uint32(8 hours),\n uint32(16 hours),\n uint32(1 days),\n uint32(2 days),\n uint32(4 days),\n uint32(7 days)\n ];\n\n // An approximation of currently how many seconds are in between blocks.\n uint256 public secondsPerBlock = 15;\n\n /*** STORAGE ***/\n\n /// @dev An array containing the Kitty struct for all Kitties in existence. The ID\n /// of each cat is actually an index into this array. Note that ID 0 is a negacat,\n /// the unKitty, the mythical beast that is the parent of all gen0 cats. A bizarre\n /// creature that is both matron and sire... to itself! Has an invalid genetic code.\n /// In other words, cat ID 0 is invalid... ;-)\n Kitty[] kitties;\n\n /// @dev A mapping from cat IDs to the address that owns them. All cats have\n /// some valid owner address, even gen0 cats are created with a non-zero owner.\n mapping (uint256 => address) public kittyIndexToOwner;\n\n // @dev A mapping from owner address to count of tokens that address owns.\n // Used internally inside balanceOf() to resolve ownership count.\n mapping (address => uint256) ownershipTokenCount;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to call\n /// transferFrom(). Each Kitty can only have one approved address for transfer\n /// at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public kittyIndexToApproved;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to use\n /// this Kitty for siring via breedWith(). Each Kitty can only have one approved\n /// address for siring at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public sireAllowedToAddress;\n\n /// @dev The address of the ClockAuction contract that handles sales of Kitties. This\n /// same contract handles both peer-to-peer sales as well as the gen0 sales which are\n /// initiated every 15 minutes.\n SaleClockAuction public saleAuction;\n\n /// @dev The address of a custom ClockAuction subclassed contract that handles siring\n /// auctions. Needs to be separate from saleAuction because the actions taken on success\n /// after a sales and siring auction are quite different.\n SiringClockAuction public siringAuction;\n\n /// @dev Assigns ownership of a specific Kitty to an address.\n function _transfer(address _from, address _to, uint256 _tokenId) internal {\n // Since the number of kittens is capped to 2^32 we can't overflow this\n ownershipTokenCount[_to]++;\n // transfer ownership\n kittyIndexToOwner[_tokenId] = _to;\n // When creating new kittens _from is 0x0, but we can't account that address.\n if (_from != address(0)) {\n ownershipTokenCount[_from]--;\n // once the kitten is transferred also clear sire allowances\n delete sireAllowedToAddress[_tokenId];\n // clear any previously approved ownership exchange\n delete kittyIndexToApproved[_tokenId];\n }\n // Emit the transfer event.\n Transfer(_from, _to, _tokenId);\n }\n\n /// @dev An internal method that creates a new kitty and stores it. This\n /// method doesn't do any checking and should only be called when the\n /// input data is known to be valid. Will generate both a Birth event\n /// and a Transfer event.\n /// @param _matronId The kitty ID of the matron of this cat (zero for gen0)\n /// @param _sireId The kitty ID of the sire of this cat (zero for gen0)\n /// @param _generation The generation number of this cat, must be computed by caller.\n /// @param _genes The kitty's genetic code.\n /// @param _owner The inital owner of this cat, must be non-zero (except for the unKitty, ID 0)\n function _createKitty(\n uint256 _matronId,\n uint256 _sireId,\n uint256 _generation,\n uint256 _genes,\n address _owner\n )\n internal\n returns (uint)\n {\n // These requires are not strictly necessary, our calling code should make\n // sure that these conditions are never broken. However! _createKitty() is already\n // an expensive call (for storage), and it doesn't hurt to be especially careful\n // to ensure our data structures are always valid.\n require(_matronId == uint256(uint32(_matronId)));\n require(_sireId == uint256(uint32(_sireId)));\n require(_generation == uint256(uint16(_generation)));\n\n // New kitty starts with the same cooldown as parent gen/2\n uint16 cooldownIndex = uint16(_generation / 2);\n if (cooldownIndex > 13) {\n cooldownIndex = 13;\n }\n\n Kitty memory _kitty = Kitty({\n genes: _genes,\n birthTime: uint64(now),\n cooldownEndBlock: 0,\n matronId: uint32(_matronId),\n sireId: uint32(_sireId),\n siringWithId: 0,\n cooldownIndex: cooldownIndex,\n generation: uint16(_generation)\n });\n uint256 newKittenId = kitties.push(_kitty) - 1;\n\n // It's probably never going to happen, 4 billion cats is A LOT, but\n // let's just be 100% sure we never let this happen.\n require(newKittenId == uint256(uint32(newKittenId)));\n\n // emit the birth event\n Birth(\n _owner,\n newKittenId,\n uint256(_kitty.matronId),\n uint256(_kitty.sireId),\n _kitty.genes\n );\n\n // This will assign ownership, and also emit the Transfer event as\n // per ERC721 draft\n _transfer(0, _owner, newKittenId);\n\n return newKittenId;\n }\n\n // Any C-level can fix how many seconds per blocks are currently observed.\n function setSecondsPerBlock(uint256 secs) external onlyCLevel {\n require(secs < cooldowns[0]);\n secondsPerBlock = secs;\n }\n}\n\n\n\n\n\n/// @title The external contract that is responsible for generating metadata for the kitties,\n/// it has one function that will return the data as bytes.\ncontract KittiesERC721Metadata {\n /// @dev Given a token Id, returns a byte array that is supposed to be converted into string.\n function getMetadata(uint256 _tokenId, string) public view returns (bytes32[4] buffer, uint256 count) {\n if (_tokenId == 1) {\n buffer[0] = \"Hello World! :D\";\n count = 15;\n } else if (_tokenId == 2) {\n buffer[0] = \"I would definitely choose a medi\";\n buffer[1] = \"um length string.\";\n count = 49;\n } else if (_tokenId == 3) {\n buffer[0] = \"Lorem ipsum dolor sit amet, mi e\";\n buffer[1] = \"st accumsan dapibus augue lorem,\";\n buffer[2] = \" tristique vestibulum id, libero\";\n buffer[3] = \" suscipit varius sapien aliquam.\";\n count = 128;\n }\n }\n}\n\n\n/// @title The facet of the CryptoKitties core contract that manages ownership, ERC-721 (draft) compliant.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev Ref: https://github.com/ethereum/EIPs/issues/721\n/// See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyOwnership is KittyBase, KittiesERC721 {\n\n /// @notice Name and symbol of the non fungible token, as defined in ERC721.\n string public constant name = \"CryptoKitties\";\n string public constant symbol = \"CK\";\n\n // The contract that will return kitty metadata\n KittiesERC721Metadata public erc721Metadata;\n\n bytes4 constant InterfaceSignature_ERC165 =\n bytes4(keccak256('supportsInterface(bytes4)'));\n\n bytes4 constant InterfaceSignature_ERC721 =\n bytes4(keccak256('name()')) ^\n bytes4(keccak256('symbol()')) ^\n bytes4(keccak256('totalSupply()')) ^\n bytes4(keccak256('balanceOf(address)')) ^\n bytes4(keccak256('ownerOf(uint256)')) ^\n bytes4(keccak256('approve(address,uint256)')) ^\n bytes4(keccak256('transfer(address,uint256)')) ^\n bytes4(keccak256('transferFrom(address,address,uint256)')) ^\n bytes4(keccak256('tokensOfOwner(address)')) ^\n bytes4(keccak256('tokenMetadata(uint256,string)'));\n\n /// @notice Introspection interface as per ERC-165 (https://github.com/ethereum/EIPs/issues/165).\n /// Returns true for any standardized interfaces implemented by this contract. We implement\n /// ERC-165 (obviously!) and ERC-721.\n function supportsInterface(bytes4 _interfaceID) external view returns (bool)\n {\n // DEBUG ONLY\n //require((InterfaceSignature_ERC165 == 0x01ffc9a7) && (InterfaceSignature_ERC721 == 0x9a20483d));\n\n return ((_interfaceID == InterfaceSignature_ERC165) || (_interfaceID == InterfaceSignature_ERC721));\n }\n\n /// @dev Set the address of the sibling contract that tracks metadata.\n /// CEO only.\n function setMetadataAddress(address _contractAddress) public onlyCEO {\n erc721Metadata = KittiesERC721Metadata(_contractAddress);\n }\n\n // Internal utility functions: These functions all assume that their input arguments\n // are valid. We leave it to public methods to sanitize their inputs and follow\n // the required logic.\n\n /// @dev Checks if a given address is the current owner of a particular Kitty.\n /// @param _claimant the address we are validating against.\n /// @param _tokenId kitten id, only valid when > 0\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToOwner[_tokenId] == _claimant;\n }\n\n /// @dev Checks if a given address currently has transferApproval for a particular Kitty.\n /// @param _claimant the address we are confirming kitten is approved for.\n /// @param _tokenId kitten id, only valid when > 0\n function _approvedFor(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToApproved[_tokenId] == _claimant;\n }\n\n /// @dev Marks an address as being approved for transferFrom(), overwriting any previous\n /// approval. Setting _approved to address(0) clears all transfer approval.\n /// NOTE: _approve() does NOT send the Approval event. This is intentional because\n /// _approve() and transferFrom() are used together for putting Kitties on auction, and\n /// there is no value in spamming the log with Approval events in that case.\n function _approve(uint256 _tokenId, address _approved) internal {\n kittyIndexToApproved[_tokenId] = _approved;\n }\n\n /// @notice Returns the number of Kitties owned by a specific address.\n /// @param _owner The owner address to check.\n /// @dev Required for ERC-721 compliance\n function balanceOf(address _owner) public view returns (uint256 count) {\n return ownershipTokenCount[_owner];\n }\n\n /// @notice Transfers a Kitty to another address. If transferring to a smart\n /// contract be VERY CAREFUL to ensure that it is aware of ERC-721 (or\n /// CryptoKitties specifically) or your Kitty may be lost forever. Seriously.\n /// @param _to The address of the recipient, can be a user or contract.\n /// @param _tokenId The ID of the Kitty to transfer.\n /// @dev Required for ERC-721 compliance.\n function transfer(\n address _to,\n uint256 _tokenId\n )\n external\n whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Disallow transfers to the auction contracts to prevent accidental\n // misuse. Auction contracts should only take ownership of kitties\n // through the allow + transferFrom flow.\n require(_to != address(saleAuction));\n require(_to != address(siringAuction));\n\n // You can only send your own cat.\n require(_owns(msg.sender, _tokenId));\n\n // Reassign ownership, clear pending approvals, emit Transfer event.\n _transfer(msg.sender, _to, _tokenId);\n }\n\n /// @notice Grant another address the right to transfer a specific Kitty via\n /// transferFrom(). This is the preferred flow for transfering NFTs to contracts.\n /// @param _to The address to be granted transfer approval. Pass address(0) to\n /// clear all approvals.\n /// @param _tokenId The ID of the Kitty that can be transferred if this call succeeds.\n /// @dev Required for ERC-721 compliance.\n function approve(\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Only an owner can grant transfer approval.\n require(_owns(msg.sender, _tokenId));\n\n // Register the approval (replacing any previous approval).\n _approve(_tokenId, _to);\n\n // Emit approval event.\n Approval(msg.sender, _to, _tokenId);\n }\n\n /// @notice Transfer a Kitty owned by another address, for which the calling address\n /// has previously been granted transfer approval by the owner.\n /// @param _from The address that owns the Kitty to be transfered.\n /// @param _to The address that should take ownership of the Kitty. Can be any address,\n /// including the caller.\n /// @param _tokenId The ID of the Kitty to be transferred.\n /// @dev Required for ERC-721 compliance.\n function transferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Check for approval and valid ownership\n require(_approvedFor(msg.sender, _tokenId));\n require(_owns(_from, _tokenId));\n\n // Reassign ownership (also clears pending approvals and emits Transfer event).\n _transfer(_from, _to, _tokenId);\n }\n\n /// @notice Returns the total number of Kitties currently in existence.\n /// @dev Required for ERC-721 compliance.\n function totalSupply() public view returns (uint) {\n return kitties.length - 1;\n }\n\n /// @notice Returns the address currently assigned ownership of a given Kitty.\n /// @dev Required for ERC-721 compliance.\n function ownerOf(uint256 _tokenId)\n external\n view\n returns (address owner)\n {\n owner = kittyIndexToOwner[_tokenId];\n\n require(owner != address(0));\n }\n\n /// @notice Returns a list of all Kitty IDs assigned to an address.\n /// @param _owner The owner whose Kitties we are interested in.\n /// @dev This method MUST NEVER be called by smart contract code. First, it's fairly\n /// expensive (it walks the entire Kitty array looking for cats belonging to owner),\n /// but it also returns a dynamic array, which is only supported for web3 calls, and\n /// not contract-to-contract calls.\n function tokensOfOwner(address _owner) external view returns(uint256[] ownerTokens) {\n uint256 tokenCount = balanceOf(_owner);\n\n if (tokenCount == 0) {\n // Return an empty array\n return new uint256[](0);\n } else {\n uint256[] memory result = new uint256[](tokenCount);\n uint256 totalCats = totalSupply();\n uint256 resultIndex = 0;\n\n // We count on the fact that all cats have IDs starting at 1 and increasing\n // sequentially up to the totalCat count.\n uint256 catId;\n\n for (catId = 1; catId <= totalCats; catId++) {\n if (kittyIndexToOwner[catId] == _owner) {\n result[resultIndex] = catId;\n resultIndex++;\n }\n }\n\n return result;\n }\n }\n\n /// @dev Adapted from memcpy() by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _memcpy(uint _dest, uint _src, uint _len) private view {\n // Copy word-length chunks while possible\n for(; _len >= 32; _len -= 32) {\n assembly {\n mstore(_dest, mload(_src))\n }\n _dest += 32;\n _src += 32;\n }\n\n // Copy remaining bytes\n uint256 mask = 256 ** (32 - _len) - 1;\n assembly {\n let srcpart := and(mload(_src), not(mask))\n let destpart := and(mload(_dest), mask)\n mstore(_dest, or(destpart, srcpart))\n }\n }\n\n /// @dev Adapted from toString(slice) by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _toString(bytes32[4] _rawBytes, uint256 _stringLength) private view returns (string) {\n var outputString = new string(_stringLength);\n uint256 outputPtr;\n uint256 bytesPtr;\n\n assembly {\n outputPtr := add(outputString, 32)\n bytesPtr := _rawBytes\n }\n\n _memcpy(outputPtr, bytesPtr, _stringLength);\n\n return outputString;\n }\n\n /// @notice Returns a URI pointing to a metadata package for this token conforming to\n /// ERC-721 (https://github.com/ethereum/EIPs/issues/721)\n /// @param _tokenId The ID number of the Kitty whose metadata should be returned.\n function tokenMetadata(uint256 _tokenId, string _preferredTransport) external view returns (string infoUrl) {\n require(erc721Metadata != address(0));\n bytes32[4] memory buffer;\n uint256 count;\n (buffer, count) = erc721Metadata.getMetadata(_tokenId, _preferredTransport);\n\n return _toString(buffer, count);\n }\n}\n\n\n\n/// @title A facet of KittyCore that manages Kitty siring, gestation, and birth.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBreeding is KittyOwnership {\n\n /// @dev The Pregnant event is fired when two cats successfully breed and the pregnancy\n /// timer begins for the matron.\n event Pregnant(address owner, uint256 matronId, uint256 sireId, uint256 cooldownEndBlock);\n\n /// @notice The minimum payment required to use breedWithAuto(). This fee goes towards\n /// the gas cost paid by whatever calls giveBirth(), and can be dynamically updated by\n /// the COO role as the gas price changes.\n uint256 public autoBirthFee = 2 finney;\n\n // Keeps track of number of pregnant kitties.\n uint256 public pregnantKitties;\n\n /// @dev The address of the sibling contract that is used to implement the sooper-sekret\n /// genetic combination algorithm.\n GeneScienceInterface public geneScience;\n\n /// @dev Update the address of the genetic contract, can only be called by the CEO.\n /// @param _address An address of a GeneScience contract instance to be used from this point forward.\n function setGeneScienceAddress(address _address) external onlyCEO {\n GeneScienceInterface candidateContract = GeneScienceInterface(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isGeneScience());\n\n // Set the new contract address\n geneScience = candidateContract;\n }\n\n /// @dev Checks that a given kitten is able to breed. Requires that the\n /// current cooldown is finished (for sires) and also checks that there is\n /// no pending pregnancy.\n function _isReadyToBreed(Kitty _kit) internal view returns (bool) {\n // In addition to checking the cooldownEndBlock, we also need to check to see if\n // the cat has a pending birth; there can be some period of time between the end\n // of the pregnacy timer and the birth event.\n return (_kit.siringWithId == 0) && (_kit.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @dev Check if a sire has authorized breeding with this matron. True if both sire\n /// and matron have the same owner, or if the sire has given siring permission to\n /// the matron's owner (via approveSiring()).\n function _isSiringPermitted(uint256 _sireId, uint256 _matronId) internal view returns (bool) {\n address matronOwner = kittyIndexToOwner[_matronId];\n address sireOwner = kittyIndexToOwner[_sireId];\n\n // Siring is okay if they have same owner, or if the matron's owner was given\n // permission to breed with this sire.\n return (matronOwner == sireOwner || sireAllowedToAddress[_sireId] == matronOwner);\n }\n\n /// @dev Set the cooldownEndTime for the given Kitty, based on its current cooldownIndex.\n /// Also increments the cooldownIndex (unless it has hit the cap).\n /// @param _kitten A reference to the Kitty in storage which needs its timer started.\n function _triggerCooldown(Kitty storage _kitten) internal {\n // Compute an estimation of the cooldown time in blocks (based on current cooldownIndex).\n _kitten.cooldownEndBlock = uint64((cooldowns[_kitten.cooldownIndex]/secondsPerBlock) + block.number);\n\n // Increment the breeding count, clamping it at 13, which is the length of the\n // cooldowns array. We could check the array size dynamically, but hard-coding\n // this as a constant saves gas. Yay, Solidity!\n if (_kitten.cooldownIndex < 13) {\n _kitten.cooldownIndex += 1;\n }\n }\n\n /// @notice Grants approval to another user to sire with one of your Kitties.\n /// @param _addr The address that will be able to sire with your Kitty. Set to\n /// address(0) to clear all siring approvals for this Kitty.\n /// @param _sireId A Kitty that you own that _addr will now be able to sire with.\n function approveSiring(address _addr, uint256 _sireId)\n external\n whenNotPaused\n {\n require(_owns(msg.sender, _sireId));\n sireAllowedToAddress[_sireId] = _addr;\n }\n\n /// @dev Updates the minimum payment required for calling giveBirthAuto(). Can only\n /// be called by the COO address. (This fee is used to offset the gas cost incurred\n /// by the autobirth daemon).\n function setAutoBirthFee(uint256 val) external onlyCOO {\n autoBirthFee = val;\n }\n\n /// @dev Checks to see if a given Kitty is pregnant and (if so) if the gestation\n /// period has passed.\n function _isReadyToGiveBirth(Kitty _matron) private view returns (bool) {\n return (_matron.siringWithId != 0) && (_matron.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @notice Checks that a given kitten is able to breed (i.e. it is not pregnant or\n /// in the middle of a siring cooldown).\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isReadyToBreed(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n Kitty storage kit = kitties[_kittyId];\n return _isReadyToBreed(kit);\n }\n\n /// @dev Checks whether a kitty is currently pregnant.\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isPregnant(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n // A kitty is pregnant if and only if this field is set\n return kitties[_kittyId].siringWithId != 0;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair. DOES NOT\n /// check ownership permissions (that is up to the caller).\n /// @param _matron A reference to the Kitty struct of the potential matron.\n /// @param _matronId The matron's ID.\n /// @param _sire A reference to the Kitty struct of the potential sire.\n /// @param _sireId The sire's ID\n function _isValidMatingPair(\n Kitty storage _matron,\n uint256 _matronId,\n Kitty storage _sire,\n uint256 _sireId\n )\n private\n view\n returns(bool)\n {\n // A Kitty can't breed with itself!\n if (_matronId == _sireId) {\n return false;\n }\n\n // Kitties can't breed with their parents.\n if (_matron.matronId == _sireId || _matron.sireId == _sireId) {\n return false;\n }\n if (_sire.matronId == _matronId || _sire.sireId == _matronId) {\n return false;\n }\n\n // We can short circuit the sibling check (below) if either cat is\n // gen zero (has a matron ID of zero).\n if (_sire.matronId == 0 || _matron.matronId == 0) {\n return true;\n }\n\n // Kitties can't breed with full or half siblings.\n if (_sire.matronId == _matron.matronId || _sire.matronId == _matron.sireId) {\n return false;\n }\n if (_sire.sireId == _matron.matronId || _sire.sireId == _matron.sireId) {\n return false;\n }\n\n // Everything seems cool! Let's get DTF.\n return true;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair for\n /// breeding via auction (i.e. skips ownership and siring approval checks).\n function _canBreedWithViaAuction(uint256 _matronId, uint256 _sireId)\n internal\n view\n returns (bool)\n {\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId);\n }\n\n /// @notice Checks to see if two cats can breed together, including checks for\n /// ownership and siring approvals. Does NOT check that both cats are ready for\n /// breeding (i.e. breedWith could still fail until the cooldowns are finished).\n /// TODO: Shouldn't this check pregnancy and cooldowns?!?\n /// @param _matronId The ID of the proposed matron.\n /// @param _sireId The ID of the proposed sire.\n function canBreedWith(uint256 _matronId, uint256 _sireId)\n external\n view\n returns(bool)\n {\n require(_matronId > 0);\n require(_sireId > 0);\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId) &&\n _isSiringPermitted(_sireId, _matronId);\n }\n\n /// @dev Internal utility function to initiate breeding, assumes that all breeding\n /// requirements have been checked.\n function _breedWith(uint256 _matronId, uint256 _sireId) internal {\n // Grab a reference to the Kitties from storage.\n Kitty storage sire = kitties[_sireId];\n Kitty storage matron = kitties[_matronId];\n\n // Mark the matron as pregnant, keeping track of who the sire is.\n matron.siringWithId = uint32(_sireId);\n\n // Trigger the cooldown for both parents.\n _triggerCooldown(sire);\n _triggerCooldown(matron);\n\n // Clear siring permission for both parents. This may not be strictly necessary\n // but it's likely to avoid confusion!\n delete sireAllowedToAddress[_matronId];\n delete sireAllowedToAddress[_sireId];\n\n // Every time a kitty gets pregnant, counter is incremented.\n pregnantKitties++;\n\n // Emit the pregnancy event.\n Pregnant(kittyIndexToOwner[_matronId], _matronId, _sireId, matron.cooldownEndBlock);\n }\n\n /// @notice Breed a Kitty you own (as matron) with a sire that you own, or for which you\n /// have previously been given Siring approval. Will either make your cat pregnant, or will\n /// fail entirely. Requires a pre-payment of the fee given out to the first caller of giveBirth()\n /// @param _matronId The ID of the Kitty acting as matron (will end up pregnant if successful)\n /// @param _sireId The ID of the Kitty acting as sire (will begin its siring cooldown if successful)\n function breedWithAuto(uint256 _matronId, uint256 _sireId)\n external\n payable\n whenNotPaused\n {\n // Checks for payment.\n require(msg.value >= autoBirthFee);\n\n // Caller must own the matron.\n require(_owns(msg.sender, _matronId));\n\n // Neither sire nor matron are allowed to be on auction during a normal\n // breeding operation, but we don't need to check that explicitly.\n // For matron: The caller of this function can't be the owner of the matron\n // because the owner of a Kitty on auction is the auction house, and the\n // auction house will never call breedWith().\n // For sire: Similarly, a sire on auction will be owned by the auction house\n // and the act of transferring ownership will have cleared any oustanding\n // siring approval.\n // Thus we don't need to spend gas explicitly checking to see if either cat\n // is on auction.\n\n // Check that matron and sire are both owned by caller, or that the sire\n // has given siring permission to caller (i.e. matron's owner).\n // Will fail for _sireId = 0\n require(_isSiringPermitted(_sireId, _matronId));\n\n // Grab a reference to the potential matron\n Kitty storage matron = kitties[_matronId];\n\n // Make sure matron isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(matron));\n\n // Grab a reference to the potential sire\n Kitty storage sire = kitties[_sireId];\n\n // Make sure sire isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(sire));\n\n // Test that these cats are a valid mating pair.\n require(_isValidMatingPair(\n matron,\n _matronId,\n sire,\n _sireId\n ));\n\n // All checks passed, kitty gets pregnant!\n _breedWith(_matronId, _sireId);\n }\n\n /// @notice Have a pregnant Kitty give birth!\n /// @param _matronId A Kitty ready to give birth.\n /// @return The Kitty ID of the new kitten.\n /// @dev Looks at a given Kitty and, if pregnant and if the gestation period has passed,\n /// combines the genes of the two parents to create a new kitten. The new Kitty is assigned\n /// to the current owner of the matron. Upon successful completion, both the matron and the\n /// new kitten will be ready to breed again. Note that anyone can call this function (if they\n /// are willing to pay the gas!), but the new kitten always goes to the mother's owner.\n function giveBirth(uint256 _matronId)\n external\n whenNotPaused\n returns(uint256)\n {\n // Grab a reference to the matron in storage.\n Kitty storage matron = kitties[_matronId];\n\n // Check that the matron is a valid cat.\n require(matron.birthTime != 0);\n\n // Check that the matron is pregnant, and that its time has come!\n require(_isReadyToGiveBirth(matron));\n\n // Grab a reference to the sire in storage.\n uint256 sireId = matron.siringWithId;\n Kitty storage sire = kitties[sireId];\n\n // Determine the higher generation number of the two parents\n uint16 parentGen = matron.generation;\n if (sire.generation > matron.generation) {\n parentGen = sire.generation;\n }\n\n // Call the sooper-sekret gene mixing operation.\n uint256 childGenes = geneScience.mixGenes(matron.genes, sire.genes, matron.cooldownEndBlock - 1);\n\n // Make the new kitten!\n address owner = kittyIndexToOwner[_matronId];\n uint256 kittenId = _createKitty(_matronId, matron.siringWithId, parentGen + 1, childGenes, owner);\n\n // Clear the reference to sire from the matron (REQUIRED! Having siringWithId\n // set is what marks a matron as being pregnant.)\n delete matron.siringWithId;\n\n // Every time a kitty gives birth counter is decremented.\n pregnantKitties--;\n\n // Send the balance fee to the person who made birth happen.\n msg.sender.send(autoBirthFee);\n\n // return the new kitten's ID\n return kittenId;\n }\n}\n\n\n\n\n\n\n\n\n\n\n/// @title Auction Core\n/// @dev Contains models, variables, and internal methods for the auction.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuctionBase {\n\n // Represents an auction on an NFT\n struct Auction {\n // Current owner of NFT\n address seller;\n // Price (in wei) at beginning of auction\n uint128 startingPrice;\n // Price (in wei) at end of auction\n uint128 endingPrice;\n // Duration (in seconds) of auction\n uint64 duration;\n // Time when auction started\n // NOTE: 0 if this auction has been concluded\n uint64 startedAt;\n }\n\n // Reference to contract tracking NFT ownership\n KittiesERC721 public nonFungibleContract;\n\n // Cut owner takes on each auction, measured in basis points (1/100 of a percent).\n // Values 0-10,000 map to 0%-100%\n uint256 public ownerCut;\n\n // Map from token ID to their corresponding auction.\n mapping (uint256 => Auction) tokenIdToAuction;\n\n event AuctionCreated(uint256 tokenId, uint256 startingPrice, uint256 endingPrice, uint256 duration);\n event AuctionSuccessful(uint256 tokenId, uint256 totalPrice, address winner);\n event AuctionCancelled(uint256 tokenId);\n\n /// @dev Returns true if the claimant owns the token.\n /// @param _claimant - Address claiming to own the token.\n /// @param _tokenId - ID of token whose ownership to verify.\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return (nonFungibleContract.ownerOf(_tokenId) == _claimant);\n }\n\n /// @dev Escrows the NFT, assigning ownership to this contract.\n /// Throws if the escrow fails.\n /// @param _owner - Current owner address of token to escrow.\n /// @param _tokenId - ID of token whose approval to verify.\n function _escrow(address _owner, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transferFrom(_owner, this, _tokenId);\n }\n\n /// @dev Transfers an NFT owned by this contract to another address.\n /// Returns true if the transfer succeeds.\n /// @param _receiver - Address to transfer NFT to.\n /// @param _tokenId - ID of token to transfer.\n function _transfer(address _receiver, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transfer(_receiver, _tokenId);\n }\n\n /// @dev Adds an auction to the list of open auctions. Also fires the\n /// AuctionCreated event.\n /// @param _tokenId The ID of the token to be put on auction.\n /// @param _auction Auction to add.\n function _addAuction(uint256 _tokenId, Auction _auction) internal {\n // Require that all auctions have a duration of\n // at least one minute. (Keeps our math from getting hairy!)\n require(_auction.duration >= 1 minutes);\n\n tokenIdToAuction[_tokenId] = _auction;\n\n AuctionCreated(\n uint256(_tokenId),\n uint256(_auction.startingPrice),\n uint256(_auction.endingPrice),\n uint256(_auction.duration)\n );\n }\n\n /// @dev Cancels an auction unconditionally.\n function _cancelAuction(uint256 _tokenId, address _seller) internal {\n _removeAuction(_tokenId);\n _transfer(_seller, _tokenId);\n AuctionCancelled(_tokenId);\n }\n\n /// @dev Computes the price and transfers winnings.\n /// Does NOT transfer ownership of token.\n function _bid(uint256 _tokenId, uint256 _bidAmount)\n internal\n returns (uint256)\n {\n // Get a reference to the auction struct\n Auction storage auction = tokenIdToAuction[_tokenId];\n\n // Explicitly check that this auction is currently live.\n // (Because of how Ethereum mappings work, we can't just count\n // on the lookup above failing. An invalid _tokenId will just\n // return an auction object that is all zeros.)\n require(_isOnAuction(auction));\n\n // Check that the bid is greater than or equal to the current price\n uint256 price = _currentPrice(auction);\n require(_bidAmount >= price);\n\n // Grab a reference to the seller before the auction struct\n // gets deleted.\n address seller = auction.seller;\n\n // The bid is good! Remove the auction before sending the fees\n // to the sender so we can't have a reentrancy attack.\n _removeAuction(_tokenId);\n\n // Transfer proceeds to seller (if there are any!)\n if (price > 0) {\n // Calculate the auctioneer's cut.\n // (NOTE: _computeCut() is guaranteed to return a\n // value <= price, so this subtraction can't go negative.)\n uint256 auctioneerCut = _computeCut(price);\n uint256 sellerProceeds = price - auctioneerCut;\n\n // NOTE: Doing a transfer() in the middle of a complex\n // method like this is generally discouraged because of\n // reentrancy attacks and DoS attacks if the seller is\n // a contract with an invalid fallback function. We explicitly\n // guard against reentrancy attacks by removing the auction\n // before calling transfer(), and the only thing the seller\n // can DoS is the sale of their own asset! (And if it's an\n // accident, they can call cancelAuction(). )\n seller.transfer(sellerProceeds);\n }\n\n // Calculate any excess funds included with the bid. If the excess\n // is anything worth worrying about, transfer it back to bidder.\n // NOTE: We checked above that the bid amount is greater than or\n // equal to the price so this cannot underflow.\n uint256 bidExcess = _bidAmount - price;\n\n // Return the funds. Similar to the previous transfer, this is\n // not susceptible to a re-entry attack because the auction is\n // removed before any transfers occur.\n msg.sender.transfer(bidExcess);\n\n // Tell the world!\n AuctionSuccessful(_tokenId, price, msg.sender);\n\n return price;\n }\n\n /// @dev Removes an auction from the list of open auctions.\n /// @param _tokenId - ID of NFT on auction.\n function _removeAuction(uint256 _tokenId) internal {\n delete tokenIdToAuction[_tokenId];\n }\n\n /// @dev Returns true if the NFT is on auction.\n /// @param _auction - Auction to check.\n function _isOnAuction(Auction storage _auction) internal view returns (bool) {\n return (_auction.startedAt > 0);\n }\n\n /// @dev Returns current price of an NFT on auction. Broken into two\n /// functions (this one, that computes the duration from the auction\n /// structure, and the other that does the price computation) so we\n /// can easily test that the price computation works correctly.\n function _currentPrice(Auction storage _auction)\n internal\n view\n returns (uint256)\n {\n uint256 secondsPassed = 0;\n\n // A bit of insurance against negative values (or wraparound).\n // Probably not necessary (since Ethereum guarnatees that the\n // now variable doesn't ever go backwards).\n if (now > _auction.startedAt) {\n secondsPassed = now - _auction.startedAt;\n }\n\n return _computeCurrentPrice(\n _auction.startingPrice,\n _auction.endingPrice,\n _auction.duration,\n secondsPassed\n );\n }\n\n /// @dev Computes the current price of an auction. Factored out\n /// from _currentPrice so we can run extensive unit tests.\n /// When testing, make this function public and turn on\n /// `Current price computation` test suite.\n function _computeCurrentPrice(\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n uint256 _secondsPassed\n )\n internal\n pure\n returns (uint256)\n {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our public functions carefully cap the maximum values for\n // time (at 64-bits) and currency (at 128-bits). _duration is\n // also known to be non-zero (see the require() statement in\n // _addAuction())\n if (_secondsPassed >= _duration) {\n // We've reached the end of the dynamic pricing portion\n // of the auction, just return the end price.\n return _endingPrice;\n } else {\n // Starting price can be higher than ending price (and often is!), so\n // this delta can be negative.\n int256 totalPriceChange = int256(_endingPrice) - int256(_startingPrice);\n\n // This multiplication can't overflow, _secondsPassed will easily fit within\n // 64-bits, and totalPriceChange will easily fit within 128-bits, their product\n // will always fit within 256-bits.\n int256 currentPriceChange = totalPriceChange * int256(_secondsPassed) / int256(_duration);\n\n // currentPriceChange can be negative, but if so, will have a magnitude\n // less that _startingPrice. Thus, this result will always end up positive.\n int256 currentPrice = int256(_startingPrice) + currentPriceChange;\n\n return uint256(currentPrice);\n }\n }\n\n /// @dev Computes owner's cut of a sale.\n /// @param _price - Sale price of NFT.\n function _computeCut(uint256 _price) internal view returns (uint256) {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our entry functions carefully cap the maximum values for\n // currency (at 128-bits), and ownerCut <= 10000 (see the require()\n // statement in the ClockAuction constructor). The result of this\n // function is always guaranteed to be <= _price.\n return _price * ownerCut / 10000;\n }\n\n}\n\n\n\n\n\n\n\n/**\n * @title KittiesPausable\n * @dev Base contract which allows children to implement an emergency stop mechanism.\n */\ncontract KittiesPausable is KittiesOwnable {\n event Pause();\n event Unpause();\n\n bool public paused = false;\n\n\n /**\n\t * @dev modifier to allow actions only when the contract IS paused\n\t */\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /**\n\t * @dev modifier to allow actions only when the contract IS NOT paused\n\t */\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /**\n\t * @dev called by the owner to pause, triggers stopped state\n\t */\n function pause() onlyOwner whenNotPaused returns (bool) {\n paused = true;\n Pause();\n return true;\n }\n\n /**\n\t * @dev called by the owner to unpause, returns to normal state\n\t */\n function unpause() onlyOwner whenPaused returns (bool) {\n paused = false;\n Unpause();\n return true;\n }\n}\n\n\n/// @title Clock auction for non-fungible tokens.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuction is KittiesPausable, ClockAuctionBase {\n\n /// @dev The ERC-165 interface signature for ERC-721.\n /// Ref: https://github.com/ethereum/EIPs/issues/165\n /// Ref: https://github.com/ethereum/EIPs/issues/721\n bytes4 constant InterfaceSignature_ERC721 = bytes4(0x9a20483d);\n\n /// @dev Constructor creates a reference to the NFT ownership contract\n /// and verifies the owner cut is in the valid range.\n /// @param _nftAddress - address of a deployed contract implementing\n /// the Nonfungible Interface.\n /// @param _cut - percent cut the owner takes on each auction, must be\n /// between 0-10,000.\n function ClockAuction(address _nftAddress, uint256 _cut) public {\n require(_cut <= 10000);\n ownerCut = _cut;\n\n KittiesERC721 candidateContract = KittiesERC721(_nftAddress);\n require(candidateContract.supportsInterface(InterfaceSignature_ERC721));\n nonFungibleContract = candidateContract;\n }\n\n /// @dev Remove all Ether from the contract, which is the owner's cuts\n /// as well as any Ether sent directly to the contract address.\n /// Always transfers to the NFT contract, but can be called either by\n /// the owner or the NFT contract.\n function withdrawBalance() external {\n address nftAddress = address(nonFungibleContract);\n\n require(\n msg.sender == owner ||\n msg.sender == nftAddress\n );\n // We are using this boolean method to make sure that even if one fails it will still work\n bool res = nftAddress.send(this.balance);\n }\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of time to move between starting\n /// price and ending price (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n whenNotPaused\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(_owns(msg.sender, _tokenId));\n _escrow(msg.sender, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Bids on an open auction, completing the auction and transferring\n /// ownership of the NFT if enough Ether is supplied.\n /// @param _tokenId - ID of token to bid on.\n function bid(uint256 _tokenId)\n external\n payable\n whenNotPaused\n {\n // _bid will throw if the bid or funds transfer fails\n _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n }\n\n /// @dev Cancels an auction that hasn't been won yet.\n /// Returns the NFT to original owner.\n /// @notice This is a state-modifying function that can\n /// be called while the contract is paused.\n /// @param _tokenId - ID of token on auction\n function cancelAuction(uint256 _tokenId)\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n address seller = auction.seller;\n require(msg.sender == seller);\n _cancelAuction(_tokenId, seller);\n }\n\n /// @dev Cancels an auction when the contract is paused.\n /// Only the owner may do this, and NFTs are returned to\n /// the seller. This should only be used in emergencies.\n /// @param _tokenId - ID of the NFT on auction to cancel.\n function cancelAuctionWhenPaused(uint256 _tokenId)\n whenPaused\n onlyOwner\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n _cancelAuction(_tokenId, auction.seller);\n }\n\n /// @dev Returns auction info for an NFT on auction.\n /// @param _tokenId - ID of NFT on auction.\n function getAuction(uint256 _tokenId)\n external\n view\n returns\n (\n address seller,\n uint256 startingPrice,\n uint256 endingPrice,\n uint256 duration,\n uint256 startedAt\n ) {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return (\n auction.seller,\n auction.startingPrice,\n auction.endingPrice,\n auction.duration,\n auction.startedAt\n );\n }\n\n /// @dev Returns the current price of an auction.\n /// @param _tokenId - ID of the token price we are checking.\n function getCurrentPrice(uint256 _tokenId)\n external\n view\n returns (uint256)\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return _currentPrice(auction);\n }\n\n}\n\n\n/// @title Reverse auction modified for siring\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SiringClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSiringAuctionAddress() call.\n bool public isSiringClockAuction = true;\n\n // Delegate constructor\n function SiringClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction. Since this function is wrapped,\n /// require sender to be KittyCore contract.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Places a bid for siring. Requires the sender\n /// is the KittyCore contract because all bid methods\n /// should be wrapped. Also returns the kitty to the\n /// seller rather than the winner.\n function bid(uint256 _tokenId)\n external\n payable\n {\n require(msg.sender == address(nonFungibleContract));\n address seller = tokenIdToAuction[_tokenId].seller;\n // _bid checks that token ID is valid and will throw if bid fails\n _bid(_tokenId, msg.value);\n // We transfer the kitty back to the seller, the winner will get\n // the offspring\n _transfer(seller, _tokenId);\n }\n\n}\n\n\n\n\n\n/// @title Clock auction modified for sale of kitties\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SaleClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSaleAuctionAddress() call.\n bool public isSaleClockAuction = true;\n\n // Tracks last 5 sale price of gen0 kitty sales\n uint256 public gen0SaleCount;\n uint256[5] public lastGen0SalePrices;\n\n // Delegate constructor\n function SaleClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Updates lastSalePrice if seller is the nft contract\n /// Otherwise, works the same as default bid method.\n function bid(uint256 _tokenId)\n external\n payable\n {\n // _bid verifies token ID size\n address seller = tokenIdToAuction[_tokenId].seller;\n uint256 price = _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n\n // If not a gen0 auction, exit\n if (seller == address(nonFungibleContract)) {\n // Track gen0 sale prices\n lastGen0SalePrices[gen0SaleCount % 5] = price;\n gen0SaleCount++;\n }\n }\n\n function averageGen0SalePrice() external view returns (uint256) {\n uint256 sum = 0;\n for (uint256 i = 0; i < 5; i++) {\n sum += lastGen0SalePrices[i];\n }\n return sum / 5;\n }\n\n}\n\n\n/// @title Handles creating auctions for sale and siring of kitties.\n/// This wrapper of ReverseAuction exists only so that users can create\n/// auctions with only one transaction.\ncontract KittyAuction is KittyBreeding {\n\n // @notice The auction contract variables are defined in KittyBase to allow\n // us to refer to them in KittyOwnership to prevent accidental transfers.\n // `saleAuction` refers to the auction for gen0 and p2p sale of kitties.\n // `siringAuction` refers to the auction for siring rights of kitties.\n\n /// @dev Sets the reference to the sale auction.\n /// @param _address - Address of sale contract.\n function setSaleAuctionAddress(address _address) external onlyCEO {\n SaleClockAuction candidateContract = SaleClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSaleClockAuction());\n\n // Set the new contract address\n saleAuction = candidateContract;\n }\n\n /// @dev Sets the reference to the siring auction.\n /// @param _address - Address of siring contract.\n function setSiringAuctionAddress(address _address) external onlyCEO {\n SiringClockAuction candidateContract = SiringClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSiringClockAuction());\n\n // Set the new contract address\n siringAuction = candidateContract;\n }\n\n /// @dev Put a kitty up for auction.\n /// Does some ownership trickery to create auctions in one tx.\n function createSaleAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n // Ensure the kitty is not pregnant to prevent the auction\n // contract accidentally receiving ownership of the child.\n // NOTE: the kitty IS allowed to be in a cooldown.\n require(!isPregnant(_kittyId));\n _approve(_kittyId, saleAuction);\n // Sale auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n saleAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Put a kitty up for auction to be sire.\n /// Performs checks to ensure the kitty can be sired, then\n /// delegates to reverse auction.\n function createSiringAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n require(isReadyToBreed(_kittyId));\n _approve(_kittyId, siringAuction);\n // Siring auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n siringAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Completes a siring auction by bidding.\n /// Immediately breeds the winning matron with the sire on auction.\n /// @param _sireId - ID of the sire on auction.\n /// @param _matronId - ID of the matron owned by the bidder.\n function bidOnSiringAuction(\n uint256 _sireId,\n uint256 _matronId\n )\n external\n payable\n whenNotPaused\n {\n // Auction contract checks input sizes\n require(_owns(msg.sender, _matronId));\n require(isReadyToBreed(_matronId));\n require(_canBreedWithViaAuction(_matronId, _sireId));\n\n // Define the current price of the auction.\n uint256 currentPrice = siringAuction.getCurrentPrice(_sireId);\n require(msg.value >= currentPrice + autoBirthFee);\n\n // Siring auction will throw if the bid fails.\n siringAuction.bid.value(msg.value - autoBirthFee)(_sireId);\n _breedWith(uint32(_matronId), uint32(_sireId));\n }\n\n /// @dev Transfers the balance of the sale auction contract\n /// to the KittyCore contract. We use two-step withdrawal to\n /// prevent two transfer calls in the auction bid function.\n function withdrawAuctionBalances() external onlyCLevel {\n saleAuction.withdrawBalance();\n siringAuction.withdrawBalance();\n }\n}\n\n\n/// @title all functions related to creating kittens\ncontract KittyMinting is KittyAuction {\n\n // Limits the number of cats the contract owner can ever create.\n uint256 public constant PROMO_CREATION_LIMIT = 5000;\n uint256 public constant GEN0_CREATION_LIMIT = 45000;\n\n // Constants for gen0 auctions.\n uint256 public constant GEN0_STARTING_PRICE = 10 finney;\n uint256 public constant GEN0_AUCTION_DURATION = 1 days;\n\n // Counts the number of cats the contract owner has created.\n uint256 public promoCreatedCount;\n uint256 public gen0CreatedCount;\n\n /// @dev we can create promo kittens, up to a limit. Only callable by COO\n /// @param _genes the encoded genes of the kitten to be created, any value is accepted\n /// @param _owner the future owner of the created kittens. Default to contract COO\n function createPromoKitty(uint256 _genes, address _owner) external onlyCOO {\n address kittyOwner = _owner;\n if (kittyOwner == address(0)) {\n kittyOwner = cooAddress;\n }\n require(promoCreatedCount < PROMO_CREATION_LIMIT);\n\n promoCreatedCount++;\n _createKitty(0, 0, 0, _genes, kittyOwner);\n }\n\n /// @dev Creates a new gen0 kitty with the given genes and\n /// creates an auction for it.\n function createGen0Auction(uint256 _genes) external onlyCOO {\n require(gen0CreatedCount < GEN0_CREATION_LIMIT);\n\n uint256 kittyId = _createKitty(0, 0, 0, _genes, address(this));\n _approve(kittyId, saleAuction);\n\n saleAuction.createAuction(\n kittyId,\n _computeNextGen0Price(),\n 0,\n GEN0_AUCTION_DURATION,\n address(this)\n );\n\n gen0CreatedCount++;\n }\n\n /// @dev Computes the next gen0 auction starting price, given\n /// the average of the past 5 prices + 50%.\n function _computeNextGen0Price() internal view returns (uint256) {\n uint256 avePrice = saleAuction.averageGen0SalePrice();\n\n // Sanity check to ensure we don't overflow arithmetic\n require(avePrice == uint256(uint128(avePrice)));\n\n uint256 nextPrice = avePrice + (avePrice / 2);\n\n // We never auction for less than starting price\n if (nextPrice < GEN0_STARTING_PRICE) {\n nextPrice = GEN0_STARTING_PRICE;\n }\n\n return nextPrice;\n }\n}\n\n\n/// @title CryptoKitties: Collectible, breedable, and oh-so-adorable cats on the Ethereum blockchain.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev The main CryptoKitties contract, keeps track of kittens so they don't wander around and get lost.\ncontract KittyCore is KittyMinting {\n\n // This is the main CryptoKitties contract. In order to keep our code seperated into logical sections,\n // we've broken it up in two ways. First, we have several seperately-instantiated sibling contracts\n // that handle auctions and our super-top-secret genetic combination algorithm. The auctions are\n // seperate since their logic is somewhat complex and there's always a risk of subtle bugs. By keeping\n // them in their own contracts, we can upgrade them without disrupting the main contract that tracks\n // kitty ownership. The genetic combination algorithm is kept seperate so we can open-source all of\n // the rest of our code without making it _too_ easy for folks to figure out how the genetics work.\n // Don't worry, I'm sure someone will reverse engineer it soon enough!\n //\n // Secondly, we break the core contract into multiple files using inheritence, one for each major\n // facet of functionality of CK. This allows us to keep related code bundled together while still\n // avoiding a single giant file with everything in it. The breakdown is as follows:\n //\n // - KittyBase: This is where we define the most fundamental code shared throughout the core\n // functionality. This includes our main data storage, constants and data types, plus\n // internal functions for managing these items.\n //\n // - KittyAccessControl: This contract manages the various addresses and constraints for operations\n // that can be executed only by specific roles. Namely CEO, CFO and COO.\n //\n // - KittyOwnership: This provides the methods required for basic non-fungible token\n // transactions, following the draft ERC-721 spec (https://github.com/ethereum/EIPs/issues/721).\n //\n // - KittyBreeding: This file contains the methods necessary to breed cats together, including\n // keeping track of siring offers, and relies on an external genetic combination contract.\n //\n // - KittyAuctions: Here we have the public methods for auctioning or bidding on cats or siring\n // services. The actual auction functionality is handled in two sibling contracts (one\n // for sales and one for siring), while auction creation and bidding is mostly mediated\n // through this facet of the core contract.\n //\n // - KittyMinting: This final facet contains the functionality we use for creating new gen0 cats.\n // We can make up to 5000 \"promo\" cats that can be given away (especially important when\n // the community is new), and all others can only be created and then immediately put up\n // for auction via an algorithmically determined starting price. Regardless of how they\n // are created, there is a hard limit of 50k gen0 cats. After that, it's all up to the\n // community to breed, breed, breed!\n\n // Set in case the core contract is broken and an upgrade is required\n address public newContractAddress;\n\n /// @notice Creates the main CryptoKitties smart contract instance.\n function KittyCore() public {\n // Starts paused.\n paused = true;\n\n // the creator of the contract is the initial CEO\n ceoAddress = msg.sender;\n\n // the creator of the contract is also the initial COO\n cooAddress = msg.sender;\n\n // start with the mythical kitten 0 - so we don't have generation-0 parent issues\n _createKitty(0, 0, 0, uint256(-1), address(0));\n }\n\n /// @dev Used to mark the smart contract as upgraded, in case there is a serious\n /// breaking bug. This method does nothing but keep track of the new contract and\n /// emit a message indicating that the new address is set. It's up to clients of this\n /// contract to update to the new contract address in that case. (This contract will\n /// be paused indefinitely if such an upgrade takes place.)\n /// @param _v2Address new address\n function setNewAddress(address _v2Address) external onlyCEO whenPaused {\n // See README.md for updgrade plan\n newContractAddress = _v2Address;\n ContractUpgrade(_v2Address);\n }\n\n /// @notice No tipping!\n /// @dev Reject all Ether from being sent here, unless it's from one of the\n /// two auction contracts. (Hopefully, we can prevent user accidents.)\n function() external payable {\n require(\n msg.sender == address(saleAuction) ||\n msg.sender == address(siringAuction)\n );\n }\n\n /// @notice Returns all the relevant information about a specific kitty.\n /// @param _id The ID of the kitty of interest.\n function getKitty(uint256 _id)\n external\n view\n returns (\n bool isGestating,\n bool isReady,\n uint256 cooldownIndex,\n uint256 nextActionAt,\n uint256 siringWithId,\n uint256 birthTime,\n uint256 matronId,\n uint256 sireId,\n uint256 generation,\n uint256 genes\n ) {\n Kitty storage kit = kitties[_id];\n\n // if this variable is 0 then it's not gestating\n isGestating = (kit.siringWithId != 0);\n isReady = (kit.cooldownEndBlock <= block.number);\n cooldownIndex = uint256(kit.cooldownIndex);\n nextActionAt = uint256(kit.cooldownEndBlock);\n siringWithId = uint256(kit.siringWithId);\n birthTime = uint256(kit.birthTime);\n matronId = uint256(kit.matronId);\n sireId = uint256(kit.sireId);\n generation = uint256(kit.generation);\n genes = kit.genes;\n }\n\n /// @dev Override unpause so it requires all external contract addresses\n /// to be set before contract can be unpaused. Also, we can't have\n /// newContractAddress set either, because then the contract was upgraded.\n /// @notice This is public rather than external so we can call super.unpause\n /// without using an expensive CALL.\n function unpause() public onlyCEO whenPaused {\n require(saleAuction != address(0));\n require(siringAuction != address(0));\n require(geneScience != address(0));\n require(newContractAddress == address(0));\n\n // Actually unpause the contract.\n super.unpause();\n }\n\n // @dev Allows the CFO to capture the balance available to the contract.\n function withdrawBalance() external onlyCFO {\n uint256 balance = this.balance;\n // Subtract all the currently pregnant kittens we have, plus 1 of margin.\n uint256 subtractFees = (pregnantKitties + 1) * autoBirthFee;\n\n if (balance > subtractFees) {\n cfoAddress.send(balance - subtractFees);\n }\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "exportedSymbols": { "ClockAuction": [ 8872 @@ -51732,5 +51732,5 @@ export const ClockAuctionBase = }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:47.636Z" + "updatedAt": "2018-10-09T17:45:35.834Z" } \ No newline at end of file diff --git a/artifacts/ts/CollateralizedSimpleInterestTermsContract.ts b/artifacts/ts/CollateralizedSimpleInterestTermsContract.ts index b0a1d181..c6127a3d 100644 --- a/artifacts/ts/CollateralizedSimpleInterestTermsContract.ts +++ b/artifacts/ts/CollateralizedSimpleInterestTermsContract.ts @@ -382,15 +382,15 @@ export const CollateralizedSimpleInterestTermsContract = "type": "event" } ], - "bytecode": "0x6060604052341561000f57600080fd5b604051602080611a68833981016040528080519060200190919050508080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050506119ea8061007e6000396000f3006060604052600436106100e6576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a896a1146100eb5780630776298214610126578063208638941461014f5780632762dd8c1461017857806340018a0d146101b35780635f0280ba146101dc5780636f69c96f146102815780638b47e58a146102aa57806393529cdf146102d3578063977a5e64146102fc57806399114d841461035a578063abf410e51461039e578063de53a13c146103f3578063ed8907d71461041c578063fd127a4114610473578063fd40d52e1461049c575b600080fd5b34156100f657600080fd5b6101106004808035600019169060200190919050506104d7565b6040518082815260200191505060405180910390f35b341561013157600080fd5b6101396104fb565b6040518082815260200191505060405180910390f35b341561015a57600080fd5b610162610504565b6040518082815260200191505060405180910390f35b341561018357600080fd5b61019d600480803560001916906020019091905050610510565b6040518082815260200191505060405180910390f35b34156101be57600080fd5b6101c6610532565b6040518082815260200191505060405180910390f35b34156101e757600080fd5b61026760048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061053e565b604051808215151515815260200191505060405180910390f35b341561028c57600080fd5b6102946107b3565b6040518082815260200191505060405180910390f35b34156102b557600080fd5b6102bd6107b9565b6040518082815260200191505060405180910390f35b34156102de57600080fd5b6102e66107be565b6040518082815260200191505060405180910390f35b341561030757600080fd5b61034060048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506107c4565b604051808215151515815260200191505060405180910390f35b341561036557600080fd5b610388600480803560001916906020019091908035906020019091905050610a43565b6040518082815260200191505060405180910390f35b34156103a957600080fd5b6103b1610c4f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103fe57600080fd5b610406610c75565b6040518082815260200191505060405180910390f35b341561042757600080fd5b610441600480803560001916906020019091905050610c7e565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b341561047e57600080fd5b610486610d76565b6040518082815260200191505060405180910390f35b34156104a757600080fd5b6104c1600480803560001916906020019091905050610d83565b6040518082815260200191505060405180910390f35b60008060008360001916600019168152602001908152602001600020549050919050565b6018610e100281565b601e6018610e10020281565b600061051a61195f565b61052383610d9b565b90508060600151915050919050565b60076018610e10020281565b600061054861195f565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636fa9d0566000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156105d657600080fd5b6102c65a03f115156105e757600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561062a57600080fd5b61063387610d9b565b9050806000015173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107a45761069a846000808a600019166000191681526020019081526020016000205461129790919063ffffffff16565b6000808960001916600019168152602001908152602001600020819055507ff1a888d220228f843ac3044ef257c80642e6434d1ddc7ebee0a2813cced3406c87878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405180910390a1600191506107a9565b600091505b5095945050505050565b610e1081565b600581565b61271081565b6000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663079dd4b76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561085757600080fd5b6102c65a03f1151561086857600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108ab57600080fd5b6108b585856112b5565b9150600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663869f05116000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561094557600080fd5b6102c65a03f1151561095657600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663649404bd86866000604051602001526040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1515610a1257600080fd5b6102c65a03f11515610a2357600080fd5b505050604051805190509050818015610a395750805b9250505092915050565b6000610a4d61195f565b60008085600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610adf57600080fd5b6102c65a03f11515610af057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663f6f494c9826000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610b7857600080fd5b6102c65a03f11515610b8957600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16141515610bcc57600080fd5b610bd587610d9b565b9350610be084611746565b9250836040015186111515610bf85760009450610c45565b836060015186101515610c0d57829450610c45565b610c17868561179c565b9150610c428460a00151610c3484866117e690919063ffffffff16565b61182190919063ffffffff16565b94505b5050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60646127100281565b6000806000806000806000806000807fff000000000000000000000000000000000000000000000000000000000000006001028b1694507effffffffffffffffffffffff000000000000000000000000000000000000006001028b16935072ffffff000000000000000000000000000000006001028b1692506ff00000000000000000000000000000006001028b1691506f0ffff0000000000000000000000000006001028b169050610d328560f861183c565b610d3d85609861183c565b610d4885608061183c565b610d5385607c61183c565b610d5e85606c61183c565b99509950995099509950505050505091939590929450565b61016d6018610e10020281565b60006020528060005260406000206000915090505481565b610da361195f565b600080600080600080600080600080600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610e4357600080fd5b6102c65a03f11515610e5457600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663314a522e8f6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610edc57600080fd5b6102c65a03f11515610eed57600080fd5b505050604051805190509b50610f028c610c7e565b809b50819c50829d50839e50849f505050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d23c4c76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610fa457600080fd5b6102c65a03f11515610fb557600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16635715c5b78c6000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561103557600080fd5b6102c65a03f1151561104657600080fd5b505050604051805190509550600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415151561108e57600080fd5b60048081111561109a57fe5b88111515156110a857600080fd5b8760048111156110b457fe5b94506110bf85611859565b9350600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561114f57600080fd5b6102c65a03f1151561116057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663d69dbf638f6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156111e857600080fd5b6102c65a03f115156111f957600080fd5b50505060405180519050925061121884886117e690919063ffffffff16565b915061122d838361129790919063ffffffff16565b905060e0604051908101604052808773ffffffffffffffffffffffffffffffffffffffff1681526020018b815260200184815260200182815260200186600481111561127557fe5b81526020018881526020018a8152509c50505050505050505050505050919050565b60008082840190508381101515156112ab57fe5b8091505092915050565b6000806000806000806000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663079dd4b76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561135157600080fd5b6102c65a03f1151561136257600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156113a557600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561143357600080fd5b6102c65a03f1151561144457600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16636be39bda8c6000604051604001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082600019166000191681526020019150506040805180830381600087803b15156114cb57600080fd5b6102c65a03f115156114dc57600080fd5b5050506040518051906020018051905080985081995050506114fd87610c7e565b809650819750829850839950849a505050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d23c4c76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561159f57600080fd5b6102c65a03f115156115b057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16635715c5b7876000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561163057600080fd5b6102c65a03f1151561164157600080fd5b505050604051805190509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561168a5750600583105b80156116c157503073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b1561173357828173ffffffffffffffffffffffffffffffffffffffff168c600019167f2c500aaec6833a053693d8c2a18a3ed5649a4609699abaf7778c3d389cc40c0588888760405180848152602001838152602001828152602001935050505060405180910390a460019850611738565b600098505b505050505050505092915050565b60008061177b60646127100261176d8560c0015186602001516117e690919063ffffffff16565b61182190919063ffffffff16565b905061179481846020015161129790919063ffffffff16565b915050919050565b60008060006117b884604001518661194690919063ffffffff16565b91506117c78460800151611859565b90506117dc818361182190919063ffffffff16565b9250505092915050565b60008060008414156117fb576000915061181a565b828402905082848281151561180c57fe5b0414151561181657fe5b8091505b5092915050565b600080828481151561182f57fe5b0490508091505092915050565b60008160020a836001900481151561185057fe5b04905092915050565b600080600481111561186757fe5b82600481111561187357fe5b141561188357610e109050611941565b6001600481111561189057fe5b82600481111561189c57fe5b14156118af576018610e10029050611941565b600260048111156118bc57fe5b8260048111156118c857fe5b14156118de5760076018610e1002029050611941565b600360048111156118eb57fe5b8260048111156118f757fe5b141561190d57601e6018610e1002029050611941565b60048081111561191957fe5b82600481111561192557fe5b141561193c5761016d6018610e1002029050611941565b600080fd5b919050565b600082821115151561195457fe5b818303905092915050565b60e060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600060048111156119aa57fe5b8152602001600081526020016000815250905600a165627a7a72305820bed8b1c3c2e17661646af383d581d516d78a5b93d68ceec1eb9f33d1149890500029", - "deployedBytecode": "0x6060604052600436106100e6576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a896a1146100eb5780630776298214610126578063208638941461014f5780632762dd8c1461017857806340018a0d146101b35780635f0280ba146101dc5780636f69c96f146102815780638b47e58a146102aa57806393529cdf146102d3578063977a5e64146102fc57806399114d841461035a578063abf410e51461039e578063de53a13c146103f3578063ed8907d71461041c578063fd127a4114610473578063fd40d52e1461049c575b600080fd5b34156100f657600080fd5b6101106004808035600019169060200190919050506104d7565b6040518082815260200191505060405180910390f35b341561013157600080fd5b6101396104fb565b6040518082815260200191505060405180910390f35b341561015a57600080fd5b610162610504565b6040518082815260200191505060405180910390f35b341561018357600080fd5b61019d600480803560001916906020019091905050610510565b6040518082815260200191505060405180910390f35b34156101be57600080fd5b6101c6610532565b6040518082815260200191505060405180910390f35b34156101e757600080fd5b61026760048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061053e565b604051808215151515815260200191505060405180910390f35b341561028c57600080fd5b6102946107b3565b6040518082815260200191505060405180910390f35b34156102b557600080fd5b6102bd6107b9565b6040518082815260200191505060405180910390f35b34156102de57600080fd5b6102e66107be565b6040518082815260200191505060405180910390f35b341561030757600080fd5b61034060048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506107c4565b604051808215151515815260200191505060405180910390f35b341561036557600080fd5b610388600480803560001916906020019091908035906020019091905050610a43565b6040518082815260200191505060405180910390f35b34156103a957600080fd5b6103b1610c4f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103fe57600080fd5b610406610c75565b6040518082815260200191505060405180910390f35b341561042757600080fd5b610441600480803560001916906020019091905050610c7e565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b341561047e57600080fd5b610486610d76565b6040518082815260200191505060405180910390f35b34156104a757600080fd5b6104c1600480803560001916906020019091905050610d83565b6040518082815260200191505060405180910390f35b60008060008360001916600019168152602001908152602001600020549050919050565b6018610e100281565b601e6018610e10020281565b600061051a61195f565b61052383610d9b565b90508060600151915050919050565b60076018610e10020281565b600061054861195f565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636fa9d0566000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156105d657600080fd5b6102c65a03f115156105e757600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561062a57600080fd5b61063387610d9b565b9050806000015173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107a45761069a846000808a600019166000191681526020019081526020016000205461129790919063ffffffff16565b6000808960001916600019168152602001908152602001600020819055507ff1a888d220228f843ac3044ef257c80642e6434d1ddc7ebee0a2813cced3406c87878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405180910390a1600191506107a9565b600091505b5095945050505050565b610e1081565b600581565b61271081565b6000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663079dd4b76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561085757600080fd5b6102c65a03f1151561086857600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108ab57600080fd5b6108b585856112b5565b9150600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663869f05116000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561094557600080fd5b6102c65a03f1151561095657600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663649404bd86866000604051602001526040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1515610a1257600080fd5b6102c65a03f11515610a2357600080fd5b505050604051805190509050818015610a395750805b9250505092915050565b6000610a4d61195f565b60008085600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610adf57600080fd5b6102c65a03f11515610af057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663f6f494c9826000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610b7857600080fd5b6102c65a03f11515610b8957600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16141515610bcc57600080fd5b610bd587610d9b565b9350610be084611746565b9250836040015186111515610bf85760009450610c45565b836060015186101515610c0d57829450610c45565b610c17868561179c565b9150610c428460a00151610c3484866117e690919063ffffffff16565b61182190919063ffffffff16565b94505b5050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60646127100281565b6000806000806000806000806000807fff000000000000000000000000000000000000000000000000000000000000006001028b1694507effffffffffffffffffffffff000000000000000000000000000000000000006001028b16935072ffffff000000000000000000000000000000006001028b1692506ff00000000000000000000000000000006001028b1691506f0ffff0000000000000000000000000006001028b169050610d328560f861183c565b610d3d85609861183c565b610d4885608061183c565b610d5385607c61183c565b610d5e85606c61183c565b99509950995099509950505050505091939590929450565b61016d6018610e10020281565b60006020528060005260406000206000915090505481565b610da361195f565b600080600080600080600080600080600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610e4357600080fd5b6102c65a03f11515610e5457600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663314a522e8f6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610edc57600080fd5b6102c65a03f11515610eed57600080fd5b505050604051805190509b50610f028c610c7e565b809b50819c50829d50839e50849f505050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d23c4c76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610fa457600080fd5b6102c65a03f11515610fb557600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16635715c5b78c6000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561103557600080fd5b6102c65a03f1151561104657600080fd5b505050604051805190509550600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415151561108e57600080fd5b60048081111561109a57fe5b88111515156110a857600080fd5b8760048111156110b457fe5b94506110bf85611859565b9350600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561114f57600080fd5b6102c65a03f1151561116057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663d69dbf638f6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156111e857600080fd5b6102c65a03f115156111f957600080fd5b50505060405180519050925061121884886117e690919063ffffffff16565b915061122d838361129790919063ffffffff16565b905060e0604051908101604052808773ffffffffffffffffffffffffffffffffffffffff1681526020018b815260200184815260200182815260200186600481111561127557fe5b81526020018881526020018a8152509c50505050505050505050505050919050565b60008082840190508381101515156112ab57fe5b8091505092915050565b6000806000806000806000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663079dd4b76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561135157600080fd5b6102c65a03f1151561136257600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156113a557600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561143357600080fd5b6102c65a03f1151561144457600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16636be39bda8c6000604051604001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082600019166000191681526020019150506040805180830381600087803b15156114cb57600080fd5b6102c65a03f115156114dc57600080fd5b5050506040518051906020018051905080985081995050506114fd87610c7e565b809650819750829850839950849a505050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d23c4c76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561159f57600080fd5b6102c65a03f115156115b057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16635715c5b7876000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561163057600080fd5b6102c65a03f1151561164157600080fd5b505050604051805190509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561168a5750600583105b80156116c157503073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b1561173357828173ffffffffffffffffffffffffffffffffffffffff168c600019167f2c500aaec6833a053693d8c2a18a3ed5649a4609699abaf7778c3d389cc40c0588888760405180848152602001838152602001828152602001935050505060405180910390a460019850611738565b600098505b505050505050505092915050565b60008061177b60646127100261176d8560c0015186602001516117e690919063ffffffff16565b61182190919063ffffffff16565b905061179481846020015161129790919063ffffffff16565b915050919050565b60008060006117b884604001518661194690919063ffffffff16565b91506117c78460800151611859565b90506117dc818361182190919063ffffffff16565b9250505092915050565b60008060008414156117fb576000915061181a565b828402905082848281151561180c57fe5b0414151561181657fe5b8091505b5092915050565b600080828481151561182f57fe5b0490508091505092915050565b60008160020a836001900481151561185057fe5b04905092915050565b600080600481111561186757fe5b82600481111561187357fe5b141561188357610e109050611941565b6001600481111561189057fe5b82600481111561189c57fe5b14156118af576018610e10029050611941565b600260048111156118bc57fe5b8260048111156118c857fe5b14156118de5760076018610e1002029050611941565b600360048111156118eb57fe5b8260048111156118f757fe5b141561190d57601e6018610e1002029050611941565b60048081111561191957fe5b82600481111561192557fe5b141561193c5761016d6018610e1002029050611941565b600080fd5b919050565b600082821115151561195457fe5b818303905092915050565b60e060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600060048111156119aa57fe5b8152602001600081526020016000815250905600a165627a7a72305820bed8b1c3c2e17661646af383d581d516d78a5b93d68ceec1eb9f33d1149890500029", + "bytecode": "0x6060604052341561000f57600080fd5b604051602080611a68833981016040528080519060200190919050508080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050506119ea8061007e6000396000f3006060604052600436106100e6576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a896a1146100eb5780630776298214610126578063208638941461014f5780632762dd8c1461017857806340018a0d146101b35780635f0280ba146101dc5780636f69c96f146102815780638b47e58a146102aa57806393529cdf146102d3578063977a5e64146102fc57806399114d841461035a578063abf410e51461039e578063de53a13c146103f3578063ed8907d71461041c578063fd127a4114610473578063fd40d52e1461049c575b600080fd5b34156100f657600080fd5b6101106004808035600019169060200190919050506104d7565b6040518082815260200191505060405180910390f35b341561013157600080fd5b6101396104fb565b6040518082815260200191505060405180910390f35b341561015a57600080fd5b610162610504565b6040518082815260200191505060405180910390f35b341561018357600080fd5b61019d600480803560001916906020019091905050610510565b6040518082815260200191505060405180910390f35b34156101be57600080fd5b6101c6610532565b6040518082815260200191505060405180910390f35b34156101e757600080fd5b61026760048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061053e565b604051808215151515815260200191505060405180910390f35b341561028c57600080fd5b6102946107b3565b6040518082815260200191505060405180910390f35b34156102b557600080fd5b6102bd6107b9565b6040518082815260200191505060405180910390f35b34156102de57600080fd5b6102e66107be565b6040518082815260200191505060405180910390f35b341561030757600080fd5b61034060048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506107c4565b604051808215151515815260200191505060405180910390f35b341561036557600080fd5b610388600480803560001916906020019091908035906020019091905050610a43565b6040518082815260200191505060405180910390f35b34156103a957600080fd5b6103b1610c4f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103fe57600080fd5b610406610c75565b6040518082815260200191505060405180910390f35b341561042757600080fd5b610441600480803560001916906020019091905050610c7e565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b341561047e57600080fd5b610486610d76565b6040518082815260200191505060405180910390f35b34156104a757600080fd5b6104c1600480803560001916906020019091905050610d83565b6040518082815260200191505060405180910390f35b60008060008360001916600019168152602001908152602001600020549050919050565b6018610e100281565b601e6018610e10020281565b600061051a61195f565b61052383610d9b565b90508060600151915050919050565b60076018610e10020281565b600061054861195f565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636fa9d0566000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156105d657600080fd5b6102c65a03f115156105e757600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561062a57600080fd5b61063387610d9b565b9050806000015173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107a45761069a846000808a600019166000191681526020019081526020016000205461129790919063ffffffff16565b6000808960001916600019168152602001908152602001600020819055507ff1a888d220228f843ac3044ef257c80642e6434d1ddc7ebee0a2813cced3406c87878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405180910390a1600191506107a9565b600091505b5095945050505050565b610e1081565b600581565b61271081565b6000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663079dd4b76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561085757600080fd5b6102c65a03f1151561086857600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108ab57600080fd5b6108b585856112b5565b9150600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663869f05116000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561094557600080fd5b6102c65a03f1151561095657600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663649404bd86866000604051602001526040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1515610a1257600080fd5b6102c65a03f11515610a2357600080fd5b505050604051805190509050818015610a395750805b9250505092915050565b6000610a4d61195f565b60008085600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610adf57600080fd5b6102c65a03f11515610af057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663f6f494c9826000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610b7857600080fd5b6102c65a03f11515610b8957600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16141515610bcc57600080fd5b610bd587610d9b565b9350610be084611746565b9250836040015186111515610bf85760009450610c45565b836060015186101515610c0d57829450610c45565b610c17868561179c565b9150610c428460a00151610c3484866117e690919063ffffffff16565b61182190919063ffffffff16565b94505b5050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60646127100281565b6000806000806000806000806000807fff000000000000000000000000000000000000000000000000000000000000006001028b1694507effffffffffffffffffffffff000000000000000000000000000000000000006001028b16935072ffffff000000000000000000000000000000006001028b1692506ff00000000000000000000000000000006001028b1691506f0ffff0000000000000000000000000006001028b169050610d328560f861183c565b610d3d85609861183c565b610d4885608061183c565b610d5385607c61183c565b610d5e85606c61183c565b99509950995099509950505050505091939590929450565b61016d6018610e10020281565b60006020528060005260406000206000915090505481565b610da361195f565b600080600080600080600080600080600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610e4357600080fd5b6102c65a03f11515610e5457600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663314a522e8f6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610edc57600080fd5b6102c65a03f11515610eed57600080fd5b505050604051805190509b50610f028c610c7e565b809b50819c50829d50839e50849f505050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d23c4c76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610fa457600080fd5b6102c65a03f11515610fb557600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16635715c5b78c6000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561103557600080fd5b6102c65a03f1151561104657600080fd5b505050604051805190509550600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415151561108e57600080fd5b60048081111561109a57fe5b88111515156110a857600080fd5b8760048111156110b457fe5b94506110bf85611859565b9350600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561114f57600080fd5b6102c65a03f1151561116057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663d69dbf638f6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156111e857600080fd5b6102c65a03f115156111f957600080fd5b50505060405180519050925061121884886117e690919063ffffffff16565b915061122d838361129790919063ffffffff16565b905060e0604051908101604052808773ffffffffffffffffffffffffffffffffffffffff1681526020018b815260200184815260200182815260200186600481111561127557fe5b81526020018881526020018a8152509c50505050505050505050505050919050565b60008082840190508381101515156112ab57fe5b8091505092915050565b6000806000806000806000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663079dd4b76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561135157600080fd5b6102c65a03f1151561136257600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156113a557600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561143357600080fd5b6102c65a03f1151561144457600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16636be39bda8c6000604051604001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082600019166000191681526020019150506040805180830381600087803b15156114cb57600080fd5b6102c65a03f115156114dc57600080fd5b5050506040518051906020018051905080985081995050506114fd87610c7e565b809650819750829850839950849a505050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d23c4c76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561159f57600080fd5b6102c65a03f115156115b057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16635715c5b7876000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561163057600080fd5b6102c65a03f1151561164157600080fd5b505050604051805190509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561168a5750600583105b80156116c157503073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b1561173357828173ffffffffffffffffffffffffffffffffffffffff168c600019167f2c500aaec6833a053693d8c2a18a3ed5649a4609699abaf7778c3d389cc40c0588888760405180848152602001838152602001828152602001935050505060405180910390a460019850611738565b600098505b505050505050505092915050565b60008061177b60646127100261176d8560c0015186602001516117e690919063ffffffff16565b61182190919063ffffffff16565b905061179481846020015161129790919063ffffffff16565b915050919050565b60008060006117b884604001518661194690919063ffffffff16565b91506117c78460800151611859565b90506117dc818361182190919063ffffffff16565b9250505092915050565b60008060008414156117fb576000915061181a565b828402905082848281151561180c57fe5b0414151561181657fe5b8091505b5092915050565b600080828481151561182f57fe5b0490508091505092915050565b60008160020a836001900481151561185057fe5b04905092915050565b600080600481111561186757fe5b82600481111561187357fe5b141561188357610e109050611941565b6001600481111561189057fe5b82600481111561189c57fe5b14156118af576018610e10029050611941565b600260048111156118bc57fe5b8260048111156118c857fe5b14156118de5760076018610e1002029050611941565b600360048111156118eb57fe5b8260048111156118f757fe5b141561190d57601e6018610e1002029050611941565b60048081111561191957fe5b82600481111561192557fe5b141561193c5761016d6018610e1002029050611941565b600080fd5b919050565b600082821115151561195457fe5b818303905092915050565b60e060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600060048111156119aa57fe5b8152602001600081526020016000815250905600a165627a7a723058206c75d10e14abe61180859cb3114cf640fbc391119d893d2135d90b3779e7b4170029", + "deployedBytecode": "0x6060604052600436106100e6576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a896a1146100eb5780630776298214610126578063208638941461014f5780632762dd8c1461017857806340018a0d146101b35780635f0280ba146101dc5780636f69c96f146102815780638b47e58a146102aa57806393529cdf146102d3578063977a5e64146102fc57806399114d841461035a578063abf410e51461039e578063de53a13c146103f3578063ed8907d71461041c578063fd127a4114610473578063fd40d52e1461049c575b600080fd5b34156100f657600080fd5b6101106004808035600019169060200190919050506104d7565b6040518082815260200191505060405180910390f35b341561013157600080fd5b6101396104fb565b6040518082815260200191505060405180910390f35b341561015a57600080fd5b610162610504565b6040518082815260200191505060405180910390f35b341561018357600080fd5b61019d600480803560001916906020019091905050610510565b6040518082815260200191505060405180910390f35b34156101be57600080fd5b6101c6610532565b6040518082815260200191505060405180910390f35b34156101e757600080fd5b61026760048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061053e565b604051808215151515815260200191505060405180910390f35b341561028c57600080fd5b6102946107b3565b6040518082815260200191505060405180910390f35b34156102b557600080fd5b6102bd6107b9565b6040518082815260200191505060405180910390f35b34156102de57600080fd5b6102e66107be565b6040518082815260200191505060405180910390f35b341561030757600080fd5b61034060048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506107c4565b604051808215151515815260200191505060405180910390f35b341561036557600080fd5b610388600480803560001916906020019091908035906020019091905050610a43565b6040518082815260200191505060405180910390f35b34156103a957600080fd5b6103b1610c4f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103fe57600080fd5b610406610c75565b6040518082815260200191505060405180910390f35b341561042757600080fd5b610441600480803560001916906020019091905050610c7e565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b341561047e57600080fd5b610486610d76565b6040518082815260200191505060405180910390f35b34156104a757600080fd5b6104c1600480803560001916906020019091905050610d83565b6040518082815260200191505060405180910390f35b60008060008360001916600019168152602001908152602001600020549050919050565b6018610e100281565b601e6018610e10020281565b600061051a61195f565b61052383610d9b565b90508060600151915050919050565b60076018610e10020281565b600061054861195f565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636fa9d0566000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156105d657600080fd5b6102c65a03f115156105e757600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561062a57600080fd5b61063387610d9b565b9050806000015173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107a45761069a846000808a600019166000191681526020019081526020016000205461129790919063ffffffff16565b6000808960001916600019168152602001908152602001600020819055507ff1a888d220228f843ac3044ef257c80642e6434d1ddc7ebee0a2813cced3406c87878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405180910390a1600191506107a9565b600091505b5095945050505050565b610e1081565b600581565b61271081565b6000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663079dd4b76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561085757600080fd5b6102c65a03f1151561086857600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108ab57600080fd5b6108b585856112b5565b9150600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663869f05116000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561094557600080fd5b6102c65a03f1151561095657600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663649404bd86866000604051602001526040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1515610a1257600080fd5b6102c65a03f11515610a2357600080fd5b505050604051805190509050818015610a395750805b9250505092915050565b6000610a4d61195f565b60008085600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610adf57600080fd5b6102c65a03f11515610af057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663f6f494c9826000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610b7857600080fd5b6102c65a03f11515610b8957600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16141515610bcc57600080fd5b610bd587610d9b565b9350610be084611746565b9250836040015186111515610bf85760009450610c45565b836060015186101515610c0d57829450610c45565b610c17868561179c565b9150610c428460a00151610c3484866117e690919063ffffffff16565b61182190919063ffffffff16565b94505b5050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60646127100281565b6000806000806000806000806000807fff000000000000000000000000000000000000000000000000000000000000006001028b1694507effffffffffffffffffffffff000000000000000000000000000000000000006001028b16935072ffffff000000000000000000000000000000006001028b1692506ff00000000000000000000000000000006001028b1691506f0ffff0000000000000000000000000006001028b169050610d328560f861183c565b610d3d85609861183c565b610d4885608061183c565b610d5385607c61183c565b610d5e85606c61183c565b99509950995099509950505050505091939590929450565b61016d6018610e10020281565b60006020528060005260406000206000915090505481565b610da361195f565b600080600080600080600080600080600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610e4357600080fd5b6102c65a03f11515610e5457600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663314a522e8f6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610edc57600080fd5b6102c65a03f11515610eed57600080fd5b505050604051805190509b50610f028c610c7e565b809b50819c50829d50839e50849f505050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d23c4c76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610fa457600080fd5b6102c65a03f11515610fb557600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16635715c5b78c6000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561103557600080fd5b6102c65a03f1151561104657600080fd5b505050604051805190509550600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415151561108e57600080fd5b60048081111561109a57fe5b88111515156110a857600080fd5b8760048111156110b457fe5b94506110bf85611859565b9350600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561114f57600080fd5b6102c65a03f1151561116057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663d69dbf638f6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156111e857600080fd5b6102c65a03f115156111f957600080fd5b50505060405180519050925061121884886117e690919063ffffffff16565b915061122d838361129790919063ffffffff16565b905060e0604051908101604052808773ffffffffffffffffffffffffffffffffffffffff1681526020018b815260200184815260200182815260200186600481111561127557fe5b81526020018881526020018a8152509c50505050505050505050505050919050565b60008082840190508381101515156112ab57fe5b8091505092915050565b6000806000806000806000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663079dd4b76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561135157600080fd5b6102c65a03f1151561136257600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156113a557600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561143357600080fd5b6102c65a03f1151561144457600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16636be39bda8c6000604051604001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082600019166000191681526020019150506040805180830381600087803b15156114cb57600080fd5b6102c65a03f115156114dc57600080fd5b5050506040518051906020018051905080985081995050506114fd87610c7e565b809650819750829850839950849a505050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d23c4c76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561159f57600080fd5b6102c65a03f115156115b057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16635715c5b7876000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561163057600080fd5b6102c65a03f1151561164157600080fd5b505050604051805190509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561168a5750600583105b80156116c157503073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b1561173357828173ffffffffffffffffffffffffffffffffffffffff168c600019167f2c500aaec6833a053693d8c2a18a3ed5649a4609699abaf7778c3d389cc40c0588888760405180848152602001838152602001828152602001935050505060405180910390a460019850611738565b600098505b505050505050505092915050565b60008061177b60646127100261176d8560c0015186602001516117e690919063ffffffff16565b61182190919063ffffffff16565b905061179481846020015161129790919063ffffffff16565b915050919050565b60008060006117b884604001518661194690919063ffffffff16565b91506117c78460800151611859565b90506117dc818361182190919063ffffffff16565b9250505092915050565b60008060008414156117fb576000915061181a565b828402905082848281151561180c57fe5b0414151561181657fe5b8091505b5092915050565b600080828481151561182f57fe5b0490508091505092915050565b60008160020a836001900481151561185057fe5b04905092915050565b600080600481111561186757fe5b82600481111561187357fe5b141561188357610e109050611941565b6001600481111561189057fe5b82600481111561189c57fe5b14156118af576018610e10029050611941565b600260048111156118bc57fe5b8260048111156118c857fe5b14156118de5760076018610e1002029050611941565b600360048111156118eb57fe5b8260048111156118f757fe5b141561190d57601e6018610e1002029050611941565b60048081111561191957fe5b82600481111561192557fe5b141561193c5761016d6018610e1002029050611941565b600080fd5b919050565b600082821115151561195457fe5b818303905092915050565b60e060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600060048111156119aa57fe5b8152602001600081526020016000815250905600a165627a7a723058206c75d10e14abe61180859cb3114cf640fbc391119d893d2135d90b3779e7b4170029", "sourceMap": "844:893:14:-;;;933:146;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1059:16;3551:17:16;3515:16;;:54;;;;;;;;;;;;;;;;;;3408:168;933:146:14;844:893;;;;;;", "deployedSourceMap": "844:893:14:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9334:167:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1532:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1687:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1476:259:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1610:71:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6636:742;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1473:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;860:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2025:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1085:385:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7987:1066:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2492:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2329:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9507:2790;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1766:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2441:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9334:167;9430:17;9470:11;:24;9482:11;9470:24;;;;;;;;;;;;;;;;;;9463:31;;9334:167;;;:::o;1532:72::-;1602:2;1519:7;1577:27;1532:72;:::o;1687:73::-;1758:2;1602;1519:7;1577:27;1734:26;1687:73;:::o;1476:259:14:-;1586:4;1606:34;;:::i;:::-;1643:40;1670:12;1643:26;:40::i;:::-;1606:77;;1701:6;:27;;;1694:34;;1476:259;;;;:::o;1610:71:16:-;1680:1;1602:2;1519:7;1577:27;1656:25;1610:71;:::o;6636:742::-;6865:13;6894:34;;:::i;:::-;3051:16;;;;;;;;;;;:32;;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3029:57;;:10;:57;;;3021:66;;;;;;;;6931:39;6958:11;6931:26;:39::i;:::-;6894:76;;7001:6;:28;;;6985:44;;:12;:44;;;6981:368;;;7072:46;7101:16;7072:11;:24;7084:11;7072:24;;;;;;;;;;;;;;;;;;:28;;:46;;;;:::i;:::-;7045:11;:24;7057:11;7045:24;;;;;;;;;;;;;;;;;:73;;;;7133:179;7171:11;7200:5;7223:11;7252:16;7286:12;7133:179;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7334:4;7327:11;;;;6981:368;7366:5;7359:12;;3097:1;6636:742;;;;;;;;:::o;1473:53::-;1519:7;1473:53;:::o;860:52::-;911:1;860:52;:::o;2025:67::-;2085:7;2025:67;:::o;1085:385:14:-;1226:13;1255:15;1327:19;3353:16:16;;;;;;;;;;;:27;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3331:52;;:10;:52;;;3323:61;;;;;;;;1273:44:14;1297:11;1310:6;1273:23;:44::i;:::-;1255:62;;1349:16;;;;;;;;;;;:31;;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:47;;;1397:11;1410:6;1349:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1327:90;;1435:10;:28;;;;;1449:14;1435:28;1428:35;;1085:385;;;;;;:::o;7987:1066:16:-;8175:28;8219:34;;:::i;:::-;8305:26;8871:13;8145:11;3201:16;;;;;;;;;;;:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:48;;;3250:11;3201:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3184:78;;3192:4;3184:78;;;3176:87;;;;;;;;8256:39;8283:11;8256:26;:39::i;:::-;8219:76;;8334:43;8370:6;8334:35;:43::i;:::-;8305:72;;8405:6;:29;;;8392:9;:42;;8388:659;;;8587:1;8580:8;;;;8388:659;8622:6;:27;;;8609:9;:40;;8605:442;;;8819:21;8812:28;;;;8605:442;8887:51;8920:9;8931:6;8887:32;:51::i;:::-;8871:67;;8959:77;8999:6;:36;;;8959:35;8985:8;8959:21;:25;;:35;;;;:::i;:::-;:39;;:77;;;;:::i;:::-;8952:84;;3273:1;7987:1066;;;;;;;;:::o;2492:40::-;;;;;;;;;;;;;:::o;2329:105::-;2431:3;2085:7;2392:42;2329:105;:::o;9507:2790::-;9620:25;9659:21;9694:18;9726:26;9766:35;9940:34;10160:30;10372:27;10588:35;10845:44;10002:66;9989:79;;:10;:79;9940:128;;10218:66;10205:79;;:10;:79;10160:124;;10427:66;10414:79;;:10;:79;10372:121;;10651:66;10638:79;;:10;:79;10588:129;;10917:66;10904:79;;:10;:79;10845:138;;11994:46;12008:26;12036:3;11994:13;:46::i;:::-;12054:42;12068:22;12092:3;12054:13;:42::i;:::-;12110:39;12124:19;12145:3;12110:13;:39::i;:::-;12163:47;12177:27;12206:3;12163:13;:47::i;:::-;12224:56;12238:36;12276:3;12224:13;:56::i;:::-;11973:317;;;;;;;;;;9507:2790;;;;;;;;;;;;:::o;1766:73::-;1836:3;1602:2;1519:7;1577:27;1812;1766:73;:::o;2441:44::-;;;;;;;;;;;;;;;;;:::o;14136:2420::-;14241:27;;:::i;:::-;14284:18;14467:24;14574:20;14664:17;14782:28;14917:34;15133:29;15568:41;15668:36;15785:27;15907:24;16022:25;14305:16;;;;;;;;;;;:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:58;;;14364:11;14305:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14284:92;;15085:37;15111:10;15085:25;:37::i;:::-;14962:160;;;;;;;;;;;;;;;;;;;;15177:16;;;;;;;;;;;:30;;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:55;;;15233:19;15177:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15133:120;;15373:1;15340:35;;:21;:35;;;;15332:44;;;;;;;;15529:26;15524:32;;;;;;;;15497:23;:59;;15489:68;;;;;;;;15633:23;15612:45;;;;;;;;15568:89;;15719:56;15754:20;15719:34;:56::i;:::-;15668:107;;15827:16;;;;;;;;;;;:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:57;;;15885:11;15827:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15785:112;;15946:66;15980:31;15946:29;:33;;:66;;;;:::i;:::-;15907:105;;16062:47;16086:22;16062:19;:23;;:47;;;;:::i;:::-;16022:87;;16127:422;;;;;;;;;16185:21;16127:422;;;;;;16237:15;16127:422;;;;16330:22;16127:422;;;;16388:20;16127:422;;;;16444:20;16127:422;;;;;;;;;;;;16509:29;16127:422;;;;16280:12;16127:422;;;16120:429;;14136:2420;;;;;;;;;;;;;;;:::o;1007:129:38:-;1065:7;1080:9;1096:1;1092;:5;1080:17;;1115:1;1110;:6;;1103:14;;;;;;1130:1;1123:8;;1007:129;;;;;:::o;4229:1696:16:-;4370:13;4399:21;4430:31;4579:24;4613:20;4643:17;4670:25;4705:34;4931:29;3353:16;;;;;;;;;;;:27;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3331:52;;:10;:52;;;3323:61;;;;;;;;4515:16;;;;;;;;;;;:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:40;;;4556:11;4515:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4472:96;;;;;;;;4870:50;4896:23;4870:25;:50::i;:::-;4750:170;;;;;;;;;;;;;;;;;;;;4975:16;;;;;;;;;;;:30;;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:55;;;5031:19;4975:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4931:120;;5473:1;5440:35;;:21;:35;;;;:101;;;;;911:1;5491:20;:50;5440:101;:147;;;;;5582:4;5557:30;;:13;:30;;;5440:147;5436:460;;;5778:20;5676:21;5603:256;;5647:11;5603:256;;;;5715:15;5748:12;5816:29;5603:256;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5881:4;5874:11;;;;5436:460;5913:5;5906:12;;3394:1;4229:1696;;;;;;;;;;;;:::o;13492:638::-;13614:27;13925:18;13946:118;2431:3;2085:7;2392:42;13946:60;13986:6;:19;;;13946:6;:22;;;:39;;:60;;;;:::i;:::-;:77;;:118;;;;:::i;:::-;13925:139;;14082:41;14109:13;14082:6;:22;;;:26;;:41;;;;:::i;:::-;14075:48;;13492:638;;;;:::o;12707:404::-;12850:10;12876;12943:36;12889:44;12903:6;:29;;;12889:9;:13;;:44;;;;:::i;:::-;12876:57;;12982:63;13017:6;:27;;;12982:34;:63::i;:::-;12943:102;;13062:42;13072:31;13062:5;:9;;:42;;;;:::i;:::-;13055:49;;12707:404;;;;;;:::o;203:173:38:-;261:7;316:9;285:1;280;:6;276:35;;;303:1;296:8;;;;276:35;332:1;328;:5;316:17;;355:1;350;346;:5;;;;;;;;:10;339:18;;;;;;370:1;363:8;;203:173;;;;;;:::o;458:265::-;516:7;605:9;621:1;617;:5;;;;;;;;605:17;;717:1;710:8;;458:265;;;;;:::o;12544:157:16:-;12642:4;12688:6;12683:1;:11;12674:5;12669:11;;;:25;;;;;;;;12662:32;;12544:157;;;;:::o;16562:806::-;16696:37;16777:26;16753:50;;;;;;;;:20;:50;;;;;;;;;16749:613;;;1519:7;16819:29;;;;16749:613;16893:25;16869:49;;;;;;;;:20;:49;;;;;;;;;16865:497;;;1602:2;1519:7;1577:27;16934:28;;;;16865:497;17007:26;16983:50;;;;;;;;:20;:50;;;;;;;;;16979:383;;;1680:1;1602:2;1519:7;1577:27;1656:25;17049:29;;;;16979:383;17123:27;17099:51;;;;;;;;:20;:51;;;;;;;;;17095:267;;;1758:2;1602;1519:7;1577:27;1734:26;17166:30;;;;17095:267;17241:26;17217:50;;;;;;;;:20;:50;;;;;;;;;17213:149;;;1836:3;1602:2;1519:7;1577:27;1812;17283:29;;;;17213:149;17343:8;;;16562:806;;;;:::o;835:110:38:-;893:7;920:1;915;:6;;908:14;;;;;;939:1;935;:5;928:12;;835:110;;;;:::o;844:893:14:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\nimport \"./SimpleInterestTermsContract.sol\";\nimport \"../Collateralizer.sol\";\n\n\n/**\n * Example collateralized terms contract for usage in simple interest debt agreements\n *\n * Authors: nadavhollander, saturnial, jdkanani, graemecode\n */\ncontract CollateralizedSimpleInterestTermsContract is SimpleInterestTermsContract {\n\n function CollateralizedSimpleInterestTermsContract(\n address contractRegistry\n ) public SimpleInterestTermsContract(contractRegistry) {}\n\n function registerTermStart(\n bytes32 agreementId,\n address debtor\n )\n public\n onlyDebtKernel\n returns (bool _success)\n {\n bool registered = super.registerTermStart(agreementId, debtor);\n bool collateralized = contractRegistry.collateralizer().collateralize(agreementId, debtor);\n\n return registered && collateralized;\n }\n\n function getTermEndTimestamp(\n bytes32 _agreementId\n )\n public\n view\n returns (uint)\n {\n SimpleInterestParams memory params = unpackParamsForAgreementID(_agreementId);\n\n return params.termEndUnixTimestamp;\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/examples/CollateralizedSimpleInterestTermsContract.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/examples/CollateralizedSimpleInterestTermsContract.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/examples/CollateralizedSimpleInterestTermsContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/examples/CollateralizedSimpleInterestTermsContract.sol", "exportedSymbols": { "CollateralizedSimpleInterestTermsContract": [ 5273 @@ -413,7 +413,7 @@ export const CollateralizedSimpleInterestTermsContract = { "attributes": { "SourceUnit": 6053, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/examples/SimpleInterestTermsContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/examples/SimpleInterestTermsContract.sol", "file": "./SimpleInterestTermsContract.sol", "scope": 5274, "symbolAliases": [ @@ -428,7 +428,7 @@ export const CollateralizedSimpleInterestTermsContract = { "attributes": { "SourceUnit": 615, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/Collateralizer.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/Collateralizer.sol", "file": "../Collateralizer.sol", "scope": 5274, "symbolAliases": [ @@ -1335,7 +1335,7 @@ export const CollateralizedSimpleInterestTermsContract = "42": { "events": {}, "links": {}, - "address": "0x670315b61825f2691084fb9387996675cf2c0225" + "address": "0x7b7be94999219352b02c70b62b7cc09f7179b3b0" }, "70": { "events": {}, @@ -1344,5 +1344,5 @@ export const CollateralizedSimpleInterestTermsContract = } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:14:48.932Z" + "updatedAt": "2018-10-09T17:51:37.279Z" } \ No newline at end of file diff --git a/artifacts/ts/Collateralizer.ts b/artifacts/ts/Collateralizer.ts index 936787f2..4fc5ac23 100644 --- a/artifacts/ts/Collateralizer.ts +++ b/artifacts/ts/Collateralizer.ts @@ -467,15 +467,15 @@ export const Collateralizer = "type": "event" } ], - "bytecode": "0x606060405260008060146101000a81548160ff021916908315150217905550341561002957600080fd5b6040516080806125d983398101604052808051906020019091908051906020019091908051906020019091908051906020019091905050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050612422806101b76000396000f300606060405260043610610111576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680627eb667146101165780630eefdbad1461016b5780632e667c4e146101c05780632f866f731461024e5780633f4ba83a146102a357806344c4ea95146102b85780634bbf7a67146102df5780635c975abb1461031657806361a52a3614610343578063649404bd1461036c5780638456cb59146103ca5780638da5cb5b146103df5780639ae1c1f3146104345780639d23c4c71461046d578063ae72c6ef146104c2578063ca062647146104fb578063e4b67a4c14610544578063ed8e52bd146105ab578063f2fde38b146105d2578063f466f42e1461060b575b600080fd5b341561012157600080fd5b610129610675565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561017657600080fd5b61017e61069b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101cb57600080fd5b6101d36106c1565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102135780820151818401526020810190506101f8565b50505050905090810190601f1680156102405780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561025957600080fd5b6102616106fa565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102ae57600080fd5b6102b6610720565b005b34156102c357600080fd5b6102dd6004808035600019169060200190919050506107de565b005b34156102ea57600080fd5b6103006004808035906020019091905050610c9a565b6040518082815260200191505060405180910390f35b341561032157600080fd5b610329610ccb565b604051808215151515815260200191505060405180910390f35b341561034e57600080fd5b610356610cde565b6040518082815260200191505060405180910390f35b341561037757600080fd5b6103b060048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610ce5565b604051808215151515815260200191505060405180910390f35b34156103d557600080fd5b6103dd61124b565b005b34156103ea57600080fd5b6103f261130b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561043f57600080fd5b61046b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611330565b005b341561047857600080fd5b6104806113d9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104cd57600080fd5b6104f9600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506113ff565b005b341561050657600080fd5b6105206004808035600019169060200190919050506114a8565b60405180848152602001838152602001828152602001935050505060405180910390f35b341561054f57600080fd5b610569600480803560001916906020019091905050611534565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156105b657600080fd5b6105d0600480803560001916906020019091905050611567565b005b34156105dd57600080fd5b610609600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611a11565b005b341561061657600080fd5b61061e611b66565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610661578082015181840152602081019050610646565b505050509050019250505060405180910390f35b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6040805190810160405280600e81526020017f636f6c6c61746572616c697a657200000000000000000000000000000000000081525081565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561077b57600080fd5b600060149054906101000a900460ff16151561079657600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b60008060008060008060149054906101000a900460ff1615151561080157600080fd5b61080a86611b7d565b8095508196508297508398505050505060008411151561082957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415151561086557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff1660056000886000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156108dc57600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166303a896a1876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b151561095b57600080fd5b6102c65a03f1151561096c57600080fd5b505050604051805190508273ffffffffffffffffffffffffffffffffffffffff166399114d84888573ffffffffffffffffffffffffffffffffffffffff16632762dd8c8b6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610a1257600080fd5b6102c65a03f11515610a2357600080fd5b505050604051805190506000604051602001526040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050602060405180830381600087803b1515610a9657600080fd5b6102c65a03f11515610aa757600080fd5b5050506040518051905011151515610abe57600080fd5b60056000876000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060056000876000191660001916815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690558473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82866000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1515610be557600080fd5b6102c65a03f11515610bf657600080fd5b505050604051805190501515610c0b57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff1686600019167f2621540e2b91ca10330d6a7cbd6fb8cab2396f91c4935ad76b1183770819fa1f8787604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a3505050505050565b6000610cc4610cb58362015180611d3990919063ffffffff16565b42611d7490919063ffffffff16565b9050919050565b600060149054906101000a900460ff1681565b6201518081565b6000806000806000806000610d04336006611d8d90919063ffffffff16565b1515610d0f57600080fd5b600060149054906101000a900460ff16151515610d2b57600080fd5b610d3489611b7d565b809650819750829850839950505050503373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515610d7e57600080fd5b600085111515610d8d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614151515610dc957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560008b6000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515610e3f57600080fd5b859150309050848273ffffffffffffffffffffffffffffffffffffffff166370a082318a6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1515610ee957600080fd5b6102c65a03f11515610efa57600080fd5b5050506040518051905010151515610f1157600080fd5b848273ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e8a600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b151561100b57600080fd5b6102c65a03f1151561101c57600080fd5b505050604051805190501015151561103357600080fd5b87600560008b6000191660001916815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166315dacbea838a84896000604051602001526040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050602060405180830381600087803b15156111c257600080fd5b6102c65a03f115156111d357600080fd5b5050506040518051905015156111e857600080fd5b8573ffffffffffffffffffffffffffffffffffffffff1689600019167f38f12634ebefbe7f6767652aae05e220f95e0ca8ef8353c9c9c5ae439a592aec876040518082815260200191505060405180910390a36001965050505050505092915050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156112a657600080fd5b600060149054906101000a900460ff161515156112c257600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561138b57600080fd5b6113d6816040805190810160405280600e81526020017f636f6c6c61746572616c697a65720000000000000000000000000000000000008152506006611de69092919063ffffffff16565b50565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561145a57600080fd5b6114a5816040805190810160405280600e81526020017f636f6c6c61746572616c697a657200000000000000000000000000000000000081525060066120dc9092919063ffffffff16565b50565b6000806000806000806000806d0ff0000000000000000000000000600102891694506c0fffffffffffffffffffffff00600102891693506c1000000000000000000000000085600190048115156114fb57fe5b049250610100846001900481151561150f57fe5b04915060ff600102891690508282826001900497509750975050505050509193909250565b60056020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008060008060149054906101000a900460ff1615151561158a57600080fd5b61159386611b7d565b809550819650829750839850505050506000841115156115b257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141515156115ee57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff1660056000886000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561166557600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166303a896a1876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156116e457600080fd5b6102c65a03f115156116f557600080fd5b505050604051805190508273ffffffffffffffffffffffffffffffffffffffff166399114d848861172587610c9a565b6000604051602001526040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050602060405180830381600087803b151561178e57600080fd5b6102c65a03f1151561179f57600080fd5b505050604051805190501115156117b557600080fd5b60056000876000191660001916815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ba20dda4876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b151561189457600080fd5b6102c65a03f115156118a557600080fd5b5050506040518051905090508473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82866000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b151561195c57600080fd5b6102c65a03f1151561196d57600080fd5b50505060405180519050151561198257600080fd5b8073ffffffffffffffffffffffffffffffffffffffff1686600019167f50d195a4b80a950617a8e0e18ac9dd4c0236ac72d5e12355d881443823870d398787604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a3505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a6c57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611aa857600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611b6e612365565b611b7860066122b8565b905090565b600080600080600080600080600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636be39bda8c6000604051604001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082600019166000191681526020019150506040805180830381600087803b1515611c2c57600080fd5b6102c65a03f11515611c3d57600080fd5b505050604051805190602001805190508096508197505050611c5e856114a8565b809450819550829650505050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635715c5b7856000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515611d0357600080fd5b6102c65a03f11515611d1457600080fd5b5050506040518051905090508083838899509950995099505050505050509193509193565b6000806000841415611d4e5760009150611d6d565b8284029050828482811515611d5f57fe5b04141515611d6957fe5b8091505b5092915050565b6000828211151515611d8257fe5b818303905092915050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000806000611df58686611d8d565b1515611e0057600080fd5b8560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600186600201805490500391508560020182815481101515611e6257fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055808660020184815481101515611ef357fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090558560020182815481101515611fd857fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600186600201818180549050039150816120209190612379565b508473ffffffffffffffffffffffffffffffffffffffff167f0814e4ee85854cea446b4a27a460e5ffb41516230dbc02f226c07907e432241c856040518080602001828103825283818151815260200191508051906020019080838360005b8381101561209a57808201518184015260208101905061207f565b50505050905090810190601f1680156120c75780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050505050565b6120e68383612350565b15156120f157600080fd5b60018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555082600201805480600101828161216191906123a5565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060018360020180549050038360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f571925c699f9072cec76b6c6c000571cc8d0bb5c47e5819202e2e9496c6508b5826040518080602001828103825283818151815260200191508051906020019080838360005b8381101561227957808201518184015260208101905061225e565b50505050905090810190601f1680156122a65780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b6122c0612365565b8160020180548060200260200160405190810160405280929190818152602001828054801561234457602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116122fa575b50505050509050919050565b600061235c8383611d8d565b15905092915050565b602060405190810160405280600081525090565b8154818355818115116123a05781836000526020600020918201910161239f91906123d1565b5b505050565b8154818355818115116123cc578183600052602060002091820191016123cb91906123d1565b5b505050565b6123f391905b808211156123ef5760008160009055506001016123d7565b5090565b905600a165627a7a723058203b584ec992a2b71a9f97e43f2ea339359f8fd35253cf72bd14ae3b2d2a47a1d40029", - "deployedBytecode": "0x606060405260043610610111576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680627eb667146101165780630eefdbad1461016b5780632e667c4e146101c05780632f866f731461024e5780633f4ba83a146102a357806344c4ea95146102b85780634bbf7a67146102df5780635c975abb1461031657806361a52a3614610343578063649404bd1461036c5780638456cb59146103ca5780638da5cb5b146103df5780639ae1c1f3146104345780639d23c4c71461046d578063ae72c6ef146104c2578063ca062647146104fb578063e4b67a4c14610544578063ed8e52bd146105ab578063f2fde38b146105d2578063f466f42e1461060b575b600080fd5b341561012157600080fd5b610129610675565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561017657600080fd5b61017e61069b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101cb57600080fd5b6101d36106c1565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102135780820151818401526020810190506101f8565b50505050905090810190601f1680156102405780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561025957600080fd5b6102616106fa565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102ae57600080fd5b6102b6610720565b005b34156102c357600080fd5b6102dd6004808035600019169060200190919050506107de565b005b34156102ea57600080fd5b6103006004808035906020019091905050610c9a565b6040518082815260200191505060405180910390f35b341561032157600080fd5b610329610ccb565b604051808215151515815260200191505060405180910390f35b341561034e57600080fd5b610356610cde565b6040518082815260200191505060405180910390f35b341561037757600080fd5b6103b060048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610ce5565b604051808215151515815260200191505060405180910390f35b34156103d557600080fd5b6103dd61124b565b005b34156103ea57600080fd5b6103f261130b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561043f57600080fd5b61046b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611330565b005b341561047857600080fd5b6104806113d9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104cd57600080fd5b6104f9600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506113ff565b005b341561050657600080fd5b6105206004808035600019169060200190919050506114a8565b60405180848152602001838152602001828152602001935050505060405180910390f35b341561054f57600080fd5b610569600480803560001916906020019091905050611534565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156105b657600080fd5b6105d0600480803560001916906020019091905050611567565b005b34156105dd57600080fd5b610609600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611a11565b005b341561061657600080fd5b61061e611b66565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610661578082015181840152602081019050610646565b505050509050019250505060405180910390f35b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6040805190810160405280600e81526020017f636f6c6c61746572616c697a657200000000000000000000000000000000000081525081565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561077b57600080fd5b600060149054906101000a900460ff16151561079657600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b60008060008060008060149054906101000a900460ff1615151561080157600080fd5b61080a86611b7d565b8095508196508297508398505050505060008411151561082957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415151561086557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff1660056000886000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156108dc57600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166303a896a1876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b151561095b57600080fd5b6102c65a03f1151561096c57600080fd5b505050604051805190508273ffffffffffffffffffffffffffffffffffffffff166399114d84888573ffffffffffffffffffffffffffffffffffffffff16632762dd8c8b6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610a1257600080fd5b6102c65a03f11515610a2357600080fd5b505050604051805190506000604051602001526040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050602060405180830381600087803b1515610a9657600080fd5b6102c65a03f11515610aa757600080fd5b5050506040518051905011151515610abe57600080fd5b60056000876000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060056000876000191660001916815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690558473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82866000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1515610be557600080fd5b6102c65a03f11515610bf657600080fd5b505050604051805190501515610c0b57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff1686600019167f2621540e2b91ca10330d6a7cbd6fb8cab2396f91c4935ad76b1183770819fa1f8787604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a3505050505050565b6000610cc4610cb58362015180611d3990919063ffffffff16565b42611d7490919063ffffffff16565b9050919050565b600060149054906101000a900460ff1681565b6201518081565b6000806000806000806000610d04336006611d8d90919063ffffffff16565b1515610d0f57600080fd5b600060149054906101000a900460ff16151515610d2b57600080fd5b610d3489611b7d565b809650819750829850839950505050503373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515610d7e57600080fd5b600085111515610d8d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614151515610dc957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560008b6000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515610e3f57600080fd5b859150309050848273ffffffffffffffffffffffffffffffffffffffff166370a082318a6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1515610ee957600080fd5b6102c65a03f11515610efa57600080fd5b5050506040518051905010151515610f1157600080fd5b848273ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e8a600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b151561100b57600080fd5b6102c65a03f1151561101c57600080fd5b505050604051805190501015151561103357600080fd5b87600560008b6000191660001916815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166315dacbea838a84896000604051602001526040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050602060405180830381600087803b15156111c257600080fd5b6102c65a03f115156111d357600080fd5b5050506040518051905015156111e857600080fd5b8573ffffffffffffffffffffffffffffffffffffffff1689600019167f38f12634ebefbe7f6767652aae05e220f95e0ca8ef8353c9c9c5ae439a592aec876040518082815260200191505060405180910390a36001965050505050505092915050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156112a657600080fd5b600060149054906101000a900460ff161515156112c257600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561138b57600080fd5b6113d6816040805190810160405280600e81526020017f636f6c6c61746572616c697a65720000000000000000000000000000000000008152506006611de69092919063ffffffff16565b50565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561145a57600080fd5b6114a5816040805190810160405280600e81526020017f636f6c6c61746572616c697a657200000000000000000000000000000000000081525060066120dc9092919063ffffffff16565b50565b6000806000806000806000806d0ff0000000000000000000000000600102891694506c0fffffffffffffffffffffff00600102891693506c1000000000000000000000000085600190048115156114fb57fe5b049250610100846001900481151561150f57fe5b04915060ff600102891690508282826001900497509750975050505050509193909250565b60056020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008060008060149054906101000a900460ff1615151561158a57600080fd5b61159386611b7d565b809550819650829750839850505050506000841115156115b257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141515156115ee57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff1660056000886000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561166557600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166303a896a1876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156116e457600080fd5b6102c65a03f115156116f557600080fd5b505050604051805190508273ffffffffffffffffffffffffffffffffffffffff166399114d848861172587610c9a565b6000604051602001526040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050602060405180830381600087803b151561178e57600080fd5b6102c65a03f1151561179f57600080fd5b505050604051805190501115156117b557600080fd5b60056000876000191660001916815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ba20dda4876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b151561189457600080fd5b6102c65a03f115156118a557600080fd5b5050506040518051905090508473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82866000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b151561195c57600080fd5b6102c65a03f1151561196d57600080fd5b50505060405180519050151561198257600080fd5b8073ffffffffffffffffffffffffffffffffffffffff1686600019167f50d195a4b80a950617a8e0e18ac9dd4c0236ac72d5e12355d881443823870d398787604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a3505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a6c57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611aa857600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611b6e612365565b611b7860066122b8565b905090565b600080600080600080600080600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636be39bda8c6000604051604001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082600019166000191681526020019150506040805180830381600087803b1515611c2c57600080fd5b6102c65a03f11515611c3d57600080fd5b505050604051805190602001805190508096508197505050611c5e856114a8565b809450819550829650505050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635715c5b7856000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515611d0357600080fd5b6102c65a03f11515611d1457600080fd5b5050506040518051905090508083838899509950995099505050505050509193509193565b6000806000841415611d4e5760009150611d6d565b8284029050828482811515611d5f57fe5b04141515611d6957fe5b8091505b5092915050565b6000828211151515611d8257fe5b818303905092915050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000806000611df58686611d8d565b1515611e0057600080fd5b8560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600186600201805490500391508560020182815481101515611e6257fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055808660020184815481101515611ef357fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090558560020182815481101515611fd857fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600186600201818180549050039150816120209190612379565b508473ffffffffffffffffffffffffffffffffffffffff167f0814e4ee85854cea446b4a27a460e5ffb41516230dbc02f226c07907e432241c856040518080602001828103825283818151815260200191508051906020019080838360005b8381101561209a57808201518184015260208101905061207f565b50505050905090810190601f1680156120c75780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050505050565b6120e68383612350565b15156120f157600080fd5b60018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555082600201805480600101828161216191906123a5565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060018360020180549050038360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f571925c699f9072cec76b6c6c000571cc8d0bb5c47e5819202e2e9496c6508b5826040518080602001828103825283818151815260200191508051906020019080838360005b8381101561227957808201518184015260208101905061225e565b50505050905090810190601f1680156122a65780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b6122c0612365565b8160020180548060200260200160405190810160405280929190818152602001828054801561234457602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116122fa575b50505050509050919050565b600061235c8383611d8d565b15905092915050565b602060405190810160405280600081525090565b8154818355818115116123a05781836000526020600020918201910161239f91906123d1565b5b505050565b8154818355818115116123cc578183600052602060002091820191016123cb91906123d1565b5b505050565b6123f391905b808211156123ef5760008160009055506001016123d7565b5090565b905600a165627a7a723058203b584ec992a2b71a9f97e43f2ea339359f8fd35253cf72bd14ae3b2d2a47a1d40029", + "bytecode": "0x606060405260008060146101000a81548160ff021916908315150217905550341561002957600080fd5b6040516080806125d983398101604052808051906020019091908051906020019091908051906020019091908051906020019091905050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050612422806101b76000396000f300606060405260043610610111576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680627eb667146101165780630eefdbad1461016b5780632e667c4e146101c05780632f866f731461024e5780633f4ba83a146102a357806344c4ea95146102b85780634bbf7a67146102df5780635c975abb1461031657806361a52a3614610343578063649404bd1461036c5780638456cb59146103ca5780638da5cb5b146103df5780639ae1c1f3146104345780639d23c4c71461046d578063ae72c6ef146104c2578063ca062647146104fb578063e4b67a4c14610544578063ed8e52bd146105ab578063f2fde38b146105d2578063f466f42e1461060b575b600080fd5b341561012157600080fd5b610129610675565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561017657600080fd5b61017e61069b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101cb57600080fd5b6101d36106c1565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102135780820151818401526020810190506101f8565b50505050905090810190601f1680156102405780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561025957600080fd5b6102616106fa565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102ae57600080fd5b6102b6610720565b005b34156102c357600080fd5b6102dd6004808035600019169060200190919050506107de565b005b34156102ea57600080fd5b6103006004808035906020019091905050610c9a565b6040518082815260200191505060405180910390f35b341561032157600080fd5b610329610ccb565b604051808215151515815260200191505060405180910390f35b341561034e57600080fd5b610356610cde565b6040518082815260200191505060405180910390f35b341561037757600080fd5b6103b060048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610ce5565b604051808215151515815260200191505060405180910390f35b34156103d557600080fd5b6103dd61124b565b005b34156103ea57600080fd5b6103f261130b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561043f57600080fd5b61046b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611330565b005b341561047857600080fd5b6104806113d9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104cd57600080fd5b6104f9600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506113ff565b005b341561050657600080fd5b6105206004808035600019169060200190919050506114a8565b60405180848152602001838152602001828152602001935050505060405180910390f35b341561054f57600080fd5b610569600480803560001916906020019091905050611534565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156105b657600080fd5b6105d0600480803560001916906020019091905050611567565b005b34156105dd57600080fd5b610609600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611a11565b005b341561061657600080fd5b61061e611b66565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610661578082015181840152602081019050610646565b505050509050019250505060405180910390f35b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6040805190810160405280600e81526020017f636f6c6c61746572616c697a657200000000000000000000000000000000000081525081565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561077b57600080fd5b600060149054906101000a900460ff16151561079657600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b60008060008060008060149054906101000a900460ff1615151561080157600080fd5b61080a86611b7d565b8095508196508297508398505050505060008411151561082957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415151561086557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff1660056000886000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156108dc57600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166303a896a1876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b151561095b57600080fd5b6102c65a03f1151561096c57600080fd5b505050604051805190508273ffffffffffffffffffffffffffffffffffffffff166399114d84888573ffffffffffffffffffffffffffffffffffffffff16632762dd8c8b6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610a1257600080fd5b6102c65a03f11515610a2357600080fd5b505050604051805190506000604051602001526040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050602060405180830381600087803b1515610a9657600080fd5b6102c65a03f11515610aa757600080fd5b5050506040518051905011151515610abe57600080fd5b60056000876000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060056000876000191660001916815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690558473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82866000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1515610be557600080fd5b6102c65a03f11515610bf657600080fd5b505050604051805190501515610c0b57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff1686600019167f2621540e2b91ca10330d6a7cbd6fb8cab2396f91c4935ad76b1183770819fa1f8787604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a3505050505050565b6000610cc4610cb58362015180611d3990919063ffffffff16565b42611d7490919063ffffffff16565b9050919050565b600060149054906101000a900460ff1681565b6201518081565b6000806000806000806000610d04336006611d8d90919063ffffffff16565b1515610d0f57600080fd5b600060149054906101000a900460ff16151515610d2b57600080fd5b610d3489611b7d565b809650819750829850839950505050503373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515610d7e57600080fd5b600085111515610d8d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614151515610dc957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560008b6000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515610e3f57600080fd5b859150309050848273ffffffffffffffffffffffffffffffffffffffff166370a082318a6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1515610ee957600080fd5b6102c65a03f11515610efa57600080fd5b5050506040518051905010151515610f1157600080fd5b848273ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e8a600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b151561100b57600080fd5b6102c65a03f1151561101c57600080fd5b505050604051805190501015151561103357600080fd5b87600560008b6000191660001916815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166315dacbea838a84896000604051602001526040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050602060405180830381600087803b15156111c257600080fd5b6102c65a03f115156111d357600080fd5b5050506040518051905015156111e857600080fd5b8573ffffffffffffffffffffffffffffffffffffffff1689600019167f38f12634ebefbe7f6767652aae05e220f95e0ca8ef8353c9c9c5ae439a592aec876040518082815260200191505060405180910390a36001965050505050505092915050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156112a657600080fd5b600060149054906101000a900460ff161515156112c257600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561138b57600080fd5b6113d6816040805190810160405280600e81526020017f636f6c6c61746572616c697a65720000000000000000000000000000000000008152506006611de69092919063ffffffff16565b50565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561145a57600080fd5b6114a5816040805190810160405280600e81526020017f636f6c6c61746572616c697a657200000000000000000000000000000000000081525060066120dc9092919063ffffffff16565b50565b6000806000806000806000806d0ff0000000000000000000000000600102891694506c0fffffffffffffffffffffff00600102891693506c1000000000000000000000000085600190048115156114fb57fe5b049250610100846001900481151561150f57fe5b04915060ff600102891690508282826001900497509750975050505050509193909250565b60056020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008060008060149054906101000a900460ff1615151561158a57600080fd5b61159386611b7d565b809550819650829750839850505050506000841115156115b257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141515156115ee57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff1660056000886000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561166557600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166303a896a1876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156116e457600080fd5b6102c65a03f115156116f557600080fd5b505050604051805190508273ffffffffffffffffffffffffffffffffffffffff166399114d848861172587610c9a565b6000604051602001526040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050602060405180830381600087803b151561178e57600080fd5b6102c65a03f1151561179f57600080fd5b505050604051805190501115156117b557600080fd5b60056000876000191660001916815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ba20dda4876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b151561189457600080fd5b6102c65a03f115156118a557600080fd5b5050506040518051905090508473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82866000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b151561195c57600080fd5b6102c65a03f1151561196d57600080fd5b50505060405180519050151561198257600080fd5b8073ffffffffffffffffffffffffffffffffffffffff1686600019167f50d195a4b80a950617a8e0e18ac9dd4c0236ac72d5e12355d881443823870d398787604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a3505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a6c57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611aa857600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611b6e612365565b611b7860066122b8565b905090565b600080600080600080600080600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636be39bda8c6000604051604001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082600019166000191681526020019150506040805180830381600087803b1515611c2c57600080fd5b6102c65a03f11515611c3d57600080fd5b505050604051805190602001805190508096508197505050611c5e856114a8565b809450819550829650505050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635715c5b7856000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515611d0357600080fd5b6102c65a03f11515611d1457600080fd5b5050506040518051905090508083838899509950995099505050505050509193509193565b6000806000841415611d4e5760009150611d6d565b8284029050828482811515611d5f57fe5b04141515611d6957fe5b8091505b5092915050565b6000828211151515611d8257fe5b818303905092915050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000806000611df58686611d8d565b1515611e0057600080fd5b8560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600186600201805490500391508560020182815481101515611e6257fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055808660020184815481101515611ef357fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090558560020182815481101515611fd857fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600186600201818180549050039150816120209190612379565b508473ffffffffffffffffffffffffffffffffffffffff167f0814e4ee85854cea446b4a27a460e5ffb41516230dbc02f226c07907e432241c856040518080602001828103825283818151815260200191508051906020019080838360005b8381101561209a57808201518184015260208101905061207f565b50505050905090810190601f1680156120c75780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050505050565b6120e68383612350565b15156120f157600080fd5b60018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555082600201805480600101828161216191906123a5565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060018360020180549050038360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f571925c699f9072cec76b6c6c000571cc8d0bb5c47e5819202e2e9496c6508b5826040518080602001828103825283818151815260200191508051906020019080838360005b8381101561227957808201518184015260208101905061225e565b50505050905090810190601f1680156122a65780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b6122c0612365565b8160020180548060200260200160405190810160405280929190818152602001828054801561234457602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116122fa575b50505050509050919050565b600061235c8383611d8d565b15905092915050565b602060405190810160405280600081525090565b8154818355818115116123a05781836000526020600020918201910161239f91906123d1565b5b505050565b8154818355818115116123cc578183600052602060002091820191016123cb91906123d1565b5b505050565b6123f391905b808211156123ef5760008160009055506001016123d7565b5090565b905600a165627a7a72305820f08f44266b9c50a091dac8a1b531ea3e794d76850524bba8c8e6b748e5160fa60029", + "deployedBytecode": "0x606060405260043610610111576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680627eb667146101165780630eefdbad1461016b5780632e667c4e146101c05780632f866f731461024e5780633f4ba83a146102a357806344c4ea95146102b85780634bbf7a67146102df5780635c975abb1461031657806361a52a3614610343578063649404bd1461036c5780638456cb59146103ca5780638da5cb5b146103df5780639ae1c1f3146104345780639d23c4c71461046d578063ae72c6ef146104c2578063ca062647146104fb578063e4b67a4c14610544578063ed8e52bd146105ab578063f2fde38b146105d2578063f466f42e1461060b575b600080fd5b341561012157600080fd5b610129610675565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561017657600080fd5b61017e61069b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101cb57600080fd5b6101d36106c1565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102135780820151818401526020810190506101f8565b50505050905090810190601f1680156102405780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561025957600080fd5b6102616106fa565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102ae57600080fd5b6102b6610720565b005b34156102c357600080fd5b6102dd6004808035600019169060200190919050506107de565b005b34156102ea57600080fd5b6103006004808035906020019091905050610c9a565b6040518082815260200191505060405180910390f35b341561032157600080fd5b610329610ccb565b604051808215151515815260200191505060405180910390f35b341561034e57600080fd5b610356610cde565b6040518082815260200191505060405180910390f35b341561037757600080fd5b6103b060048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610ce5565b604051808215151515815260200191505060405180910390f35b34156103d557600080fd5b6103dd61124b565b005b34156103ea57600080fd5b6103f261130b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561043f57600080fd5b61046b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611330565b005b341561047857600080fd5b6104806113d9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104cd57600080fd5b6104f9600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506113ff565b005b341561050657600080fd5b6105206004808035600019169060200190919050506114a8565b60405180848152602001838152602001828152602001935050505060405180910390f35b341561054f57600080fd5b610569600480803560001916906020019091905050611534565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156105b657600080fd5b6105d0600480803560001916906020019091905050611567565b005b34156105dd57600080fd5b610609600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611a11565b005b341561061657600080fd5b61061e611b66565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610661578082015181840152602081019050610646565b505050509050019250505060405180910390f35b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6040805190810160405280600e81526020017f636f6c6c61746572616c697a657200000000000000000000000000000000000081525081565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561077b57600080fd5b600060149054906101000a900460ff16151561079657600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b60008060008060008060149054906101000a900460ff1615151561080157600080fd5b61080a86611b7d565b8095508196508297508398505050505060008411151561082957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415151561086557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff1660056000886000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156108dc57600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166303a896a1876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b151561095b57600080fd5b6102c65a03f1151561096c57600080fd5b505050604051805190508273ffffffffffffffffffffffffffffffffffffffff166399114d84888573ffffffffffffffffffffffffffffffffffffffff16632762dd8c8b6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610a1257600080fd5b6102c65a03f11515610a2357600080fd5b505050604051805190506000604051602001526040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050602060405180830381600087803b1515610a9657600080fd5b6102c65a03f11515610aa757600080fd5b5050506040518051905011151515610abe57600080fd5b60056000876000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060056000876000191660001916815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690558473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82866000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1515610be557600080fd5b6102c65a03f11515610bf657600080fd5b505050604051805190501515610c0b57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff1686600019167f2621540e2b91ca10330d6a7cbd6fb8cab2396f91c4935ad76b1183770819fa1f8787604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a3505050505050565b6000610cc4610cb58362015180611d3990919063ffffffff16565b42611d7490919063ffffffff16565b9050919050565b600060149054906101000a900460ff1681565b6201518081565b6000806000806000806000610d04336006611d8d90919063ffffffff16565b1515610d0f57600080fd5b600060149054906101000a900460ff16151515610d2b57600080fd5b610d3489611b7d565b809650819750829850839950505050503373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515610d7e57600080fd5b600085111515610d8d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614151515610dc957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560008b6000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515610e3f57600080fd5b859150309050848273ffffffffffffffffffffffffffffffffffffffff166370a082318a6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1515610ee957600080fd5b6102c65a03f11515610efa57600080fd5b5050506040518051905010151515610f1157600080fd5b848273ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e8a600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b151561100b57600080fd5b6102c65a03f1151561101c57600080fd5b505050604051805190501015151561103357600080fd5b87600560008b6000191660001916815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166315dacbea838a84896000604051602001526040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050602060405180830381600087803b15156111c257600080fd5b6102c65a03f115156111d357600080fd5b5050506040518051905015156111e857600080fd5b8573ffffffffffffffffffffffffffffffffffffffff1689600019167f38f12634ebefbe7f6767652aae05e220f95e0ca8ef8353c9c9c5ae439a592aec876040518082815260200191505060405180910390a36001965050505050505092915050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156112a657600080fd5b600060149054906101000a900460ff161515156112c257600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561138b57600080fd5b6113d6816040805190810160405280600e81526020017f636f6c6c61746572616c697a65720000000000000000000000000000000000008152506006611de69092919063ffffffff16565b50565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561145a57600080fd5b6114a5816040805190810160405280600e81526020017f636f6c6c61746572616c697a657200000000000000000000000000000000000081525060066120dc9092919063ffffffff16565b50565b6000806000806000806000806d0ff0000000000000000000000000600102891694506c0fffffffffffffffffffffff00600102891693506c1000000000000000000000000085600190048115156114fb57fe5b049250610100846001900481151561150f57fe5b04915060ff600102891690508282826001900497509750975050505050509193909250565b60056020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008060008060149054906101000a900460ff1615151561158a57600080fd5b61159386611b7d565b809550819650829750839850505050506000841115156115b257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141515156115ee57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff1660056000886000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561166557600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166303a896a1876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156116e457600080fd5b6102c65a03f115156116f557600080fd5b505050604051805190508273ffffffffffffffffffffffffffffffffffffffff166399114d848861172587610c9a565b6000604051602001526040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050602060405180830381600087803b151561178e57600080fd5b6102c65a03f1151561179f57600080fd5b505050604051805190501115156117b557600080fd5b60056000876000191660001916815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ba20dda4876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b151561189457600080fd5b6102c65a03f115156118a557600080fd5b5050506040518051905090508473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82866000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b151561195c57600080fd5b6102c65a03f1151561196d57600080fd5b50505060405180519050151561198257600080fd5b8073ffffffffffffffffffffffffffffffffffffffff1686600019167f50d195a4b80a950617a8e0e18ac9dd4c0236ac72d5e12355d881443823870d398787604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a3505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a6c57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611aa857600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611b6e612365565b611b7860066122b8565b905090565b600080600080600080600080600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636be39bda8c6000604051604001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082600019166000191681526020019150506040805180830381600087803b1515611c2c57600080fd5b6102c65a03f11515611c3d57600080fd5b505050604051805190602001805190508096508197505050611c5e856114a8565b809450819550829650505050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635715c5b7856000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515611d0357600080fd5b6102c65a03f11515611d1457600080fd5b5050506040518051905090508083838899509950995099505050505050509193509193565b6000806000841415611d4e5760009150611d6d565b8284029050828482811515611d5f57fe5b04141515611d6957fe5b8091505b5092915050565b6000828211151515611d8257fe5b818303905092915050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000806000611df58686611d8d565b1515611e0057600080fd5b8560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600186600201805490500391508560020182815481101515611e6257fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055808660020184815481101515611ef357fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090558560020182815481101515611fd857fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600186600201818180549050039150816120209190612379565b508473ffffffffffffffffffffffffffffffffffffffff167f0814e4ee85854cea446b4a27a460e5ffb41516230dbc02f226c07907e432241c856040518080602001828103825283818151815260200191508051906020019080838360005b8381101561209a57808201518184015260208101905061207f565b50505050905090810190601f1680156120c75780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050505050565b6120e68383612350565b15156120f157600080fd5b60018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555082600201805480600101828161216191906123a5565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060018360020180549050038360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f571925c699f9072cec76b6c6c000571cc8d0bb5c47e5819202e2e9496c6508b5826040518080602001828103825283818151815260200191508051906020019080838360005b8381101561227957808201518184015260208101905061225e565b50505050905090810190601f1680156122a65780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b6122c0612365565b8160020180548060200260200160405190810160405280929190818152602001828054801561234457602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116122fa575b50505050509050919050565b600061235c8383611d8d565b15905092915050565b602060405190810160405280600081525090565b8154818355818115116123a05781836000526020600020918201910161239f91906123d1565b5b505050565b8154818355818115116123cc578183600052602060002091820191016123cb91906123d1565b5b505050565b6123f391905b808211156123ef5760008160009055506001016123d7565b5090565b905600a165627a7a72305820f08f44266b9c50a091dac8a1b531ea3e794d76850524bba8c8e6b748e5160fa60029", "sourceMap": "1169:15132:0:-;;;268:5:37;247:26;;;;;;;;;;;;;;;;;;;;2393:391:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;509:10:39;501:5;;:18;;;;;;;;;;;;;;;;;;2589:11:0;2569:17;;:31;;;;;;;;;;;;;;;;;;2638:13;2610:12;;:42;;;;;;;;;;;;;;;;;;2692:14;2662:13;;:45;;;;;;;;;;;;;;;;;;2757:19;2717:18;;:60;;;;;;;;;;;;;;;;;;2393:391;;;;1169:15132;;;;;;", "deployedSourceMap": "1169:15132:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1316:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1433:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1765:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1355:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;833:87:37;;;;;;;;;;;;;;6067:2313:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14803:224;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;247:26:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1712:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3035:2749;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;666:85:37;;;;;;;;;;;;;;238:20:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11766:175:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;1393:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11472:164;;;;;;;;;;;;;;;;;;;;;;;;;;;;13297:1500;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1574:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8640:2707;;;;;;;;;;;;;;;;;;;;;;;;;;;;;832:169:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;12046:177:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;1316:32:0;;;;;;;;;;;;;:::o;1433:44::-;;;;;;;;;;;;;:::o;1765:49::-;;;;;;;;;;;;;;;;;;;;:::o;1355:32::-;;;;;;;;;;;;;:::o;833:87:37:-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;568:6:37;;;;;;;;;;;560:15;;;;;;;;895:5;886:6;;:14;;;;;;;;;;;;;;;;;;906:9;;;;;;;;;;833:87::o;6067:2313:0:-;6235:23;6318:21;6480:22;6597:27;7709:22;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;6825:41:0;6854:11;6825:28;:41::i;:::-;6695:171;;;;;;;;;;;;;;;;6978:1;6959:16;:20;6951:29;;;;;;;;7025:1;6998:29;;:15;:29;;;;6990:38;;;;;;;;7340:1;7290:52;;:25;:38;7316:11;7290:38;;;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;;7282:61;;;;;;;;7586:13;:34;;;7621:11;7586:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7436:13;:39;;;7493:11;7522:13;:33;;;7556:11;7522:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7436:146;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:197;;7415:228;;;;;;;;7734:25;:38;7760:11;7734:38;;;;;;;;;;;;;;;;;;;;;;;;;;;7709:63;;7903:25;:38;7929:11;7903:38;;;;;;;;;;;;;;;;;;7896:45;;;;;;;;;;;8074:15;8068:31;;;8117:14;8149:16;8068:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8047:142;;;;;;;;8290:14;8233:140;;8265:11;8233:140;;;;8318:15;8347:16;8233:140;;;;;;;;;;;;;;;;;;;;;;;;;;;;6067:2313;;;;;;:::o;14803:224::-;14913:4;14940:80;14973:37;14992:17;1750:8;14973:18;;:37;;;;:::i;:::-;14940:15;:19;;:80;;;;:::i;:::-;14933:87;;14803:224;;;:::o;247:26:37:-;;;;;;;;;;;;;:::o;1712:46:0:-;1750:8;1712:46;:::o;3035:2749::-;3217:13;3302:23;3385:21;3547:22;3664:27;4607:16;4658:17;2315:53;2357:10;2315:28;:41;;:53;;;;:::i;:::-;2307:62;;;;;;;;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;3891:41:0;3920:11;3891:28;:41::i;:::-;3761:171;;;;;;;;;;;;;;;;3968:10;3951:27;;:13;:27;;;3943:36;;;;;;;;4016:1;3997:16;:20;3989:29;;;;;;;;4063:1;4036:29;;:15;:29;;;;4028:38;;;;;;;;4593:1;4543:52;;:25;:38;4569:11;4543:38;;;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;4535:61;;;;;;;;4632:15;4607:41;;4686:4;4658:33;;4901:16;4861:10;:20;;;4882:14;4861:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:56;;4853:65;;;;;;;;5163:16;5103:10;:20;;;5124:14;5140:18;;;;;;;;;;;5103:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:76;;5095:85;;;;;;;;5354:14;5313:25;:38;5339:11;5313:38;;;;;;;;;;;;;;;;;;:55;;;;;;;;;;;;;;;;;;5477:18;;;;;;;;;;;:31;;;5522:10;5546:14;5574:9;5597:16;5477:146;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5469:155;;;;;;;;5721:15;5691:64;;5708:11;5691:64;;;;5738:16;5691:64;;;;;;;;;;;;;;;;;;5773:4;5766:11;;3035:2749;;;;;;;;;;:::o;666:85:37:-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;729:4;720:6;;:13;;;;;;;;;;;;;;;;;;739:7;;;;;;;;;;666:85::o;238:20:39:-;;;;;;;;;;;;;:::o;11766:175:0:-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;11870:64:0;11919:5;11926:7;;;;;;;;;;;;;;;;;;11870:28;:48;;:64;;;;;:::i;:::-;11766:175;:::o;1393:34::-;;;;;;;;;;;;;:::o;11472:164::-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;11575:54:0;11614:5;11621:7;;;;;;;;;;;;;;;;;;11575:28;:38;;:54;;;;;:::i;:::-;11472:164;:::o;13297:1500::-;13407:4;13413;13419;13523:35;13765:31;14138:25;14220:21;14542:25;13586:66;13573:79;;:10;:79;13523:129;;13824:66;13811:79;;:10;:79;13765:125;;14202:8;14171:27;14166:33;;;:44;;;;;;;;14138:72;;14276:6;14249:23;14244:29;;;:38;;;;;;;;14220:62;;14595:66;14582:79;;:10;:79;14542:119;;14693:20;14727:16;14762:17;14757:23;;;14672:118;;;;;;13297:1500;;;;;;;;;;:::o;1574:60::-;;;;;;;;;;;;;;;;;;;;;;:::o;8640:2707::-;8808:23;8891:21;9053:22;9170:27;10861:19;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;9397:41:0;9426:11;9397:28;:41::i;:::-;9267:171;;;;;;;;;;;;;;;;9550:1;9531:16;:20;9523:29;;;;;;;;9597:1;9570:29;;:15;:29;;;;9562:38;;;;;;;;9909:1;9859:52;;:25;:38;9885:11;9859:38;;;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;;9851:61;;;;;;;;10565:13;:34;;;10600:11;10565:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10412:13;:39;;;10469:11;10498:50;10530:17;10498:31;:50::i;:::-;10412:150;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:200;10391:231;;;;;;;;10753:25;:38;10779:11;10753:38;;;;;;;;;;;;;;;;;;10746:45;;;;;;;;;;;10883:12;;;;;;;;;;;:27;;;10911:11;10883:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10861:62;;11048:15;11042:31;;;11091:11;11120:16;11042:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11021:139;;;;;;;;11260:11;11205:135;;11235:11;11205:135;;;;11285:15;11314:16;11205:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;8640:2707;;;;;;:::o;832:169:39:-;653:5;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;928:1;908:22;;:8;:22;;;;900:31;;;;;;;;965:8;937:37;;958:5;;;;;;;;;;;937:37;;;;;;;;;;;;988:8;980:5;;:16;;;;;;;;;;;;;;;;;;832:169;:::o;12046:177:0:-;12134:9;;:::i;:::-;12166:50;:28;:48;:50::i;:::-;12159:57;;12046:177;:::o;15033:1266::-;15152:24;15190:22;15226:23;15263:28;15316;15354:31;15570:25;15605:21;15636:22;16027:30;15525:12;;;;;;;;;;;:21;;;15547:11;15525:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15475:84;;;;;;;;15871:60;15907:23;15871:35;:60::i;:::-;15763:168;;;;;;;;;;;;16060:13;;;;;;;;;;;:36;;;16097:20;16060:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16027:91;;16150:22;16186:16;16216:17;16261:20;16129:163;;;;;;;;15033:1266;;;;;;;;;;;:::o;203:173:38:-;261:7;316:9;285:1;280;:6;276:35;;;303:1;296:8;;;;276:35;332:1;328;:5;316:17;;355:1;350;346;:5;;;;;;;;:10;339:18;;;;;;370:1;363:8;;203:173;;;;;;:::o;835:110::-;893:7;920:1;915;:6;;908:14;;;;;;939:1;935;:5;928:12;;835:110;;;;:::o;3295:166:17:-;3405:4;3432;:15;;:22;3448:5;3432:22;;;;;;;;;;;;;;;;;;;;;;;;;3425:29;;3295:166;;;;:::o;2121:1168::-;2489:25;2551:23;2619:19;2452:25;2465:4;2471:5;2452:12;:25::i;:::-;2444:34;;;;;;;;2517:4;:17;;:24;2535:5;2517:24;;;;;;;;;;;;;;;;2489:52;;2608:1;2577:4;:21;;:28;;;;:32;2551:58;;2641:4;:21;;2663:18;2641:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;2619:63;;2745:4;:15;;:22;2761:5;2745:22;;;;;;;;;;;;;;;;2738:29;;;;;;;;;;;2894:11;2848:4;:21;;2870:20;2848:43;;;;;;;;;;;;;;;;;;;:57;;;;;;;;;;;;;;;;;;3009:20;2976:4;:17;;:30;2994:11;2976:30;;;;;;;;;;;;;;;:53;;;;3046:4;:17;;:24;3064:5;3046:24;;;;;;;;;;;;;;;3039:31;;;3144:4;:21;;3166:18;3144:41;;;;;;;;;;;;;;;;;;;3137:48;;;;;;;;;;;3227:1;3195:4;:21;;:33;;;;;;;;;;;;;;:::i;:::-;;3260:5;3239:43;;;3267:14;3239:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2121:1168:17;;;;;;:::o;1732:383::-;1884:28;1900:4;1906:5;1884:15;:28::i;:::-;1876:37;;;;;;;;1949:4;1924;:15;;:22;1940:5;1924:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;1963:4;:21;;:33;;;;;;;;;;;:::i;:::-;;;;;;;;;;1990:5;1963:33;;;;;;;;;;;;;;;;;;;;;;;2064:1;2033:4;:21;;:28;;;;:32;2006:4;:17;;:24;2024:5;2006:24;;;;;;;;;;;;;;;:59;;;;2086:5;2075:33;;;2093:14;2075:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1732:383:17;;;:::o;3646:162::-;3748:9;;:::i;:::-;3780:4;:21;;3773:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3646:162;;;:::o;3467:173::-;3580:4;3608:25;3621:4;3627:5;3608:12;:25::i;:::-;3607:26;3600:33;;3467:173;;;;:::o;1169:15132:0:-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\nimport \"zeppelin-solidity/contracts/math/SafeMath.sol\";\nimport \"zeppelin-solidity/contracts/token/ERC20/ERC20.sol\";\n\nimport \"./TermsContract.sol\";\nimport \"./DebtRegistry.sol\";\nimport \"./TokenRegistry.sol\";\nimport \"./TokenTransferProxy.sol\";\nimport { PermissionsLib, PermissionEvents } from \"./libraries/PermissionsLib.sol\";\n\n\n/**\n * Contains functionality for collateralizing assets, by transferring them from\n * a debtor address to this contract as a custodian.\n *\n * Authors (in no particular order): nadavhollander, saturnial, jdkanani, graemecode\n */\ncontract Collateralizer is Pausable, PermissionEvents {\n using PermissionsLib for PermissionsLib.Permissions;\n using SafeMath for uint;\n\n address public debtKernelAddress;\n\n DebtRegistry public debtRegistry;\n TokenRegistry public tokenRegistry;\n TokenTransferProxy public tokenTransferProxy;\n\n // Collateralizer here refers to the owner of the asset that is being collateralized.\n mapping(bytes32 => address) public agreementToCollateralizer;\n\n PermissionsLib.Permissions internal collateralizationPermissions;\n\n uint public constant SECONDS_IN_DAY = 24*60*60;\n\n string public constant CONTEXT = \"collateralizer\";\n\n event CollateralLocked(\n bytes32 indexed agreementID,\n address indexed token,\n uint amount\n );\n\n event CollateralReturned(\n bytes32 indexed agreementID,\n address indexed collateralizer,\n address token,\n uint amount\n );\n\n event CollateralSeized(\n bytes32 indexed agreementID,\n address indexed beneficiary,\n address token,\n uint amount\n );\n\n modifier onlyAuthorizedToCollateralize() {\n require(collateralizationPermissions.isAuthorized(msg.sender));\n _;\n }\n\n function Collateralizer(\n address _debtKernel,\n address _debtRegistry,\n address _tokenRegistry,\n address _tokenTransferProxy\n ) public {\n debtKernelAddress = _debtKernel;\n debtRegistry = DebtRegistry(_debtRegistry);\n tokenRegistry = TokenRegistry(_tokenRegistry);\n tokenTransferProxy = TokenTransferProxy(_tokenTransferProxy);\n }\n\n /**\n * Transfers collateral from the debtor to the current contract, as custodian.\n *\n * @param agreementId bytes32 The debt agreement's ID\n * @param collateralizer address The owner of the asset being collateralized\n */\n function collateralize(\n bytes32 agreementId,\n address collateralizer\n )\n public\n onlyAuthorizedToCollateralize\n whenNotPaused\n returns (bool _success)\n {\n // The token in which collateral is denominated\n address collateralToken;\n // The amount being put up for collateral\n uint collateralAmount;\n // The number of days a debtor has after a debt enters default\n // before their collateral is eligible for seizure.\n uint gracePeriodInDays;\n // The terms contract according to which this asset is being collateralized.\n TermsContract termsContract;\n\n // Fetch all relevant collateralization parameters\n (\n collateralToken,\n collateralAmount,\n gracePeriodInDays,\n termsContract\n ) = retrieveCollateralParameters(agreementId);\n\n require(termsContract == msg.sender);\n require(collateralAmount > 0);\n require(collateralToken != address(0));\n\n /*\n Ensure that the agreement has not already been collateralized.\n\n If the agreement has already been collateralized, this check will fail\n because any valid collateralization must have some sort of valid\n address associated with it as a collateralizer. Given that it is impossible\n to send transactions from address 0x0, this check will only fail\n when the agreement is already collateralized.\n */\n require(agreementToCollateralizer[agreementId] == address(0));\n\n ERC20 erc20token = ERC20(collateralToken);\n address custodian = address(this);\n\n /*\n The collateralizer must have sufficient balance equal to or greater\n than the amount being put up for collateral.\n */\n require(erc20token.balanceOf(collateralizer) >= collateralAmount);\n\n /*\n The proxy must have an allowance granted by the collateralizer equal\n to or greater than the amount being put up for collateral.\n */\n require(erc20token.allowance(collateralizer, tokenTransferProxy) >= collateralAmount);\n\n // store collaterallizer in mapping, effectively demarcating that the\n // agreement is now collateralized.\n agreementToCollateralizer[agreementId] = collateralizer;\n\n // the collateral must be successfully transferred to this contract, via a proxy.\n require(tokenTransferProxy.transferFrom(\n erc20token,\n collateralizer,\n custodian,\n collateralAmount\n ));\n\n // emit event that collateral has been secured.\n CollateralLocked(agreementId, collateralToken, collateralAmount);\n\n return true;\n }\n\n /**\n * Returns collateral to the debt agreement's original collateralizer\n * if and only if the debt agreement's term has lapsed and\n * the total expected repayment value has been repaid.\n *\n * @param agreementId bytes32 The debt agreement's ID\n */\n function returnCollateral(\n bytes32 agreementId\n )\n public\n whenNotPaused\n {\n // The token in which collateral is denominated\n address collateralToken;\n // The amount being put up for collateral\n uint collateralAmount;\n // The number of days a debtor has after a debt enters default\n // before their collateral is eligible for seizure.\n uint gracePeriodInDays;\n // The terms contract according to which this asset is being collateralized.\n TermsContract termsContract;\n\n // Fetch all relevant collateralization parameters.\n (\n collateralToken,\n collateralAmount,\n gracePeriodInDays,\n termsContract\n ) = retrieveCollateralParameters(agreementId);\n\n // Ensure a valid form of collateral is tied to this agreement id\n require(collateralAmount > 0);\n require(collateralToken != address(0));\n\n // Withdrawal can only occur if the collateral has yet to be withdrawn.\n // When we withdraw collateral, we reset the collateral agreement\n // in a gas-efficient manner by resetting the address of the collateralizer to 0\n require(agreementToCollateralizer[agreementId] != address(0));\n\n // Ensure that the debt is not in a state of default\n require(\n termsContract.getExpectedRepaymentValue(\n agreementId,\n termsContract.getTermEndTimestamp(agreementId)\n ) <= termsContract.getValueRepaidToDate(agreementId)\n );\n\n // determine collateralizer of the collateral.\n address collateralizer = agreementToCollateralizer[agreementId];\n\n // Mark agreement's collateral as withdrawn by setting the agreement's\n // collateralizer to 0x0.\n delete agreementToCollateralizer[agreementId];\n\n // transfer the collateral this contract was holding in escrow back to collateralizer.\n require(\n ERC20(collateralToken).transfer(\n collateralizer,\n collateralAmount\n )\n );\n\n // log the return event.\n CollateralReturned(\n agreementId,\n collateralizer,\n collateralToken,\n collateralAmount\n );\n }\n\n /**\n * Seizes the collateral from the given debt agreement and\n * transfers it to the debt agreement's current beneficiary\n * (i.e. the person who \"owns\" the debt).\n *\n * @param agreementId bytes32 The debt agreement's ID\n */\n function seizeCollateral(\n bytes32 agreementId\n )\n public\n whenNotPaused\n {\n\n // The token in which collateral is denominated\n address collateralToken;\n // The amount being put up for collateral\n uint collateralAmount;\n // The number of days a debtor has after a debt enters default\n // before their collateral is eligible for seizure.\n uint gracePeriodInDays;\n // The terms contract according to which this asset is being collateralized.\n TermsContract termsContract;\n\n // Fetch all relevant collateralization parameters\n (\n collateralToken,\n collateralAmount,\n gracePeriodInDays,\n termsContract\n ) = retrieveCollateralParameters(agreementId);\n\n // Ensure a valid form of collateral is tied to this agreement id\n require(collateralAmount > 0);\n require(collateralToken != address(0));\n\n // Seizure can only occur if the collateral has yet to be withdrawn.\n // When we withdraw collateral, we reset the collateral agreement\n // in a gas-efficient manner by resetting the address of the collateralizer to 0\n require(agreementToCollateralizer[agreementId] != address(0));\n\n // Ensure debt is in a state of default when we account for the\n // specified \"grace period\". We do this by checking whether the\n // *current* value repaid to-date exceeds the expected repayment value\n // at the point of time at which the grace period would begin if it ended\n // now. This crucially relies on the assumption that both expected repayment value\n /// and value repaid to date monotonically increase over time\n require(\n termsContract.getExpectedRepaymentValue(\n agreementId,\n timestampAdjustedForGracePeriod(gracePeriodInDays)\n ) > termsContract.getValueRepaidToDate(agreementId)\n );\n\n // Mark agreement's collateral as withdrawn by setting the agreement's\n // collateralizer to 0x0.\n delete agreementToCollateralizer[agreementId];\n\n // determine beneficiary of the seized collateral.\n address beneficiary = debtRegistry.getBeneficiary(agreementId);\n\n // transfer the collateral this contract was holding in escrow to beneficiary.\n require(\n ERC20(collateralToken).transfer(\n beneficiary,\n collateralAmount\n )\n );\n\n // log the seizure event.\n CollateralSeized(\n agreementId,\n beneficiary,\n collateralToken,\n collateralAmount\n );\n }\n\n /**\n * Adds an address to the list of agents authorized\n * to invoke the `collateralize` function.\n */\n function addAuthorizedCollateralizeAgent(address agent)\n public\n onlyOwner\n {\n collateralizationPermissions.authorize(agent, CONTEXT);\n }\n\n /**\n * Removes an address from the list of agents authorized\n * to invoke the `collateralize` function.\n */\n function revokeCollateralizeAuthorization(address agent)\n public\n onlyOwner\n {\n collateralizationPermissions.revokeAuthorization(agent, CONTEXT);\n }\n\n /**\n * Returns the list of agents authorized to invoke the 'collateralize' function.\n */\n function getAuthorizedCollateralizeAgents()\n public\n view\n returns(address[])\n {\n return collateralizationPermissions.getAuthorizedAgents();\n }\n\n /**\n * Unpacks collateralization-specific parameters from their tightly-packed\n * representation in a terms contract parameter string.\n *\n * For collateralized terms contracts, we reserve the lowest order 108 bits\n * of the terms contract parameters for parameters relevant to collateralization.\n *\n * Contracts that inherit from the Collateralized terms contract\n * can encode whichever parameter schema they please in the remaining\n * space of the terms contract parameters.\n * The 108 bits are encoded as follows (from higher order bits to lower order bits):\n *\n * 8 bits - Collateral Token (encoded by its unsigned integer index in the TokenRegistry contract)\n * 92 bits - Collateral Amount (encoded as an unsigned integer)\n * 8 bits - Grace Period* Length (encoded as an unsigned integer)\n *\n * * = The \"Grace\" Period is the number of days a debtor has between\n * when they fall behind on an expected payment and when their collateral\n * can be seized by the creditor.\n */\n function unpackCollateralParametersFromBytes(bytes32 parameters)\n public\n pure\n returns (uint, uint, uint)\n {\n // The first byte of the 108 reserved bits represents the collateral token.\n bytes32 collateralTokenIndexShifted =\n parameters & 0x0000000000000000000000000000000000000ff0000000000000000000000000;\n // The subsequent 92 bits represents the collateral amount, as denominated in the above token.\n bytes32 collateralAmountShifted =\n parameters & 0x000000000000000000000000000000000000000fffffffffffffffffffffff00;\n\n // We bit-shift these values, respectively, 100 bits and 8 bits right using\n // mathematical operations, so that their 32 byte integer counterparts\n // correspond to the intended values packed in the 32 byte string\n uint collateralTokenIndex = uint(collateralTokenIndexShifted) / 2 ** 100;\n uint collateralAmount = uint(collateralAmountShifted) / 2 ** 8;\n\n // The last byte of the parameters represents the \"grace period\" of the loan,\n // as defined in terms of days.\n // Since this value takes the rightmost place in the parameters string,\n // we do not need to bit-shift it.\n bytes32 gracePeriodInDays =\n parameters & 0x00000000000000000000000000000000000000000000000000000000000000ff;\n\n return (\n collateralTokenIndex,\n collateralAmount,\n uint(gracePeriodInDays)\n );\n }\n\n function timestampAdjustedForGracePeriod(uint gracePeriodInDays)\n public\n view\n returns (uint)\n {\n return block.timestamp.sub(\n SECONDS_IN_DAY.mul(gracePeriodInDays)\n );\n }\n\n function retrieveCollateralParameters(bytes32 agreementId)\n internal\n view\n returns (\n address _collateralToken,\n uint _collateralAmount,\n uint _gracePeriodInDays,\n TermsContract _termsContract\n )\n {\n address termsContractAddress;\n bytes32 termsContractParameters;\n\n // Pull the terms contract and associated parameters for the agreement\n (termsContractAddress, termsContractParameters) = debtRegistry.getTerms(agreementId);\n\n uint collateralTokenIndex;\n uint collateralAmount;\n uint gracePeriodInDays;\n\n // Unpack terms contract parameters in order to get collateralization-specific params\n (\n collateralTokenIndex,\n collateralAmount,\n gracePeriodInDays\n ) = unpackCollateralParametersFromBytes(termsContractParameters);\n\n // Resolve address of token associated with this agreement in token registry\n address collateralTokenAddress = tokenRegistry.getTokenAddressByIndex(collateralTokenIndex);\n\n return (\n collateralTokenAddress,\n collateralAmount,\n gracePeriodInDays,\n TermsContract(termsContractAddress)\n );\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/Collateralizer.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/Collateralizer.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/Collateralizer.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/Collateralizer.sol", "exportedSymbols": { "Collateralizer": [ 614 @@ -528,7 +528,7 @@ export const Collateralizer = { "attributes": { "SourceUnit": 4758, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/TermsContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/TermsContract.sol", "file": "./TermsContract.sol", "scope": 615, "symbolAliases": [ @@ -543,7 +543,7 @@ export const Collateralizer = { "attributes": { "SourceUnit": 3159, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/DebtRegistry.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/DebtRegistry.sol", "file": "./DebtRegistry.sol", "scope": 615, "symbolAliases": [ @@ -558,7 +558,7 @@ export const Collateralizer = { "attributes": { "SourceUnit": 5114, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/TokenRegistry.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/TokenRegistry.sol", "file": "./TokenRegistry.sol", "scope": 615, "symbolAliases": [ @@ -573,7 +573,7 @@ export const Collateralizer = { "attributes": { "SourceUnit": 5207, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/TokenTransferProxy.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/TokenTransferProxy.sol", "file": "./TokenTransferProxy.sol", "scope": 615, "symbolAliases": [ @@ -588,7 +588,7 @@ export const Collateralizer = { "attributes": { "SourceUnit": 6272, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/libraries/PermissionsLib.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/libraries/PermissionsLib.sol", "file": "./libraries/PermissionsLib.sol", "scope": 615, "symbolAliases": [ @@ -9802,7 +9802,7 @@ export const Collateralizer = } }, "links": {}, - "address": "0xf5ff656bfeada48090daf7341a2d4e160d699d27" + "address": "0x39ab84786d3696677cb62181f56286c9496b490b" }, "70": { "events": { @@ -9951,5 +9951,5 @@ export const Collateralizer = } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:15:01.357Z" + "updatedAt": "2018-10-09T17:51:53.173Z" } \ No newline at end of file diff --git a/artifacts/ts/ContractRegistry.ts b/artifacts/ts/ContractRegistry.ts index 9cf71fd6..9eee18cd 100644 --- a/artifacts/ts/ContractRegistry.ts +++ b/artifacts/ts/ContractRegistry.ts @@ -221,15 +221,15 @@ export const ContractRegistry = "type": "event" } ], - "bytecode": "0x6060604052341561000f57600080fd5b60405160e080610e5683398101604052808051906020019091908051906020019091908051906020019091908051906020019091908051906020019091908051906020019091908051906020019091905050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555086600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050505050610bd88061027e6000396000f3006060604052600436106100a4576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063079dd4b7146100a95780630eefdbad146100fe5780632f866f73146101535780636fa9d056146101a8578063869f0511146101fd5780638da5cb5b146102525780639d23c4c7146102a7578063e2aa46bb146102fc578063f2fde38b14610341578063f8d898981461037a575b600080fd5b34156100b457600080fd5b6100bc6103cf565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561010957600080fd5b6101116103f5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015e57600080fd5b61016661041b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101b357600080fd5b6101bb610441565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561020857600080fd5b610210610467565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561025d57600080fd5b61026561048d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102b257600080fd5b6102ba6104b2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561030757600080fd5b61033f600480803560ff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506104d8565b005b341561034c57600080fd5b610378600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506109b6565b005b341561038557600080fd5b61038d610b0b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561053557600080fd5b6000600681111561054257fe5b83600681111561054e57fe5b14156105c957600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506105838282610b31565b81600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061094b565b600160068111156105d657fe5b8360068111156105e257fe5b141561065d57600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506106178282610b31565b81600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061094a565b6002600681111561066a57fe5b83600681111561067657fe5b14156106f157600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506106ab8282610b31565b81600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610949565b600360068111156106fe57fe5b83600681111561070a57fe5b141561078557600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061073f8282610b31565b81600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610948565b6004600681111561079257fe5b83600681111561079e57fe5b141561081957600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506107d38282610b31565b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610947565b6005600681111561082657fe5b83600681111561083257fe5b14156108ad57600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506108678282610b31565b81600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610946565b6006808111156108b957fe5b8360068111156108c557fe5b141561094057600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506108fa8282610b31565b81600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610945565b600080fd5b5b5b5b5b5b5b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1684600681111561098557fe5b7fea5852cbfaa20064a0ffec7659e5b7178c40ecc51d8788b6981bfa062bc6e78860405160405180910390a4505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a1157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610a4d57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515610b6d57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515610ba857600080fd5b50505600a165627a7a72305820863aed3d99d08dd18c74da28de24f902c7888dba43fa57be5382cd9453da81520029", - "deployedBytecode": "0x6060604052600436106100a4576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063079dd4b7146100a95780630eefdbad146100fe5780632f866f73146101535780636fa9d056146101a8578063869f0511146101fd5780638da5cb5b146102525780639d23c4c7146102a7578063e2aa46bb146102fc578063f2fde38b14610341578063f8d898981461037a575b600080fd5b34156100b457600080fd5b6100bc6103cf565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561010957600080fd5b6101116103f5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015e57600080fd5b61016661041b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101b357600080fd5b6101bb610441565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561020857600080fd5b610210610467565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561025d57600080fd5b61026561048d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102b257600080fd5b6102ba6104b2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561030757600080fd5b61033f600480803560ff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506104d8565b005b341561034c57600080fd5b610378600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506109b6565b005b341561038557600080fd5b61038d610b0b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561053557600080fd5b6000600681111561054257fe5b83600681111561054e57fe5b14156105c957600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506105838282610b31565b81600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061094b565b600160068111156105d657fe5b8360068111156105e257fe5b141561065d57600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506106178282610b31565b81600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061094a565b6002600681111561066a57fe5b83600681111561067657fe5b14156106f157600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506106ab8282610b31565b81600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610949565b600360068111156106fe57fe5b83600681111561070a57fe5b141561078557600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061073f8282610b31565b81600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610948565b6004600681111561079257fe5b83600681111561079e57fe5b141561081957600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506107d38282610b31565b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610947565b6005600681111561082657fe5b83600681111561083257fe5b14156108ad57600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506108678282610b31565b81600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610946565b6006808111156108b957fe5b8360068111156108c557fe5b141561094057600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506108fa8282610b31565b81600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610945565b600080fd5b5b5b5b5b5b5b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1684600681111561098557fe5b7fea5852cbfaa20064a0ffec7659e5b7178c40ecc51d8788b6981bfa062bc6e78860405160405180910390a4505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a1157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610a4d57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515610b6d57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515610ba857600080fd5b50505600a165627a7a72305820863aed3d99d08dd18c74da28de24f902c7888dba43fa57be5382cd9453da81520029", + "bytecode": "0x6060604052341561000f57600080fd5b60405160e080610e5683398101604052808051906020019091908051906020019091908051906020019091908051906020019091908051906020019091908051906020019091908051906020019091905050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555086600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050505050610bd88061027e6000396000f3006060604052600436106100a4576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063079dd4b7146100a95780630eefdbad146100fe5780632f866f73146101535780636fa9d056146101a8578063869f0511146101fd5780638da5cb5b146102525780639d23c4c7146102a7578063e2aa46bb146102fc578063f2fde38b14610341578063f8d898981461037a575b600080fd5b34156100b457600080fd5b6100bc6103cf565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561010957600080fd5b6101116103f5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015e57600080fd5b61016661041b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101b357600080fd5b6101bb610441565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561020857600080fd5b610210610467565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561025d57600080fd5b61026561048d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102b257600080fd5b6102ba6104b2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561030757600080fd5b61033f600480803560ff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506104d8565b005b341561034c57600080fd5b610378600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506109b6565b005b341561038557600080fd5b61038d610b0b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561053557600080fd5b6000600681111561054257fe5b83600681111561054e57fe5b14156105c957600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506105838282610b31565b81600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061094b565b600160068111156105d657fe5b8360068111156105e257fe5b141561065d57600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506106178282610b31565b81600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061094a565b6002600681111561066a57fe5b83600681111561067657fe5b14156106f157600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506106ab8282610b31565b81600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610949565b600360068111156106fe57fe5b83600681111561070a57fe5b141561078557600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061073f8282610b31565b81600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610948565b6004600681111561079257fe5b83600681111561079e57fe5b141561081957600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506107d38282610b31565b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610947565b6005600681111561082657fe5b83600681111561083257fe5b14156108ad57600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506108678282610b31565b81600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610946565b6006808111156108b957fe5b8360068111156108c557fe5b141561094057600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506108fa8282610b31565b81600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610945565b600080fd5b5b5b5b5b5b5b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1684600681111561098557fe5b7fea5852cbfaa20064a0ffec7659e5b7178c40ecc51d8788b6981bfa062bc6e78860405160405180910390a4505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a1157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610a4d57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515610b6d57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515610ba857600080fd5b50505600a165627a7a72305820d2c3695b4e3dc0d3df9860fc48c7997a17a9cac2d105fc35b68b7c1d4971de900029", + "deployedBytecode": "0x6060604052600436106100a4576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063079dd4b7146100a95780630eefdbad146100fe5780632f866f73146101535780636fa9d056146101a8578063869f0511146101fd5780638da5cb5b146102525780639d23c4c7146102a7578063e2aa46bb146102fc578063f2fde38b14610341578063f8d898981461037a575b600080fd5b34156100b457600080fd5b6100bc6103cf565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561010957600080fd5b6101116103f5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015e57600080fd5b61016661041b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101b357600080fd5b6101bb610441565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561020857600080fd5b610210610467565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561025d57600080fd5b61026561048d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102b257600080fd5b6102ba6104b2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561030757600080fd5b61033f600480803560ff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506104d8565b005b341561034c57600080fd5b610378600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506109b6565b005b341561038557600080fd5b61038d610b0b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561053557600080fd5b6000600681111561054257fe5b83600681111561054e57fe5b14156105c957600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506105838282610b31565b81600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061094b565b600160068111156105d657fe5b8360068111156105e257fe5b141561065d57600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506106178282610b31565b81600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061094a565b6002600681111561066a57fe5b83600681111561067657fe5b14156106f157600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506106ab8282610b31565b81600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610949565b600360068111156106fe57fe5b83600681111561070a57fe5b141561078557600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061073f8282610b31565b81600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610948565b6004600681111561079257fe5b83600681111561079e57fe5b141561081957600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506107d38282610b31565b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610947565b6005600681111561082657fe5b83600681111561083257fe5b14156108ad57600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506108678282610b31565b81600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610946565b6006808111156108b957fe5b8360068111156108c557fe5b141561094057600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506108fa8282610b31565b81600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610945565b600080fd5b5b5b5b5b5b5b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1684600681111561098557fe5b7fea5852cbfaa20064a0ffec7659e5b7178c40ecc51d8788b6981bfa062bc6e78860405160405180910390a4505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a1157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610a4d57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515610b6d57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515610ba857600080fd5b50505600a165627a7a72305820d2c3695b4e3dc0d3df9860fc48c7997a17a9cac2d105fc35b68b7c1d4971de900029", "sourceMap": "298:3506:1:-;;;971:667;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;509:10:39;501:5;;:18;;;;;;;;;;;;;;;;;;1288:15:1;1256:14;;:48;;;;;;;;;;;;;;;;;;1338:11;1314:10;;:36;;;;;;;;;;;;;;;;;;1388:13;1360:12;;:42;;;;;;;;;;;;;;;;;;1434:10;1412:9;;:33;;;;;;;;;;;;;;;;;;1489:16;1455:15;;:51;;;;;;;;;;;;;;;;;;1546:14;1516:13;;:45;;;;;;;;;;;;;;;;;;1611:19;1571:18;;:60;;;;;;;;;;;;;;;;;;971:667;;;;;;;298:3506;;;;;;", "deployedSourceMap": "298:3506:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;731:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;920:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;765:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;836:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;689:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;238:20:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;880:34:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1644:1853;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;832:169:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;804:26:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;731:28;;;;;;;;;;;;;:::o;920:44::-;;;;;;;;;;;;;:::o;765:33::-;;;;;;;;;;;;;:::o;836:38::-;;;;;;;;;;;;;:::o;689:36::-;;;;;;;;;;;;;:::o;238:20:39:-;;;;;;;;;;;;;:::o;880:34:1:-;;;;;;;;;;;;;:::o;1644:1853::-;1783:18;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;1832:27:1;1816:43;;;;;;;;:12;:43;;;;;;;;;1812:1608;;;1896:14;;;;;;;;;;;1875:36;;1925:42;1944:10;1956;1925:18;:42::i;:::-;2013:10;1981:14;;:43;;;;;;;;;;;;;;;;;;1812:1608;;;2061:23;2045:39;;;;;;;;:12;:39;;;;;;;;;2041:1379;;;2121:10;;;;;;;;;;;2100:32;;2146:42;2165:10;2177;2146:18;:42::i;:::-;2226:10;2202;;:35;;;;;;;;;;;;;;;;;;2041:1379;;;2274:25;2258:41;;;;;;;;:12;:41;;;;;;;;;2254:1166;;;2336:12;;;;;;;;;;;2315:34;;2363:42;2382:10;2394;2363:18;:42::i;:::-;2447:10;2419:12;;:39;;;;;;;;;;;;;;;;;;2254:1166;;;2495:22;2479:38;;;;;;;;:12;:38;;;;;;;;;2475:945;;;2554:9;;;;;;;;;;;2533:31;;2578:42;2597:10;2609;2578:18;:42::i;:::-;2656:10;2634:9;;:33;;;;;;;;;;;;;;;;;;2475:945;;;2704:28;2688:44;;;;;;;;:12;:44;;;;;;;;;2684:736;;;2769:15;;;;;;;;;;;2748:37;;2799:42;2818:10;2830;2799:18;:42::i;:::-;2889:10;2855:15;;:45;;;;;;;;;;;;;;;;;;2684:736;;;2937:26;2921:42;;;;;;;;:12;:42;;;;;;;;;2917:503;;;3000:13;;;;;;;;;;;2979:35;;3028:42;3047:10;3059;3028:18;:42::i;:::-;3114:10;3084:13;;:41;;;;;;;;;;;;;;;;;;2917:503;;;3162:31;3146:47;;;;;;;;:12;:47;;;;;;;;;3142:278;;;3230:18;;;;;;;;;;;3209:40;;3263:42;3282:10;3294;3263:18;:42::i;:::-;3359:10;3319:18;;:51;;;;;;;;;;;;;;;;;;3142:278;;;3401:8;;;3142:278;2917:503;2684:736;2475:945;2254:1166;2041:1379;1812:1608;3479:10;3430:60;;3467:10;3430:60;;3453:12;3430:60;;;;;;;;;;;;;;;;;;1644:1853;;;:::o;832:169:39:-;653:5;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;928:1;908:22;;:8;:22;;;;900:31;;;;;;;;965:8;937:37;;958:5;;;;;;;;;;;937:37;;;;;;;;;;;;988:8;980:5;;:16;;;;;;;;;;;;;;;;;;832:169;:::o;804:26:1:-;;;;;;;;;;;;;:::o;3503:299::-;3667:1;3645:24;;:10;:24;;;;3637:33;;;;;;;;3741:10;3727:24;;:10;:24;;;;3719:33;;;;;;;;3503:299;;:::o", "source": "pragma solidity 0.4.18;\n\nimport \"zeppelin-solidity/contracts/ownership/Ownable.sol\";\n\nimport \"./Collateralizer.sol\";\nimport \"./DebtKernel.sol\";\nimport \"./DebtRegistry.sol\";\nimport \"./DebtToken.sol\";\nimport \"./RepaymentRouter.sol\";\nimport \"./TokenRegistry.sol\";\nimport \"./TokenTransferProxy.sol\";\n\n\ncontract ContractRegistry is Ownable {\n\n event ContractAddressUpdated(\n ContractType indexed contractType,\n address indexed oldAddress,\n address indexed newAddress\n );\n\n enum ContractType {\n Collateralizer,\n DebtKernel,\n DebtRegistry,\n DebtToken,\n RepaymentRouter,\n TokenRegistry,\n TokenTransferProxy\n }\n\n Collateralizer public collateralizer;\n DebtKernel public debtKernel;\n DebtRegistry public debtRegistry;\n DebtToken public debtToken;\n RepaymentRouter public repaymentRouter;\n TokenRegistry public tokenRegistry;\n TokenTransferProxy public tokenTransferProxy;\n\n function ContractRegistry(\n address _collateralizer,\n address _debtKernel,\n address _debtRegistry,\n address _debtToken,\n address _repaymentRouter,\n address _tokenRegistry,\n address _tokenTransferProxy\n )\n public\n {\n collateralizer = Collateralizer(_collateralizer);\n debtKernel = DebtKernel(_debtKernel);\n debtRegistry = DebtRegistry(_debtRegistry);\n debtToken = DebtToken(_debtToken);\n repaymentRouter = RepaymentRouter(_repaymentRouter);\n tokenRegistry = TokenRegistry(_tokenRegistry);\n tokenTransferProxy = TokenTransferProxy(_tokenTransferProxy);\n }\n\n function updateAddress(\n ContractType contractType,\n address newAddress\n )\n public\n onlyOwner\n {\n address oldAddress;\n\n if (contractType == ContractType.Collateralizer) {\n oldAddress = address(collateralizer);\n validateNewAddress(newAddress, oldAddress);\n collateralizer = Collateralizer(newAddress);\n } else if (contractType == ContractType.DebtKernel) {\n oldAddress = address(debtKernel);\n validateNewAddress(newAddress, oldAddress);\n debtKernel = DebtKernel(newAddress);\n } else if (contractType == ContractType.DebtRegistry) {\n oldAddress = address(debtRegistry);\n validateNewAddress(newAddress, oldAddress);\n debtRegistry = DebtRegistry(newAddress);\n } else if (contractType == ContractType.DebtToken) {\n oldAddress = address(debtToken);\n validateNewAddress(newAddress, oldAddress);\n debtToken = DebtToken(newAddress);\n } else if (contractType == ContractType.RepaymentRouter) {\n oldAddress = address(repaymentRouter);\n validateNewAddress(newAddress, oldAddress);\n repaymentRouter = RepaymentRouter(newAddress);\n } else if (contractType == ContractType.TokenRegistry) {\n oldAddress = address(tokenRegistry);\n validateNewAddress(newAddress, oldAddress);\n tokenRegistry = TokenRegistry(newAddress);\n } else if (contractType == ContractType.TokenTransferProxy) {\n oldAddress = address(tokenTransferProxy);\n validateNewAddress(newAddress, oldAddress);\n tokenTransferProxy = TokenTransferProxy(newAddress);\n } else {\n revert();\n }\n\n ContractAddressUpdated(contractType, oldAddress, newAddress);\n }\n\n function validateNewAddress(\n address newAddress,\n address oldAddress\n )\n internal\n pure\n {\n require(newAddress != address(0)); // new address cannot be null address.\n require(newAddress != oldAddress); // new address cannot be existing address.\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/ContractRegistry.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/ContractRegistry.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/ContractRegistry.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/ContractRegistry.sol", "exportedSymbols": { "ContractRegistry": [ 923 @@ -267,7 +267,7 @@ export const ContractRegistry = { "attributes": { "SourceUnit": 615, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/Collateralizer.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/Collateralizer.sol", "file": "./Collateralizer.sol", "scope": 924, "symbolAliases": [ @@ -282,7 +282,7 @@ export const ContractRegistry = { "attributes": { "SourceUnit": 2631, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/DebtKernel.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/DebtKernel.sol", "file": "./DebtKernel.sol", "scope": 924, "symbolAliases": [ @@ -297,7 +297,7 @@ export const ContractRegistry = { "attributes": { "SourceUnit": 3159, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/DebtRegistry.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/DebtRegistry.sol", "file": "./DebtRegistry.sol", "scope": 924, "symbolAliases": [ @@ -312,7 +312,7 @@ export const ContractRegistry = { "attributes": { "SourceUnit": 3541, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/DebtToken.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/DebtToken.sol", "file": "./DebtToken.sol", "scope": 924, "symbolAliases": [ @@ -327,7 +327,7 @@ export const ContractRegistry = { "attributes": { "SourceUnit": 4708, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/RepaymentRouter.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/RepaymentRouter.sol", "file": "./RepaymentRouter.sol", "scope": 924, "symbolAliases": [ @@ -342,7 +342,7 @@ export const ContractRegistry = { "attributes": { "SourceUnit": 5114, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/TokenRegistry.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/TokenRegistry.sol", "file": "./TokenRegistry.sol", "scope": 924, "symbolAliases": [ @@ -357,7 +357,7 @@ export const ContractRegistry = { "attributes": { "SourceUnit": 5207, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/TokenTransferProxy.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/TokenTransferProxy.sol", "file": "./TokenTransferProxy.sol", "scope": 924, "symbolAliases": [ @@ -4731,7 +4731,7 @@ export const ContractRegistry = } }, "links": {}, - "address": "0x98090fb23948d09772840b7440e7cdd4c28c2c8d" + "address": "0x342e4778937a0fa5879aa594d0f57370f1a0e5d9" }, "70": { "events": { @@ -4780,5 +4780,5 @@ export const ContractRegistry = } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:16:36.727Z" + "updatedAt": "2018-10-09T17:53:24.840Z" } \ No newline at end of file diff --git a/artifacts/ts/CreditorProxy.ts b/artifacts/ts/CreditorProxy.ts index 994b0a65..efb70aa5 100644 --- a/artifacts/ts/CreditorProxy.ts +++ b/artifacts/ts/CreditorProxy.ts @@ -309,15 +309,15 @@ export const CreditorProxy = "type": "event" } ], - "bytecode": "0x606060405260008060146101000a81548160ff021916908315150217905550341561002957600080fd5b604051602080611be483398101604052808051906020019091905050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050611b0e806100d66000396000f3006060604052600436106100ba576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633c1c90a7146100bf5780633f4ba83a1461015d57806347f7835d146101725780635c975abb146102d05780638456cb59146102fd5780638da5cb5b14610312578063a318b5f714610367578063abf410e5146103a6578063c1614d00146103fb578063e283040d1461043a578063f06bbf751461046b578063f2fde38b1461049c575b600080fd5b34156100ca57600080fd5b61015b60048080608001906004806020026040519081016040528092919082600460200280828437820191505050505091908060800190600480602002604051908101604052809291908260046020028082843782019150505050509190806020019060018060200260405190810160405280929190826001602002808284378201915050505050919050506104d5565b005b341561016857600080fd5b6101706105e1565b005b341561017d57600080fd5b6102b2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908060c001906006806020026040519081016040528092919082600660200280828437820191505050505091908061010001906008806020026040519081016040528092919082600860200280828437820191505050505091908060200190600180602002604051908101604052809291908260016020028082843782019150505050509190806060019060038060200260405190810160405280929190826003602002808284378201915050505050919080606001906003806020026040519081016040528092919082600360200280828437820191505050505091908060600190600380602002604051908101604052809291908260036020028082843782019150505050509190505061069f565b60405180826000191660001916815260200191505060405180910390f35b34156102db57600080fd5b6102e3610fa7565b604051808215151515815260200191505060405180910390f35b341561030857600080fd5b610310610fba565b005b341561031d57600080fd5b61032561107a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561037257600080fd5b61038c60048080356000191690602001909190505061109f565b604051808215151515815260200191505060405180910390f35b34156103b157600080fd5b6103b96110bf565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561040657600080fd5b6104206004808035600019169060200190919050506110e5565b604051808215151515815260200191505060405180910390f35b341561044557600080fd5b61044d611105565b60405180826000191660001916815260200191505060405180910390f35b341561047657600080fd5b61047e61110d565b604051808261ffff1661ffff16815260200191505060405180910390f35b34156104a757600080fd5b6104d3600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611113565b005b60008060149054906101000a900460ff161515156104f257600080fd5b83600060048110151561050157fe5b602002015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561053f57600080fd5b61054a848484611268565b9050600160026000836000191660001916815260200190815260200160002060006101000a81548160ff021916908315150217905550806000191684600060048110151561059457fe5b602002015173ffffffffffffffffffffffffffffffffffffffff167f07d3242876ac355520b94ab74873262d83b5b81dbd5da781118f78cee0bbe74760405160405180910390a350505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561063c57600080fd5b600060149054906101000a900460ff16151561065757600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b600080600080600060149054906101000a900460ff161515156106c157600080fd5b6108436080604051908101604052808d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018c600060068110151561071157fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018c600260068110151561075657fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018c600360068110151561079b57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152506080604051908101604052808c60056008811015156107ea57fe5b602002015181526020018c600060088110151561080357fe5b602002015181526020018c600760088110151561081c57fe5b602002015181526020018c600160088110151561083557fe5b60200201518152508a611268565b925060036000846000191660001916815260200190815260200160002060009054906101000a900460ff16156108d75782600019168b73ffffffffffffffffffffffffffffffffffffffff166001600381111561089c57fe5b60ff167f2ced8b4371717a8c6ce644dc517a7eaf4c7c0b52e5ab304c4c7472b15588b10260405160405180910390a460006001029350610f99565b60026000846000191660001916815260200190815260200160002060009054906101000a900460ff16156109695782600019168b73ffffffffffffffffffffffffffffffffffffffff166000600381111561092e57fe5b60ff167f2ced8b4371717a8c6ce644dc517a7eaf4c7c0b52e5ab304c4c7472b15588b10260405160405180910390a460006001029350610f99565b6109af8b8489600160038110151561097d57fe5b602002015189600160038110151561099157fe5b60200201518960016003811015156109a557fe5b6020020151611468565b1515610a195782600019168b73ffffffffffffffffffffffffffffffffffffffff16600260038111156109de57fe5b60ff167f2ced8b4371717a8c6ce644dc517a7eaf4c7c0b52e5ab304c4c7472b15588b10260405160405180910390a460006001029350610f99565b610a52896005600881101515610a2b57fe5b60200201518a6002600881101515610a3f57fe5b602002015161156f90919063ffffffff16565b9150610a728b8b6004600681101515610a6757fe5b60200201518461158d565b1515610adb5782600019168b73ffffffffffffffffffffffffffffffffffffffff16600380811115610aa057fe5b60ff167f2ced8b4371717a8c6ce644dc517a7eaf4c7c0b52e5ab304c4c7472b15588b10260405160405180910390a460006001029350610f99565b6000821115610b0f57610b038a6004600681101515610af657fe5b60200201518c30856116a9565b1515610b0e57600080fd5b5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663079dd4b76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610b9d57600080fd5b6102c65a03f11515610bae57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663e6488fc9308c8c8c8c8c8c6000604051602001526040518863ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200187600660200280838360005b83811015610c6b578082015181840152602081019050610c50565b5050505090500186600860200280838360005b83811015610c99578082015181840152602081019050610c7e565b5050505090500185600160200280838360005b83811015610cc7578082015181840152602081019050610cac565b5050505090500184600360200280838360005b83811015610cf5578082015181840152602081019050610cda565b5050505090500183600360200280838360005b83811015610d23578082015181840152602081019050610d08565b5050505090500182600360200280838360005b83811015610d51578082015181840152602081019050610d36565b50505050905001975050505050505050602060405180830381600087803b1515610d7a57600080fd5b6102c65a03f11515610d8b57600080fd5b505050604051805190509050600060010260001916816000191614151515610db257600080fd5b600160036000856000191660001916815260200190815260200160002060006101000a81548160ff021916908315150217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f8d898986000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610e7457600080fd5b6102c65a03f11515610e8557600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8c83600190046040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1515610f3457600080fd5b6102c65a03f11515610f4557600080fd5b505050806000191683600019168c73ffffffffffffffffffffffffffffffffffffffff167f44bca8cc6f9375e3d800b6361e71fdde37e4fc86bdc3a72c4f8f69bbd19a01f360405160405180910390a48093505b505050979650505050505050565b600060149054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561101557600080fd5b600060149054906101000a900460ff1615151561103157600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60026020528060005260406000206000915054906101000a900460ff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60036020528060005260406000206000915054906101000a900460ff1681565b600060010281565b611f4081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561116e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156111aa57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600083600060048110151561127957fe5b602002015184600160048110151561128d57fe5b60200201518460006004811015156112a157fe5b60200201518660026004811015156112b557fe5b60200201518660016004811015156112c957fe5b60200201518860036004811015156112dd57fe5b60200201518760006001811015156112f157fe5b602002015189600260048110151561130557fe5b60200201518a600360048110151561131957fe5b6020020151604051808a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018881526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140184600019166000191681526020018381526020018281526020019950505050505050505050604051809103902090509392505050565b600060018560405180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c0182600019166000191681526020019150506040518091039020858585604051600081526020016040526000604051602001526040518085600019166000191681526020018460ff1660ff16815260200183600019166000191681526020018260001916600019168152602001945050505050602060405160208103908084039060008661646e5a03f1151561152d57600080fd5b50506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b600080828401905083811015151561158357fe5b8091505092915050565b60008060008061159e8688306117af565b92506115aa86886118a7565b9150848210806115b957508483105b156115c7576000935061169f565b61167a8630600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630eefdbad6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561165a57600080fd5b6102c65a03f1151561166b57600080fd5b505050604051805190506117af565b90508481101561169a5761168e868661196a565b151561169957600080fd5b5b600193505b5050509392505050565b60008473ffffffffffffffffffffffffffffffffffffffff166323b872dd8585856000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b151561178a57600080fd5b6102c65a03f1151561179b57600080fd5b505050604051805190509050949350505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e611f4061ffff1685856040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600088803b151561188657600080fd5b87f1151561189357600080fd5b505050506040518051905090509392505050565b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231611f4061ffff16846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600088803b151561194a57600080fd5b87f1151561195757600080fd5b5050505060405180519050905092915050565b60008273ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630eefdbad6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515611a1657600080fd5b6102c65a03f11515611a2757600080fd5b50505060405180519050846000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1515611abf57600080fd5b6102c65a03f11515611ad057600080fd5b505050604051805190509050929150505600a165627a7a7230582077351096e22ed68088d0c4d2d4e0c3c66fd364f8bacf64149f14f1cdb40aa1850029", - "deployedBytecode": "0x6060604052600436106100ba576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633c1c90a7146100bf5780633f4ba83a1461015d57806347f7835d146101725780635c975abb146102d05780638456cb59146102fd5780638da5cb5b14610312578063a318b5f714610367578063abf410e5146103a6578063c1614d00146103fb578063e283040d1461043a578063f06bbf751461046b578063f2fde38b1461049c575b600080fd5b34156100ca57600080fd5b61015b60048080608001906004806020026040519081016040528092919082600460200280828437820191505050505091908060800190600480602002604051908101604052809291908260046020028082843782019150505050509190806020019060018060200260405190810160405280929190826001602002808284378201915050505050919050506104d5565b005b341561016857600080fd5b6101706105e1565b005b341561017d57600080fd5b6102b2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908060c001906006806020026040519081016040528092919082600660200280828437820191505050505091908061010001906008806020026040519081016040528092919082600860200280828437820191505050505091908060200190600180602002604051908101604052809291908260016020028082843782019150505050509190806060019060038060200260405190810160405280929190826003602002808284378201915050505050919080606001906003806020026040519081016040528092919082600360200280828437820191505050505091908060600190600380602002604051908101604052809291908260036020028082843782019150505050509190505061069f565b60405180826000191660001916815260200191505060405180910390f35b34156102db57600080fd5b6102e3610fa7565b604051808215151515815260200191505060405180910390f35b341561030857600080fd5b610310610fba565b005b341561031d57600080fd5b61032561107a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561037257600080fd5b61038c60048080356000191690602001909190505061109f565b604051808215151515815260200191505060405180910390f35b34156103b157600080fd5b6103b96110bf565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561040657600080fd5b6104206004808035600019169060200190919050506110e5565b604051808215151515815260200191505060405180910390f35b341561044557600080fd5b61044d611105565b60405180826000191660001916815260200191505060405180910390f35b341561047657600080fd5b61047e61110d565b604051808261ffff1661ffff16815260200191505060405180910390f35b34156104a757600080fd5b6104d3600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611113565b005b60008060149054906101000a900460ff161515156104f257600080fd5b83600060048110151561050157fe5b602002015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561053f57600080fd5b61054a848484611268565b9050600160026000836000191660001916815260200190815260200160002060006101000a81548160ff021916908315150217905550806000191684600060048110151561059457fe5b602002015173ffffffffffffffffffffffffffffffffffffffff167f07d3242876ac355520b94ab74873262d83b5b81dbd5da781118f78cee0bbe74760405160405180910390a350505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561063c57600080fd5b600060149054906101000a900460ff16151561065757600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b600080600080600060149054906101000a900460ff161515156106c157600080fd5b6108436080604051908101604052808d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018c600060068110151561071157fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018c600260068110151561075657fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018c600360068110151561079b57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152506080604051908101604052808c60056008811015156107ea57fe5b602002015181526020018c600060088110151561080357fe5b602002015181526020018c600760088110151561081c57fe5b602002015181526020018c600160088110151561083557fe5b60200201518152508a611268565b925060036000846000191660001916815260200190815260200160002060009054906101000a900460ff16156108d75782600019168b73ffffffffffffffffffffffffffffffffffffffff166001600381111561089c57fe5b60ff167f2ced8b4371717a8c6ce644dc517a7eaf4c7c0b52e5ab304c4c7472b15588b10260405160405180910390a460006001029350610f99565b60026000846000191660001916815260200190815260200160002060009054906101000a900460ff16156109695782600019168b73ffffffffffffffffffffffffffffffffffffffff166000600381111561092e57fe5b60ff167f2ced8b4371717a8c6ce644dc517a7eaf4c7c0b52e5ab304c4c7472b15588b10260405160405180910390a460006001029350610f99565b6109af8b8489600160038110151561097d57fe5b602002015189600160038110151561099157fe5b60200201518960016003811015156109a557fe5b6020020151611468565b1515610a195782600019168b73ffffffffffffffffffffffffffffffffffffffff16600260038111156109de57fe5b60ff167f2ced8b4371717a8c6ce644dc517a7eaf4c7c0b52e5ab304c4c7472b15588b10260405160405180910390a460006001029350610f99565b610a52896005600881101515610a2b57fe5b60200201518a6002600881101515610a3f57fe5b602002015161156f90919063ffffffff16565b9150610a728b8b6004600681101515610a6757fe5b60200201518461158d565b1515610adb5782600019168b73ffffffffffffffffffffffffffffffffffffffff16600380811115610aa057fe5b60ff167f2ced8b4371717a8c6ce644dc517a7eaf4c7c0b52e5ab304c4c7472b15588b10260405160405180910390a460006001029350610f99565b6000821115610b0f57610b038a6004600681101515610af657fe5b60200201518c30856116a9565b1515610b0e57600080fd5b5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663079dd4b76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610b9d57600080fd5b6102c65a03f11515610bae57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663e6488fc9308c8c8c8c8c8c6000604051602001526040518863ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200187600660200280838360005b83811015610c6b578082015181840152602081019050610c50565b5050505090500186600860200280838360005b83811015610c99578082015181840152602081019050610c7e565b5050505090500185600160200280838360005b83811015610cc7578082015181840152602081019050610cac565b5050505090500184600360200280838360005b83811015610cf5578082015181840152602081019050610cda565b5050505090500183600360200280838360005b83811015610d23578082015181840152602081019050610d08565b5050505090500182600360200280838360005b83811015610d51578082015181840152602081019050610d36565b50505050905001975050505050505050602060405180830381600087803b1515610d7a57600080fd5b6102c65a03f11515610d8b57600080fd5b505050604051805190509050600060010260001916816000191614151515610db257600080fd5b600160036000856000191660001916815260200190815260200160002060006101000a81548160ff021916908315150217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f8d898986000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610e7457600080fd5b6102c65a03f11515610e8557600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8c83600190046040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1515610f3457600080fd5b6102c65a03f11515610f4557600080fd5b505050806000191683600019168c73ffffffffffffffffffffffffffffffffffffffff167f44bca8cc6f9375e3d800b6361e71fdde37e4fc86bdc3a72c4f8f69bbd19a01f360405160405180910390a48093505b505050979650505050505050565b600060149054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561101557600080fd5b600060149054906101000a900460ff1615151561103157600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60026020528060005260406000206000915054906101000a900460ff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60036020528060005260406000206000915054906101000a900460ff1681565b600060010281565b611f4081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561116e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156111aa57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600083600060048110151561127957fe5b602002015184600160048110151561128d57fe5b60200201518460006004811015156112a157fe5b60200201518660026004811015156112b557fe5b60200201518660016004811015156112c957fe5b60200201518860036004811015156112dd57fe5b60200201518760006001811015156112f157fe5b602002015189600260048110151561130557fe5b60200201518a600360048110151561131957fe5b6020020151604051808a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018881526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140184600019166000191681526020018381526020018281526020019950505050505050505050604051809103902090509392505050565b600060018560405180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c0182600019166000191681526020019150506040518091039020858585604051600081526020016040526000604051602001526040518085600019166000191681526020018460ff1660ff16815260200183600019166000191681526020018260001916600019168152602001945050505050602060405160208103908084039060008661646e5a03f1151561152d57600080fd5b50506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b600080828401905083811015151561158357fe5b8091505092915050565b60008060008061159e8688306117af565b92506115aa86886118a7565b9150848210806115b957508483105b156115c7576000935061169f565b61167a8630600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630eefdbad6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561165a57600080fd5b6102c65a03f1151561166b57600080fd5b505050604051805190506117af565b90508481101561169a5761168e868661196a565b151561169957600080fd5b5b600193505b5050509392505050565b60008473ffffffffffffffffffffffffffffffffffffffff166323b872dd8585856000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b151561178a57600080fd5b6102c65a03f1151561179b57600080fd5b505050604051805190509050949350505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e611f4061ffff1685856040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600088803b151561188657600080fd5b87f1151561189357600080fd5b505050506040518051905090509392505050565b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231611f4061ffff16846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600088803b151561194a57600080fd5b87f1151561195757600080fd5b5050505060405180519050905092915050565b60008273ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630eefdbad6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515611a1657600080fd5b6102c65a03f11515611a2757600080fd5b50505060405180519050846000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1515611abf57600080fd5b6102c65a03f11515611ad057600080fd5b505050604051805190509050929150505600a165627a7a7230582077351096e22ed68088d0c4d2d4e0c3c66fd364f8bacf64149f14f1cdb40aa1850029", + "bytecode": "0x606060405260008060146101000a81548160ff021916908315150217905550341561002957600080fd5b604051602080611be483398101604052808051906020019091905050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050611b0e806100d66000396000f3006060604052600436106100ba576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633c1c90a7146100bf5780633f4ba83a1461015d57806347f7835d146101725780635c975abb146102d05780638456cb59146102fd5780638da5cb5b14610312578063a318b5f714610367578063abf410e5146103a6578063c1614d00146103fb578063e283040d1461043a578063f06bbf751461046b578063f2fde38b1461049c575b600080fd5b34156100ca57600080fd5b61015b60048080608001906004806020026040519081016040528092919082600460200280828437820191505050505091908060800190600480602002604051908101604052809291908260046020028082843782019150505050509190806020019060018060200260405190810160405280929190826001602002808284378201915050505050919050506104d5565b005b341561016857600080fd5b6101706105e1565b005b341561017d57600080fd5b6102b2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908060c001906006806020026040519081016040528092919082600660200280828437820191505050505091908061010001906008806020026040519081016040528092919082600860200280828437820191505050505091908060200190600180602002604051908101604052809291908260016020028082843782019150505050509190806060019060038060200260405190810160405280929190826003602002808284378201915050505050919080606001906003806020026040519081016040528092919082600360200280828437820191505050505091908060600190600380602002604051908101604052809291908260036020028082843782019150505050509190505061069f565b60405180826000191660001916815260200191505060405180910390f35b34156102db57600080fd5b6102e3610fa7565b604051808215151515815260200191505060405180910390f35b341561030857600080fd5b610310610fba565b005b341561031d57600080fd5b61032561107a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561037257600080fd5b61038c60048080356000191690602001909190505061109f565b604051808215151515815260200191505060405180910390f35b34156103b157600080fd5b6103b96110bf565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561040657600080fd5b6104206004808035600019169060200190919050506110e5565b604051808215151515815260200191505060405180910390f35b341561044557600080fd5b61044d611105565b60405180826000191660001916815260200191505060405180910390f35b341561047657600080fd5b61047e61110d565b604051808261ffff1661ffff16815260200191505060405180910390f35b34156104a757600080fd5b6104d3600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611113565b005b60008060149054906101000a900460ff161515156104f257600080fd5b83600060048110151561050157fe5b602002015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561053f57600080fd5b61054a848484611268565b9050600160026000836000191660001916815260200190815260200160002060006101000a81548160ff021916908315150217905550806000191684600060048110151561059457fe5b602002015173ffffffffffffffffffffffffffffffffffffffff167f07d3242876ac355520b94ab74873262d83b5b81dbd5da781118f78cee0bbe74760405160405180910390a350505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561063c57600080fd5b600060149054906101000a900460ff16151561065757600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b600080600080600060149054906101000a900460ff161515156106c157600080fd5b6108436080604051908101604052808d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018c600060068110151561071157fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018c600260068110151561075657fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018c600360068110151561079b57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152506080604051908101604052808c60056008811015156107ea57fe5b602002015181526020018c600060088110151561080357fe5b602002015181526020018c600760088110151561081c57fe5b602002015181526020018c600160088110151561083557fe5b60200201518152508a611268565b925060036000846000191660001916815260200190815260200160002060009054906101000a900460ff16156108d75782600019168b73ffffffffffffffffffffffffffffffffffffffff166001600381111561089c57fe5b60ff167f2ced8b4371717a8c6ce644dc517a7eaf4c7c0b52e5ab304c4c7472b15588b10260405160405180910390a460006001029350610f99565b60026000846000191660001916815260200190815260200160002060009054906101000a900460ff16156109695782600019168b73ffffffffffffffffffffffffffffffffffffffff166000600381111561092e57fe5b60ff167f2ced8b4371717a8c6ce644dc517a7eaf4c7c0b52e5ab304c4c7472b15588b10260405160405180910390a460006001029350610f99565b6109af8b8489600160038110151561097d57fe5b602002015189600160038110151561099157fe5b60200201518960016003811015156109a557fe5b6020020151611468565b1515610a195782600019168b73ffffffffffffffffffffffffffffffffffffffff16600260038111156109de57fe5b60ff167f2ced8b4371717a8c6ce644dc517a7eaf4c7c0b52e5ab304c4c7472b15588b10260405160405180910390a460006001029350610f99565b610a52896005600881101515610a2b57fe5b60200201518a6002600881101515610a3f57fe5b602002015161156f90919063ffffffff16565b9150610a728b8b6004600681101515610a6757fe5b60200201518461158d565b1515610adb5782600019168b73ffffffffffffffffffffffffffffffffffffffff16600380811115610aa057fe5b60ff167f2ced8b4371717a8c6ce644dc517a7eaf4c7c0b52e5ab304c4c7472b15588b10260405160405180910390a460006001029350610f99565b6000821115610b0f57610b038a6004600681101515610af657fe5b60200201518c30856116a9565b1515610b0e57600080fd5b5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663079dd4b76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610b9d57600080fd5b6102c65a03f11515610bae57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663e6488fc9308c8c8c8c8c8c6000604051602001526040518863ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200187600660200280838360005b83811015610c6b578082015181840152602081019050610c50565b5050505090500186600860200280838360005b83811015610c99578082015181840152602081019050610c7e565b5050505090500185600160200280838360005b83811015610cc7578082015181840152602081019050610cac565b5050505090500184600360200280838360005b83811015610cf5578082015181840152602081019050610cda565b5050505090500183600360200280838360005b83811015610d23578082015181840152602081019050610d08565b5050505090500182600360200280838360005b83811015610d51578082015181840152602081019050610d36565b50505050905001975050505050505050602060405180830381600087803b1515610d7a57600080fd5b6102c65a03f11515610d8b57600080fd5b505050604051805190509050600060010260001916816000191614151515610db257600080fd5b600160036000856000191660001916815260200190815260200160002060006101000a81548160ff021916908315150217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f8d898986000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610e7457600080fd5b6102c65a03f11515610e8557600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8c83600190046040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1515610f3457600080fd5b6102c65a03f11515610f4557600080fd5b505050806000191683600019168c73ffffffffffffffffffffffffffffffffffffffff167f44bca8cc6f9375e3d800b6361e71fdde37e4fc86bdc3a72c4f8f69bbd19a01f360405160405180910390a48093505b505050979650505050505050565b600060149054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561101557600080fd5b600060149054906101000a900460ff1615151561103157600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60026020528060005260406000206000915054906101000a900460ff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60036020528060005260406000206000915054906101000a900460ff1681565b600060010281565b611f4081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561116e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156111aa57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600083600060048110151561127957fe5b602002015184600160048110151561128d57fe5b60200201518460006004811015156112a157fe5b60200201518660026004811015156112b557fe5b60200201518660016004811015156112c957fe5b60200201518860036004811015156112dd57fe5b60200201518760006001811015156112f157fe5b602002015189600260048110151561130557fe5b60200201518a600360048110151561131957fe5b6020020151604051808a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018881526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140184600019166000191681526020018381526020018281526020019950505050505050505050604051809103902090509392505050565b600060018560405180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c0182600019166000191681526020019150506040518091039020858585604051600081526020016040526000604051602001526040518085600019166000191681526020018460ff1660ff16815260200183600019166000191681526020018260001916600019168152602001945050505050602060405160208103908084039060008661646e5a03f1151561152d57600080fd5b50506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b600080828401905083811015151561158357fe5b8091505092915050565b60008060008061159e8688306117af565b92506115aa86886118a7565b9150848210806115b957508483105b156115c7576000935061169f565b61167a8630600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630eefdbad6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561165a57600080fd5b6102c65a03f1151561166b57600080fd5b505050604051805190506117af565b90508481101561169a5761168e868661196a565b151561169957600080fd5b5b600193505b5050509392505050565b60008473ffffffffffffffffffffffffffffffffffffffff166323b872dd8585856000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b151561178a57600080fd5b6102c65a03f1151561179b57600080fd5b505050604051805190509050949350505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e611f4061ffff1685856040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600088803b151561188657600080fd5b87f1151561189357600080fd5b505050506040518051905090509392505050565b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231611f4061ffff16846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600088803b151561194a57600080fd5b87f1151561195757600080fd5b5050505060405180519050905092915050565b60008273ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630eefdbad6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515611a1657600080fd5b6102c65a03f11515611a2757600080fd5b50505060405180519050846000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1515611abf57600080fd5b6102c65a03f11515611ad057600080fd5b505050604051805190509050929150505600a165627a7a72305820627f64d2f5e59580e881310ad781c1c18c95e290f478ac08b283c8661b5071d90029", + "deployedBytecode": "0x6060604052600436106100ba576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633c1c90a7146100bf5780633f4ba83a1461015d57806347f7835d146101725780635c975abb146102d05780638456cb59146102fd5780638da5cb5b14610312578063a318b5f714610367578063abf410e5146103a6578063c1614d00146103fb578063e283040d1461043a578063f06bbf751461046b578063f2fde38b1461049c575b600080fd5b34156100ca57600080fd5b61015b60048080608001906004806020026040519081016040528092919082600460200280828437820191505050505091908060800190600480602002604051908101604052809291908260046020028082843782019150505050509190806020019060018060200260405190810160405280929190826001602002808284378201915050505050919050506104d5565b005b341561016857600080fd5b6101706105e1565b005b341561017d57600080fd5b6102b2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908060c001906006806020026040519081016040528092919082600660200280828437820191505050505091908061010001906008806020026040519081016040528092919082600860200280828437820191505050505091908060200190600180602002604051908101604052809291908260016020028082843782019150505050509190806060019060038060200260405190810160405280929190826003602002808284378201915050505050919080606001906003806020026040519081016040528092919082600360200280828437820191505050505091908060600190600380602002604051908101604052809291908260036020028082843782019150505050509190505061069f565b60405180826000191660001916815260200191505060405180910390f35b34156102db57600080fd5b6102e3610fa7565b604051808215151515815260200191505060405180910390f35b341561030857600080fd5b610310610fba565b005b341561031d57600080fd5b61032561107a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561037257600080fd5b61038c60048080356000191690602001909190505061109f565b604051808215151515815260200191505060405180910390f35b34156103b157600080fd5b6103b96110bf565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561040657600080fd5b6104206004808035600019169060200190919050506110e5565b604051808215151515815260200191505060405180910390f35b341561044557600080fd5b61044d611105565b60405180826000191660001916815260200191505060405180910390f35b341561047657600080fd5b61047e61110d565b604051808261ffff1661ffff16815260200191505060405180910390f35b34156104a757600080fd5b6104d3600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611113565b005b60008060149054906101000a900460ff161515156104f257600080fd5b83600060048110151561050157fe5b602002015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561053f57600080fd5b61054a848484611268565b9050600160026000836000191660001916815260200190815260200160002060006101000a81548160ff021916908315150217905550806000191684600060048110151561059457fe5b602002015173ffffffffffffffffffffffffffffffffffffffff167f07d3242876ac355520b94ab74873262d83b5b81dbd5da781118f78cee0bbe74760405160405180910390a350505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561063c57600080fd5b600060149054906101000a900460ff16151561065757600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b600080600080600060149054906101000a900460ff161515156106c157600080fd5b6108436080604051908101604052808d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018c600060068110151561071157fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018c600260068110151561075657fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018c600360068110151561079b57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152506080604051908101604052808c60056008811015156107ea57fe5b602002015181526020018c600060088110151561080357fe5b602002015181526020018c600760088110151561081c57fe5b602002015181526020018c600160088110151561083557fe5b60200201518152508a611268565b925060036000846000191660001916815260200190815260200160002060009054906101000a900460ff16156108d75782600019168b73ffffffffffffffffffffffffffffffffffffffff166001600381111561089c57fe5b60ff167f2ced8b4371717a8c6ce644dc517a7eaf4c7c0b52e5ab304c4c7472b15588b10260405160405180910390a460006001029350610f99565b60026000846000191660001916815260200190815260200160002060009054906101000a900460ff16156109695782600019168b73ffffffffffffffffffffffffffffffffffffffff166000600381111561092e57fe5b60ff167f2ced8b4371717a8c6ce644dc517a7eaf4c7c0b52e5ab304c4c7472b15588b10260405160405180910390a460006001029350610f99565b6109af8b8489600160038110151561097d57fe5b602002015189600160038110151561099157fe5b60200201518960016003811015156109a557fe5b6020020151611468565b1515610a195782600019168b73ffffffffffffffffffffffffffffffffffffffff16600260038111156109de57fe5b60ff167f2ced8b4371717a8c6ce644dc517a7eaf4c7c0b52e5ab304c4c7472b15588b10260405160405180910390a460006001029350610f99565b610a52896005600881101515610a2b57fe5b60200201518a6002600881101515610a3f57fe5b602002015161156f90919063ffffffff16565b9150610a728b8b6004600681101515610a6757fe5b60200201518461158d565b1515610adb5782600019168b73ffffffffffffffffffffffffffffffffffffffff16600380811115610aa057fe5b60ff167f2ced8b4371717a8c6ce644dc517a7eaf4c7c0b52e5ab304c4c7472b15588b10260405160405180910390a460006001029350610f99565b6000821115610b0f57610b038a6004600681101515610af657fe5b60200201518c30856116a9565b1515610b0e57600080fd5b5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663079dd4b76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610b9d57600080fd5b6102c65a03f11515610bae57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663e6488fc9308c8c8c8c8c8c6000604051602001526040518863ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200187600660200280838360005b83811015610c6b578082015181840152602081019050610c50565b5050505090500186600860200280838360005b83811015610c99578082015181840152602081019050610c7e565b5050505090500185600160200280838360005b83811015610cc7578082015181840152602081019050610cac565b5050505090500184600360200280838360005b83811015610cf5578082015181840152602081019050610cda565b5050505090500183600360200280838360005b83811015610d23578082015181840152602081019050610d08565b5050505090500182600360200280838360005b83811015610d51578082015181840152602081019050610d36565b50505050905001975050505050505050602060405180830381600087803b1515610d7a57600080fd5b6102c65a03f11515610d8b57600080fd5b505050604051805190509050600060010260001916816000191614151515610db257600080fd5b600160036000856000191660001916815260200190815260200160002060006101000a81548160ff021916908315150217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f8d898986000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610e7457600080fd5b6102c65a03f11515610e8557600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8c83600190046040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1515610f3457600080fd5b6102c65a03f11515610f4557600080fd5b505050806000191683600019168c73ffffffffffffffffffffffffffffffffffffffff167f44bca8cc6f9375e3d800b6361e71fdde37e4fc86bdc3a72c4f8f69bbd19a01f360405160405180910390a48093505b505050979650505050505050565b600060149054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561101557600080fd5b600060149054906101000a900460ff1615151561103157600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60026020528060005260406000206000915054906101000a900460ff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60036020528060005260406000206000915054906101000a900460ff1681565b600060010281565b611f4081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561116e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156111aa57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600083600060048110151561127957fe5b602002015184600160048110151561128d57fe5b60200201518460006004811015156112a157fe5b60200201518660026004811015156112b557fe5b60200201518660016004811015156112c957fe5b60200201518860036004811015156112dd57fe5b60200201518760006001811015156112f157fe5b602002015189600260048110151561130557fe5b60200201518a600360048110151561131957fe5b6020020151604051808a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018881526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140184600019166000191681526020018381526020018281526020019950505050505050505050604051809103902090509392505050565b600060018560405180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c0182600019166000191681526020019150506040518091039020858585604051600081526020016040526000604051602001526040518085600019166000191681526020018460ff1660ff16815260200183600019166000191681526020018260001916600019168152602001945050505050602060405160208103908084039060008661646e5a03f1151561152d57600080fd5b50506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b600080828401905083811015151561158357fe5b8091505092915050565b60008060008061159e8688306117af565b92506115aa86886118a7565b9150848210806115b957508483105b156115c7576000935061169f565b61167a8630600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630eefdbad6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561165a57600080fd5b6102c65a03f1151561166b57600080fd5b505050604051805190506117af565b90508481101561169a5761168e868661196a565b151561169957600080fd5b5b600193505b5050509392505050565b60008473ffffffffffffffffffffffffffffffffffffffff166323b872dd8585856000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b151561178a57600080fd5b6102c65a03f1151561179b57600080fd5b505050604051805190509050949350505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e611f4061ffff1685856040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600088803b151561188657600080fd5b87f1151561189357600080fd5b505050506040518051905090509392505050565b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231611f4061ffff16846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600088803b151561194a57600080fd5b87f1151561195757600080fd5b5050505060405180519050905092915050565b60008273ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630eefdbad6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515611a1657600080fd5b6102c65a03f11515611a2757600080fd5b50505060405180519050846000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1515611abf57600080fd5b6102c65a03f11515611ad057600080fd5b505050604051805190509050929150505600a165627a7a72305820627f64d2f5e59580e881310ad781c1c18c95e290f478ac08b283c8661b5071d90029", "sourceMap": "1086:9807:2:-;;;268:5:37;247:26;;;;;;;;;;;;;;;;;;;;2040:140:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;509:10:39;501:5;;:18;;;;;;;;;;;;;;;;;;2155:17:2;2119:16;;:54;;;;;;;;;;;;;;;;;;2040:140;1086:9807;;;;;;", "deployedSourceMap": "1086:9807:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5952:607;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;833:87:37;;;;;;;;;;;;;;2398:3455:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;247:26:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;666:85;;;;;;;;;;;;;;238:20:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1502:51:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1333:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1559:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1380:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1441:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;832:169:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;5952:607:2;6246:30;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;6213:19:2;6233:1;6213:22;;;;;;;;;;;;;6199:36;;:10;:36;;;6191:45;;;;;;;;6279:135;6318:19;6351:16;6381:23;6279:25;:135::i;:::-;6246:168;;6469:4;6424:18;:42;6443:22;6424:42;;;;;;;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;6529:22;6483:69;;;6505:19;6525:1;6505:22;;;;;;;;;;;;;6483:69;;;;;;;;;;;;5952:607;;;;:::o;833:87:37:-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;568:6:37;;;;;;;;;;;560:15;;;;;;;;895:5;886:6;;:14;;;;;;;;;;;;;;;;;;906:9;;;;;;;;;;833:87::o;2398:3455:2:-;2835:20;2872:30;4306:25;5247:19;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;2905:550:2;;;;;;;;;;2962:8;2905:550;;;;;;;;2988:14;3003:1;2988:17;;;;;;;;;;;;;2905:550;;;;;;;;3051:14;3066:1;3051:17;;;;;;;;;;;;;2905:550;;;;;;;;3101:14;3116:1;3101:17;;;;;;;;;;;;;2905:550;;;;;;;;;;;;;;;;3181:11;3193:1;3181:14;;;;;;;;;;;;;2905:550;;;;3229:11;3241:1;3229:14;;;;;;;;;;;;;2905:550;;;;3286:11;3298:1;3286:14;;;;;;;;;;;;;2905:550;;;;3356:11;3368:1;3356:14;;;;;;;;;;;;;2905:550;;;3406:12;2905:25;:550::i;:::-;2872:583;;3470:15;:39;3486:22;3470:39;;;;;;;;;;;;;;;;;;;;;;;;;;;3466:192;;;3585:22;3525:83;;;3575:8;3525:83;;3540:32;3534:39;;;;;;;;3525:83;;;;;;;;;;;;1433:1;1425:10;;3622:25;;;;3466:192;3672:18;:42;3691:22;3672:42;;;;;;;;;;;;;;;;;;;;;;;;;;;3668:191;;;3785:22;3730:78;;;3775:8;3730:78;;3745:27;3739:34;;;;;;;;3730:78;;;;;;;;;;;;1433:1;1425:10;;3822:25;;;;3668:191;3874:168;3904:8;3926:22;3962:11;3974:1;3962:14;;;;;;;;;;;;;3990:11;4002:1;3990:14;;;;;;;;;;;;;4018:11;4030:1;4018:14;;;;;;;;;;;;;3874:16;:168::i;:::-;3873:169;3869:384;;;4167:22;4058:145;;;4141:8;4058:145;;4090:32;4084:39;;;;;;;;4058:145;;;;;;;;;;;;1433:1;1425:10;;4217:25;;;;3869:384;4334:34;4353:11;4365:1;4353:14;;;;;;;;;;;;;4334:11;4346:1;4334:14;;;;;;;;;;;;;:18;;:34;;;;:::i;:::-;4306:62;;4384:129;4430:8;4452:14;4467:1;4452:17;;;;;;;;;;;;;4483:20;4384:32;:129::i;:::-;4383:130;4379:362;;;4655:22;4529:162;;;4629:8;4529:162;;4561:49;4555:56;;;;;;;;4529:162;;;;;;;;;;;;1433:1;1425:10;;4705:25;;;;4379:362;4839:1;4816:20;:24;4812:276;;;4881:182;4921:14;4936:1;4921:17;;;;;;;;;;;;;4960:8;4998:4;5025:20;4881:18;:182::i;:::-;4856:221;;;;;;;;4812:276;5269:16;;;;;;;;;;;:27;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:43;;;5334:4;5353:14;5381:11;5406:12;5432:11;5457;5482;5269:234;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;23:1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;23:1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;23:1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;23:1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;23:1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5247:256:2;;1433:1;1425:10;;5522:33;;;:11;:33;;;;;5514:42;;;;;;;;5609:4;5567:15;:39;5583:22;5567:39;;;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;5672:16;;;;;;;;;;;:26;;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:37;;;5710:8;5728:11;5720:20;;;5672:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5805:11;5752:65;;;5781:22;5752:65;;;5771:8;5752:65;;;;;;;;;;;;5835:11;5828:18;;429:1:37;2398:3455:2;;;;;;;;;;;;:::o;247:26:37:-;;;;;;;;;;;;;:::o;666:85::-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;729:4;720:6;;:13;;;;;;;;;;;;;;;;;;739:7;;;;;;;;;;666:85::o;238:20:39:-;;;;;;;;;;;;;:::o;1502:51:2:-;;;;;;;;;;;;;;;;;;;;;;:::o;1333:40::-;;;;;;;;;;;;;:::o;1559:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;1380:55::-;1433:1;1425:10;;1380:55;:::o;1441:54::-;1491:4;1441:54;:::o;832:169:39:-;653:5;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;928:1;908:22;;:8;:22;;;;900:31;;;;;;;;965:8;937:37;;958:5;;;;;;;;;;;937:37;;;;;;;;;;;;988:8;980:5;;:16;;;;;;;;;;;;;;;;;;832:169;:::o;6749:761:2:-;6955:31;7032:19;7052:1;7032:22;;;;;;;;;;;;;7080:19;7100:1;7080:22;;;;;;;;;;;;;7144:16;7161:1;7144:19;;;;;;;;;;;;;7193;7213:1;7193:22;;;;;;;;;;;;;7244:16;7261:1;7244:19;;;;;;;;;;;;;7302;7322:1;7302:22;;;;;;;;;;;;;7355:23;7379:1;7355:26;;;;;;;;;;;;;7395:16;7412:1;7395:19;;;;;;;;;;;;;7466:16;7483:1;7466:19;;;;;;;;;;;;;7009:494;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7002:501;;6749:761;;;;;:::o;8965:360::-;9145:11;9189:129;9258:4;9212:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9277:1;9292;9307;9189:129;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9179:139;;:6;:139;;;9172:146;;8965:360;;;;;;;:::o;1007:129:38:-;1065:7;1080:9;1096:1;1092;:5;1080:17;;1115:1;1110;:6;;1103:14;;;;;;1130:1;1123:8;;1007:129;;;;;:::o;7721:1107:2:-;7896:37;8022:19;8107:20;8396:27;8044:53;8057:14;8073:8;8091:4;8044:12;:53::i;:::-;8022:75;;8130:36;8141:14;8157:8;8130:10;:36::i;:::-;8107:59;;8199:20;8181:15;:38;:79;;;;8240:20;8223:14;:37;8181:79;8177:122;;;8283:5;8276:12;;;;8177:122;8426:128;8452:14;8488:4;8507:16;;;;;;;;;;;:35;;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8426:12;:128::i;:::-;8396:158;;8681:20;8656:22;:45;8652:148;;;8725:63;8751:14;8767:20;8725:25;:63::i;:::-;8717:72;;;;;;;;8652:148;8817:4;8810:11;;7721:1107;;;;;;;;;:::o;10643:248::-;10801:13;10843:6;10837:26;;;10864:5;10871:3;10876:7;10837:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10830:54;;10643:248;;;;;;:::o;9804:337::-;9950:15;10038:5;10032:22;;;1491:4;10032:52;;10098:5;10117:7;10032:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10025:109;;9804:337;;;;;:::o;9421:265::-;9540:13;9626:5;9620:22;;;1491:4;9620:52;;9673:5;9620:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9613:66;;9421:265;;;;:::o;10258:272::-;10377:13;10419:5;10413:20;;;10455:16;;;;;;;;;;;:35;;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10507:6;10413:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10406:117;;10258:272;;;;:::o", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\nimport \"./ContractRegistry.sol\";\nimport \"zeppelin-solidity/contracts/lifecycle/Pausable.sol\";\nimport \"zeppelin-solidity/contracts/math/SafeMath.sol\";\nimport \"zeppelin-solidity/contracts/token/ERC20/ERC20.sol\";\n\n\n/**\n * The CreditorProxy is a thin wrapper around the DebtKernel\n * It implements creditor-driven loans as specified by DIP-1\n *\n * Authors: Bo Henderson & Shivani Gupta & Dharma Team\n * DIP: https://github.com/dharmaprotocol/DIPs/issues/1\n */\ncontract CreditorProxy is Pausable {\n using SafeMath for uint;\n\n enum Errors {\n DEBT_OFFER_CANCELLED,\n DEBT_OFFER_ALREADY_FILLED,\n DEBT_OFFER_NON_CONSENSUAL,\n CREDITOR_BALANCE_OR_ALLOWANCE_INSUFFICIENT\n }\n\n ContractRegistry public contractRegistry;\n\n bytes32 constant public NULL_ISSUANCE_HASH = bytes32(0);\n uint16 constant public EXTERNAL_QUERY_GAS_LIMIT = 8000;\n\n mapping (bytes32 => bool) public debtOfferCancelled;\n mapping (bytes32 => bool) public debtOfferFilled;\n\n event LogDebtOfferCancelled(\n address indexed _creditor,\n bytes32 indexed _creditorCommitmentHash\n );\n\n event LogDebtOfferFilled(\n address indexed _creditor,\n bytes32 indexed _creditorCommitmentHash,\n bytes32 indexed _agreementId\n );\n\n event LogError(\n uint8 indexed _errorId,\n address indexed _creditor,\n bytes32 indexed _creditorCommitmentHash\n );\n\n function CreditorProxy(address _contractRegistry)\n public\n {\n contractRegistry = ContractRegistry(_contractRegistry);\n }\n\n /*\n * Submit debt order to DebtKernel if it is consensual with creditor's request\n * Creditor signature in arguments is only used internally,\n * It will not be verified by the Debt Kernel\n */\n function fillDebtOffer(\n address creditor,\n address[6] orderAddresses, // repayment-router, debtor, uw, tc, p-token, relayer\n uint[8] orderValues, // rr, salt, pa, uwFee, rFee, cFee, dFee, expTime\n bytes32[1] orderBytes32, // tcParams\n uint8[3] signaturesV, // debtV, credV, uwV\n bytes32[3] signaturesR,\n bytes32[3] signaturesS\n )\n public\n whenNotPaused\n returns (bytes32 _agreementId)\n {\n\n bytes32 creditorCommitmentHash = getCreditorCommitmentHash(\n [\n creditor,\n orderAddresses[0], // repayment router version\n orderAddresses[2], // underwriter\n orderAddresses[3] // termsContract\n ],\n [\n orderValues[5], // creditor fee\n orderValues[0], // underwriterRiskRating\n orderValues[7], // commitmentExpirationTimestampInSec\n orderValues[1] // salt\n ],\n orderBytes32 // termsContractParameters\n );\n\n if (debtOfferFilled[creditorCommitmentHash]) {\n LogError(uint8(Errors.DEBT_OFFER_ALREADY_FILLED), creditor, creditorCommitmentHash);\n return NULL_ISSUANCE_HASH;\n }\n\n if (debtOfferCancelled[creditorCommitmentHash]) {\n LogError(uint8(Errors.DEBT_OFFER_CANCELLED), creditor, creditorCommitmentHash);\n return NULL_ISSUANCE_HASH; \n }\n\n if (!isValidSignature(\n creditor,\n creditorCommitmentHash,\n signaturesV[1],\n signaturesR[1],\n signaturesS[1]\n )) {\n LogError(\n uint8(Errors.DEBT_OFFER_NON_CONSENSUAL),\n creditor,\n creditorCommitmentHash\n );\n return NULL_ISSUANCE_HASH;\n }\n\n // principal amount + creditor fee\n uint totalCreditorPayment = orderValues[2].add(orderValues[5]);\n\n if (!hasSufficientBalanceAndAllowance(\n creditor,\n orderAddresses[4],\n totalCreditorPayment\n )) {\n LogError(\n uint8(Errors.CREDITOR_BALANCE_OR_ALLOWANCE_INSUFFICIENT),\n creditor,\n creditorCommitmentHash\n );\n return NULL_ISSUANCE_HASH;\n }\n\n // Transfer principal from creditor to CreditorProxy\n if (totalCreditorPayment > 0) {\n require(\n transferTokensFrom(\n orderAddresses[4],\n creditor,\n address(this),\n totalCreditorPayment\n )\n );\n }\n\n // Grant allowance to the TokenTransferProxy for this contract.\n\n\n // Fill debt order with this contract playing the role of creditor\n bytes32 agreementId = contractRegistry.debtKernel().fillDebtOrder(\n address(this),\n orderAddresses,\n orderValues,\n orderBytes32,\n signaturesV,\n signaturesR,\n signaturesS\n );\n\n require(agreementId != NULL_ISSUANCE_HASH);\n\n debtOfferFilled[creditorCommitmentHash] = true;\n\n // transfer debt token to real creditor\n contractRegistry.debtToken().transfer(creditor, uint256(agreementId));\n\n LogDebtOfferFilled(creditor, creditorCommitmentHash, agreementId);\n\n return agreementId;\n }\n\n /**\n * Allows creditor to prevent a debt offer from being used in the future\n */\n function cancelDebtOffer(\n address[4] commitmentAddresses,\n uint[4] commitmentValues,\n bytes32[1] termsContractParameters\n )\n public\n whenNotPaused\n {\n // sender must be the creditor\n require(msg.sender == commitmentAddresses[0]);\n bytes32 creditorCommitmentHash = getCreditorCommitmentHash(\n commitmentAddresses,\n commitmentValues,\n termsContractParameters\n );\n debtOfferCancelled[creditorCommitmentHash] = true;\n LogDebtOfferCancelled(commitmentAddresses[0], creditorCommitmentHash);\n }\n\n ////////////////////////\n // INTERNAL FUNCTIONS //\n ////////////////////////\n\n /**\n * Returns the messaged signed by the creditor to indicate their commitment\n */\n function getCreditorCommitmentHash(\n address[4] commitmentAddresses,\n uint[4] commitmentValues,\n bytes32[1] termsContractParameters\n )\n internal\n pure\n returns (bytes32 _creditorCommitmentHash)\n {\n return keccak256(\n commitmentAddresses[0], // creditor\n commitmentAddresses[1], // repayment router version\n commitmentValues[0], // creditor fee\n commitmentAddresses[2], // underwriter\n commitmentValues[1], // underwriterRiskRating\n commitmentAddresses[3], // termsContract\n termsContractParameters[0],\n commitmentValues[2], // commitmentExpirationTimestampInSec\n commitmentValues[3] // salt\n );\n }\n\n\n /**\n * Assert that the creditor has a sufficient token balance and has granted the token transfer\n * proxy contract sufficient allowance to suffice for the principal and creditor fee.\n */\n function hasSufficientBalanceAndAllowance(\n address creditor,\n address principalToken,\n uint totalCreditorPayment\n )\n internal\n returns (bool _isBalanceAndAllowanceSufficient)\n {\n // The allowance that this contract has for a creditor's tokens.\n uint proxyAllowance = getAllowance(principalToken, creditor, address(this));\n uint creditorBalance = getBalance(principalToken, creditor);\n\n if (creditorBalance < totalCreditorPayment || proxyAllowance < totalCreditorPayment) {\n return false;\n }\n\n // The allowance that the token transfer proxy has for this contract's tokens.\n uint tokenTransferAllowance = getAllowance(\n principalToken,\n address(this),\n contractRegistry.tokenTransferProxy()\n );\n\n // Ensure the token transfer proxy can transfer tokens from the creditor proxy\n if (tokenTransferAllowance < totalCreditorPayment) {\n require(setTokenTransferAllowance(principalToken, totalCreditorPayment));\n }\n\n return true;\n }\n\n /**\n * Given a hashed message, a signer's address, and a signature,\n * returns whether the signature is valid.\n */\n function isValidSignature(\n address signer,\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n )\n internal\n pure\n returns (bool _valid)\n {\n return signer == ecrecover(\n keccak256(\"\\x19Ethereum Signed Message:\\n32\", hash),\n v,\n r,\n s\n );\n }\n\n /**\n * Helper function for querying an address' balance on a given token.\n */\n function getBalance(\n address token,\n address owner\n )\n internal\n view\n returns (uint _balance)\n {\n // Limit gas to prevent reentrancy.\n return ERC20(token).balanceOf.gas(EXTERNAL_QUERY_GAS_LIMIT)(owner);\n }\n\n /**\n * Helper function for querying this contract's allowance for transferring the given token.\n */\n function getAllowance(\n address token,\n address owner,\n address granter\n )\n internal\n view\n returns (uint _allowance)\n {\n // Limit gas to prevent reentrancy.\n return ERC20(token).allowance.gas(EXTERNAL_QUERY_GAS_LIMIT)(\n owner,\n granter\n );\n }\n\n /**\n * Helper function for approving this address' allowance to Dharma's token transfer proxy.\n */\n function setTokenTransferAllowance(\n address token,\n uint amount\n )\n internal\n returns (bool _success)\n {\n return ERC20(token).approve(\n address(contractRegistry.tokenTransferProxy()),\n amount\n );\n }\n\n\n /**\n * Helper function for transferring a specified amount of tokens between two parties.\n */\n function transferTokensFrom(\n address _token,\n address _from,\n address _to,\n uint _amount\n )\n internal\n returns (bool _success)\n {\n return ERC20(_token).transferFrom(_from, _to, _amount);\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/CreditorProxy.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/CreditorProxy.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/CreditorProxy.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/CreditorProxy.sol", "exportedSymbols": { "CreditorProxy": [ 1491 @@ -340,7 +340,7 @@ export const CreditorProxy = { "attributes": { "SourceUnit": 924, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/ContractRegistry.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/ContractRegistry.sol", "file": "./ContractRegistry.sol", "scope": 1492, "symbolAliases": [ @@ -8779,7 +8779,7 @@ export const CreditorProxy = } }, "links": {}, - "address": "0xd1c0be587dc75cb5d9c9c3856068717351c020d5" + "address": "0xd9b303da12a84a405c482c91592b5bd00a2317e2" }, "70": { "events": { @@ -8879,5 +8879,5 @@ export const CreditorProxy = } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:16:36.732Z" + "updatedAt": "2018-10-09T17:53:24.855Z" } \ No newline at end of file diff --git a/artifacts/ts/DebtKernel.ts b/artifacts/ts/DebtKernel.ts index af71fdb2..67436c08 100644 --- a/artifacts/ts/DebtKernel.ts +++ b/artifacts/ts/DebtKernel.ts @@ -407,15 +407,15 @@ export const DebtKernel = "type": "event" } ], - "bytecode": "0x606060405260008060146101000a81548160ff021916908315150217905550341561002957600080fd5b60405160208061276a83398101604052808051906020019091905050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050612694806100d66000396000f3006060604052600436106100db576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806320385f2f146100e05780633f4ba83a1461017f5780635428368f146101945780635c975abb146101d35780638456cb59146102005780638591b2ad146102155780638da5cb5b1461025457806390e14899146102a95780639b345d75146102fe578063a8b3bb8714610337578063e283040d146103ec578063e6488fc91461041d578063f06bbf751461057b578063f2fde38b146105ac578063f8d89898146105e5575b600080fd5b34156100eb57600080fd5b61017d6004808060c001906006806020026040519081016040528092919082600660200280828437820191505050505091908061010001906008806020026040519081016040528092919082600860200280828437820191505050505091908060200190600180602002604051908101604052809291908260016020028082843782019150505050509190505061063a565b005b341561018a57600080fd5b610192610739565b005b341561019f57600080fd5b6101b96004808035600019169060200190919050506107f7565b604051808215151515815260200191505060405180910390f35b34156101de57600080fd5b6101e6610817565b604051808215151515815260200191505060405180910390f35b341561020b57600080fd5b61021361082a565b005b341561022057600080fd5b61023a6004808035600019169060200190919050506108ea565b604051808215151515815260200191505060405180910390f35b341561025f57600080fd5b61026761090a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102b457600080fd5b6102bc61092f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561030957600080fd5b610335600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610955565b005b341561034257600080fd5b6103ea600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919080359060200190919050506109f4565b005b34156103f757600080fd5b6103ff610b27565b60405180826000191660001916815260200191505060405180910390f35b341561042857600080fd5b61055d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908060c0019060068060200260405190810160405280929190826006602002808284378201915050505050919080610100019060088060200260405190810160405280929190826008602002808284378201915050505050919080602001906001806020026040519081016040528092919082600160200280828437820191505050505091908060600190600380602002604051908101604052809291908260036020028082843782019150505050509190806060019060038060200260405190810160405280929190826003602002808284378201915050505050919080606001906003806020026040519081016040528092919082600360200280828437820191505050505091905050610b2f565b60405180826000191660001916815260200191505060405180910390f35b341561058657600080fd5b61058e610e7e565b604051808261ffff1661ffff16815260200191505060405180910390f35b34156105b757600080fd5b6105e3600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610e84565b005b34156105f057600080fd5b6105f8610fd9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610642612497565b600060149054906101000a900460ff1615151561065e57600080fd5b610669848484610fff565b905080600001516020015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156106ad57600080fd5b6001600460008361012001516000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff16816101200151600019167f781502ecbc7096cfe7d502e0027f02eedf4ce6d62162cd3bd45d1a3dd98b8c2360405160405180910390a350505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561079457600080fd5b600060149054906101000a900460ff1615156107af57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b60046020528060005260406000206000915054906101000a900460ff1681565b600060149054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561088557600080fd5b600060149054906101000a900460ff161515156108a157600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b60036020528060005260406000206000915054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156109b057600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6109fc612520565b600060149054906101000a900460ff16151515610a1857600080fd5b8673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610a7d57508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515610a8857600080fd5b610a978888868987878b6111df565b90506001600360008360e001516000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff168160e00151600019167f77b488cc12f7f1c1527489c59889ce053dfc7115033f9b5d147fd7a8bdbc3a4760405160405180910390a35050505050505050565b600060010281565b6000610b39612497565b600060149054906101000a900460ff16151515610b5557600080fd5b610b60888888610fff565b9050610b6b816112a9565b1580610b815750610b7f818a878787611703565b155b80610b935750610b9189826119f9565b155b15610ba45760006001029150610e72565b610bb2898260000151611a9f565b50600073ffffffffffffffffffffffffffffffffffffffff1681600001516080015173ffffffffffffffffffffffffffffffffffffffff16141515610ce35780600001516080015173ffffffffffffffffffffffffffffffffffffffff1663977a5e64826000015160e001518360000151602001516000604051602001526040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1515610cbc57600080fd5b6102c65a03f11515610ccd57600080fd5b505050604051805190501515610ce257600080fd5b5b600081606001511115610d2e57610d2281608001518a836000015160200151610d1d8560c001518660600151611cb190919063ffffffff16565b611cca565b1515610d2d57600080fd5b5b600081602001511115610d6357610d5781608001518a8360000151604001518460200151611cca565b1515610d6257600080fd5b5b600081604001511115610d9457610d8881608001518a8360e001518460400151611cca565b1515610d9357600080fd5b5b8060e0015173ffffffffffffffffffffffffffffffffffffffff1681600001516040015173ffffffffffffffffffffffffffffffffffffffff16826000015160e00151600019167f4d61b488582cd44b5157ec41d5a9cfcc0595cc347661eda1d84cc40d7e943fb38460600151856080015186602001518760400151604051808581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182815260200194505050505060405180910390a4806000015160e0015191505b50979650505050505050565b611f4081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610edf57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610f1b57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611007612497565b61100f612497565b610140604051908101604052806110b087600060068110151561102e57fe5b602002015188600160068110151561104257fe5b602002015189600260068110151561105657fe5b60200201518a600360068110151561106a57fe5b60200201518a600060088110151561107e57fe5b60200201518b600160088110151561109257fe5b60200201518b60006001811015156110a657fe5b60200201516111df565b81526020018560036008811015156110c457fe5b602002015181526020018560046008811015156110dd57fe5b602002015181526020018560026008811015156110f657fe5b6020020151815260200186600460068110151561110f57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff16815260200185600560088110151561113e57fe5b6020020151815260200185600660088110151561115757fe5b6020020151815260200186600560068110151561117057fe5b602002015173ffffffffffffffffffffffffffffffffffffffff16815260200185600760088110151561119f57fe5b6020020151815260200160006001026000191681525090506111c081611e26565b8161012001906000191690816000191681525050809150509392505050565b6111e7612520565b6111ef612520565b610100604051908101604052808a73ffffffffffffffffffffffffffffffffffffffff1681526020018973ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018773ffffffffffffffffffffffffffffffffffffffff168152602001846000191681526020018581526020016112918b8b8b8b8b8b8b611f6f565b60001916815250905080915050979650505050505050565b6000806112c78360c001518460a001516120b890919063ffffffff16565b90506112e4836020015184604001516120b890919063ffffffff16565b8114151561133b57826101200151600019166004600881111561130357fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b8260c001518360600151101561139a57826101200151600019166005600881111561136257fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b600073ffffffffffffffffffffffffffffffffffffffff1683600001516040015173ffffffffffffffffffffffffffffffffffffffff161480156113e2575060008360200151115b8061142d5750600073ffffffffffffffffffffffffffffffffffffffff168360e0015173ffffffffffffffffffffffffffffffffffffffff1614801561142c575082602001518114155b5b1561148157826101200151600019166006600881111561144957fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b4283610100015110156114dd5782610120015160001916600160088111156114a557fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634f558e79846000015160e00151600190046000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561158257600080fd5b6102c65a03f1151561159357600080fd5b50505060405180519050156115f15782610120015160001916600060088111156115b957fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b60036000846000015160e001516000191660001916815260200190815260200160002060009054906101000a900460ff161561167657826101200151600019166002600881111561163e57fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b600460008461012001516000191660001916815260200190815260200160002060009054906101000a900460ff16156116f85782610120015160001916600360088111156116c057fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b600191505b50919050565b600085600001516020015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156117eb5761179586600001516020015187610120015186600060038110151561176357fe5b602002015186600060038110151561177757fe5b602002015186600060038110151561178b57fe5b60200201516120d6565b15156117ea5785610120015160001916600760088111156117b257fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600090506119f0565b5b8473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156118c15761186b8587610120015186600160038110151561183957fe5b602002015186600160038110151561184d57fe5b602002015186600160038110151561186157fe5b60200201516120d6565b15156118c057856101200151600019166007600881111561188857fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600090506119f0565b5b600073ffffffffffffffffffffffffffffffffffffffff1686600001516040015173ffffffffffffffffffffffffffffffffffffffff161415801561193a575085600001516040015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b156119eb57611995866000015160400151611954886121dd565b86600260038110151561196357fe5b602002015186600260038110151561197757fe5b602002015186600260038110151561198b57fe5b60200201516120d6565b15156119ea5785610120015160001916600760088111156119b257fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600090506119f0565b5b600190505b95945050505050565b600080611a178360a0015184606001516120b890919063ffffffff16565b905080611a288460800151866122bb565b1080611a40575080611a3e84608001518661237e565b105b15611a935782610120015160001916600880811115611a5b57fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009150611a98565b600191505b5092915050565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166399f1050184600001518686602001518760400151886060015189608001518a60a001518b60c001516000604051602001526040518963ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001836000191660001916815260200182815260200198505050505050505050602060405180830381600087803b1515611c7357600080fd5b6102c65a03f11515611c8457600080fd5b5050506040518051905090508260e001516001900481141515611ca357fe5b8260e0015191505092915050565b6000828211151515611cbf57fe5b818303905092915050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166315dacbea868686866000604051602001526040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050602060405180830381600087803b1515611e0157600080fd5b6102c65a03f11515611e1257600080fd5b505050604051805190509050949350505050565b600030826000015160e001518360200151846060015185608001518660c001518760a001518860e0015189604001518a6101000151604051808b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018a600019166000191681526020018981526020018881526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018381526020018281526020019a505050505050505050505060405180910390209050919050565b600087878786888688604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401836000191660001916815260200182815260200197505050505050505060405180910390209050979650505050505050565b60008082840190508381101515156120cc57fe5b8091505092915050565b600060018560405180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c0182600019166000191681526020019150506040518091039020858585604051600081526020016040526000604051602001526040518085600019166000191681526020018460ff1660ff16815260200183600019166000191681526020018260001916600019168152602001945050505050602060405160208103908084039060008661646e5a03f1151561219b57600080fd5b50506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b600030826000015160e00151836020015184606001518560800151866101000151604051808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140186600019166000191681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001965050505050505060405180910390209050919050565b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231611f4061ffff16846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600088803b151561235e57600080fd5b87f1151561236b57600080fd5b5050505060405180519050905092915050565b60008273ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e611f4061ffff1684600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600088803b151561247757600080fd5b87f1151561248457600080fd5b5050505060405180519050905092915050565b610220604051908101604052806124ac6125c4565b8152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600080191681525090565b61010060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000801916815260200160008152602001600080191681525090565b61010060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008019168152602001600081526020016000801916815250905600a165627a7a7230582019411195caef9256a956aee6f4d54e6877e2c4808c9a00d29b58e4c57701b5120029", - "deployedBytecode": "0x6060604052600436106100db576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806320385f2f146100e05780633f4ba83a1461017f5780635428368f146101945780635c975abb146101d35780638456cb59146102005780638591b2ad146102155780638da5cb5b1461025457806390e14899146102a95780639b345d75146102fe578063a8b3bb8714610337578063e283040d146103ec578063e6488fc91461041d578063f06bbf751461057b578063f2fde38b146105ac578063f8d89898146105e5575b600080fd5b34156100eb57600080fd5b61017d6004808060c001906006806020026040519081016040528092919082600660200280828437820191505050505091908061010001906008806020026040519081016040528092919082600860200280828437820191505050505091908060200190600180602002604051908101604052809291908260016020028082843782019150505050509190505061063a565b005b341561018a57600080fd5b610192610739565b005b341561019f57600080fd5b6101b96004808035600019169060200190919050506107f7565b604051808215151515815260200191505060405180910390f35b34156101de57600080fd5b6101e6610817565b604051808215151515815260200191505060405180910390f35b341561020b57600080fd5b61021361082a565b005b341561022057600080fd5b61023a6004808035600019169060200190919050506108ea565b604051808215151515815260200191505060405180910390f35b341561025f57600080fd5b61026761090a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102b457600080fd5b6102bc61092f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561030957600080fd5b610335600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610955565b005b341561034257600080fd5b6103ea600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919080359060200190919050506109f4565b005b34156103f757600080fd5b6103ff610b27565b60405180826000191660001916815260200191505060405180910390f35b341561042857600080fd5b61055d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908060c0019060068060200260405190810160405280929190826006602002808284378201915050505050919080610100019060088060200260405190810160405280929190826008602002808284378201915050505050919080602001906001806020026040519081016040528092919082600160200280828437820191505050505091908060600190600380602002604051908101604052809291908260036020028082843782019150505050509190806060019060038060200260405190810160405280929190826003602002808284378201915050505050919080606001906003806020026040519081016040528092919082600360200280828437820191505050505091905050610b2f565b60405180826000191660001916815260200191505060405180910390f35b341561058657600080fd5b61058e610e7e565b604051808261ffff1661ffff16815260200191505060405180910390f35b34156105b757600080fd5b6105e3600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610e84565b005b34156105f057600080fd5b6105f8610fd9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610642612497565b600060149054906101000a900460ff1615151561065e57600080fd5b610669848484610fff565b905080600001516020015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156106ad57600080fd5b6001600460008361012001516000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff16816101200151600019167f781502ecbc7096cfe7d502e0027f02eedf4ce6d62162cd3bd45d1a3dd98b8c2360405160405180910390a350505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561079457600080fd5b600060149054906101000a900460ff1615156107af57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b60046020528060005260406000206000915054906101000a900460ff1681565b600060149054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561088557600080fd5b600060149054906101000a900460ff161515156108a157600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b60036020528060005260406000206000915054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156109b057600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6109fc612520565b600060149054906101000a900460ff16151515610a1857600080fd5b8673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610a7d57508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515610a8857600080fd5b610a978888868987878b6111df565b90506001600360008360e001516000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff168160e00151600019167f77b488cc12f7f1c1527489c59889ce053dfc7115033f9b5d147fd7a8bdbc3a4760405160405180910390a35050505050505050565b600060010281565b6000610b39612497565b600060149054906101000a900460ff16151515610b5557600080fd5b610b60888888610fff565b9050610b6b816112a9565b1580610b815750610b7f818a878787611703565b155b80610b935750610b9189826119f9565b155b15610ba45760006001029150610e72565b610bb2898260000151611a9f565b50600073ffffffffffffffffffffffffffffffffffffffff1681600001516080015173ffffffffffffffffffffffffffffffffffffffff16141515610ce35780600001516080015173ffffffffffffffffffffffffffffffffffffffff1663977a5e64826000015160e001518360000151602001516000604051602001526040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1515610cbc57600080fd5b6102c65a03f11515610ccd57600080fd5b505050604051805190501515610ce257600080fd5b5b600081606001511115610d2e57610d2281608001518a836000015160200151610d1d8560c001518660600151611cb190919063ffffffff16565b611cca565b1515610d2d57600080fd5b5b600081602001511115610d6357610d5781608001518a8360000151604001518460200151611cca565b1515610d6257600080fd5b5b600081604001511115610d9457610d8881608001518a8360e001518460400151611cca565b1515610d9357600080fd5b5b8060e0015173ffffffffffffffffffffffffffffffffffffffff1681600001516040015173ffffffffffffffffffffffffffffffffffffffff16826000015160e00151600019167f4d61b488582cd44b5157ec41d5a9cfcc0595cc347661eda1d84cc40d7e943fb38460600151856080015186602001518760400151604051808581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182815260200194505050505060405180910390a4806000015160e0015191505b50979650505050505050565b611f4081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610edf57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610f1b57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611007612497565b61100f612497565b610140604051908101604052806110b087600060068110151561102e57fe5b602002015188600160068110151561104257fe5b602002015189600260068110151561105657fe5b60200201518a600360068110151561106a57fe5b60200201518a600060088110151561107e57fe5b60200201518b600160088110151561109257fe5b60200201518b60006001811015156110a657fe5b60200201516111df565b81526020018560036008811015156110c457fe5b602002015181526020018560046008811015156110dd57fe5b602002015181526020018560026008811015156110f657fe5b6020020151815260200186600460068110151561110f57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff16815260200185600560088110151561113e57fe5b6020020151815260200185600660088110151561115757fe5b6020020151815260200186600560068110151561117057fe5b602002015173ffffffffffffffffffffffffffffffffffffffff16815260200185600760088110151561119f57fe5b6020020151815260200160006001026000191681525090506111c081611e26565b8161012001906000191690816000191681525050809150509392505050565b6111e7612520565b6111ef612520565b610100604051908101604052808a73ffffffffffffffffffffffffffffffffffffffff1681526020018973ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018773ffffffffffffffffffffffffffffffffffffffff168152602001846000191681526020018581526020016112918b8b8b8b8b8b8b611f6f565b60001916815250905080915050979650505050505050565b6000806112c78360c001518460a001516120b890919063ffffffff16565b90506112e4836020015184604001516120b890919063ffffffff16565b8114151561133b57826101200151600019166004600881111561130357fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b8260c001518360600151101561139a57826101200151600019166005600881111561136257fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b600073ffffffffffffffffffffffffffffffffffffffff1683600001516040015173ffffffffffffffffffffffffffffffffffffffff161480156113e2575060008360200151115b8061142d5750600073ffffffffffffffffffffffffffffffffffffffff168360e0015173ffffffffffffffffffffffffffffffffffffffff1614801561142c575082602001518114155b5b1561148157826101200151600019166006600881111561144957fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b4283610100015110156114dd5782610120015160001916600160088111156114a557fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634f558e79846000015160e00151600190046000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561158257600080fd5b6102c65a03f1151561159357600080fd5b50505060405180519050156115f15782610120015160001916600060088111156115b957fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b60036000846000015160e001516000191660001916815260200190815260200160002060009054906101000a900460ff161561167657826101200151600019166002600881111561163e57fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b600460008461012001516000191660001916815260200190815260200160002060009054906101000a900460ff16156116f85782610120015160001916600360088111156116c057fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b600191505b50919050565b600085600001516020015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156117eb5761179586600001516020015187610120015186600060038110151561176357fe5b602002015186600060038110151561177757fe5b602002015186600060038110151561178b57fe5b60200201516120d6565b15156117ea5785610120015160001916600760088111156117b257fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600090506119f0565b5b8473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156118c15761186b8587610120015186600160038110151561183957fe5b602002015186600160038110151561184d57fe5b602002015186600160038110151561186157fe5b60200201516120d6565b15156118c057856101200151600019166007600881111561188857fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600090506119f0565b5b600073ffffffffffffffffffffffffffffffffffffffff1686600001516040015173ffffffffffffffffffffffffffffffffffffffff161415801561193a575085600001516040015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b156119eb57611995866000015160400151611954886121dd565b86600260038110151561196357fe5b602002015186600260038110151561197757fe5b602002015186600260038110151561198b57fe5b60200201516120d6565b15156119ea5785610120015160001916600760088111156119b257fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600090506119f0565b5b600190505b95945050505050565b600080611a178360a0015184606001516120b890919063ffffffff16565b905080611a288460800151866122bb565b1080611a40575080611a3e84608001518661237e565b105b15611a935782610120015160001916600880811115611a5b57fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009150611a98565b600191505b5092915050565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166399f1050184600001518686602001518760400151886060015189608001518a60a001518b60c001516000604051602001526040518963ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001836000191660001916815260200182815260200198505050505050505050602060405180830381600087803b1515611c7357600080fd5b6102c65a03f11515611c8457600080fd5b5050506040518051905090508260e001516001900481141515611ca357fe5b8260e0015191505092915050565b6000828211151515611cbf57fe5b818303905092915050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166315dacbea868686866000604051602001526040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050602060405180830381600087803b1515611e0157600080fd5b6102c65a03f11515611e1257600080fd5b505050604051805190509050949350505050565b600030826000015160e001518360200151846060015185608001518660c001518760a001518860e0015189604001518a6101000151604051808b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018a600019166000191681526020018981526020018881526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018381526020018281526020019a505050505050505050505060405180910390209050919050565b600087878786888688604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401836000191660001916815260200182815260200197505050505050505060405180910390209050979650505050505050565b60008082840190508381101515156120cc57fe5b8091505092915050565b600060018560405180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c0182600019166000191681526020019150506040518091039020858585604051600081526020016040526000604051602001526040518085600019166000191681526020018460ff1660ff16815260200183600019166000191681526020018260001916600019168152602001945050505050602060405160208103908084039060008661646e5a03f1151561219b57600080fd5b50506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b600030826000015160e00151836020015184606001518560800151866101000151604051808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140186600019166000191681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001965050505050505060405180910390209050919050565b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231611f4061ffff16846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600088803b151561235e57600080fd5b87f1151561236b57600080fd5b5050505060405180519050905092915050565b60008273ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e611f4061ffff1684600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600088803b151561247757600080fd5b87f1151561248457600080fd5b5050505060405180519050905092915050565b610220604051908101604052806124ac6125c4565b8152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600080191681525090565b61010060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000801916815260200160008152602001600080191681525090565b61010060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008019168152602001600081526020016000801916815250905600a165627a7a7230582019411195caef9256a956aee6f4d54e6877e2c4808c9a00d29b58e4c57701b5120029", + "bytecode": "0x606060405260008060146101000a81548160ff021916908315150217905550341561002957600080fd5b60405160208061276a83398101604052808051906020019091905050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050612694806100d66000396000f3006060604052600436106100db576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806320385f2f146100e05780633f4ba83a1461017f5780635428368f146101945780635c975abb146101d35780638456cb59146102005780638591b2ad146102155780638da5cb5b1461025457806390e14899146102a95780639b345d75146102fe578063a8b3bb8714610337578063e283040d146103ec578063e6488fc91461041d578063f06bbf751461057b578063f2fde38b146105ac578063f8d89898146105e5575b600080fd5b34156100eb57600080fd5b61017d6004808060c001906006806020026040519081016040528092919082600660200280828437820191505050505091908061010001906008806020026040519081016040528092919082600860200280828437820191505050505091908060200190600180602002604051908101604052809291908260016020028082843782019150505050509190505061063a565b005b341561018a57600080fd5b610192610739565b005b341561019f57600080fd5b6101b96004808035600019169060200190919050506107f7565b604051808215151515815260200191505060405180910390f35b34156101de57600080fd5b6101e6610817565b604051808215151515815260200191505060405180910390f35b341561020b57600080fd5b61021361082a565b005b341561022057600080fd5b61023a6004808035600019169060200190919050506108ea565b604051808215151515815260200191505060405180910390f35b341561025f57600080fd5b61026761090a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102b457600080fd5b6102bc61092f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561030957600080fd5b610335600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610955565b005b341561034257600080fd5b6103ea600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919080359060200190919050506109f4565b005b34156103f757600080fd5b6103ff610b27565b60405180826000191660001916815260200191505060405180910390f35b341561042857600080fd5b61055d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908060c0019060068060200260405190810160405280929190826006602002808284378201915050505050919080610100019060088060200260405190810160405280929190826008602002808284378201915050505050919080602001906001806020026040519081016040528092919082600160200280828437820191505050505091908060600190600380602002604051908101604052809291908260036020028082843782019150505050509190806060019060038060200260405190810160405280929190826003602002808284378201915050505050919080606001906003806020026040519081016040528092919082600360200280828437820191505050505091905050610b2f565b60405180826000191660001916815260200191505060405180910390f35b341561058657600080fd5b61058e610e7e565b604051808261ffff1661ffff16815260200191505060405180910390f35b34156105b757600080fd5b6105e3600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610e84565b005b34156105f057600080fd5b6105f8610fd9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610642612497565b600060149054906101000a900460ff1615151561065e57600080fd5b610669848484610fff565b905080600001516020015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156106ad57600080fd5b6001600460008361012001516000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff16816101200151600019167f781502ecbc7096cfe7d502e0027f02eedf4ce6d62162cd3bd45d1a3dd98b8c2360405160405180910390a350505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561079457600080fd5b600060149054906101000a900460ff1615156107af57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b60046020528060005260406000206000915054906101000a900460ff1681565b600060149054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561088557600080fd5b600060149054906101000a900460ff161515156108a157600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b60036020528060005260406000206000915054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156109b057600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6109fc612520565b600060149054906101000a900460ff16151515610a1857600080fd5b8673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610a7d57508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515610a8857600080fd5b610a978888868987878b6111df565b90506001600360008360e001516000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff168160e00151600019167f77b488cc12f7f1c1527489c59889ce053dfc7115033f9b5d147fd7a8bdbc3a4760405160405180910390a35050505050505050565b600060010281565b6000610b39612497565b600060149054906101000a900460ff16151515610b5557600080fd5b610b60888888610fff565b9050610b6b816112a9565b1580610b815750610b7f818a878787611703565b155b80610b935750610b9189826119f9565b155b15610ba45760006001029150610e72565b610bb2898260000151611a9f565b50600073ffffffffffffffffffffffffffffffffffffffff1681600001516080015173ffffffffffffffffffffffffffffffffffffffff16141515610ce35780600001516080015173ffffffffffffffffffffffffffffffffffffffff1663977a5e64826000015160e001518360000151602001516000604051602001526040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1515610cbc57600080fd5b6102c65a03f11515610ccd57600080fd5b505050604051805190501515610ce257600080fd5b5b600081606001511115610d2e57610d2281608001518a836000015160200151610d1d8560c001518660600151611cb190919063ffffffff16565b611cca565b1515610d2d57600080fd5b5b600081602001511115610d6357610d5781608001518a8360000151604001518460200151611cca565b1515610d6257600080fd5b5b600081604001511115610d9457610d8881608001518a8360e001518460400151611cca565b1515610d9357600080fd5b5b8060e0015173ffffffffffffffffffffffffffffffffffffffff1681600001516040015173ffffffffffffffffffffffffffffffffffffffff16826000015160e00151600019167f4d61b488582cd44b5157ec41d5a9cfcc0595cc347661eda1d84cc40d7e943fb38460600151856080015186602001518760400151604051808581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182815260200194505050505060405180910390a4806000015160e0015191505b50979650505050505050565b611f4081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610edf57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610f1b57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611007612497565b61100f612497565b610140604051908101604052806110b087600060068110151561102e57fe5b602002015188600160068110151561104257fe5b602002015189600260068110151561105657fe5b60200201518a600360068110151561106a57fe5b60200201518a600060088110151561107e57fe5b60200201518b600160088110151561109257fe5b60200201518b60006001811015156110a657fe5b60200201516111df565b81526020018560036008811015156110c457fe5b602002015181526020018560046008811015156110dd57fe5b602002015181526020018560026008811015156110f657fe5b6020020151815260200186600460068110151561110f57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff16815260200185600560088110151561113e57fe5b6020020151815260200185600660088110151561115757fe5b6020020151815260200186600560068110151561117057fe5b602002015173ffffffffffffffffffffffffffffffffffffffff16815260200185600760088110151561119f57fe5b6020020151815260200160006001026000191681525090506111c081611e26565b8161012001906000191690816000191681525050809150509392505050565b6111e7612520565b6111ef612520565b610100604051908101604052808a73ffffffffffffffffffffffffffffffffffffffff1681526020018973ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018773ffffffffffffffffffffffffffffffffffffffff168152602001846000191681526020018581526020016112918b8b8b8b8b8b8b611f6f565b60001916815250905080915050979650505050505050565b6000806112c78360c001518460a001516120b890919063ffffffff16565b90506112e4836020015184604001516120b890919063ffffffff16565b8114151561133b57826101200151600019166004600881111561130357fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b8260c001518360600151101561139a57826101200151600019166005600881111561136257fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b600073ffffffffffffffffffffffffffffffffffffffff1683600001516040015173ffffffffffffffffffffffffffffffffffffffff161480156113e2575060008360200151115b8061142d5750600073ffffffffffffffffffffffffffffffffffffffff168360e0015173ffffffffffffffffffffffffffffffffffffffff1614801561142c575082602001518114155b5b1561148157826101200151600019166006600881111561144957fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b4283610100015110156114dd5782610120015160001916600160088111156114a557fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634f558e79846000015160e00151600190046000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561158257600080fd5b6102c65a03f1151561159357600080fd5b50505060405180519050156115f15782610120015160001916600060088111156115b957fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b60036000846000015160e001516000191660001916815260200190815260200160002060009054906101000a900460ff161561167657826101200151600019166002600881111561163e57fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b600460008461012001516000191660001916815260200190815260200160002060009054906101000a900460ff16156116f85782610120015160001916600360088111156116c057fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b600191505b50919050565b600085600001516020015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156117eb5761179586600001516020015187610120015186600060038110151561176357fe5b602002015186600060038110151561177757fe5b602002015186600060038110151561178b57fe5b60200201516120d6565b15156117ea5785610120015160001916600760088111156117b257fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600090506119f0565b5b8473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156118c15761186b8587610120015186600160038110151561183957fe5b602002015186600160038110151561184d57fe5b602002015186600160038110151561186157fe5b60200201516120d6565b15156118c057856101200151600019166007600881111561188857fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600090506119f0565b5b600073ffffffffffffffffffffffffffffffffffffffff1686600001516040015173ffffffffffffffffffffffffffffffffffffffff161415801561193a575085600001516040015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b156119eb57611995866000015160400151611954886121dd565b86600260038110151561196357fe5b602002015186600260038110151561197757fe5b602002015186600260038110151561198b57fe5b60200201516120d6565b15156119ea5785610120015160001916600760088111156119b257fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600090506119f0565b5b600190505b95945050505050565b600080611a178360a0015184606001516120b890919063ffffffff16565b905080611a288460800151866122bb565b1080611a40575080611a3e84608001518661237e565b105b15611a935782610120015160001916600880811115611a5b57fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009150611a98565b600191505b5092915050565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166399f1050184600001518686602001518760400151886060015189608001518a60a001518b60c001516000604051602001526040518963ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001836000191660001916815260200182815260200198505050505050505050602060405180830381600087803b1515611c7357600080fd5b6102c65a03f11515611c8457600080fd5b5050506040518051905090508260e001516001900481141515611ca357fe5b8260e0015191505092915050565b6000828211151515611cbf57fe5b818303905092915050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166315dacbea868686866000604051602001526040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050602060405180830381600087803b1515611e0157600080fd5b6102c65a03f11515611e1257600080fd5b505050604051805190509050949350505050565b600030826000015160e001518360200151846060015185608001518660c001518760a001518860e0015189604001518a6101000151604051808b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018a600019166000191681526020018981526020018881526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018381526020018281526020019a505050505050505050505060405180910390209050919050565b600087878786888688604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401836000191660001916815260200182815260200197505050505050505060405180910390209050979650505050505050565b60008082840190508381101515156120cc57fe5b8091505092915050565b600060018560405180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c0182600019166000191681526020019150506040518091039020858585604051600081526020016040526000604051602001526040518085600019166000191681526020018460ff1660ff16815260200183600019166000191681526020018260001916600019168152602001945050505050602060405160208103908084039060008661646e5a03f1151561219b57600080fd5b50506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b600030826000015160e00151836020015184606001518560800151866101000151604051808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140186600019166000191681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001965050505050505060405180910390209050919050565b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231611f4061ffff16846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600088803b151561235e57600080fd5b87f1151561236b57600080fd5b5050505060405180519050905092915050565b60008273ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e611f4061ffff1684600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600088803b151561247757600080fd5b87f1151561248457600080fd5b5050505060405180519050905092915050565b610220604051908101604052806124ac6125c4565b8152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600080191681525090565b61010060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000801916815260200160008152602001600080191681525090565b61010060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008019168152602001600081526020016000801916815250905600a165627a7a723058207dc7286e90d9ea455bd504e38e706d1e72bd10278d055e25e2cb023c570eb76d0029", + "deployedBytecode": "0x6060604052600436106100db576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806320385f2f146100e05780633f4ba83a1461017f5780635428368f146101945780635c975abb146101d35780638456cb59146102005780638591b2ad146102155780638da5cb5b1461025457806390e14899146102a95780639b345d75146102fe578063a8b3bb8714610337578063e283040d146103ec578063e6488fc91461041d578063f06bbf751461057b578063f2fde38b146105ac578063f8d89898146105e5575b600080fd5b34156100eb57600080fd5b61017d6004808060c001906006806020026040519081016040528092919082600660200280828437820191505050505091908061010001906008806020026040519081016040528092919082600860200280828437820191505050505091908060200190600180602002604051908101604052809291908260016020028082843782019150505050509190505061063a565b005b341561018a57600080fd5b610192610739565b005b341561019f57600080fd5b6101b96004808035600019169060200190919050506107f7565b604051808215151515815260200191505060405180910390f35b34156101de57600080fd5b6101e6610817565b604051808215151515815260200191505060405180910390f35b341561020b57600080fd5b61021361082a565b005b341561022057600080fd5b61023a6004808035600019169060200190919050506108ea565b604051808215151515815260200191505060405180910390f35b341561025f57600080fd5b61026761090a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102b457600080fd5b6102bc61092f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561030957600080fd5b610335600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610955565b005b341561034257600080fd5b6103ea600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919080359060200190919050506109f4565b005b34156103f757600080fd5b6103ff610b27565b60405180826000191660001916815260200191505060405180910390f35b341561042857600080fd5b61055d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908060c0019060068060200260405190810160405280929190826006602002808284378201915050505050919080610100019060088060200260405190810160405280929190826008602002808284378201915050505050919080602001906001806020026040519081016040528092919082600160200280828437820191505050505091908060600190600380602002604051908101604052809291908260036020028082843782019150505050509190806060019060038060200260405190810160405280929190826003602002808284378201915050505050919080606001906003806020026040519081016040528092919082600360200280828437820191505050505091905050610b2f565b60405180826000191660001916815260200191505060405180910390f35b341561058657600080fd5b61058e610e7e565b604051808261ffff1661ffff16815260200191505060405180910390f35b34156105b757600080fd5b6105e3600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610e84565b005b34156105f057600080fd5b6105f8610fd9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610642612497565b600060149054906101000a900460ff1615151561065e57600080fd5b610669848484610fff565b905080600001516020015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156106ad57600080fd5b6001600460008361012001516000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff16816101200151600019167f781502ecbc7096cfe7d502e0027f02eedf4ce6d62162cd3bd45d1a3dd98b8c2360405160405180910390a350505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561079457600080fd5b600060149054906101000a900460ff1615156107af57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b60046020528060005260406000206000915054906101000a900460ff1681565b600060149054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561088557600080fd5b600060149054906101000a900460ff161515156108a157600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b60036020528060005260406000206000915054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156109b057600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6109fc612520565b600060149054906101000a900460ff16151515610a1857600080fd5b8673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610a7d57508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515610a8857600080fd5b610a978888868987878b6111df565b90506001600360008360e001516000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff168160e00151600019167f77b488cc12f7f1c1527489c59889ce053dfc7115033f9b5d147fd7a8bdbc3a4760405160405180910390a35050505050505050565b600060010281565b6000610b39612497565b600060149054906101000a900460ff16151515610b5557600080fd5b610b60888888610fff565b9050610b6b816112a9565b1580610b815750610b7f818a878787611703565b155b80610b935750610b9189826119f9565b155b15610ba45760006001029150610e72565b610bb2898260000151611a9f565b50600073ffffffffffffffffffffffffffffffffffffffff1681600001516080015173ffffffffffffffffffffffffffffffffffffffff16141515610ce35780600001516080015173ffffffffffffffffffffffffffffffffffffffff1663977a5e64826000015160e001518360000151602001516000604051602001526040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1515610cbc57600080fd5b6102c65a03f11515610ccd57600080fd5b505050604051805190501515610ce257600080fd5b5b600081606001511115610d2e57610d2281608001518a836000015160200151610d1d8560c001518660600151611cb190919063ffffffff16565b611cca565b1515610d2d57600080fd5b5b600081602001511115610d6357610d5781608001518a8360000151604001518460200151611cca565b1515610d6257600080fd5b5b600081604001511115610d9457610d8881608001518a8360e001518460400151611cca565b1515610d9357600080fd5b5b8060e0015173ffffffffffffffffffffffffffffffffffffffff1681600001516040015173ffffffffffffffffffffffffffffffffffffffff16826000015160e00151600019167f4d61b488582cd44b5157ec41d5a9cfcc0595cc347661eda1d84cc40d7e943fb38460600151856080015186602001518760400151604051808581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182815260200194505050505060405180910390a4806000015160e0015191505b50979650505050505050565b611f4081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610edf57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610f1b57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611007612497565b61100f612497565b610140604051908101604052806110b087600060068110151561102e57fe5b602002015188600160068110151561104257fe5b602002015189600260068110151561105657fe5b60200201518a600360068110151561106a57fe5b60200201518a600060088110151561107e57fe5b60200201518b600160088110151561109257fe5b60200201518b60006001811015156110a657fe5b60200201516111df565b81526020018560036008811015156110c457fe5b602002015181526020018560046008811015156110dd57fe5b602002015181526020018560026008811015156110f657fe5b6020020151815260200186600460068110151561110f57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff16815260200185600560088110151561113e57fe5b6020020151815260200185600660088110151561115757fe5b6020020151815260200186600560068110151561117057fe5b602002015173ffffffffffffffffffffffffffffffffffffffff16815260200185600760088110151561119f57fe5b6020020151815260200160006001026000191681525090506111c081611e26565b8161012001906000191690816000191681525050809150509392505050565b6111e7612520565b6111ef612520565b610100604051908101604052808a73ffffffffffffffffffffffffffffffffffffffff1681526020018973ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018773ffffffffffffffffffffffffffffffffffffffff168152602001846000191681526020018581526020016112918b8b8b8b8b8b8b611f6f565b60001916815250905080915050979650505050505050565b6000806112c78360c001518460a001516120b890919063ffffffff16565b90506112e4836020015184604001516120b890919063ffffffff16565b8114151561133b57826101200151600019166004600881111561130357fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b8260c001518360600151101561139a57826101200151600019166005600881111561136257fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b600073ffffffffffffffffffffffffffffffffffffffff1683600001516040015173ffffffffffffffffffffffffffffffffffffffff161480156113e2575060008360200151115b8061142d5750600073ffffffffffffffffffffffffffffffffffffffff168360e0015173ffffffffffffffffffffffffffffffffffffffff1614801561142c575082602001518114155b5b1561148157826101200151600019166006600881111561144957fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b4283610100015110156114dd5782610120015160001916600160088111156114a557fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634f558e79846000015160e00151600190046000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561158257600080fd5b6102c65a03f1151561159357600080fd5b50505060405180519050156115f15782610120015160001916600060088111156115b957fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b60036000846000015160e001516000191660001916815260200190815260200160002060009054906101000a900460ff161561167657826101200151600019166002600881111561163e57fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b600460008461012001516000191660001916815260200190815260200160002060009054906101000a900460ff16156116f85782610120015160001916600360088111156116c057fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600091506116fd565b600191505b50919050565b600085600001516020015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156117eb5761179586600001516020015187610120015186600060038110151561176357fe5b602002015186600060038110151561177757fe5b602002015186600060038110151561178b57fe5b60200201516120d6565b15156117ea5785610120015160001916600760088111156117b257fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600090506119f0565b5b8473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156118c15761186b8587610120015186600160038110151561183957fe5b602002015186600160038110151561184d57fe5b602002015186600160038110151561186157fe5b60200201516120d6565b15156118c057856101200151600019166007600881111561188857fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600090506119f0565b5b600073ffffffffffffffffffffffffffffffffffffffff1686600001516040015173ffffffffffffffffffffffffffffffffffffffff161415801561193a575085600001516040015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b156119eb57611995866000015160400151611954886121dd565b86600260038110151561196357fe5b602002015186600260038110151561197757fe5b602002015186600260038110151561198b57fe5b60200201516120d6565b15156119ea5785610120015160001916600760088111156119b257fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600090506119f0565b5b600190505b95945050505050565b600080611a178360a0015184606001516120b890919063ffffffff16565b905080611a288460800151866122bb565b1080611a40575080611a3e84608001518661237e565b105b15611a935782610120015160001916600880811115611a5b57fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009150611a98565b600191505b5092915050565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166399f1050184600001518686602001518760400151886060015189608001518a60a001518b60c001516000604051602001526040518963ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001836000191660001916815260200182815260200198505050505050505050602060405180830381600087803b1515611c7357600080fd5b6102c65a03f11515611c8457600080fd5b5050506040518051905090508260e001516001900481141515611ca357fe5b8260e0015191505092915050565b6000828211151515611cbf57fe5b818303905092915050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166315dacbea868686866000604051602001526040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050602060405180830381600087803b1515611e0157600080fd5b6102c65a03f11515611e1257600080fd5b505050604051805190509050949350505050565b600030826000015160e001518360200151846060015185608001518660c001518760a001518860e0015189604001518a6101000151604051808b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018a600019166000191681526020018981526020018881526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018381526020018281526020019a505050505050505050505060405180910390209050919050565b600087878786888688604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401836000191660001916815260200182815260200197505050505050505060405180910390209050979650505050505050565b60008082840190508381101515156120cc57fe5b8091505092915050565b600060018560405180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c0182600019166000191681526020019150506040518091039020858585604051600081526020016040526000604051602001526040518085600019166000191681526020018460ff1660ff16815260200183600019166000191681526020018260001916600019168152602001945050505050602060405160208103908084039060008661646e5a03f1151561219b57600080fd5b50506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b600030826000015160e00151836020015184606001518560800151866101000151604051808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140186600019166000191681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001965050505050505060405180910390209050919050565b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231611f4061ffff16846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600088803b151561235e57600080fd5b87f1151561236b57600080fd5b5050505060405180519050905092915050565b60008273ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e611f4061ffff1684600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600088803b151561247757600080fd5b87f1151561248457600080fd5b5050505060405180519050905092915050565b610220604051908101604052806124ac6125c4565b8152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600080191681525090565b61010060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000801916815260200160008152602001600080191681525090565b61010060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008019168152602001600081526020016000801916815250905600a165627a7a723058207dc7286e90d9ea455bd504e38e706d1e72bd10278d055e25e2cb023c570eb76d0029", "sourceMap": "1252:20103:3:-;;;268:5:37;247:26;;;;;;;;;;;;;;;;;;;;4174:139:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;509:10:39;501:5;;:18;;;;;;;;;;;;;;;;;;4281:25:3;4258:20;;:48;;;;;;;;;;;;;;;;;;4174:139;1252:20103;;;;;;", "deployedSourceMap": "1252:20103:3:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8782:459;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;833:87:37;;;;;;;;;;;;;;2946:51:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;247:26:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;666:85;;;;;;;;;;;;;;2890:50:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;238:20:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2428:35:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4600:141;;;;;;;;;;;;;;;;;;;;;;;;;;;;7906:715;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2469:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4826:2907;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2829:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;832:169:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;2343:26:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8782:459;8961:26;;:::i;:::-;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;8990:55:3;9003:14;9019:11;9032:12;8990;:55::i;:::-;8961:84;;9078:9;:18;;;:25;;;9064:39;;:10;:39;;;9056:48;;;;;;;;9161:4;9115:18;:43;9134:9;:23;;;9115:43;;;;;;;;;;;;;;;;;;:50;;;;;;;;;;;;;;;;;;9223:10;9176:58;;9198:9;:23;;;9176:58;;;;;;;;;;;;;8782:459;;;;:::o;833:87:37:-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;568:6:37;;;;;;;;;;;560:15;;;;;;;;895:5;886:6;;:14;;;;;;;;;;;;;;;;;;906:9;;;;;;;;;;833:87::o;2946:51:3:-;;;;;;;;;;;;;;;;;;;;;;:::o;247:26:37:-;;;;;;;;;;;;;:::o;666:85::-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;729:4;720:6;;:13;;;;;;;;;;;;;;;;;;739:7;;;;;;;;;;666:85::o;2890:50:3:-;;;;;;;;;;;;;;;;;;;;;;:::o;238:20:39:-;;;;;;;;;;;;;:::o;2428:35:3:-;;;;;;;;;;;;;:::o;4600:141::-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;4717:16:3;4695:9;;:39;;;;;;;;;;;;;;;;;;4600:141;:::o;7906:715::-;8261:24;;:::i;:::-;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;8214:6:3;8200:20;;:10;:20;;;:49;;;;8238:11;8224:25;;:10;:25;;;8200:49;8192:58;;;;;;;;8288:204;8313:7;8334:6;8354:11;8379:13;8406:21;8441:4;8459:23;8288:11;:204::i;:::-;8261:231;;8545:4;8503:17;:39;8521:8;:20;;;8503:39;;;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;8603:10;8560:54;;8581:8;:20;;;8560:54;;;;;;;;;;;;;7906:715;;;;;;;;:::o;2469:55::-;2522:1;2514:10;;2469:55;:::o;4826:2907::-;5126:20;5162:26;;:::i;:::-;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;5191:55:3;5204:14;5220:11;5233:12;5191;:55::i;:::-;5162:84;;5313:44;5347:9;5313:33;:44::i;:::-;5312:45;:241;;;;5374:179;5430:9;5457:8;5483:11;5512;5541;5374:38;:179::i;:::-;5373:180;5312:241;:322;;;;5570:64;5614:8;5624:9;5570:43;:64::i;:::-;5569:65;5312:322;5308:378;;;2522:1;2514:10;;5650:25;;;;5308:378;5751:48;5770:8;5780:9;:18;;;5751;:48::i;:::-;;6150:1;6106:46;;:9;:18;;;:32;;;:46;;;;6102:331;;;6207:9;:18;;;:32;;;6193:86;;;6305:9;:18;;;:30;;;6361:9;:18;;;:25;;;6193:215;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6168:254;;;;;;;;6102:331;6515:1;6487:9;:25;;;:29;6483:280;;;6540:211;6576:9;:24;;;6618:8;6644:9;:18;;;:25;;;6687:50;6717:9;:19;;;6687:9;:25;;;:29;;:50;;;;:::i;:::-;6540:18;:211::i;:::-;6532:220;;;;;;;;6483:280;6855:1;6828:9;:24;;;:28;6824:258;;;6880:190;6916:9;:24;;;6958:8;6984:9;:18;;;:30;;;7032:9;:24;;;6880:18;:190::i;:::-;6872:199;;;;;;;;6824:258;7162:1;7139:9;:20;;;:24;7135:237;;;7187:173;7223:9;:24;;;7265:8;7291:9;:17;;;7326:9;:20;;;7187:18;:173::i;:::-;7179:182;;;;;;;;7135:237;7617:9;:17;;;7382:296;;7535:9;:18;;;:30;;;7382:296;;7414:9;:18;;;:30;;;7382:296;;;;7458:9;:25;;;7497:9;:24;;;7579:9;:24;;;7648:9;:20;;;7382:296;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7696:9;:18;;;:30;;;7689:37;;429:1:37;4826:2907:3;;;;;;;;;;:::o;2829:54::-;2879:4;2829:54;:::o;832:169:39:-;653:5;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;928:1;908:22;;:8;:22;;;;900:31;;;;;;;;965:8;937:37;;958:5;;;;;;;;;;;937:37;;;;;;;;;;;;988:8;980:5;;:16;;;;;;;;;;;;;;;;;;832:169;:::o;2343:26:3:-;;;;;;;;;;;;;:::o;17363:1001::-;17505:20;;:::i;:::-;17541:26;;:::i;:::-;17570:696;;;;;;;;;17604:262;17633:14;17648:1;17633:17;;;;;;;;;;;;;17668:14;17683:1;17668:17;;;;;;;;;;;;;17703:14;17718:1;17703:17;;;;;;;;;;;;;17738:14;17753:1;17738:17;;;;;;;;;;;;;17773:11;17785:1;17773:14;;;;;;;;;;;;;17805:11;17817:1;17805:14;;;;;;;;;;;;;17837:12;17850:1;17837:15;;;;;;;;;;;;;17604:11;:262::i;:::-;17570:696;;;;18028:11;18040:1;18028:14;;;;;;;;;;;;;17570:696;;;;18068:11;18080:1;18068:14;;;;;;;;;;;;;17570:696;;;;17984:11;17996:1;17984:14;;;;;;;;;;;;;17570:696;;;;17896:14;17911:1;17896:17;;;;;;;;;;;;;17570:696;;;;;;18109:11;18121:1;18109:14;;;;;;;;;;;;;17570:696;;;;18148:11;18160:1;18148:14;;;;;;;;;;;;;17570:696;;;;17936:14;17951:1;17936:17;;;;;;;;;;;;;17570:696;;;;;;18202:11;18214:1;18202:14;;;;;;;;;;;;;17570:696;;;;18253:1;18245:10;;17570:696;;;;;;17541:725;;18303:27;18320:9;18303:16;:27::i;:::-;18277:9;:23;;:53;;;;;;;;;;;;;18348:9;18341:16;;17363:1001;;;;;;:::o;16285:941::-;16564:18;;:::i;:::-;16598:24;;:::i;:::-;16625:568;;;;;;;;;16657:7;16625:568;;;;;;16686:6;16625:568;;;;;;16719:11;16625:568;;;;;;16809:21;16625:568;;;;16759:13;16625:568;;;;;;16893:23;16625:568;;;;;;;16850:4;16625:568;;;;16943:239;16975:7;17000:6;17024:11;17053:13;17084:21;17123:4;17145:23;16943:14;:239::i;:::-;16625:568;;;;;;16598:595;;17211:8;17204:15;;16285:941;;;;;;;;;;:::o;12282:2557::-;12380:18;12414:14;12431:46;12457:9;:19;;;12431:9;:21;;;:25;;:46;;;;:::i;:::-;12414:63;;12666:50;12691:9;:24;;;12666:9;:20;;;:24;;:50;;;;:::i;:::-;12653:9;:63;;12649:213;;;12801:9;:23;;;12732:93;;;12747:51;12741:58;;;;;;;;12732:93;;;;;;;;;;;;12846:5;12839:12;;;;12649:213;12988:9;:19;;;12960:9;:25;;;:47;12956:189;;;13084:9;:23;;;13023:85;;;13038:43;13032:50;;;;;;;;13023:85;;;;;;;;;;;;13129:5;13122:12;;;;12956:189;13492:1;13450:44;;:9;:18;;;:30;;;:44;;;:76;;;;;13525:1;13498:9;:24;;;:28;13450:76;13449:168;;;;13573:1;13544:31;;:9;:17;;;:31;;;:72;;;;;13592:9;:24;;;13579:9;:37;;13544:72;13449:168;13445:313;;;13697:9;:23;;;13633:88;;;13648:46;13642:53;;;;;;;;13633:88;;;;;;;;;;;;13742:5;13735:12;;;;13445:313;13916:15;13879:9;:34;;;:52;13875:171;;;13985:9;:23;;;13947:62;;;13962:20;13956:27;;;;;;;;13947:62;;;;;;;;;;;;14030:5;14023:12;;;;13875:171;14145:9;;;;;;;;;;;:16;;;14167:9;:18;;;:30;;;14162:36;;;14145:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14141:171;;;14251:9;:23;;;14215:60;;;14230:18;14224:25;;;;;;;;14215:60;;;;;;;;;;;;14296:5;14289:12;;;;14141:171;14399:17;:49;14417:9;:18;;;:30;;;14399:49;;;;;;;;;;;;;;;;;;;;;;;;;;;14395:173;;;14507:9;:23;;;14464:67;;;14479:25;14473:32;;;;;;;;14464:67;;;;;;;;;;;;14552:5;14545:12;;;;14395:173;14651:18;:43;14670:9;:23;;;14651:43;;;;;;;;;;;;;;;;;;;;;;;;;;;14647:164;;;14750:9;:23;;;14710:64;;;14725:22;14719:29;;;;;;;;14710:64;;;;;;;;;;;;14795:5;14788:12;;;;14647:164;14828:4;14821:11;;12282:2557;;;;;:::o;10229:1909::-;10466:23;10613:9;:18;;;:25;;;10599:39;;:10;:39;;;;10595:426;;;10659:210;10693:9;:18;;;:25;;;10736:9;:23;;;10777:11;10789:1;10777:14;;;;;;;;;;;;;10809:11;10821:1;10809:14;;;;;;;;;;;;;10841:11;10853:1;10841:14;;;;;;;;;;;;;10659:16;:210::i;:::-;10658:211;10654:357;;;10942:9;:23;;;10889:77;;;10904:35;10898:42;;;;;;;;10889:77;;;;;;;;;;;;10991:5;10984:12;;;;10654:357;10595:426;11143:8;11129:22;;:10;:22;;;;11125:392;;;11172:193;11206:8;11232:9;:23;;;11273:11;11285:1;11273:14;;;;;;;;;;;;;11305:11;11317:1;11305:14;;;;;;;;;;;;;11337:11;11349:1;11337:14;;;;;;;;;;;;;11172:16;:193::i;:::-;11171:194;11167:340;;;11438:9;:23;;;11385:77;;;11400:35;11394:42;;;;;;;;11385:77;;;;;;;;;;;;11487:5;11480:12;;;;11167:340;11125:392;11647:1;11605:44;;:9;:18;;;:30;;;:44;;;;:104;;;;;11679:9;:18;;;:30;;;11665:44;;:10;:44;;;;11605:104;11601:509;;;11730:228;11764:9;:18;;;:30;;;11812:36;11838:9;11812:25;:36::i;:::-;11866:11;11878:1;11866:14;;;;;;;;;;;;;11898:11;11910:1;11898:14;;;;;;;;;;;;;11930:11;11942:1;11930:14;;;;;;;;;;;;;11730:16;:228::i;:::-;11729:229;11725:375;;;12031:9;:23;;;11978:77;;;11993:35;11987:42;;;;;;;;11978:77;;;;;;;;;;;;12080:5;12073:12;;;;11725:375;11601:509;12127:4;12120:11;;10229:1909;;;;;;;;:::o;15056:624::-;15204:37;15257:25;15285:52;15315:9;:21;;;15285:9;:25;;;:29;;:52;;;;:::i;:::-;15257:80;;15401:20;15352:46;15363:9;:24;;;15389:8;15352:10;:46::i;:::-;:69;:156;;;;15488:20;15437:48;15450:9;:24;;;15476:8;15437:12;:48::i;:::-;:71;15352:156;15348:304;;;15591:9;:23;;;15524:91;;;15539:49;15533:56;;;;;;;;15524:91;;;;;;;;;;;;15636:5;15629:12;;;;15348:304;15669:4;15662:11;;15056:624;;;;;;:::o;9472:606::-;9574:20;9665:12;9680:9;;;;;;;;;;;:16;;;9710:8;:16;;;9740:11;9765:8;:15;;;9794:8;:20;;;9828:8;:30;;;9872:8;:22;;;9908:8;:32;;;9954:8;:13;;;9680:297;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9665:312;;10011:8;:20;;;10006:26;;;9995:7;:37;9988:45;;;;;;10051:8;:20;;;10044:27;;9472:606;;;;;:::o;835:110:38:-;893:7;920:1;915;:6;;908:14;;;;;;939:1;935;:5;928:12;;835:110;;;;:::o;15832:332:3:-;15986:12;16040:20;;;;;;;;;;;16021:53;;;16088:5;16107:4;16125:2;16141:6;16021:136;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16014:143;;15832:332;;;;;;:::o;19562:536::-;19656:26;19736:4;19755:9;:18;;;:30;;;19799:9;:24;;;19837:9;:25;;;19876:9;:24;;;19914:9;:19;;;19947:9;:21;;;19982:9;:17;;;20013:9;:20;;;20047:9;:34;;;19705:386;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19698:393;;19562:536;;;:::o;18441:534::-;18723:20;18789:7;18810:6;18830:11;18855:21;18890:13;18917:23;18954:4;18766:202;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18759:209;;18441:534;;;;;;;;;:::o;1007:129:38:-;1065:7;1080:9;1096:1;1092;:5;1080:17;;1115:1;1110;:6;;1103:14;;;;;;1130:1;1123:8;;1007:129;;;;;:::o;20235:360:3:-;20415:11;20459:129;20528:4;20482:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20547:1;20562;20577;20459:129;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20449:139;;:6;:139;;;20442:146;;20235:360;;;;;;;:::o;19080:417::-;19183:31;19268:4;19287:9;:18;;;:30;;;19331:9;:24;;;19369:9;:25;;;19408:9;:24;;;19446:9;:34;;;19237:253;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19230:260;;19080:417;;;:::o;20691:265::-;20810:13;20896:5;20890:22;;;2879:4;20890:52;;20943:5;20890:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20883:66;;20691:265;;;;:::o;21062:291::-;21183:15;21271:5;21265:22;;;2879:4;21265:52;;21318:5;21325:20;;;;;;;;;;;21265:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21258:88;;21062:291;;;;:::o;1252:20103::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\nimport \"./DebtToken.sol\";\nimport \"./TermsContract.sol\";\nimport \"./TokenTransferProxy.sol\";\nimport \"zeppelin-solidity/contracts/lifecycle/Pausable.sol\";\nimport \"zeppelin-solidity/contracts/math/SafeMath.sol\";\nimport \"zeppelin-solidity/contracts/token/ERC20/ERC20.sol\";\n\n\n/**\n * The DebtKernel is the hub of all business logic governing how and when\n * debt orders can be filled and cancelled. All logic that determines\n * whether a debt order is valid & consensual is contained herein,\n * as well as the mechanisms that transfer fees to keepers and\n * principal payments to debtors.\n *\n * Author: Nadav Hollander -- Github: nadavhollander\n */\ncontract DebtKernel is Pausable {\n using SafeMath for uint;\n\n enum Errors {\n // Debt has been already been issued\n DEBT_ISSUED,\n // Order has already expired\n ORDER_EXPIRED,\n // Debt issuance associated with order has been cancelled\n ISSUANCE_CANCELLED,\n // Order has been cancelled\n ORDER_CANCELLED,\n // Order parameters specify amount of creditor / debtor fees\n // that is not equivalent to the amount of underwriter / relayer fees\n ORDER_INVALID_INSUFFICIENT_OR_EXCESSIVE_FEES,\n // Order parameters specify insufficient principal amount for\n // debtor to at least be able to meet his fees\n ORDER_INVALID_INSUFFICIENT_PRINCIPAL,\n // Order parameters specify non zero fee for an unspecified recipient\n ORDER_INVALID_UNSPECIFIED_FEE_RECIPIENT,\n // Order signatures are mismatched / malformed\n ORDER_INVALID_NON_CONSENSUAL,\n // Insufficient balance or allowance for principal token transfer\n CREDITOR_BALANCE_OR_ALLOWANCE_INSUFFICIENT\n }\n\n DebtToken public debtToken;\n\n // solhint-disable-next-line var-name-mixedcase\n address public TOKEN_TRANSFER_PROXY;\n bytes32 constant public NULL_ISSUANCE_HASH = bytes32(0);\n\n /* NOTE(kayvon): Currently, the `view` keyword does not actually enforce the\n static nature of the method; this will change in the future, but for now, in\n order to prevent reentrancy we'll need to arbitrarily set an upper bound on\n the gas limit allotted for certain method calls. */\n uint16 constant public EXTERNAL_QUERY_GAS_LIMIT = 8000;\n\n mapping (bytes32 => bool) public issuanceCancelled;\n mapping (bytes32 => bool) public debtOrderCancelled;\n\n event LogDebtOrderFilled(\n bytes32 indexed _agreementId,\n uint _principal,\n address _principalToken,\n address indexed _underwriter,\n uint _underwriterFee,\n address indexed _relayer,\n uint _relayerFee\n );\n\n event LogIssuanceCancelled(\n bytes32 indexed _agreementId,\n address indexed _cancelledBy\n );\n\n event LogDebtOrderCancelled(\n bytes32 indexed _debtOrderHash,\n address indexed _cancelledBy\n );\n\n event LogError(\n uint8 indexed _errorId,\n bytes32 indexed _orderHash\n );\n\n struct Issuance {\n address version;\n address debtor;\n address underwriter;\n uint underwriterRiskRating;\n address termsContract;\n bytes32 termsContractParameters;\n uint salt;\n bytes32 agreementId;\n }\n\n struct DebtOrder {\n Issuance issuance;\n uint underwriterFee;\n uint relayerFee;\n uint principalAmount;\n address principalToken;\n uint creditorFee;\n uint debtorFee;\n address relayer;\n uint expirationTimestampInSec;\n bytes32 debtOrderHash;\n }\n\n function DebtKernel(address tokenTransferProxyAddress)\n public\n {\n TOKEN_TRANSFER_PROXY = tokenTransferProxyAddress;\n }\n\n ////////////////////////\n // EXTERNAL FUNCTIONS //\n ////////////////////////\n\n /**\n * Allows contract owner to set the currently used debt token contract.\n * Function exists to maximize upgradeability of individual modules\n * in the entire system.\n */\n function setDebtToken(address debtTokenAddress)\n public\n onlyOwner\n {\n debtToken = DebtToken(debtTokenAddress);\n }\n\n /**\n * Fills a given debt order if it is valid and consensual.\n */\n function fillDebtOrder(\n address creditor,\n address[6] orderAddresses,\n uint[8] orderValues,\n bytes32[1] orderBytes32,\n uint8[3] signaturesV,\n bytes32[3] signaturesR,\n bytes32[3] signaturesS\n )\n public\n whenNotPaused\n returns (bytes32 _agreementId)\n {\n DebtOrder memory debtOrder = getDebtOrder(orderAddresses, orderValues, orderBytes32);\n\n // Assert order's validity & consensuality\n if (!assertDebtOrderValidityInvariants(debtOrder) ||\n !assertDebtOrderConsensualityInvariants(\n debtOrder,\n creditor,\n signaturesV,\n signaturesR,\n signaturesS) ||\n !assertExternalBalanceAndAllowanceInvariants(creditor, debtOrder)) {\n return NULL_ISSUANCE_HASH;\n }\n\n // Mint debt token and finalize debt agreement\n issueDebtAgreement(creditor, debtOrder.issuance);\n\n // Register debt agreement's start with terms contract\n // We permit terms contracts to be undefined (for debt agreements which\n // may not have terms contracts associated with them), and only\n // register a term's start if the terms contract address is defined.\n if (debtOrder.issuance.termsContract != address(0)) {\n require(\n TermsContract(debtOrder.issuance.termsContract)\n .registerTermStart(\n debtOrder.issuance.agreementId,\n debtOrder.issuance.debtor\n )\n );\n }\n\n // Transfer principal to debtor\n if (debtOrder.principalAmount > 0) {\n require(transferTokensFrom(\n debtOrder.principalToken,\n creditor,\n debtOrder.issuance.debtor,\n debtOrder.principalAmount.sub(debtOrder.debtorFee)\n ));\n }\n\n // Transfer underwriter fee to underwriter\n if (debtOrder.underwriterFee > 0) {\n require(transferTokensFrom(\n debtOrder.principalToken,\n creditor,\n debtOrder.issuance.underwriter,\n debtOrder.underwriterFee\n ));\n }\n\n // Transfer relayer fee to relayer\n if (debtOrder.relayerFee > 0) {\n require(transferTokensFrom(\n debtOrder.principalToken,\n creditor,\n debtOrder.relayer,\n debtOrder.relayerFee\n ));\n }\n\n LogDebtOrderFilled(\n debtOrder.issuance.agreementId,\n debtOrder.principalAmount,\n debtOrder.principalToken,\n debtOrder.issuance.underwriter,\n debtOrder.underwriterFee,\n debtOrder.relayer,\n debtOrder.relayerFee\n );\n\n return debtOrder.issuance.agreementId;\n }\n\n /**\n * Allows both underwriters and debtors to prevent a debt\n * issuance in which they're involved from being used in\n * a future debt order.\n */\n function cancelIssuance(\n address version,\n address debtor,\n address termsContract,\n bytes32 termsContractParameters,\n address underwriter,\n uint underwriterRiskRating,\n uint salt\n )\n public\n whenNotPaused\n {\n require(msg.sender == debtor || msg.sender == underwriter);\n\n Issuance memory issuance = getIssuance(\n version,\n debtor,\n underwriter,\n termsContract,\n underwriterRiskRating,\n salt,\n termsContractParameters\n );\n\n issuanceCancelled[issuance.agreementId] = true;\n\n LogIssuanceCancelled(issuance.agreementId, msg.sender);\n }\n\n /**\n * Allows a debtor to cancel a debt order before it's been filled\n * -- preventing any counterparty from filling it in the future.\n */\n function cancelDebtOrder(\n address[6] orderAddresses,\n uint[8] orderValues,\n bytes32[1] orderBytes32\n )\n public\n whenNotPaused\n {\n DebtOrder memory debtOrder = getDebtOrder(orderAddresses, orderValues, orderBytes32);\n\n require(msg.sender == debtOrder.issuance.debtor);\n\n debtOrderCancelled[debtOrder.debtOrderHash] = true;\n\n LogDebtOrderCancelled(debtOrder.debtOrderHash, msg.sender);\n }\n\n ////////////////////////\n // INTERNAL FUNCTIONS //\n ////////////////////////\n\n /**\n * Helper function that mints debt token associated with the\n * given issuance and grants it to the beneficiary.\n */\n function issueDebtAgreement(address beneficiary, Issuance issuance)\n internal\n returns (bytes32 _agreementId)\n {\n // Mint debt token and finalize debt agreement\n uint tokenId = debtToken.create(\n issuance.version,\n beneficiary,\n issuance.debtor,\n issuance.underwriter,\n issuance.underwriterRiskRating,\n issuance.termsContract,\n issuance.termsContractParameters,\n issuance.salt\n );\n\n assert(tokenId == uint(issuance.agreementId));\n\n return issuance.agreementId;\n }\n\n /**\n * Asserts that a debt order meets all consensuality requirements\n * described in the DebtKernel specification document.\n */\n function assertDebtOrderConsensualityInvariants(\n DebtOrder debtOrder,\n address creditor,\n uint8[3] signaturesV,\n bytes32[3] signaturesR,\n bytes32[3] signaturesS\n )\n internal\n returns (bool _orderIsConsensual)\n {\n // Invariant: debtor's signature must be valid, unless debtor is submitting order\n if (msg.sender != debtOrder.issuance.debtor) {\n if (!isValidSignature(\n debtOrder.issuance.debtor,\n debtOrder.debtOrderHash,\n signaturesV[0],\n signaturesR[0],\n signaturesS[0]\n )) {\n LogError(uint8(Errors.ORDER_INVALID_NON_CONSENSUAL), debtOrder.debtOrderHash);\n return false;\n }\n }\n\n // Invariant: creditor's signature must be valid, unless creditor is submitting order\n if (msg.sender != creditor) {\n if (!isValidSignature(\n creditor,\n debtOrder.debtOrderHash,\n signaturesV[1],\n signaturesR[1],\n signaturesS[1]\n )) {\n LogError(uint8(Errors.ORDER_INVALID_NON_CONSENSUAL), debtOrder.debtOrderHash);\n return false;\n }\n }\n\n\n // Invariant: underwriter's signature must be valid (if present)\n if (debtOrder.issuance.underwriter != address(0) &&\n msg.sender != debtOrder.issuance.underwriter) {\n if (!isValidSignature(\n debtOrder.issuance.underwriter,\n getUnderwriterMessageHash(debtOrder),\n signaturesV[2],\n signaturesR[2],\n signaturesS[2]\n )) {\n LogError(uint8(Errors.ORDER_INVALID_NON_CONSENSUAL), debtOrder.debtOrderHash);\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Asserts that debt order meets all validity requirements described in\n * the DebtKernel specification document.\n */\n function assertDebtOrderValidityInvariants(DebtOrder debtOrder)\n internal\n returns (bool _orderIsValid)\n {\n uint totalFees = debtOrder.creditorFee.add(debtOrder.debtorFee);\n\n // Invariant: the total value of fees contributed by debtors and creditors\n // must be equivalent to that paid out to underwriters and relayers.\n if (totalFees != debtOrder.relayerFee.add(debtOrder.underwriterFee)) {\n LogError(uint8(Errors.ORDER_INVALID_INSUFFICIENT_OR_EXCESSIVE_FEES), debtOrder.debtOrderHash);\n return false;\n }\n\n // Invariant: debtor is given enough principal to cover at least debtorFees\n if (debtOrder.principalAmount < debtOrder.debtorFee) {\n LogError(uint8(Errors.ORDER_INVALID_INSUFFICIENT_PRINCIPAL), debtOrder.debtOrderHash);\n return false;\n }\n\n // Invariant: if no underwriter is specified, underwriter fees must be 0\n // Invariant: if no relayer is specified, relayer fees must be 0.\n // Given that relayer fees = total fees - underwriter fees,\n // we assert that total fees = underwriter fees.\n if ((debtOrder.issuance.underwriter == address(0) && debtOrder.underwriterFee > 0) ||\n (debtOrder.relayer == address(0) && totalFees != debtOrder.underwriterFee)) {\n LogError(uint8(Errors.ORDER_INVALID_UNSPECIFIED_FEE_RECIPIENT), debtOrder.debtOrderHash);\n return false;\n }\n\n // Invariant: debt order must not be expired\n // solhint-disable-next-line not-rely-on-time\n if (debtOrder.expirationTimestampInSec < block.timestamp) {\n LogError(uint8(Errors.ORDER_EXPIRED), debtOrder.debtOrderHash);\n return false;\n }\n\n // Invariant: debt order's issuance must not already be minted as debt token\n if (debtToken.exists(uint(debtOrder.issuance.agreementId))) {\n LogError(uint8(Errors.DEBT_ISSUED), debtOrder.debtOrderHash);\n return false;\n }\n\n // Invariant: debt order's issuance must not have been cancelled\n if (issuanceCancelled[debtOrder.issuance.agreementId]) {\n LogError(uint8(Errors.ISSUANCE_CANCELLED), debtOrder.debtOrderHash);\n return false;\n }\n\n // Invariant: debt order itself must not have been cancelled\n if (debtOrderCancelled[debtOrder.debtOrderHash]) {\n LogError(uint8(Errors.ORDER_CANCELLED), debtOrder.debtOrderHash);\n return false;\n }\n\n return true;\n }\n\n /**\n * Assert that the creditor has a sufficient token balance and has\n * granted the token transfer proxy contract sufficient allowance to suffice for the principal\n * and creditor fee.\n */\n function assertExternalBalanceAndAllowanceInvariants(\n address creditor,\n DebtOrder debtOrder\n )\n internal\n returns (bool _isBalanceAndAllowanceSufficient)\n {\n uint totalCreditorPayment = debtOrder.principalAmount.add(debtOrder.creditorFee);\n\n if (getBalance(debtOrder.principalToken, creditor) < totalCreditorPayment ||\n getAllowance(debtOrder.principalToken, creditor) < totalCreditorPayment) {\n LogError(uint8(Errors.CREDITOR_BALANCE_OR_ALLOWANCE_INSUFFICIENT), debtOrder.debtOrderHash);\n return false;\n }\n\n return true;\n }\n\n /**\n * Helper function transfers a specified amount of tokens between two parties\n * using the token transfer proxy contract.\n */\n function transferTokensFrom(\n address token,\n address from,\n address to,\n uint amount\n )\n internal\n returns (bool success)\n {\n return TokenTransferProxy(TOKEN_TRANSFER_PROXY).transferFrom(\n token,\n from,\n to,\n amount\n );\n }\n\n /**\n * Helper function that constructs a hashed issuance structs from the given\n * parameters.\n */\n function getIssuance(\n address version,\n address debtor,\n address underwriter,\n address termsContract,\n uint underwriterRiskRating,\n uint salt,\n bytes32 termsContractParameters\n )\n internal\n pure\n returns (Issuance _issuance)\n {\n Issuance memory issuance = Issuance({\n version: version,\n debtor: debtor,\n underwriter: underwriter,\n termsContract: termsContract,\n underwriterRiskRating: underwriterRiskRating,\n salt: salt,\n termsContractParameters: termsContractParameters,\n agreementId: getAgreementId(\n version,\n debtor,\n underwriter,\n termsContract,\n underwriterRiskRating,\n salt,\n termsContractParameters\n )\n });\n\n return issuance;\n }\n\n /**\n * Helper function that constructs a hashed debt order struct given the raw parameters\n * of a debt order.\n */\n function getDebtOrder(address[6] orderAddresses, uint[8] orderValues, bytes32[1] orderBytes32)\n internal\n view\n returns (DebtOrder _debtOrder)\n {\n DebtOrder memory debtOrder = DebtOrder({\n issuance: getIssuance(\n orderAddresses[0],\n orderAddresses[1],\n orderAddresses[2],\n orderAddresses[3],\n orderValues[0],\n orderValues[1],\n orderBytes32[0]\n ),\n principalToken: orderAddresses[4],\n relayer: orderAddresses[5],\n principalAmount: orderValues[2],\n underwriterFee: orderValues[3],\n relayerFee: orderValues[4],\n creditorFee: orderValues[5],\n debtorFee: orderValues[6],\n expirationTimestampInSec: orderValues[7],\n debtOrderHash: bytes32(0)\n });\n\n debtOrder.debtOrderHash = getDebtOrderHash(debtOrder);\n\n return debtOrder;\n }\n\n /**\n * Helper function that returns an issuance's hash\n */\n function getAgreementId(\n address version,\n address debtor,\n address underwriter,\n address termsContract,\n uint underwriterRiskRating,\n uint salt,\n bytes32 termsContractParameters\n )\n internal\n pure\n returns (bytes32 _agreementId)\n {\n return keccak256(\n version,\n debtor,\n underwriter,\n underwriterRiskRating,\n termsContract,\n termsContractParameters,\n salt\n );\n }\n\n /**\n * Returns the hash of the parameters which an underwriter is supposed to sign\n */\n function getUnderwriterMessageHash(DebtOrder debtOrder)\n internal\n view\n returns (bytes32 _underwriterMessageHash)\n {\n return keccak256(\n address(this),\n debtOrder.issuance.agreementId,\n debtOrder.underwriterFee,\n debtOrder.principalAmount,\n debtOrder.principalToken,\n debtOrder.expirationTimestampInSec\n );\n }\n\n /**\n * Returns the hash of the debt order.\n */\n function getDebtOrderHash(DebtOrder debtOrder)\n internal\n view\n returns (bytes32 _debtorMessageHash)\n {\n return keccak256(\n address(this),\n debtOrder.issuance.agreementId,\n debtOrder.underwriterFee,\n debtOrder.principalAmount,\n debtOrder.principalToken,\n debtOrder.debtorFee,\n debtOrder.creditorFee,\n debtOrder.relayer,\n debtOrder.relayerFee,\n debtOrder.expirationTimestampInSec\n );\n }\n\n /**\n * Given a hashed message, a signer's address, and a signature, returns\n * whether the signature is valid.\n */\n function isValidSignature(\n address signer,\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n )\n internal\n pure\n returns (bool _valid)\n {\n return signer == ecrecover(\n keccak256(\"\\x19Ethereum Signed Message:\\n32\", hash),\n v,\n r,\n s\n );\n }\n\n /**\n * Helper function for querying an address' balance on a given token.\n */\n function getBalance(\n address token,\n address owner\n )\n internal\n view\n returns (uint _balance)\n {\n // Limit gas to prevent reentrancy.\n return ERC20(token).balanceOf.gas(EXTERNAL_QUERY_GAS_LIMIT)(owner);\n }\n\n /**\n * Helper function for querying an address' allowance to the 0x transfer proxy.\n */\n function getAllowance(\n address token,\n address owner\n )\n internal\n view\n returns (uint _allowance)\n {\n // Limit gas to prevent reentrancy.\n return ERC20(token).allowance.gas(EXTERNAL_QUERY_GAS_LIMIT)(owner, TOKEN_TRANSFER_PROXY);\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/DebtKernel.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/DebtKernel.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/DebtKernel.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/DebtKernel.sol", "exportedSymbols": { "DebtKernel": [ 2630 @@ -438,7 +438,7 @@ export const DebtKernel = { "attributes": { "SourceUnit": 3541, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/DebtToken.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/DebtToken.sol", "file": "./DebtToken.sol", "scope": 2631, "symbolAliases": [ @@ -453,7 +453,7 @@ export const DebtKernel = { "attributes": { "SourceUnit": 4758, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/TermsContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/TermsContract.sol", "file": "./TermsContract.sol", "scope": 2631, "symbolAliases": [ @@ -468,7 +468,7 @@ export const DebtKernel = { "attributes": { "SourceUnit": 5207, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/TokenTransferProxy.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/TokenTransferProxy.sol", "file": "./TokenTransferProxy.sol", "scope": 2631, "symbolAliases": [ @@ -17683,7 +17683,7 @@ export const DebtKernel = } }, "links": {}, - "address": "0xc01c57ffedca4d0644abb966f055f040cd63fd5b" + "address": "0x4a42fbdae13791341361f9d2dd69873d83e4b816" }, "70": { "events": { @@ -17815,5 +17815,5 @@ export const DebtKernel = } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:15:01.344Z" + "updatedAt": "2018-10-09T17:51:53.185Z" } \ No newline at end of file diff --git a/artifacts/ts/DebtRegistry.ts b/artifacts/ts/DebtRegistry.ts index 41735c50..8a3038d3 100644 --- a/artifacts/ts/DebtRegistry.ts +++ b/artifacts/ts/DebtRegistry.ts @@ -542,15 +542,15 @@ export const DebtRegistry = "type": "event" } ], - "bytecode": "0x606060405260008060146101000a81548160ff021916908315150217905550336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506123298061006d6000396000f300606060405260043610610133576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632be84c6614610138578063314a522e146101c65780633f4ba83a1461020957806342cc6b041461021e5780635969549e146102575780635c975abb1461029d57806364a666f2146102ca5780636be39bda146103345780638456cb59146103aa5780638ad1d846146103bf5780638da5cb5b1461044d5780638dadc81d146104a25780638eaa6ac014610530578063932993951461064d5780639758af1e14610686578063ad655998146106c5578063ba20dda4146106fe578063c205e64c14610765578063cf9df5eb1461079e578063d69dbf631461088e578063f2fde38b146108c9578063f6f494c914610902578063f94df67814610969575b600080fd5b341561014357600080fd5b61014b6109d3565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561018b578082015181840152602081019050610170565b50505050905090810190601f1680156101b85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101d157600080fd5b6101eb600480803560001916906020019091905050610a0c565b60405180826000191660001916815260200191505060405180910390f35b341561021457600080fd5b61021c610a4a565b005b341561022957600080fd5b610255600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b08565b005b341561026257600080fd5b61029b60048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610bb1565b005b34156102a857600080fd5b6102b0610d44565b604051808215151515815260200191505060405180910390f35b34156102d557600080fd5b6102dd610d57565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610320578082015181840152602081019050610305565b505050509050019250505060405180910390f35b341561033f57600080fd5b610359600480803560001916906020019091905050610d6e565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182600019166000191681526020019250505060405180910390f35b34156103b557600080fd5b6103bd610dee565b005b34156103ca57600080fd5b6103f6600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610eae565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561043957808201518184015260208101905061041e565b505050509050019250505060405180910390f35b341561045857600080fd5b610460610f4f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104ad57600080fd5b6104b5610f74565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104f55780820151818401526020810190506104da565b50505050905090810190601f1680156105225780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561053b57600080fd5b610555600480803560001916906020019091905050610fad565b604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001836000191660001916815260200182815260200197505050505050505060405180910390f35b341561065857600080fd5b610684600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061112a565b005b341561069157600080fd5b6106ab6004808035600019169060200190919050506111d3565b604051808215151515815260200191505060405180910390f35b34156106d057600080fd5b6106fc600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061124a565b005b341561070957600080fd5b6107236004808035600019169060200190919050506112f3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561077057600080fd5b61079c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611351565b005b34156107a957600080fd5b610870600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035600019169060200190919080359060200190919050506113fa565b60405180826000191660001916815260200191505060405180910390f35b341561089957600080fd5b6108b3600480803560001916906020019091905050611835565b6040518082815260200191505060405180910390f35b34156108d457600080fd5b610900600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611873565b005b341561090d57600080fd5b6109276004808035600019169060200190919050506119c8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561097457600080fd5b61097c611a26565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156109bf5780820151818401526020810190506109a4565b505050509050019250505060405180910390f35b6040805190810160405280601281526020017f646562742d72656769737472792d65646974000000000000000000000000000081525081565b600081610a18816111d3565b1515610a2357600080fd5b60016000846000191660001916815260200190815260200160002060050154915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610aa557600080fd5b600060149054906101000a900460ff161515610ac057600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610b6357600080fd5b610bae816040805190810160405280601281526020017f646562742d72656769737472792d6564697400000000000000000000000000008152506006611a3d9092919063ffffffff16565b50565b6000610bc7336006611c1990919063ffffffff16565b1515610bd257600080fd5b600060149054906101000a900460ff16151515610bee57600080fd5b82610bf8816111d3565b1515610c0357600080fd5b82600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610c4057600080fd5b60016000866000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692508360016000876000191660001916815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1686600019167f7afbd1e661f2fdce6222afdac74cd28b1847177e232db3d0f0dcf3739e8d809460405160405180910390a45050505050565b600060149054906101000a900460ff1681565b610d5f61216e565b610d696003611c72565b905090565b60008082610d7b816111d3565b1515610d8657600080fd5b60016000856000191660001916815260200190815260200160002060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008660001916600019168152602001908152602001600020600501549250925050915091565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610e4957600080fd5b600060149054906101000a900460ff16151515610e6557600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b610eb6612182565b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015610f4357602002820191906000526020600020905b81546000191681526020019060010190808311610f2b575b50505050509050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6040805190810160405280601481526020017f646562742d72656769737472792d696e7365727400000000000000000000000081525081565b600080600080600080600060016000896000191660001916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008a6000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008b6000191660001916815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008c6000191660001916815260200190815260200160002060030154600160008d6000191660001916815260200190815260200160002060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008e6000191660001916815260200190815260200160002060050154600160008f60001916600019168152602001908152602001600020600601549650965096509650965096509650919395979092949650565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561118557600080fd5b6111d0816040805190810160405280601281526020017f646562742d72656769737472792d6564697400000000000000000000000000008152506006611d0a9092919063ffffffff16565b50565b60008073ffffffffffffffffffffffffffffffffffffffff1660016000846000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156112a557600080fd5b6112f0816040805190810160405280601481526020017f646562742d72656769737472792d696e736572740000000000000000000000008152506003611a3d9092919063ffffffff16565b50565b6000816112ff816111d3565b151561130a57600080fd5b60016000846000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156113ac57600080fd5b6113f7816040805190810160405280601481526020017f646562742d72656769737472792d696e736572740000000000000000000000008152506003611d0a9092919063ffffffff16565b50565b6000611404612196565b600061141a336003611c1990919063ffffffff16565b151561142557600080fd5b600060149054906101000a900460ff1615151561144157600080fd5b89600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561147e57600080fd5b60e0604051908101604052808d73ffffffffffffffffffffffffffffffffffffffff1681526020018c73ffffffffffffffffffffffffffffffffffffffff1681526020018a73ffffffffffffffffffffffffffffffffffffffff1681526020018981526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018760001916815260200142815250925061151b838b87612000565b9150600073ffffffffffffffffffffffffffffffffffffffff1660016000846000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561159657600080fd5b8260016000846000191660001916815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506060820151816003015560808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060a0820151816005019060001916905560c08201518160060155905050600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806001018281611746919061222f565b916000526020600020900160008490919091509060001916905550826040015173ffffffffffffffffffffffffffffffffffffffff16836020015173ffffffffffffffffffffffffffffffffffffffff1683600019167f10919d8a6bfbd0c46213ad51d6258e42af00bbf36133aada8a058bbe4f4a9240866060015187608001518860a00151604051808481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018260001916600019168152602001935050505060405180910390a481935050505098975050505050505050565b600081611841816111d3565b151561184c57600080fd5b60016000846000191660001916815260200190815260200160002060060154915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156118ce57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561190a57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000816119d4816111d3565b15156119df57600080fd5b60016000846000191660001916815260200190815260200160002060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b611a2e61216e565b611a386006611c72565b905090565b611a478383612159565b1515611a5257600080fd5b60018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550826002018054806001018281611ac2919061225b565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060018360020180549050038360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f571925c699f9072cec76b6c6c000571cc8d0bb5c47e5819202e2e9496c6508b5826040518080602001828103825283818151815260200191508051906020019080838360005b83811015611bda578082015181840152602081019050611bbf565b50505050905090810190601f168015611c075780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c7a61216e565b81600201805480602002602001604051908101604052809291908181526020018280548015611cfe57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611cb4575b50505050509050919050565b6000806000611d198686611c19565b1515611d2457600080fd5b8560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600186600201805490500391508560020182815481101515611d8657fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055808660020184815481101515611e1757fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090558560020182815481101515611efc57fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018660020181818054905003915081611f449190612287565b508473ffffffffffffffffffffffffffffffffffffffff167f0814e4ee85854cea446b4a27a460e5ffb41516230dbc02f226c07907e432241c856040518080602001828103825283818151815260200191508051906020019080838360005b83811015611fbe578082015181840152602081019050611fa3565b50505050905090810190601f168015611feb5780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050505050565b60008360000151838560400151866060015187608001518860a0015187604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018360001916600019168152602001828152602001975050505050505050604051809103902090509392505050565b60006121658383611c19565b15905092915050565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b60e060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008019168152602001600081525090565b8154818355818115116122565781836000526020600020918201910161225591906122b3565b5b505050565b8154818355818115116122825781836000526020600020918201910161228191906122d8565b5b505050565b8154818355818115116122ae578183600052602060002091820191016122ad91906122d8565b5b505050565b6122d591905b808211156122d15760008160009055506001016122b9565b5090565b90565b6122fa91905b808211156122f65760008160009055506001016122de565b5090565b905600a165627a7a72305820a7dff4e8b78a42a8352e889d366d56ee6d328cf9f4e829420fa1fc37829c4d180029", - "deployedBytecode": "0x606060405260043610610133576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632be84c6614610138578063314a522e146101c65780633f4ba83a1461020957806342cc6b041461021e5780635969549e146102575780635c975abb1461029d57806364a666f2146102ca5780636be39bda146103345780638456cb59146103aa5780638ad1d846146103bf5780638da5cb5b1461044d5780638dadc81d146104a25780638eaa6ac014610530578063932993951461064d5780639758af1e14610686578063ad655998146106c5578063ba20dda4146106fe578063c205e64c14610765578063cf9df5eb1461079e578063d69dbf631461088e578063f2fde38b146108c9578063f6f494c914610902578063f94df67814610969575b600080fd5b341561014357600080fd5b61014b6109d3565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561018b578082015181840152602081019050610170565b50505050905090810190601f1680156101b85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101d157600080fd5b6101eb600480803560001916906020019091905050610a0c565b60405180826000191660001916815260200191505060405180910390f35b341561021457600080fd5b61021c610a4a565b005b341561022957600080fd5b610255600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b08565b005b341561026257600080fd5b61029b60048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610bb1565b005b34156102a857600080fd5b6102b0610d44565b604051808215151515815260200191505060405180910390f35b34156102d557600080fd5b6102dd610d57565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610320578082015181840152602081019050610305565b505050509050019250505060405180910390f35b341561033f57600080fd5b610359600480803560001916906020019091905050610d6e565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182600019166000191681526020019250505060405180910390f35b34156103b557600080fd5b6103bd610dee565b005b34156103ca57600080fd5b6103f6600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610eae565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561043957808201518184015260208101905061041e565b505050509050019250505060405180910390f35b341561045857600080fd5b610460610f4f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104ad57600080fd5b6104b5610f74565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104f55780820151818401526020810190506104da565b50505050905090810190601f1680156105225780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561053b57600080fd5b610555600480803560001916906020019091905050610fad565b604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001836000191660001916815260200182815260200197505050505050505060405180910390f35b341561065857600080fd5b610684600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061112a565b005b341561069157600080fd5b6106ab6004808035600019169060200190919050506111d3565b604051808215151515815260200191505060405180910390f35b34156106d057600080fd5b6106fc600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061124a565b005b341561070957600080fd5b6107236004808035600019169060200190919050506112f3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561077057600080fd5b61079c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611351565b005b34156107a957600080fd5b610870600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035600019169060200190919080359060200190919050506113fa565b60405180826000191660001916815260200191505060405180910390f35b341561089957600080fd5b6108b3600480803560001916906020019091905050611835565b6040518082815260200191505060405180910390f35b34156108d457600080fd5b610900600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611873565b005b341561090d57600080fd5b6109276004808035600019169060200190919050506119c8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561097457600080fd5b61097c611a26565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156109bf5780820151818401526020810190506109a4565b505050509050019250505060405180910390f35b6040805190810160405280601281526020017f646562742d72656769737472792d65646974000000000000000000000000000081525081565b600081610a18816111d3565b1515610a2357600080fd5b60016000846000191660001916815260200190815260200160002060050154915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610aa557600080fd5b600060149054906101000a900460ff161515610ac057600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610b6357600080fd5b610bae816040805190810160405280601281526020017f646562742d72656769737472792d6564697400000000000000000000000000008152506006611a3d9092919063ffffffff16565b50565b6000610bc7336006611c1990919063ffffffff16565b1515610bd257600080fd5b600060149054906101000a900460ff16151515610bee57600080fd5b82610bf8816111d3565b1515610c0357600080fd5b82600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610c4057600080fd5b60016000866000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692508360016000876000191660001916815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1686600019167f7afbd1e661f2fdce6222afdac74cd28b1847177e232db3d0f0dcf3739e8d809460405160405180910390a45050505050565b600060149054906101000a900460ff1681565b610d5f61216e565b610d696003611c72565b905090565b60008082610d7b816111d3565b1515610d8657600080fd5b60016000856000191660001916815260200190815260200160002060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008660001916600019168152602001908152602001600020600501549250925050915091565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610e4957600080fd5b600060149054906101000a900460ff16151515610e6557600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b610eb6612182565b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015610f4357602002820191906000526020600020905b81546000191681526020019060010190808311610f2b575b50505050509050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6040805190810160405280601481526020017f646562742d72656769737472792d696e7365727400000000000000000000000081525081565b600080600080600080600060016000896000191660001916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008a6000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008b6000191660001916815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008c6000191660001916815260200190815260200160002060030154600160008d6000191660001916815260200190815260200160002060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008e6000191660001916815260200190815260200160002060050154600160008f60001916600019168152602001908152602001600020600601549650965096509650965096509650919395979092949650565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561118557600080fd5b6111d0816040805190810160405280601281526020017f646562742d72656769737472792d6564697400000000000000000000000000008152506006611d0a9092919063ffffffff16565b50565b60008073ffffffffffffffffffffffffffffffffffffffff1660016000846000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156112a557600080fd5b6112f0816040805190810160405280601481526020017f646562742d72656769737472792d696e736572740000000000000000000000008152506003611a3d9092919063ffffffff16565b50565b6000816112ff816111d3565b151561130a57600080fd5b60016000846000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156113ac57600080fd5b6113f7816040805190810160405280601481526020017f646562742d72656769737472792d696e736572740000000000000000000000008152506003611d0a9092919063ffffffff16565b50565b6000611404612196565b600061141a336003611c1990919063ffffffff16565b151561142557600080fd5b600060149054906101000a900460ff1615151561144157600080fd5b89600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561147e57600080fd5b60e0604051908101604052808d73ffffffffffffffffffffffffffffffffffffffff1681526020018c73ffffffffffffffffffffffffffffffffffffffff1681526020018a73ffffffffffffffffffffffffffffffffffffffff1681526020018981526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018760001916815260200142815250925061151b838b87612000565b9150600073ffffffffffffffffffffffffffffffffffffffff1660016000846000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561159657600080fd5b8260016000846000191660001916815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506060820151816003015560808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060a0820151816005019060001916905560c08201518160060155905050600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806001018281611746919061222f565b916000526020600020900160008490919091509060001916905550826040015173ffffffffffffffffffffffffffffffffffffffff16836020015173ffffffffffffffffffffffffffffffffffffffff1683600019167f10919d8a6bfbd0c46213ad51d6258e42af00bbf36133aada8a058bbe4f4a9240866060015187608001518860a00151604051808481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018260001916600019168152602001935050505060405180910390a481935050505098975050505050505050565b600081611841816111d3565b151561184c57600080fd5b60016000846000191660001916815260200190815260200160002060060154915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156118ce57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561190a57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000816119d4816111d3565b15156119df57600080fd5b60016000846000191660001916815260200190815260200160002060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b611a2e61216e565b611a386006611c72565b905090565b611a478383612159565b1515611a5257600080fd5b60018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550826002018054806001018281611ac2919061225b565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060018360020180549050038360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f571925c699f9072cec76b6c6c000571cc8d0bb5c47e5819202e2e9496c6508b5826040518080602001828103825283818151815260200191508051906020019080838360005b83811015611bda578082015181840152602081019050611bbf565b50505050905090810190601f168015611c075780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c7a61216e565b81600201805480602002602001604051908101604052809291908181526020018280548015611cfe57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611cb4575b50505050509050919050565b6000806000611d198686611c19565b1515611d2457600080fd5b8560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600186600201805490500391508560020182815481101515611d8657fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055808660020184815481101515611e1757fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090558560020182815481101515611efc57fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018660020181818054905003915081611f449190612287565b508473ffffffffffffffffffffffffffffffffffffffff167f0814e4ee85854cea446b4a27a460e5ffb41516230dbc02f226c07907e432241c856040518080602001828103825283818151815260200191508051906020019080838360005b83811015611fbe578082015181840152602081019050611fa3565b50505050905090810190601f168015611feb5780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050505050565b60008360000151838560400151866060015187608001518860a0015187604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018360001916600019168152602001828152602001975050505050505050604051809103902090509392505050565b60006121658383611c19565b15905092915050565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b60e060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008019168152602001600081525090565b8154818355818115116122565781836000526020600020918201910161225591906122b3565b5b505050565b8154818355818115116122825781836000526020600020918201910161228191906122d8565b5b505050565b8154818355818115116122ae578183600052602060002091820191016122ad91906122d8565b5b505050565b6122d591905b808211156122d15760008160009055506001016122b9565b5090565b90565b6122fa91905b808211156122f65760008160009055506001016122de565b5090565b905600a165627a7a72305820a7dff4e8b78a42a8352e889d366d56ee6d328cf9f4e829420fa1fc37829c4d180029", + "bytecode": "0x606060405260008060146101000a81548160ff021916908315150217905550336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506123298061006d6000396000f300606060405260043610610133576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632be84c6614610138578063314a522e146101c65780633f4ba83a1461020957806342cc6b041461021e5780635969549e146102575780635c975abb1461029d57806364a666f2146102ca5780636be39bda146103345780638456cb59146103aa5780638ad1d846146103bf5780638da5cb5b1461044d5780638dadc81d146104a25780638eaa6ac014610530578063932993951461064d5780639758af1e14610686578063ad655998146106c5578063ba20dda4146106fe578063c205e64c14610765578063cf9df5eb1461079e578063d69dbf631461088e578063f2fde38b146108c9578063f6f494c914610902578063f94df67814610969575b600080fd5b341561014357600080fd5b61014b6109d3565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561018b578082015181840152602081019050610170565b50505050905090810190601f1680156101b85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101d157600080fd5b6101eb600480803560001916906020019091905050610a0c565b60405180826000191660001916815260200191505060405180910390f35b341561021457600080fd5b61021c610a4a565b005b341561022957600080fd5b610255600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b08565b005b341561026257600080fd5b61029b60048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610bb1565b005b34156102a857600080fd5b6102b0610d44565b604051808215151515815260200191505060405180910390f35b34156102d557600080fd5b6102dd610d57565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610320578082015181840152602081019050610305565b505050509050019250505060405180910390f35b341561033f57600080fd5b610359600480803560001916906020019091905050610d6e565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182600019166000191681526020019250505060405180910390f35b34156103b557600080fd5b6103bd610dee565b005b34156103ca57600080fd5b6103f6600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610eae565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561043957808201518184015260208101905061041e565b505050509050019250505060405180910390f35b341561045857600080fd5b610460610f4f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104ad57600080fd5b6104b5610f74565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104f55780820151818401526020810190506104da565b50505050905090810190601f1680156105225780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561053b57600080fd5b610555600480803560001916906020019091905050610fad565b604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001836000191660001916815260200182815260200197505050505050505060405180910390f35b341561065857600080fd5b610684600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061112a565b005b341561069157600080fd5b6106ab6004808035600019169060200190919050506111d3565b604051808215151515815260200191505060405180910390f35b34156106d057600080fd5b6106fc600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061124a565b005b341561070957600080fd5b6107236004808035600019169060200190919050506112f3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561077057600080fd5b61079c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611351565b005b34156107a957600080fd5b610870600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035600019169060200190919080359060200190919050506113fa565b60405180826000191660001916815260200191505060405180910390f35b341561089957600080fd5b6108b3600480803560001916906020019091905050611835565b6040518082815260200191505060405180910390f35b34156108d457600080fd5b610900600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611873565b005b341561090d57600080fd5b6109276004808035600019169060200190919050506119c8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561097457600080fd5b61097c611a26565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156109bf5780820151818401526020810190506109a4565b505050509050019250505060405180910390f35b6040805190810160405280601281526020017f646562742d72656769737472792d65646974000000000000000000000000000081525081565b600081610a18816111d3565b1515610a2357600080fd5b60016000846000191660001916815260200190815260200160002060050154915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610aa557600080fd5b600060149054906101000a900460ff161515610ac057600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610b6357600080fd5b610bae816040805190810160405280601281526020017f646562742d72656769737472792d6564697400000000000000000000000000008152506006611a3d9092919063ffffffff16565b50565b6000610bc7336006611c1990919063ffffffff16565b1515610bd257600080fd5b600060149054906101000a900460ff16151515610bee57600080fd5b82610bf8816111d3565b1515610c0357600080fd5b82600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610c4057600080fd5b60016000866000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692508360016000876000191660001916815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1686600019167f7afbd1e661f2fdce6222afdac74cd28b1847177e232db3d0f0dcf3739e8d809460405160405180910390a45050505050565b600060149054906101000a900460ff1681565b610d5f61216e565b610d696003611c72565b905090565b60008082610d7b816111d3565b1515610d8657600080fd5b60016000856000191660001916815260200190815260200160002060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008660001916600019168152602001908152602001600020600501549250925050915091565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610e4957600080fd5b600060149054906101000a900460ff16151515610e6557600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b610eb6612182565b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015610f4357602002820191906000526020600020905b81546000191681526020019060010190808311610f2b575b50505050509050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6040805190810160405280601481526020017f646562742d72656769737472792d696e7365727400000000000000000000000081525081565b600080600080600080600060016000896000191660001916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008a6000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008b6000191660001916815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008c6000191660001916815260200190815260200160002060030154600160008d6000191660001916815260200190815260200160002060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008e6000191660001916815260200190815260200160002060050154600160008f60001916600019168152602001908152602001600020600601549650965096509650965096509650919395979092949650565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561118557600080fd5b6111d0816040805190810160405280601281526020017f646562742d72656769737472792d6564697400000000000000000000000000008152506006611d0a9092919063ffffffff16565b50565b60008073ffffffffffffffffffffffffffffffffffffffff1660016000846000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156112a557600080fd5b6112f0816040805190810160405280601481526020017f646562742d72656769737472792d696e736572740000000000000000000000008152506003611a3d9092919063ffffffff16565b50565b6000816112ff816111d3565b151561130a57600080fd5b60016000846000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156113ac57600080fd5b6113f7816040805190810160405280601481526020017f646562742d72656769737472792d696e736572740000000000000000000000008152506003611d0a9092919063ffffffff16565b50565b6000611404612196565b600061141a336003611c1990919063ffffffff16565b151561142557600080fd5b600060149054906101000a900460ff1615151561144157600080fd5b89600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561147e57600080fd5b60e0604051908101604052808d73ffffffffffffffffffffffffffffffffffffffff1681526020018c73ffffffffffffffffffffffffffffffffffffffff1681526020018a73ffffffffffffffffffffffffffffffffffffffff1681526020018981526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018760001916815260200142815250925061151b838b87612000565b9150600073ffffffffffffffffffffffffffffffffffffffff1660016000846000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561159657600080fd5b8260016000846000191660001916815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506060820151816003015560808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060a0820151816005019060001916905560c08201518160060155905050600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806001018281611746919061222f565b916000526020600020900160008490919091509060001916905550826040015173ffffffffffffffffffffffffffffffffffffffff16836020015173ffffffffffffffffffffffffffffffffffffffff1683600019167f10919d8a6bfbd0c46213ad51d6258e42af00bbf36133aada8a058bbe4f4a9240866060015187608001518860a00151604051808481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018260001916600019168152602001935050505060405180910390a481935050505098975050505050505050565b600081611841816111d3565b151561184c57600080fd5b60016000846000191660001916815260200190815260200160002060060154915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156118ce57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561190a57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000816119d4816111d3565b15156119df57600080fd5b60016000846000191660001916815260200190815260200160002060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b611a2e61216e565b611a386006611c72565b905090565b611a478383612159565b1515611a5257600080fd5b60018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550826002018054806001018281611ac2919061225b565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060018360020180549050038360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f571925c699f9072cec76b6c6c000571cc8d0bb5c47e5819202e2e9496c6508b5826040518080602001828103825283818151815260200191508051906020019080838360005b83811015611bda578082015181840152602081019050611bbf565b50505050905090810190601f168015611c075780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c7a61216e565b81600201805480602002602001604051908101604052809291908181526020018280548015611cfe57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611cb4575b50505050509050919050565b6000806000611d198686611c19565b1515611d2457600080fd5b8560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600186600201805490500391508560020182815481101515611d8657fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055808660020184815481101515611e1757fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090558560020182815481101515611efc57fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018660020181818054905003915081611f449190612287565b508473ffffffffffffffffffffffffffffffffffffffff167f0814e4ee85854cea446b4a27a460e5ffb41516230dbc02f226c07907e432241c856040518080602001828103825283818151815260200191508051906020019080838360005b83811015611fbe578082015181840152602081019050611fa3565b50505050905090810190601f168015611feb5780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050505050565b60008360000151838560400151866060015187608001518860a0015187604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018360001916600019168152602001828152602001975050505050505050604051809103902090509392505050565b60006121658383611c19565b15905092915050565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b60e060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008019168152602001600081525090565b8154818355818115116122565781836000526020600020918201910161225591906122b3565b5b505050565b8154818355818115116122825781836000526020600020918201910161228191906122d8565b5b505050565b8154818355818115116122ae578183600052602060002091820191016122ad91906122d8565b5b505050565b6122d591905b808211156122d15760008160009055506001016122b9565b5090565b90565b6122fa91905b808211156122f65760008160009055506001016122de565b5090565b905600a165627a7a723058201d2cee182d625af198fe8ab8069834713ceab1956303b72b02b2a75c642ebdf60029", + "deployedBytecode": "0x606060405260043610610133576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632be84c6614610138578063314a522e146101c65780633f4ba83a1461020957806342cc6b041461021e5780635969549e146102575780635c975abb1461029d57806364a666f2146102ca5780636be39bda146103345780638456cb59146103aa5780638ad1d846146103bf5780638da5cb5b1461044d5780638dadc81d146104a25780638eaa6ac014610530578063932993951461064d5780639758af1e14610686578063ad655998146106c5578063ba20dda4146106fe578063c205e64c14610765578063cf9df5eb1461079e578063d69dbf631461088e578063f2fde38b146108c9578063f6f494c914610902578063f94df67814610969575b600080fd5b341561014357600080fd5b61014b6109d3565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561018b578082015181840152602081019050610170565b50505050905090810190601f1680156101b85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101d157600080fd5b6101eb600480803560001916906020019091905050610a0c565b60405180826000191660001916815260200191505060405180910390f35b341561021457600080fd5b61021c610a4a565b005b341561022957600080fd5b610255600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b08565b005b341561026257600080fd5b61029b60048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610bb1565b005b34156102a857600080fd5b6102b0610d44565b604051808215151515815260200191505060405180910390f35b34156102d557600080fd5b6102dd610d57565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610320578082015181840152602081019050610305565b505050509050019250505060405180910390f35b341561033f57600080fd5b610359600480803560001916906020019091905050610d6e565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182600019166000191681526020019250505060405180910390f35b34156103b557600080fd5b6103bd610dee565b005b34156103ca57600080fd5b6103f6600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610eae565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561043957808201518184015260208101905061041e565b505050509050019250505060405180910390f35b341561045857600080fd5b610460610f4f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104ad57600080fd5b6104b5610f74565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104f55780820151818401526020810190506104da565b50505050905090810190601f1680156105225780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561053b57600080fd5b610555600480803560001916906020019091905050610fad565b604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001836000191660001916815260200182815260200197505050505050505060405180910390f35b341561065857600080fd5b610684600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061112a565b005b341561069157600080fd5b6106ab6004808035600019169060200190919050506111d3565b604051808215151515815260200191505060405180910390f35b34156106d057600080fd5b6106fc600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061124a565b005b341561070957600080fd5b6107236004808035600019169060200190919050506112f3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561077057600080fd5b61079c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611351565b005b34156107a957600080fd5b610870600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035600019169060200190919080359060200190919050506113fa565b60405180826000191660001916815260200191505060405180910390f35b341561089957600080fd5b6108b3600480803560001916906020019091905050611835565b6040518082815260200191505060405180910390f35b34156108d457600080fd5b610900600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611873565b005b341561090d57600080fd5b6109276004808035600019169060200190919050506119c8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561097457600080fd5b61097c611a26565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156109bf5780820151818401526020810190506109a4565b505050509050019250505060405180910390f35b6040805190810160405280601281526020017f646562742d72656769737472792d65646974000000000000000000000000000081525081565b600081610a18816111d3565b1515610a2357600080fd5b60016000846000191660001916815260200190815260200160002060050154915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610aa557600080fd5b600060149054906101000a900460ff161515610ac057600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610b6357600080fd5b610bae816040805190810160405280601281526020017f646562742d72656769737472792d6564697400000000000000000000000000008152506006611a3d9092919063ffffffff16565b50565b6000610bc7336006611c1990919063ffffffff16565b1515610bd257600080fd5b600060149054906101000a900460ff16151515610bee57600080fd5b82610bf8816111d3565b1515610c0357600080fd5b82600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610c4057600080fd5b60016000866000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692508360016000876000191660001916815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1686600019167f7afbd1e661f2fdce6222afdac74cd28b1847177e232db3d0f0dcf3739e8d809460405160405180910390a45050505050565b600060149054906101000a900460ff1681565b610d5f61216e565b610d696003611c72565b905090565b60008082610d7b816111d3565b1515610d8657600080fd5b60016000856000191660001916815260200190815260200160002060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008660001916600019168152602001908152602001600020600501549250925050915091565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610e4957600080fd5b600060149054906101000a900460ff16151515610e6557600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b610eb6612182565b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015610f4357602002820191906000526020600020905b81546000191681526020019060010190808311610f2b575b50505050509050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6040805190810160405280601481526020017f646562742d72656769737472792d696e7365727400000000000000000000000081525081565b600080600080600080600060016000896000191660001916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008a6000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008b6000191660001916815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008c6000191660001916815260200190815260200160002060030154600160008d6000191660001916815260200190815260200160002060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008e6000191660001916815260200190815260200160002060050154600160008f60001916600019168152602001908152602001600020600601549650965096509650965096509650919395979092949650565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561118557600080fd5b6111d0816040805190810160405280601281526020017f646562742d72656769737472792d6564697400000000000000000000000000008152506006611d0a9092919063ffffffff16565b50565b60008073ffffffffffffffffffffffffffffffffffffffff1660016000846000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156112a557600080fd5b6112f0816040805190810160405280601481526020017f646562742d72656769737472792d696e736572740000000000000000000000008152506003611a3d9092919063ffffffff16565b50565b6000816112ff816111d3565b151561130a57600080fd5b60016000846000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156113ac57600080fd5b6113f7816040805190810160405280601481526020017f646562742d72656769737472792d696e736572740000000000000000000000008152506003611d0a9092919063ffffffff16565b50565b6000611404612196565b600061141a336003611c1990919063ffffffff16565b151561142557600080fd5b600060149054906101000a900460ff1615151561144157600080fd5b89600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561147e57600080fd5b60e0604051908101604052808d73ffffffffffffffffffffffffffffffffffffffff1681526020018c73ffffffffffffffffffffffffffffffffffffffff1681526020018a73ffffffffffffffffffffffffffffffffffffffff1681526020018981526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018760001916815260200142815250925061151b838b87612000565b9150600073ffffffffffffffffffffffffffffffffffffffff1660016000846000191660001916815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561159657600080fd5b8260016000846000191660001916815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506060820151816003015560808201518160040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060a0820151816005019060001916905560c08201518160060155905050600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806001018281611746919061222f565b916000526020600020900160008490919091509060001916905550826040015173ffffffffffffffffffffffffffffffffffffffff16836020015173ffffffffffffffffffffffffffffffffffffffff1683600019167f10919d8a6bfbd0c46213ad51d6258e42af00bbf36133aada8a058bbe4f4a9240866060015187608001518860a00151604051808481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018260001916600019168152602001935050505060405180910390a481935050505098975050505050505050565b600081611841816111d3565b151561184c57600080fd5b60016000846000191660001916815260200190815260200160002060060154915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156118ce57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561190a57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000816119d4816111d3565b15156119df57600080fd5b60016000846000191660001916815260200190815260200160002060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b611a2e61216e565b611a386006611c72565b905090565b611a478383612159565b1515611a5257600080fd5b60018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550826002018054806001018281611ac2919061225b565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060018360020180549050038360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f571925c699f9072cec76b6c6c000571cc8d0bb5c47e5819202e2e9496c6508b5826040518080602001828103825283818151815260200191508051906020019080838360005b83811015611bda578082015181840152602081019050611bbf565b50505050905090810190601f168015611c075780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c7a61216e565b81600201805480602002602001604051908101604052809291908181526020018280548015611cfe57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611cb4575b50505050509050919050565b6000806000611d198686611c19565b1515611d2457600080fd5b8560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600186600201805490500391508560020182815481101515611d8657fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055808660020184815481101515611e1757fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090558560020182815481101515611efc57fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018660020181818054905003915081611f449190612287565b508473ffffffffffffffffffffffffffffffffffffffff167f0814e4ee85854cea446b4a27a460e5ffb41516230dbc02f226c07907e432241c856040518080602001828103825283818151815260200191508051906020019080838360005b83811015611fbe578082015181840152602081019050611fa3565b50505050905090810190601f168015611feb5780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050505050565b60008360000151838560400151866060015187608001518860a0015187604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018360001916600019168152602001828152602001975050505050505050604051809103902090509392505050565b60006121658383611c19565b15905092915050565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b60e060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008019168152602001600081525090565b8154818355818115116122565781836000526020600020918201910161225591906122b3565b5b505050565b8154818355818115116122825781836000526020600020918201910161228191906122d8565b5b505050565b8154818355818115116122ae578183600052602060002091820191016122ad91906122d8565b5b505050565b6122d591905b808211156122d15760008160009055506001016122b9565b5090565b90565b6122fa91905b808211156122f65760008160009055506001016122de565b5090565b905600a165627a7a723058201d2cee182d625af198fe8ab8069834713ceab1956303b72b02b2a75c642ebdf60029", "sourceMap": "1124:8996:4:-;;;268:5:37;247:26;;;;;;;;;;;;;;;;;;;;509:10:39;501:5;;:18;;;;;;;;;;;;;;;;;;1124:8996:4;;;;;;", "deployedSourceMap": "1124:8996:4:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1975:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7833:221:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;833:87:37;;;;;;;;;;;;;;5634:152:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;4712:495;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;247:26:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8885:164:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;8179:284:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;666:85:37;;;;;;;;;;;;;;9457:145:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;238:20:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1907:62:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6659:533:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6239:168;;;;;;;;;;;;;;;;;;;;;;;;;;;;3027:178;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5336:158;;;;;;;;;;;;;;;;;;;;;;;;;;;;7265:196;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5920:174;;;;;;;;;;;;;;;;;;;;;;;;;;;;3371:1170;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8565:226;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;832:169:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;7545:201:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9154:160;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;1975:58:4;;;;;;;;;;;;;;;;;;;;:::o;7833:221::-;7972:7;7942:11;2766:27;2781:11;2766:14;:27::i;:::-;2758:36;;;;;;;;8002:8;:21;8011:11;8002:21;;;;;;;;;;;;;;;;;:45;;;7995:52;;7833:221;;;;:::o;833:87:37:-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;568:6:37;;;;;;;;;;;560:15;;;;;;;;895:5;886:6;;:14;;;;;;;;;;;;;;;;;;906:9;;;;;;;;;;833:87::o;5634:152:4:-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;5728:51:4;5759:5;5766:12;;;;;;;;;;;;;;;;;;5728:20;:30;;:51;;;;;:::i;:::-;5634:152;:::o;4712:495::-;4944:27;2632:45;2666:10;2632:20;:33;;:45;;;;:::i;:::-;2624:54;;;;;;;;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;4874:11:4;2766:27;2781:11;2766:14;:27::i;:::-;2758:36;;;;;;;;4914:14;2908:1;2885:25;;:11;:25;;;;2877:34;;;;;;;;4974:8;:21;4983:11;4974:21;;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;4944:63;;5054:14;5018:8;:21;5027:11;5018:21;;;;;;;;;;;;;;;;;:33;;;:50;;;;;;;;;;;;;;;;;;5176:14;5079:121;;5143:19;5079:121;;5118:11;5079:121;;;;;;;;;;;;;2804:1;429::37;4712:495:4;;;:::o;247:26:37:-;;;;;;;;;;;;;:::o;8885:164:4:-;8966:9;;:::i;:::-;8998:44;:22;:42;:44::i;:::-;8991:51;;8885:164;:::o;8179:284::-;8299:7;8308;8270:11;2766:27;2781:11;2766:14;:27::i;:::-;2758:36;;;;;;;;8352:8;:21;8361:11;8352:21;;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;8401:8;:21;8410:11;8401:21;;;;;;;;;;;;;;;;;:45;;;8331:125;;;;8179:284;;;;:::o;666:85:37:-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;729:4;720:6;;:13;;;;;;;;;;;;;;;;;;739:7;;;;;;;;;;666:85::o;9457:145:4:-;9542:9;;:::i;:::-;9574:13;:21;9588:6;9574:21;;;;;;;;;;;;;;;9567:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9457:145;;;:::o;238:20:39:-;;;;;;;;;;;;;:::o;1907:62:4:-;;;;;;;;;;;;;;;;;;;;:::o;6659:533::-;6737:7;6746;6755;6764:4;6770:7;6779;6788:4;6829:8;:21;6838:11;6829:21;;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;6872:8;:21;6881:11;6872:21;;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;6919:8;:21;6928:11;6919:21;;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;6966:8;:21;6975:11;6966:21;;;;;;;;;;;;;;;;;:43;;;7023:8;:21;7032:11;7023:21;;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;7072:8;:21;7081:11;7072:21;;;;;;;;;;;;;;;;;:45;;;7131:8;:21;7140:11;7131:21;;;;;;;;;;;;;;;;;:44;;;6808:377;;;;;;;;;;;;;;6659:533;;;;;;;;;:::o;6239:168::-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;6339:61:4;6380:5;6387:12;;;;;;;;;;;;;;;;;;6339:20;:40;;:61;;;;;:::i;:::-;6239:168;:::o;3027:178::-;3117:11;3196:1;3151:47;;:8;:21;3160:11;3151:21;;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;:47;;;;3144:54;;3027:178;;;:::o;5336:158::-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;5432:55:4;5465:5;5472:14;;;;;;;;;;;;;;;;;;5432:22;:32;;:55;;;;;:::i;:::-;5336:158;:::o;7265:196::-;7391:7;7362:11;2766:27;2781:11;2766:14;:27::i;:::-;2758:36;;;;;;;;7421:8;:21;7430:11;7421:21;;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;7414:40;;7265:196;;;;:::o;5920:174::-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;6022:65:4;6065:5;6072:14;;;;;;;;;;;;;;;;;;6022:22;:42;;:65;;;;;:::i;:::-;5920:174;:::o;3371:1170::-;3761:20;3797:18;;:::i;:::-;4049:19;2510:47;2546:10;2510:22;:35;;:47;;;;:::i;:::-;2502:56;;;;;;;;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;3730:12:4;2908:1;2885:25;;:11;:25;;;;2877:34;;;;;;;;3818:220;;;;;;;;;3837:8;3818:220;;;;;;3859:12;3818:220;;;;;;3885:12;3818:220;;;;;;3911:22;3818:220;;;;3947:14;3818:220;;;;;;3975:24;3818:220;;;;;;;4013:15;3818:220;;;3797:241;;4071:38;4087:5;4094:7;4103:5;4071:15;:38::i;:::-;4049:60;;4173:1;4128:47;;:8;:21;4137:11;4128:21;;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;:47;;;4120:56;;;;;;;;4211:5;4187:8;:21;4196:11;4187:21;;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4226:13;:22;4240:7;4226:22;;;;;;;;;;;;;;;:40;;;;;;;;;;;:::i;:::-;;;;;;;;;;4254:11;4226:40;;;;;;;;;;;;4361:5;:17;;;4277:228;;4330:5;:17;;;4277:228;;4305:11;4277:228;;;;4392:5;:27;;;4433:5;:19;;;4466:5;:29;;;4277:228;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4523:11;4516:18;;429:1:37;3371:1170:4;;;;;;;;;;;;:::o;8565:226::-;8703:14;8673:11;2766:27;2781:11;2766:14;:27::i;:::-;2758:36;;;;;;;;8740:8;:21;8749:11;8740:21;;;;;;;;;;;;;;;;;:44;;;8733:51;;8565:226;;;;:::o;832:169:39:-;653:5;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;928:1;908:22;;:8;:22;;;;900:31;;;;;;;;965:8;937:37;;958:5;;;;;;;;;;;937:37;;;;;;;;;;;;988:8;980:5;;:16;;;;;;;;;;;;;;;;;;832:169;:::o;7545:201:4:-;7674:7;7644:11;2766:27;2781:11;2766:14;:27::i;:::-;2758:36;;;;;;;;7704:8;:21;7713:11;7704:21;;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;7697:42;;7545:201;;;;:::o;9154:160::-;9233:9;;:::i;:::-;9265:42;:20;:40;:42::i;:::-;9258:49;;9154:160;:::o;1732:383:17:-;1884:28;1900:4;1906:5;1884:15;:28::i;:::-;1876:37;;;;;;;;1949:4;1924;:15;;:22;1940:5;1924:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;1963:4;:21;;:33;;;;;;;;;;;:::i;:::-;;;;;;;;;;1990:5;1963:33;;;;;;;;;;;;;;;;;;;;;;;2064:1;2033:4;:21;;:28;;;;:32;2006:4;:17;;:24;2024:5;2006:24;;;;;;;;;;;;;;;:59;;;;2086:5;2075:33;;;2093:14;2075:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1732:383:17;;;:::o;3295:166::-;3405:4;3432;:15;;:22;3448:5;3432:22;;;;;;;;;;;;;;;;;;;;;;;;;3425:29;;3295:166;;;;:::o;3646:162::-;3748:9;;:::i;:::-;3780:4;:21;;3773:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3646:162;;;:::o;2121:1168::-;2489:25;2551:23;2619:19;2452:25;2465:4;2471:5;2452:12;:25::i;:::-;2444:34;;;;;;;;2517:4;:17;;:24;2535:5;2517:24;;;;;;;;;;;;;;;;2489:52;;2608:1;2577:4;:21;;:28;;;;:32;2551:58;;2641:4;:21;;2663:18;2641:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;2619:63;;2745:4;:15;;:22;2761:5;2745:22;;;;;;;;;;;;;;;;2738:29;;;;;;;;;;;2894:11;2848:4;:21;;2870:20;2848:43;;;;;;;;;;;;;;;;;;;:57;;;;;;;;;;;;;;;;;;3009:20;2976:4;:17;;:30;2994:11;2976:30;;;;;;;;;;;;;;;:53;;;;3046:4;:17;;:24;3064:5;3046:24;;;;;;;;;;;;;;;3039:31;;;3144:4;:21;;3166:18;3144:41;;;;;;;;;;;;;;;;;;;3137:48;;;;;;;;;;;3227:1;3195:4;:21;;:33;;;;;;;;;;;;;;:::i;:::-;;3260:5;3239:43;;;3267:14;3239:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2121:1168:17;;;;;;:::o;9728:390:4:-;9842:7;9895:6;:14;;;9923:7;9944:6;:18;;;9976:6;:28;;;10018:6;:20;;;10052:6;:30;;;10096:5;9872:239;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9865:246;;9728:390;;;;;:::o;3467:173:17:-;3580:4;3608:25;3621:4;3627:5;3608:12;:25::i;:::-;3607:26;3600:33;;3467:173;;;;:::o;1124:8996:4:-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\nimport { PermissionsLib, PermissionEvents } from \"./libraries/PermissionsLib.sol\";\nimport \"zeppelin-solidity/contracts/math/SafeMath.sol\";\nimport \"zeppelin-solidity/contracts/lifecycle/Pausable.sol\";\n\n\n/**\n * The DebtRegistry stores the parameters and beneficiaries of all debt agreements in\n * Dharma protocol. It authorizes a limited number of agents to\n * perform mutations on it -- those agents can be changed at any\n * time by the contract's owner.\n *\n * Author: Nadav Hollander -- Github: nadavhollander\n */\ncontract DebtRegistry is Pausable, PermissionEvents {\n using SafeMath for uint;\n using PermissionsLib for PermissionsLib.Permissions;\n\n struct Entry {\n address version;\n address beneficiary;\n address underwriter;\n uint underwriterRiskRating;\n address termsContract;\n bytes32 termsContractParameters;\n uint issuanceBlockTimestamp;\n }\n\n // Primary registry mapping agreement IDs to their corresponding entries\n mapping (bytes32 => Entry) internal registry;\n\n // Maps debtor addresses to a list of their debts' agreement IDs\n mapping (address => bytes32[]) internal debtorToDebts;\n\n PermissionsLib.Permissions internal entryInsertPermissions;\n PermissionsLib.Permissions internal entryEditPermissions;\n\n string public constant INSERT_CONTEXT = \"debt-registry-insert\";\n string public constant EDIT_CONTEXT = \"debt-registry-edit\";\n\n event LogInsertEntry(\n bytes32 indexed agreementId,\n address indexed beneficiary,\n address indexed underwriter,\n uint underwriterRiskRating,\n address termsContract,\n bytes32 termsContractParameters\n );\n\n event LogModifyEntryBeneficiary(\n bytes32 indexed agreementId,\n address indexed previousBeneficiary,\n address indexed newBeneficiary\n );\n\n modifier onlyAuthorizedToInsert() {\n require(entryInsertPermissions.isAuthorized(msg.sender));\n _;\n }\n\n modifier onlyAuthorizedToEdit() {\n require(entryEditPermissions.isAuthorized(msg.sender));\n _;\n }\n\n modifier onlyExtantEntry(bytes32 agreementId) {\n require(doesEntryExist(agreementId));\n _;\n }\n\n modifier nonNullBeneficiary(address beneficiary) {\n require(beneficiary != address(0));\n _;\n }\n\n /* Ensures an entry with the specified agreement ID exists within the debt registry. */\n function doesEntryExist(bytes32 agreementId)\n public\n view\n returns (bool exists)\n {\n return registry[agreementId].beneficiary != address(0);\n }\n\n /**\n * Inserts a new entry into the registry, if the entry is valid and sender is\n * authorized to make 'insert' mutations to the registry.\n */\n function insert(\n address _version,\n address _beneficiary,\n address _debtor,\n address _underwriter,\n uint _underwriterRiskRating,\n address _termsContract,\n bytes32 _termsContractParameters,\n uint _salt\n )\n public\n onlyAuthorizedToInsert\n whenNotPaused\n nonNullBeneficiary(_beneficiary)\n returns (bytes32 _agreementId)\n {\n Entry memory entry = Entry(\n _version,\n _beneficiary,\n _underwriter,\n _underwriterRiskRating,\n _termsContract,\n _termsContractParameters,\n block.timestamp\n );\n\n bytes32 agreementId = _getAgreementId(entry, _debtor, _salt);\n\n require(registry[agreementId].beneficiary == address(0));\n\n registry[agreementId] = entry;\n debtorToDebts[_debtor].push(agreementId);\n\n LogInsertEntry(\n agreementId,\n entry.beneficiary,\n entry.underwriter,\n entry.underwriterRiskRating,\n entry.termsContract,\n entry.termsContractParameters\n );\n\n return agreementId;\n }\n\n /**\n * Modifies the beneficiary of a debt issuance, if the sender\n * is authorized to make 'modifyBeneficiary' mutations to\n * the registry.\n */\n function modifyBeneficiary(bytes32 agreementId, address newBeneficiary)\n public\n onlyAuthorizedToEdit\n whenNotPaused\n onlyExtantEntry(agreementId)\n nonNullBeneficiary(newBeneficiary)\n {\n address previousBeneficiary = registry[agreementId].beneficiary;\n\n registry[agreementId].beneficiary = newBeneficiary;\n\n LogModifyEntryBeneficiary(\n agreementId,\n previousBeneficiary,\n newBeneficiary\n );\n }\n\n /**\n * Adds an address to the list of agents authorized\n * to make 'insert' mutations to the registry.\n */\n function addAuthorizedInsertAgent(address agent)\n public\n onlyOwner\n {\n entryInsertPermissions.authorize(agent, INSERT_CONTEXT);\n }\n\n /**\n * Adds an address to the list of agents authorized\n * to make 'modifyBeneficiary' mutations to the registry.\n */\n function addAuthorizedEditAgent(address agent)\n public\n onlyOwner\n {\n entryEditPermissions.authorize(agent, EDIT_CONTEXT);\n }\n\n /**\n * Removes an address from the list of agents authorized\n * to make 'insert' mutations to the registry.\n */\n function revokeInsertAgentAuthorization(address agent)\n public\n onlyOwner\n {\n entryInsertPermissions.revokeAuthorization(agent, INSERT_CONTEXT);\n }\n\n /**\n * Removes an address from the list of agents authorized\n * to make 'modifyBeneficiary' mutations to the registry.\n */\n function revokeEditAgentAuthorization(address agent)\n public\n onlyOwner\n {\n entryEditPermissions.revokeAuthorization(agent, EDIT_CONTEXT);\n }\n\n /**\n * Returns the parameters of a debt issuance in the registry.\n *\n * TODO(kayvon): protect this function with our `onlyExtantEntry` modifier once the restriction\n * on the size of the call stack has been addressed.\n */\n function get(bytes32 agreementId)\n public\n view\n returns(address, address, address, uint, address, bytes32, uint)\n {\n return (\n registry[agreementId].version,\n registry[agreementId].beneficiary,\n registry[agreementId].underwriter,\n registry[agreementId].underwriterRiskRating,\n registry[agreementId].termsContract,\n registry[agreementId].termsContractParameters,\n registry[agreementId].issuanceBlockTimestamp\n );\n }\n\n /**\n * Returns the beneficiary of a given issuance\n */\n function getBeneficiary(bytes32 agreementId)\n public\n view\n onlyExtantEntry(agreementId)\n returns(address)\n {\n return registry[agreementId].beneficiary;\n }\n\n /**\n * Returns the terms contract address of a given issuance\n */\n function getTermsContract(bytes32 agreementId)\n public\n view\n onlyExtantEntry(agreementId)\n returns (address)\n {\n return registry[agreementId].termsContract;\n }\n\n /**\n * Returns the terms contract parameters of a given issuance\n */\n function getTermsContractParameters(bytes32 agreementId)\n public\n view\n onlyExtantEntry(agreementId)\n returns (bytes32)\n {\n return registry[agreementId].termsContractParameters;\n }\n\n /**\n * Returns a tuple of the terms contract and its associated parameters\n * for a given issuance\n */\n function getTerms(bytes32 agreementId)\n public\n view\n onlyExtantEntry(agreementId)\n returns(address, bytes32)\n {\n return (\n registry[agreementId].termsContract,\n registry[agreementId].termsContractParameters\n );\n }\n\n /**\n * Returns the timestamp of the block at which a debt agreement was issued.\n */\n function getIssuanceBlockTimestamp(bytes32 agreementId)\n public\n view\n onlyExtantEntry(agreementId)\n returns (uint timestamp)\n {\n return registry[agreementId].issuanceBlockTimestamp;\n }\n\n /**\n * Returns the list of agents authorized to make 'insert' mutations\n */\n function getAuthorizedInsertAgents()\n public\n view\n returns(address[])\n {\n return entryInsertPermissions.getAuthorizedAgents();\n }\n\n /**\n * Returns the list of agents authorized to make 'modifyBeneficiary' mutations\n */\n function getAuthorizedEditAgents()\n public\n view\n returns(address[])\n {\n return entryEditPermissions.getAuthorizedAgents();\n }\n\n /**\n * Returns the list of debt agreements a debtor is party to,\n * with each debt agreement listed by agreement ID.\n */\n function getDebtorsDebts(address debtor)\n public\n view\n returns(bytes32[])\n {\n return debtorToDebts[debtor];\n }\n\n /**\n * Helper function for computing the hash of a given issuance,\n * and, in turn, its agreementId\n */\n function _getAgreementId(Entry _entry, address _debtor, uint _salt)\n internal\n pure\n returns(bytes32)\n {\n return keccak256(\n _entry.version,\n _debtor,\n _entry.underwriter,\n _entry.underwriterRiskRating,\n _entry.termsContract,\n _entry.termsContractParameters,\n _salt\n );\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/DebtRegistry.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/DebtRegistry.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/DebtRegistry.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/DebtRegistry.sol", "exportedSymbols": { "DebtRegistry": [ 3158 @@ -573,7 +573,7 @@ export const DebtRegistry = { "attributes": { "SourceUnit": 6272, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/libraries/PermissionsLib.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/libraries/PermissionsLib.sol", "file": "./libraries/PermissionsLib.sol", "scope": 3159, "symbolAliases": [ @@ -7985,7 +7985,7 @@ export const DebtRegistry = } }, "links": {}, - "address": "0x2bfd08581121530eba6b86eda5b2932bea8117d9" + "address": "0x0db51854d2b302e35d8f0f7a4fabb2415f9e42a5" }, "70": { "events": { @@ -8165,5 +8165,5 @@ export const DebtRegistry = } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:15:01.319Z" + "updatedAt": "2018-10-09T17:51:53.167Z" } \ No newline at end of file diff --git a/artifacts/ts/DebtToken.ts b/artifacts/ts/DebtToken.ts index 71649f3e..7ca6758b 100644 --- a/artifacts/ts/DebtToken.ts +++ b/artifacts/ts/DebtToken.ts @@ -739,15 +739,15 @@ export const DebtToken = "type": "event" } ], - "bytecode": "0x60606040526000600b60146101000a81548160ff02191690831515021790555034156200002b57600080fd5b60405160208062003823833981016040528080519060200190919050506040805190810160405280600981526020017f44656274546f6b656e00000000000000000000000000000000000000000000008152506040805190810160405280600381526020017f44445400000000000000000000000000000000000000000000000000000000008152508160049080519060200190620000cc92919062000171565b508060059080519060200190620000e592919062000171565b50505033600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505062000220565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620001b457805160ff1916838001178555620001e5565b82800160010185558215620001e5579182015b82811115620001e4578251825591602001919060010190620001c7565b5b509050620001f49190620001f8565b5090565b6200021d91905b8082111562000219576000816000905550600101620001ff565b5090565b90565b6135f380620002306000396000f3006060604052600436106101ab576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168062b0aeae146101b057806301ffc9a7146101e95780630343e1221461024357806306fdde03146102ad578063081812fc1461033b578063095ea7b31461039e578063162094c4146103e057806318160ddd146104465780631fe23d7f1461046f57806321d37127146104fd57806323b872dd146105675780632f745c59146105c857806333d261771461061e5780633f4ba83a1461065757806342842e0e1461066c5780634f558e79146106cd5780634f6ccce7146107085780635c975abb1461073f5780636352211e1461076c57806370a08231146107cf5780637b1039991461081c57806381ac3fbc146108715780638456cb59146108aa5780638da5cb5b146108bf57806395d89b411461091457806399f10501146109a25780639c0d9c4314610a8a578063a22cb46514610ac3578063a9059cbb14610b07578063b5c2f7ea14610b49578063b88d4fde14610bd7578063c87b56dd14610c7b578063e985e9c514610d17578063f2fde38b14610d87575b600080fd5b34156101bb57600080fd5b6101e7600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610dc0565b005b34156101f457600080fd5b61022960048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050610e6a565b604051808215151515815260200191505060405180910390f35b341561024e57600080fd5b610256610eb8565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561029957808201518184015260208101905061027e565b505050509050019250505060405180910390f35b34156102b857600080fd5b6102c0610ecf565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103005780820151818401526020810190506102e5565b50505050905090810190601f16801561032d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561034657600080fd5b61035c6004808035906020019091905050610f77565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103a957600080fd5b6103de600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610fb4565b005b34156103eb57600080fd5b610444600480803590602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610fde565b005b341561045157600080fd5b610459611027565b6040518082815260200191505060405180910390f35b341561047a57600080fd5b610482611034565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104c25780820151818401526020810190506104a7565b50505050905090810190601f1680156104ef5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561050857600080fd5b61051061106d565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610553578082015181840152602081019050610538565b505050509050019250505060405180910390f35b341561057257600080fd5b6105c6600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611084565b005b34156105d357600080fd5b610608600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506110ba565b6040518082815260200191505060405180910390f35b341561062957600080fd5b610655600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611132565b005b341561066257600080fd5b61066a6111dc565b005b341561067757600080fd5b6106cb600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061129c565b005b34156106d857600080fd5b6106ee60048080359060200190919050506112d2565b604051808215151515815260200191505060405180910390f35b341561071357600080fd5b6107296004808035906020019091905050611343565b6040518082815260200191505060405180910390f35b341561074a57600080fd5b61075261137c565b604051808215151515815260200191505060405180910390f35b341561077757600080fd5b61078d600480803590602001909190505061138f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156107da57600080fd5b610806600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061140c565b6040518082815260200191505060405180910390f35b341561082757600080fd5b61082f611490565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561087c57600080fd5b6108a8600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506114b6565b005b34156108b557600080fd5b6108bd611560565b005b34156108ca57600080fd5b6108d2611621565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561091f57600080fd5b610927611647565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561096757808201518184015260208101905061094c565b50505050905090810190601f1680156109945780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156109ad57600080fd5b610a74600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035600019169060200190919080359060200190919050506116ef565b6040518082815260200191505060405180910390f35b3415610a9557600080fd5b610ac1600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611921565b005b3415610ace57600080fd5b610b05600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803515159060200190919050506119cb565b005b3415610b1257600080fd5b610b47600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506119f5565b005b3415610b5457600080fd5b610b5c611a04565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610b9c578082015181840152602081019050610b81565b50505050905090810190601f168015610bc95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610be257600080fd5b610c79600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611a3d565b005b3415610c8657600080fd5b610c9c6004808035906020019091905050611a75565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610cdc578082015181840152602081019050610cc1565b50505050905090810190601f168015610d095780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610d2257600080fd5b610d6d600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611b44565b604051808215151515815260200191505060405180910390f35b3415610d9257600080fd5b610dbe600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611bd8565b005b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610e1c57600080fd5b610e67816040805190810160405280600e81526020017f646562742d746f6b656e2d7572690000000000000000000000000000000000008152506010611d309092919063ffffffff16565b50565b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610ec061344a565b610eca600d612026565b905090565b610ed761345e565b60048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f6d5780601f10610f4257610100808354040283529160200191610f6d565b820191906000526020600020905b815481529060010190602001808311610f5057829003601f168201915b5050505050905090565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600b60149054906101000a900460ff16151515610fd057600080fd5b610fda82826120be565b5050565b600b60149054906101000a900460ff16151515610ffa57600080fd5b61100e33601061228490919063ffffffff16565b151561101957600080fd5b61102382826122dd565b5050565b6000600880549050905090565b6040805190810160405280601381526020017f646562742d746f6b656e2d6372656174696f6e0000000000000000000000000081525081565b61107561344a565b61107f6010612026565b905090565b600b60149054906101000a900460ff161515156110a057600080fd5b6110aa818361231d565b6110b58383836124f8565b505050565b60006110c58361140c565b821015156110d257600080fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110151561111e57fe5b906000526020600020900154905092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561118e57600080fd5b6111d9816040805190810160405280600e81526020017f646562742d746f6b656e2d757269000000000000000000000000000000000000815250601061260f9092919063ffffffff16565b50565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561123857600080fd5b600b60149054906101000a900460ff16151561125357600080fd5b6000600b60146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b600b60149054906101000a900460ff161515156112b857600080fd5b6112c2818361231d565b6112cd8383836127eb565b505050565b60008060008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b600061134d611027565b8210151561135a57600080fd5b60088281548110151561136957fe5b9060005260206000209001549050919050565b600b60149054906101000a900460ff1681565b60008060008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561140357600080fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561144957600080fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561151257600080fd5b61155d816040805190810160405280601381526020017f646562742d746f6b656e2d6372656174696f6e00000000000000000000000000815250600d611d309092919063ffffffff16565b50565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156115bc57600080fd5b600b60149054906101000a900460ff161515156115d857600080fd5b6001600b60146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61164f61345e565b60058054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116e55780601f106116ba576101008083540402835291602001916116e5565b820191906000526020600020905b8154815290600101906020018083116116c857829003601f168201915b5050505050905090565b600080600b60149054906101000a900460ff1615151561170e57600080fd5b61172233600d61228490919063ffffffff16565b151561172d57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cf9df5eb8b8b8b8b8b8b8b8b6000604051602001526040518963ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001836000191660001916815260200182815260200198505050505050505050602060405180830381600087803b15156118e257600080fd5b6102c65a03f115156118f357600080fd5b50505060405180519050905061190d898260019004612823565b806001900491505098975050505050505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561197d57600080fd5b6119c8816040805190810160405280601381526020017f646562742d746f6b656e2d6372656174696f6e00000000000000000000000000815250600d61260f9092919063ffffffff16565b50565b600b60149054906101000a900460ff161515156119e757600080fd5b6119f18282612877565b5050565b611a0033838361129c565b5050565b6040805190810160405280600e81526020017f646562742d746f6b656e2d75726900000000000000000000000000000000000081525081565b600b60149054906101000a900460ff16151515611a5957600080fd5b611a63828461231d565b611a6f848484846129b3565b50505050565b611a7d61345e565b611a86826112d2565b1515611a9157600080fd5b600a60008381526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b385780601f10611b0d57610100808354040283529160200191611b38565b820191906000526020600020905b815481529060010190602001808311611b1b57829003601f168201915b50505050509050919050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c3457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611c7057600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806000611d3f8686612284565b1515611d4a57600080fd5b8560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600186600201805490500391508560020182815481101515611dac57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055808660020184815481101515611e3d57fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090558560020182815481101515611f2257fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018660020181818054905003915081611f6a9190613472565b508473ffffffffffffffffffffffffffffffffffffffff167f0814e4ee85854cea446b4a27a460e5ffb41516230dbc02f226c07907e432241c856040518080602001828103825283818151815260200191508051906020019080838360005b83811015611fe4578082015181840152602081019050611fc9565b50505050905090810190601f1680156120115780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050505050565b61202e61344a565b816002018054806020026020016040519081016040528092919081815260200182805480156120b257602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612068575b50505050509050919050565b60006120c98261138f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561210657600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061214657506121458133611b44565b5b151561215157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff1661217283610f77565b73ffffffffffffffffffffffffffffffffffffffff161415806121c25750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b1561227f57826001600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a35b505050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122e6826112d2565b15156122f157600080fd5b80600a6000848152602001908152602001600020908051906020019061231892919061349e565b505050565b8073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ba20dda4846001026000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156123d857600080fd5b6102c65a03f115156123e957600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff161415156124f457600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635969549e83600102836040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b15156124df57600080fd5b6102c65a03f115156124f057600080fd5b5050505b5050565b8061250333826129f2565b151561250e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415151561254a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561258657600080fd5b6125908483612a87565b61259a8483612bf0565b6125a48383612e0b565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a350505050565b6126198383612edf565b151561262457600080fd5b60018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550826002018054806001018281612694919061351e565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060018360020180549050038360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f571925c699f9072cec76b6c6c000571cc8d0bb5c47e5819202e2e9496c6508b5826040518080602001828103825283818151815260200191508051906020019080838360005b838110156127ac578082015181840152602081019050612791565b50505050905090810190601f1680156127d95780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b806127f633826129f2565b151561280157600080fd5b61281d8484846020604051908101604052806000815250611a3d565b50505050565b61282d8282612ef4565b60088054905060096000838152602001908152602001600020819055506008805480600101828161285e919061354a565b9160005260206000209001600083909190915055505050565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156128b257600080fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b816129be33826129f2565b15156129c957600080fd5b6129d4858585611084565b6129e085858585612fa4565b15156129eb57600080fd5b5050505050565b6000806129fe8361138f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612a6d57508373ffffffffffffffffffffffffffffffffffffffff16612a5584610f77565b73ffffffffffffffffffffffffffffffffffffffff16145b80612a7e5750612a7d8185611b44565b5b91505092915050565b8173ffffffffffffffffffffffffffffffffffffffff16612aa78261138f565b73ffffffffffffffffffffffffffffffffffffffff16141515612ac957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515612bec5760006001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a35b5050565b6000806000612bff858561317a565b60076000858152602001908152602001600020549250612c6b6001600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506132a890919063ffffffff16565b9150600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515612cb957fe5b906000526020600020900154905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084815481101515612d1457fe5b9060005260206000209001819055506000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481101515612d7157fe5b906000526020600020900181905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480919060019003612dd29190613576565b50600060076000868152602001908152602001600020819055508260076000838152602001908152602001600020819055505050505050565b6000612e1783836132c1565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806001018281612ead919061354a565b916000526020600020900160008490919091505550806007600084815260200190815260200160002081905550505050565b6000612eeb8383612284565b15905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612f3057600080fd5b612f3a8282612e0b565b8173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600080612fc68573ffffffffffffffffffffffffffffffffffffffff16613419565b1515612fd55760019150613171565b8473ffffffffffffffffffffffffffffffffffffffff1663f0b9e5ba8786866000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156130a0578082015181840152602081019050613085565b50505050905090810190601f1680156130cd5780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15156130ed57600080fd5b6102c65a03f115156130fe57600080fd5b50505060405180519050905063f0b9e5ba7c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505b50949350505050565b8173ffffffffffffffffffffffffffffffffffffffff1661319a8261138f565b73ffffffffffffffffffffffffffffffffffffffff161415156131bc57600080fd5b61320f6001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546132a890919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600080600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008282111515156132b657fe5b818303905092915050565b600073ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561332e57600080fd5b8160008083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506133d26001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461342c90919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600080823b905060008111915050919050565b600080828401905083811015151561344057fe5b8091505092915050565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b8154818355818115116134995781836000526020600020918201910161349891906135a2565b5b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106134df57805160ff191683800117855561350d565b8280016001018555821561350d579182015b8281111561350c5782518255916020019190600101906134f1565b5b50905061351a91906135a2565b5090565b8154818355818115116135455781836000526020600020918201910161354491906135a2565b5b505050565b8154818355818115116135715781836000526020600020918201910161357091906135a2565b5b505050565b81548183558181151161359d5781836000526020600020918201910161359c91906135a2565b5b505050565b6135c491905b808211156135c05760008160009055506001016135a8565b5090565b905600a165627a7a72305820a06f7ebb5629e063d990ddf25ad858bb8d53ff1f3e3648d9ec7809bdc3692dc50029", - "deployedBytecode": "0x6060604052600436106101ab576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168062b0aeae146101b057806301ffc9a7146101e95780630343e1221461024357806306fdde03146102ad578063081812fc1461033b578063095ea7b31461039e578063162094c4146103e057806318160ddd146104465780631fe23d7f1461046f57806321d37127146104fd57806323b872dd146105675780632f745c59146105c857806333d261771461061e5780633f4ba83a1461065757806342842e0e1461066c5780634f558e79146106cd5780634f6ccce7146107085780635c975abb1461073f5780636352211e1461076c57806370a08231146107cf5780637b1039991461081c57806381ac3fbc146108715780638456cb59146108aa5780638da5cb5b146108bf57806395d89b411461091457806399f10501146109a25780639c0d9c4314610a8a578063a22cb46514610ac3578063a9059cbb14610b07578063b5c2f7ea14610b49578063b88d4fde14610bd7578063c87b56dd14610c7b578063e985e9c514610d17578063f2fde38b14610d87575b600080fd5b34156101bb57600080fd5b6101e7600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610dc0565b005b34156101f457600080fd5b61022960048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050610e6a565b604051808215151515815260200191505060405180910390f35b341561024e57600080fd5b610256610eb8565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561029957808201518184015260208101905061027e565b505050509050019250505060405180910390f35b34156102b857600080fd5b6102c0610ecf565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103005780820151818401526020810190506102e5565b50505050905090810190601f16801561032d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561034657600080fd5b61035c6004808035906020019091905050610f77565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103a957600080fd5b6103de600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610fb4565b005b34156103eb57600080fd5b610444600480803590602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610fde565b005b341561045157600080fd5b610459611027565b6040518082815260200191505060405180910390f35b341561047a57600080fd5b610482611034565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104c25780820151818401526020810190506104a7565b50505050905090810190601f1680156104ef5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561050857600080fd5b61051061106d565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610553578082015181840152602081019050610538565b505050509050019250505060405180910390f35b341561057257600080fd5b6105c6600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611084565b005b34156105d357600080fd5b610608600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506110ba565b6040518082815260200191505060405180910390f35b341561062957600080fd5b610655600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611132565b005b341561066257600080fd5b61066a6111dc565b005b341561067757600080fd5b6106cb600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061129c565b005b34156106d857600080fd5b6106ee60048080359060200190919050506112d2565b604051808215151515815260200191505060405180910390f35b341561071357600080fd5b6107296004808035906020019091905050611343565b6040518082815260200191505060405180910390f35b341561074a57600080fd5b61075261137c565b604051808215151515815260200191505060405180910390f35b341561077757600080fd5b61078d600480803590602001909190505061138f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156107da57600080fd5b610806600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061140c565b6040518082815260200191505060405180910390f35b341561082757600080fd5b61082f611490565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561087c57600080fd5b6108a8600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506114b6565b005b34156108b557600080fd5b6108bd611560565b005b34156108ca57600080fd5b6108d2611621565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561091f57600080fd5b610927611647565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561096757808201518184015260208101905061094c565b50505050905090810190601f1680156109945780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156109ad57600080fd5b610a74600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035600019169060200190919080359060200190919050506116ef565b6040518082815260200191505060405180910390f35b3415610a9557600080fd5b610ac1600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611921565b005b3415610ace57600080fd5b610b05600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803515159060200190919050506119cb565b005b3415610b1257600080fd5b610b47600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506119f5565b005b3415610b5457600080fd5b610b5c611a04565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610b9c578082015181840152602081019050610b81565b50505050905090810190601f168015610bc95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610be257600080fd5b610c79600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611a3d565b005b3415610c8657600080fd5b610c9c6004808035906020019091905050611a75565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610cdc578082015181840152602081019050610cc1565b50505050905090810190601f168015610d095780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610d2257600080fd5b610d6d600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611b44565b604051808215151515815260200191505060405180910390f35b3415610d9257600080fd5b610dbe600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611bd8565b005b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610e1c57600080fd5b610e67816040805190810160405280600e81526020017f646562742d746f6b656e2d7572690000000000000000000000000000000000008152506010611d309092919063ffffffff16565b50565b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610ec061344a565b610eca600d612026565b905090565b610ed761345e565b60048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f6d5780601f10610f4257610100808354040283529160200191610f6d565b820191906000526020600020905b815481529060010190602001808311610f5057829003601f168201915b5050505050905090565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600b60149054906101000a900460ff16151515610fd057600080fd5b610fda82826120be565b5050565b600b60149054906101000a900460ff16151515610ffa57600080fd5b61100e33601061228490919063ffffffff16565b151561101957600080fd5b61102382826122dd565b5050565b6000600880549050905090565b6040805190810160405280601381526020017f646562742d746f6b656e2d6372656174696f6e0000000000000000000000000081525081565b61107561344a565b61107f6010612026565b905090565b600b60149054906101000a900460ff161515156110a057600080fd5b6110aa818361231d565b6110b58383836124f8565b505050565b60006110c58361140c565b821015156110d257600080fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110151561111e57fe5b906000526020600020900154905092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561118e57600080fd5b6111d9816040805190810160405280600e81526020017f646562742d746f6b656e2d757269000000000000000000000000000000000000815250601061260f9092919063ffffffff16565b50565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561123857600080fd5b600b60149054906101000a900460ff16151561125357600080fd5b6000600b60146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b600b60149054906101000a900460ff161515156112b857600080fd5b6112c2818361231d565b6112cd8383836127eb565b505050565b60008060008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b600061134d611027565b8210151561135a57600080fd5b60088281548110151561136957fe5b9060005260206000209001549050919050565b600b60149054906101000a900460ff1681565b60008060008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561140357600080fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561144957600080fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561151257600080fd5b61155d816040805190810160405280601381526020017f646562742d746f6b656e2d6372656174696f6e00000000000000000000000000815250600d611d309092919063ffffffff16565b50565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156115bc57600080fd5b600b60149054906101000a900460ff161515156115d857600080fd5b6001600b60146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61164f61345e565b60058054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116e55780601f106116ba576101008083540402835291602001916116e5565b820191906000526020600020905b8154815290600101906020018083116116c857829003601f168201915b5050505050905090565b600080600b60149054906101000a900460ff1615151561170e57600080fd5b61172233600d61228490919063ffffffff16565b151561172d57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cf9df5eb8b8b8b8b8b8b8b8b6000604051602001526040518963ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001836000191660001916815260200182815260200198505050505050505050602060405180830381600087803b15156118e257600080fd5b6102c65a03f115156118f357600080fd5b50505060405180519050905061190d898260019004612823565b806001900491505098975050505050505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561197d57600080fd5b6119c8816040805190810160405280601381526020017f646562742d746f6b656e2d6372656174696f6e00000000000000000000000000815250600d61260f9092919063ffffffff16565b50565b600b60149054906101000a900460ff161515156119e757600080fd5b6119f18282612877565b5050565b611a0033838361129c565b5050565b6040805190810160405280600e81526020017f646562742d746f6b656e2d75726900000000000000000000000000000000000081525081565b600b60149054906101000a900460ff16151515611a5957600080fd5b611a63828461231d565b611a6f848484846129b3565b50505050565b611a7d61345e565b611a86826112d2565b1515611a9157600080fd5b600a60008381526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b385780601f10611b0d57610100808354040283529160200191611b38565b820191906000526020600020905b815481529060010190602001808311611b1b57829003601f168201915b50505050509050919050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c3457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611c7057600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806000611d3f8686612284565b1515611d4a57600080fd5b8560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600186600201805490500391508560020182815481101515611dac57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055808660020184815481101515611e3d57fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090558560020182815481101515611f2257fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018660020181818054905003915081611f6a9190613472565b508473ffffffffffffffffffffffffffffffffffffffff167f0814e4ee85854cea446b4a27a460e5ffb41516230dbc02f226c07907e432241c856040518080602001828103825283818151815260200191508051906020019080838360005b83811015611fe4578082015181840152602081019050611fc9565b50505050905090810190601f1680156120115780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050505050565b61202e61344a565b816002018054806020026020016040519081016040528092919081815260200182805480156120b257602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612068575b50505050509050919050565b60006120c98261138f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561210657600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061214657506121458133611b44565b5b151561215157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff1661217283610f77565b73ffffffffffffffffffffffffffffffffffffffff161415806121c25750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b1561227f57826001600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a35b505050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122e6826112d2565b15156122f157600080fd5b80600a6000848152602001908152602001600020908051906020019061231892919061349e565b505050565b8073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ba20dda4846001026000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156123d857600080fd5b6102c65a03f115156123e957600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff161415156124f457600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635969549e83600102836040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b15156124df57600080fd5b6102c65a03f115156124f057600080fd5b5050505b5050565b8061250333826129f2565b151561250e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415151561254a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561258657600080fd5b6125908483612a87565b61259a8483612bf0565b6125a48383612e0b565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a350505050565b6126198383612edf565b151561262457600080fd5b60018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550826002018054806001018281612694919061351e565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060018360020180549050038360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f571925c699f9072cec76b6c6c000571cc8d0bb5c47e5819202e2e9496c6508b5826040518080602001828103825283818151815260200191508051906020019080838360005b838110156127ac578082015181840152602081019050612791565b50505050905090810190601f1680156127d95780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b806127f633826129f2565b151561280157600080fd5b61281d8484846020604051908101604052806000815250611a3d565b50505050565b61282d8282612ef4565b60088054905060096000838152602001908152602001600020819055506008805480600101828161285e919061354a565b9160005260206000209001600083909190915055505050565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156128b257600080fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b816129be33826129f2565b15156129c957600080fd5b6129d4858585611084565b6129e085858585612fa4565b15156129eb57600080fd5b5050505050565b6000806129fe8361138f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612a6d57508373ffffffffffffffffffffffffffffffffffffffff16612a5584610f77565b73ffffffffffffffffffffffffffffffffffffffff16145b80612a7e5750612a7d8185611b44565b5b91505092915050565b8173ffffffffffffffffffffffffffffffffffffffff16612aa78261138f565b73ffffffffffffffffffffffffffffffffffffffff16141515612ac957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515612bec5760006001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a35b5050565b6000806000612bff858561317a565b60076000858152602001908152602001600020549250612c6b6001600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506132a890919063ffffffff16565b9150600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515612cb957fe5b906000526020600020900154905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084815481101515612d1457fe5b9060005260206000209001819055506000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481101515612d7157fe5b906000526020600020900181905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480919060019003612dd29190613576565b50600060076000868152602001908152602001600020819055508260076000838152602001908152602001600020819055505050505050565b6000612e1783836132c1565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806001018281612ead919061354a565b916000526020600020900160008490919091505550806007600084815260200190815260200160002081905550505050565b6000612eeb8383612284565b15905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612f3057600080fd5b612f3a8282612e0b565b8173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600080612fc68573ffffffffffffffffffffffffffffffffffffffff16613419565b1515612fd55760019150613171565b8473ffffffffffffffffffffffffffffffffffffffff1663f0b9e5ba8786866000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156130a0578082015181840152602081019050613085565b50505050905090810190601f1680156130cd5780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15156130ed57600080fd5b6102c65a03f115156130fe57600080fd5b50505060405180519050905063f0b9e5ba7c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505b50949350505050565b8173ffffffffffffffffffffffffffffffffffffffff1661319a8261138f565b73ffffffffffffffffffffffffffffffffffffffff161415156131bc57600080fd5b61320f6001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546132a890919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600080600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008282111515156132b657fe5b818303905092915050565b600073ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561332e57600080fd5b8160008083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506133d26001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461342c90919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600080823b905060008111915050919050565b600080828401905083811015151561344057fe5b8091505092915050565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b8154818355818115116134995781836000526020600020918201910161349891906135a2565b5b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106134df57805160ff191683800117855561350d565b8280016001018555821561350d579182015b8281111561350c5782518255916020019190600101906134f1565b5b50905061351a91906135a2565b5090565b8154818355818115116135455781836000526020600020918201910161354491906135a2565b5b505050565b8154818355818115116135715781836000526020600020918201910161357091906135a2565b5b505050565b81548183558181151161359d5781836000526020600020918201910161359c91906135a2565b5b505050565b6135c491905b808211156135c05760008160009055506001016135a8565b5090565b905600a165627a7a72305820a06f7ebb5629e063d990ddf25ad858bb8d53ff1f3e3648d9ec7809bdc3692dc50029", + "bytecode": "0x60606040526000600b60146101000a81548160ff02191690831515021790555034156200002b57600080fd5b60405160208062003823833981016040528080519060200190919050506040805190810160405280600981526020017f44656274546f6b656e00000000000000000000000000000000000000000000008152506040805190810160405280600381526020017f44445400000000000000000000000000000000000000000000000000000000008152508160049080519060200190620000cc92919062000171565b508060059080519060200190620000e592919062000171565b50505033600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505062000220565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620001b457805160ff1916838001178555620001e5565b82800160010185558215620001e5579182015b82811115620001e4578251825591602001919060010190620001c7565b5b509050620001f49190620001f8565b5090565b6200021d91905b8082111562000219576000816000905550600101620001ff565b5090565b90565b6135f380620002306000396000f3006060604052600436106101ab576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168062b0aeae146101b057806301ffc9a7146101e95780630343e1221461024357806306fdde03146102ad578063081812fc1461033b578063095ea7b31461039e578063162094c4146103e057806318160ddd146104465780631fe23d7f1461046f57806321d37127146104fd57806323b872dd146105675780632f745c59146105c857806333d261771461061e5780633f4ba83a1461065757806342842e0e1461066c5780634f558e79146106cd5780634f6ccce7146107085780635c975abb1461073f5780636352211e1461076c57806370a08231146107cf5780637b1039991461081c57806381ac3fbc146108715780638456cb59146108aa5780638da5cb5b146108bf57806395d89b411461091457806399f10501146109a25780639c0d9c4314610a8a578063a22cb46514610ac3578063a9059cbb14610b07578063b5c2f7ea14610b49578063b88d4fde14610bd7578063c87b56dd14610c7b578063e985e9c514610d17578063f2fde38b14610d87575b600080fd5b34156101bb57600080fd5b6101e7600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610dc0565b005b34156101f457600080fd5b61022960048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050610e6a565b604051808215151515815260200191505060405180910390f35b341561024e57600080fd5b610256610eb8565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561029957808201518184015260208101905061027e565b505050509050019250505060405180910390f35b34156102b857600080fd5b6102c0610ecf565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103005780820151818401526020810190506102e5565b50505050905090810190601f16801561032d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561034657600080fd5b61035c6004808035906020019091905050610f77565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103a957600080fd5b6103de600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610fb4565b005b34156103eb57600080fd5b610444600480803590602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610fde565b005b341561045157600080fd5b610459611027565b6040518082815260200191505060405180910390f35b341561047a57600080fd5b610482611034565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104c25780820151818401526020810190506104a7565b50505050905090810190601f1680156104ef5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561050857600080fd5b61051061106d565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610553578082015181840152602081019050610538565b505050509050019250505060405180910390f35b341561057257600080fd5b6105c6600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611084565b005b34156105d357600080fd5b610608600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506110ba565b6040518082815260200191505060405180910390f35b341561062957600080fd5b610655600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611132565b005b341561066257600080fd5b61066a6111dc565b005b341561067757600080fd5b6106cb600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061129c565b005b34156106d857600080fd5b6106ee60048080359060200190919050506112d2565b604051808215151515815260200191505060405180910390f35b341561071357600080fd5b6107296004808035906020019091905050611343565b6040518082815260200191505060405180910390f35b341561074a57600080fd5b61075261137c565b604051808215151515815260200191505060405180910390f35b341561077757600080fd5b61078d600480803590602001909190505061138f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156107da57600080fd5b610806600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061140c565b6040518082815260200191505060405180910390f35b341561082757600080fd5b61082f611490565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561087c57600080fd5b6108a8600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506114b6565b005b34156108b557600080fd5b6108bd611560565b005b34156108ca57600080fd5b6108d2611621565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561091f57600080fd5b610927611647565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561096757808201518184015260208101905061094c565b50505050905090810190601f1680156109945780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156109ad57600080fd5b610a74600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035600019169060200190919080359060200190919050506116ef565b6040518082815260200191505060405180910390f35b3415610a9557600080fd5b610ac1600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611921565b005b3415610ace57600080fd5b610b05600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803515159060200190919050506119cb565b005b3415610b1257600080fd5b610b47600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506119f5565b005b3415610b5457600080fd5b610b5c611a04565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610b9c578082015181840152602081019050610b81565b50505050905090810190601f168015610bc95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610be257600080fd5b610c79600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611a3d565b005b3415610c8657600080fd5b610c9c6004808035906020019091905050611a75565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610cdc578082015181840152602081019050610cc1565b50505050905090810190601f168015610d095780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610d2257600080fd5b610d6d600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611b44565b604051808215151515815260200191505060405180910390f35b3415610d9257600080fd5b610dbe600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611bd8565b005b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610e1c57600080fd5b610e67816040805190810160405280600e81526020017f646562742d746f6b656e2d7572690000000000000000000000000000000000008152506010611d309092919063ffffffff16565b50565b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610ec061344a565b610eca600d612026565b905090565b610ed761345e565b60048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f6d5780601f10610f4257610100808354040283529160200191610f6d565b820191906000526020600020905b815481529060010190602001808311610f5057829003601f168201915b5050505050905090565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600b60149054906101000a900460ff16151515610fd057600080fd5b610fda82826120be565b5050565b600b60149054906101000a900460ff16151515610ffa57600080fd5b61100e33601061228490919063ffffffff16565b151561101957600080fd5b61102382826122dd565b5050565b6000600880549050905090565b6040805190810160405280601381526020017f646562742d746f6b656e2d6372656174696f6e0000000000000000000000000081525081565b61107561344a565b61107f6010612026565b905090565b600b60149054906101000a900460ff161515156110a057600080fd5b6110aa818361231d565b6110b58383836124f8565b505050565b60006110c58361140c565b821015156110d257600080fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110151561111e57fe5b906000526020600020900154905092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561118e57600080fd5b6111d9816040805190810160405280600e81526020017f646562742d746f6b656e2d757269000000000000000000000000000000000000815250601061260f9092919063ffffffff16565b50565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561123857600080fd5b600b60149054906101000a900460ff16151561125357600080fd5b6000600b60146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b600b60149054906101000a900460ff161515156112b857600080fd5b6112c2818361231d565b6112cd8383836127eb565b505050565b60008060008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b600061134d611027565b8210151561135a57600080fd5b60088281548110151561136957fe5b9060005260206000209001549050919050565b600b60149054906101000a900460ff1681565b60008060008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561140357600080fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561144957600080fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561151257600080fd5b61155d816040805190810160405280601381526020017f646562742d746f6b656e2d6372656174696f6e00000000000000000000000000815250600d611d309092919063ffffffff16565b50565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156115bc57600080fd5b600b60149054906101000a900460ff161515156115d857600080fd5b6001600b60146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61164f61345e565b60058054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116e55780601f106116ba576101008083540402835291602001916116e5565b820191906000526020600020905b8154815290600101906020018083116116c857829003601f168201915b5050505050905090565b600080600b60149054906101000a900460ff1615151561170e57600080fd5b61172233600d61228490919063ffffffff16565b151561172d57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cf9df5eb8b8b8b8b8b8b8b8b6000604051602001526040518963ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001836000191660001916815260200182815260200198505050505050505050602060405180830381600087803b15156118e257600080fd5b6102c65a03f115156118f357600080fd5b50505060405180519050905061190d898260019004612823565b806001900491505098975050505050505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561197d57600080fd5b6119c8816040805190810160405280601381526020017f646562742d746f6b656e2d6372656174696f6e00000000000000000000000000815250600d61260f9092919063ffffffff16565b50565b600b60149054906101000a900460ff161515156119e757600080fd5b6119f18282612877565b5050565b611a0033838361129c565b5050565b6040805190810160405280600e81526020017f646562742d746f6b656e2d75726900000000000000000000000000000000000081525081565b600b60149054906101000a900460ff16151515611a5957600080fd5b611a63828461231d565b611a6f848484846129b3565b50505050565b611a7d61345e565b611a86826112d2565b1515611a9157600080fd5b600a60008381526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b385780601f10611b0d57610100808354040283529160200191611b38565b820191906000526020600020905b815481529060010190602001808311611b1b57829003601f168201915b50505050509050919050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c3457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611c7057600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806000611d3f8686612284565b1515611d4a57600080fd5b8560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600186600201805490500391508560020182815481101515611dac57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055808660020184815481101515611e3d57fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090558560020182815481101515611f2257fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018660020181818054905003915081611f6a9190613472565b508473ffffffffffffffffffffffffffffffffffffffff167f0814e4ee85854cea446b4a27a460e5ffb41516230dbc02f226c07907e432241c856040518080602001828103825283818151815260200191508051906020019080838360005b83811015611fe4578082015181840152602081019050611fc9565b50505050905090810190601f1680156120115780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050505050565b61202e61344a565b816002018054806020026020016040519081016040528092919081815260200182805480156120b257602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612068575b50505050509050919050565b60006120c98261138f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561210657600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061214657506121458133611b44565b5b151561215157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff1661217283610f77565b73ffffffffffffffffffffffffffffffffffffffff161415806121c25750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b1561227f57826001600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a35b505050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122e6826112d2565b15156122f157600080fd5b80600a6000848152602001908152602001600020908051906020019061231892919061349e565b505050565b8073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ba20dda4846001026000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156123d857600080fd5b6102c65a03f115156123e957600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff161415156124f457600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635969549e83600102836040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b15156124df57600080fd5b6102c65a03f115156124f057600080fd5b5050505b5050565b8061250333826129f2565b151561250e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415151561254a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561258657600080fd5b6125908483612a87565b61259a8483612bf0565b6125a48383612e0b565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a350505050565b6126198383612edf565b151561262457600080fd5b60018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550826002018054806001018281612694919061351e565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060018360020180549050038360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f571925c699f9072cec76b6c6c000571cc8d0bb5c47e5819202e2e9496c6508b5826040518080602001828103825283818151815260200191508051906020019080838360005b838110156127ac578082015181840152602081019050612791565b50505050905090810190601f1680156127d95780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b806127f633826129f2565b151561280157600080fd5b61281d8484846020604051908101604052806000815250611a3d565b50505050565b61282d8282612ef4565b60088054905060096000838152602001908152602001600020819055506008805480600101828161285e919061354a565b9160005260206000209001600083909190915055505050565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156128b257600080fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b816129be33826129f2565b15156129c957600080fd5b6129d4858585611084565b6129e085858585612fa4565b15156129eb57600080fd5b5050505050565b6000806129fe8361138f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612a6d57508373ffffffffffffffffffffffffffffffffffffffff16612a5584610f77565b73ffffffffffffffffffffffffffffffffffffffff16145b80612a7e5750612a7d8185611b44565b5b91505092915050565b8173ffffffffffffffffffffffffffffffffffffffff16612aa78261138f565b73ffffffffffffffffffffffffffffffffffffffff16141515612ac957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515612bec5760006001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a35b5050565b6000806000612bff858561317a565b60076000858152602001908152602001600020549250612c6b6001600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506132a890919063ffffffff16565b9150600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515612cb957fe5b906000526020600020900154905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084815481101515612d1457fe5b9060005260206000209001819055506000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481101515612d7157fe5b906000526020600020900181905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480919060019003612dd29190613576565b50600060076000868152602001908152602001600020819055508260076000838152602001908152602001600020819055505050505050565b6000612e1783836132c1565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806001018281612ead919061354a565b916000526020600020900160008490919091505550806007600084815260200190815260200160002081905550505050565b6000612eeb8383612284565b15905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612f3057600080fd5b612f3a8282612e0b565b8173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600080612fc68573ffffffffffffffffffffffffffffffffffffffff16613419565b1515612fd55760019150613171565b8473ffffffffffffffffffffffffffffffffffffffff1663f0b9e5ba8786866000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156130a0578082015181840152602081019050613085565b50505050905090810190601f1680156130cd5780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15156130ed57600080fd5b6102c65a03f115156130fe57600080fd5b50505060405180519050905063f0b9e5ba7c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505b50949350505050565b8173ffffffffffffffffffffffffffffffffffffffff1661319a8261138f565b73ffffffffffffffffffffffffffffffffffffffff161415156131bc57600080fd5b61320f6001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546132a890919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600080600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008282111515156132b657fe5b818303905092915050565b600073ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561332e57600080fd5b8160008083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506133d26001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461342c90919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600080823b905060008111915050919050565b600080828401905083811015151561344057fe5b8091505092915050565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b8154818355818115116134995781836000526020600020918201910161349891906135a2565b5b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106134df57805160ff191683800117855561350d565b8280016001018555821561350d579182015b8281111561350c5782518255916020019190600101906134f1565b5b50905061351a91906135a2565b5090565b8154818355818115116135455781836000526020600020918201910161354491906135a2565b5b505050565b8154818355818115116135715781836000526020600020918201910161357091906135a2565b5b505050565b81548183558181151161359d5781836000526020600020918201910161359c91906135a2565b5b505050565b6135c491905b808211156135c05760008160009055506001016135a8565b5090565b905600a165627a7a7230582074db728e3ec6848db28867954bfe392ba4e952253ab40eff39894b329dea5cbe0029", + "deployedBytecode": "0x6060604052600436106101ab576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168062b0aeae146101b057806301ffc9a7146101e95780630343e1221461024357806306fdde03146102ad578063081812fc1461033b578063095ea7b31461039e578063162094c4146103e057806318160ddd146104465780631fe23d7f1461046f57806321d37127146104fd57806323b872dd146105675780632f745c59146105c857806333d261771461061e5780633f4ba83a1461065757806342842e0e1461066c5780634f558e79146106cd5780634f6ccce7146107085780635c975abb1461073f5780636352211e1461076c57806370a08231146107cf5780637b1039991461081c57806381ac3fbc146108715780638456cb59146108aa5780638da5cb5b146108bf57806395d89b411461091457806399f10501146109a25780639c0d9c4314610a8a578063a22cb46514610ac3578063a9059cbb14610b07578063b5c2f7ea14610b49578063b88d4fde14610bd7578063c87b56dd14610c7b578063e985e9c514610d17578063f2fde38b14610d87575b600080fd5b34156101bb57600080fd5b6101e7600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610dc0565b005b34156101f457600080fd5b61022960048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050610e6a565b604051808215151515815260200191505060405180910390f35b341561024e57600080fd5b610256610eb8565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561029957808201518184015260208101905061027e565b505050509050019250505060405180910390f35b34156102b857600080fd5b6102c0610ecf565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103005780820151818401526020810190506102e5565b50505050905090810190601f16801561032d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561034657600080fd5b61035c6004808035906020019091905050610f77565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103a957600080fd5b6103de600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610fb4565b005b34156103eb57600080fd5b610444600480803590602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610fde565b005b341561045157600080fd5b610459611027565b6040518082815260200191505060405180910390f35b341561047a57600080fd5b610482611034565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104c25780820151818401526020810190506104a7565b50505050905090810190601f1680156104ef5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561050857600080fd5b61051061106d565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610553578082015181840152602081019050610538565b505050509050019250505060405180910390f35b341561057257600080fd5b6105c6600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611084565b005b34156105d357600080fd5b610608600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506110ba565b6040518082815260200191505060405180910390f35b341561062957600080fd5b610655600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611132565b005b341561066257600080fd5b61066a6111dc565b005b341561067757600080fd5b6106cb600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061129c565b005b34156106d857600080fd5b6106ee60048080359060200190919050506112d2565b604051808215151515815260200191505060405180910390f35b341561071357600080fd5b6107296004808035906020019091905050611343565b6040518082815260200191505060405180910390f35b341561074a57600080fd5b61075261137c565b604051808215151515815260200191505060405180910390f35b341561077757600080fd5b61078d600480803590602001909190505061138f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156107da57600080fd5b610806600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061140c565b6040518082815260200191505060405180910390f35b341561082757600080fd5b61082f611490565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561087c57600080fd5b6108a8600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506114b6565b005b34156108b557600080fd5b6108bd611560565b005b34156108ca57600080fd5b6108d2611621565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561091f57600080fd5b610927611647565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561096757808201518184015260208101905061094c565b50505050905090810190601f1680156109945780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156109ad57600080fd5b610a74600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035600019169060200190919080359060200190919050506116ef565b6040518082815260200191505060405180910390f35b3415610a9557600080fd5b610ac1600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611921565b005b3415610ace57600080fd5b610b05600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803515159060200190919050506119cb565b005b3415610b1257600080fd5b610b47600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506119f5565b005b3415610b5457600080fd5b610b5c611a04565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610b9c578082015181840152602081019050610b81565b50505050905090810190601f168015610bc95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610be257600080fd5b610c79600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611a3d565b005b3415610c8657600080fd5b610c9c6004808035906020019091905050611a75565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610cdc578082015181840152602081019050610cc1565b50505050905090810190601f168015610d095780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610d2257600080fd5b610d6d600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611b44565b604051808215151515815260200191505060405180910390f35b3415610d9257600080fd5b610dbe600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611bd8565b005b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610e1c57600080fd5b610e67816040805190810160405280600e81526020017f646562742d746f6b656e2d7572690000000000000000000000000000000000008152506010611d309092919063ffffffff16565b50565b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610ec061344a565b610eca600d612026565b905090565b610ed761345e565b60048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f6d5780601f10610f4257610100808354040283529160200191610f6d565b820191906000526020600020905b815481529060010190602001808311610f5057829003601f168201915b5050505050905090565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600b60149054906101000a900460ff16151515610fd057600080fd5b610fda82826120be565b5050565b600b60149054906101000a900460ff16151515610ffa57600080fd5b61100e33601061228490919063ffffffff16565b151561101957600080fd5b61102382826122dd565b5050565b6000600880549050905090565b6040805190810160405280601381526020017f646562742d746f6b656e2d6372656174696f6e0000000000000000000000000081525081565b61107561344a565b61107f6010612026565b905090565b600b60149054906101000a900460ff161515156110a057600080fd5b6110aa818361231d565b6110b58383836124f8565b505050565b60006110c58361140c565b821015156110d257600080fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110151561111e57fe5b906000526020600020900154905092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561118e57600080fd5b6111d9816040805190810160405280600e81526020017f646562742d746f6b656e2d757269000000000000000000000000000000000000815250601061260f9092919063ffffffff16565b50565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561123857600080fd5b600b60149054906101000a900460ff16151561125357600080fd5b6000600b60146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b600b60149054906101000a900460ff161515156112b857600080fd5b6112c2818361231d565b6112cd8383836127eb565b505050565b60008060008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b600061134d611027565b8210151561135a57600080fd5b60088281548110151561136957fe5b9060005260206000209001549050919050565b600b60149054906101000a900460ff1681565b60008060008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561140357600080fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561144957600080fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561151257600080fd5b61155d816040805190810160405280601381526020017f646562742d746f6b656e2d6372656174696f6e00000000000000000000000000815250600d611d309092919063ffffffff16565b50565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156115bc57600080fd5b600b60149054906101000a900460ff161515156115d857600080fd5b6001600b60146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61164f61345e565b60058054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116e55780601f106116ba576101008083540402835291602001916116e5565b820191906000526020600020905b8154815290600101906020018083116116c857829003601f168201915b5050505050905090565b600080600b60149054906101000a900460ff1615151561170e57600080fd5b61172233600d61228490919063ffffffff16565b151561172d57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cf9df5eb8b8b8b8b8b8b8b8b6000604051602001526040518963ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001836000191660001916815260200182815260200198505050505050505050602060405180830381600087803b15156118e257600080fd5b6102c65a03f115156118f357600080fd5b50505060405180519050905061190d898260019004612823565b806001900491505098975050505050505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561197d57600080fd5b6119c8816040805190810160405280601381526020017f646562742d746f6b656e2d6372656174696f6e00000000000000000000000000815250600d61260f9092919063ffffffff16565b50565b600b60149054906101000a900460ff161515156119e757600080fd5b6119f18282612877565b5050565b611a0033838361129c565b5050565b6040805190810160405280600e81526020017f646562742d746f6b656e2d75726900000000000000000000000000000000000081525081565b600b60149054906101000a900460ff16151515611a5957600080fd5b611a63828461231d565b611a6f848484846129b3565b50505050565b611a7d61345e565b611a86826112d2565b1515611a9157600080fd5b600a60008381526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b385780601f10611b0d57610100808354040283529160200191611b38565b820191906000526020600020905b815481529060010190602001808311611b1b57829003601f168201915b50505050509050919050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c3457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611c7057600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806000611d3f8686612284565b1515611d4a57600080fd5b8560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600186600201805490500391508560020182815481101515611dac57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055808660020184815481101515611e3d57fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090558560020182815481101515611f2257fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018660020181818054905003915081611f6a9190613472565b508473ffffffffffffffffffffffffffffffffffffffff167f0814e4ee85854cea446b4a27a460e5ffb41516230dbc02f226c07907e432241c856040518080602001828103825283818151815260200191508051906020019080838360005b83811015611fe4578082015181840152602081019050611fc9565b50505050905090810190601f1680156120115780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050505050565b61202e61344a565b816002018054806020026020016040519081016040528092919081815260200182805480156120b257602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612068575b50505050509050919050565b60006120c98261138f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561210657600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061214657506121458133611b44565b5b151561215157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff1661217283610f77565b73ffffffffffffffffffffffffffffffffffffffff161415806121c25750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b1561227f57826001600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a35b505050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122e6826112d2565b15156122f157600080fd5b80600a6000848152602001908152602001600020908051906020019061231892919061349e565b505050565b8073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ba20dda4846001026000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156123d857600080fd5b6102c65a03f115156123e957600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff161415156124f457600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635969549e83600102836040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b15156124df57600080fd5b6102c65a03f115156124f057600080fd5b5050505b5050565b8061250333826129f2565b151561250e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415151561254a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561258657600080fd5b6125908483612a87565b61259a8483612bf0565b6125a48383612e0b565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a350505050565b6126198383612edf565b151561262457600080fd5b60018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550826002018054806001018281612694919061351e565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060018360020180549050038360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f571925c699f9072cec76b6c6c000571cc8d0bb5c47e5819202e2e9496c6508b5826040518080602001828103825283818151815260200191508051906020019080838360005b838110156127ac578082015181840152602081019050612791565b50505050905090810190601f1680156127d95780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b806127f633826129f2565b151561280157600080fd5b61281d8484846020604051908101604052806000815250611a3d565b50505050565b61282d8282612ef4565b60088054905060096000838152602001908152602001600020819055506008805480600101828161285e919061354a565b9160005260206000209001600083909190915055505050565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156128b257600080fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b816129be33826129f2565b15156129c957600080fd5b6129d4858585611084565b6129e085858585612fa4565b15156129eb57600080fd5b5050505050565b6000806129fe8361138f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612a6d57508373ffffffffffffffffffffffffffffffffffffffff16612a5584610f77565b73ffffffffffffffffffffffffffffffffffffffff16145b80612a7e5750612a7d8185611b44565b5b91505092915050565b8173ffffffffffffffffffffffffffffffffffffffff16612aa78261138f565b73ffffffffffffffffffffffffffffffffffffffff16141515612ac957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515612bec5760006001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a35b5050565b6000806000612bff858561317a565b60076000858152602001908152602001600020549250612c6b6001600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506132a890919063ffffffff16565b9150600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515612cb957fe5b906000526020600020900154905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084815481101515612d1457fe5b9060005260206000209001819055506000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481101515612d7157fe5b906000526020600020900181905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480919060019003612dd29190613576565b50600060076000868152602001908152602001600020819055508260076000838152602001908152602001600020819055505050505050565b6000612e1783836132c1565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806001018281612ead919061354a565b916000526020600020900160008490919091505550806007600084815260200190815260200160002081905550505050565b6000612eeb8383612284565b15905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612f3057600080fd5b612f3a8282612e0b565b8173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600080612fc68573ffffffffffffffffffffffffffffffffffffffff16613419565b1515612fd55760019150613171565b8473ffffffffffffffffffffffffffffffffffffffff1663f0b9e5ba8786866000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156130a0578082015181840152602081019050613085565b50505050905090810190601f1680156130cd5780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15156130ed57600080fd5b6102c65a03f115156130fe57600080fd5b50505060405180519050905063f0b9e5ba7c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505b50949350505050565b8173ffffffffffffffffffffffffffffffffffffffff1661319a8261138f565b73ffffffffffffffffffffffffffffffffffffffff161415156131bc57600080fd5b61320f6001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546132a890919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600080600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008282111515156132b657fe5b818303905092915050565b600073ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561332e57600080fd5b8160008083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506133d26001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461342c90919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600080823b905060008111915050919050565b600080828401905083811015151561344057fe5b8091505092915050565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b8154818355818115116134995781836000526020600020918201910161349891906135a2565b5b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106134df57805160ff191683800117855561350d565b8280016001018555821561350d579182015b8281111561350c5782518255916020019190600101906134f1565b5b50905061351a91906135a2565b5090565b8154818355818115116135455781836000526020600020918201910161354491906135a2565b5b505050565b8154818355818115116135715781836000526020600020918201910161357091906135a2565b5b505050565b81548183558181151161359d5781836000526020600020918201910161359c91906135a2565b5b505050565b6135c491905b808211156135c05760008160009055506001016135a8565b5090565b905600a165627a7a7230582074db728e3ec6848db28867954bfe392ba4e952253ab40eff39894b329dea5cbe0029", "sourceMap": "1362:6140:5:-;;;268:5:37;247:26;;;;;;;;;;;;;;;;;;;;1867:148:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1107:105:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1179:5;1171;:13;;;;;;;;;;;;:::i;:::-;;1200:7;1190;:17;;;;;;;;;;;;:::i;:::-;;1107:105;;509:10:39;501:5;;:18;;;;;;;;;;;;;;;;;;1998:9:5;1974:8;;:34;;;;;;;;;;;;;;;;;;1867:148;1362:6140;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;", "deployedSourceMap": "1362:6140:5:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4640:167;;;;;;;;;;;;;;;;;;;;;;;;;;;;2110:176;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3854:173;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;1303:68:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3577:111:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4974:131:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6913:207;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2887:87:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1659:63:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4366:172:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;5793:206:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2571:177:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4124:156:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;833:87:37;;;;;;;;;;;;;;6175:214:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2445:140:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3298::50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;247:26:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2107:164:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1756:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1496:28:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3589:178;;;;;;;;;;;;;;;;;;;;;;;;;;;;666:85:37;;;;;;;;;;;;;;238:20:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1466:72:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2455:770:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3324:162;;;;;;;;;;;;;;;;;;;;;;;;;;;;5281:153;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5496:125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1728:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6565:234:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1727:133:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4478:142:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;832:169:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;4640:167:5;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;4740:60:5;4780:6;4788:11;;;;;;;;;;;;;;;;;;4740:19;:39;;:60;;;;;:::i;:::-;4640:167;:::o;2110:176::-;2204:17;2259:10;2244:25;;:11;:25;;;;2237:32;;2110:176;;;:::o;3854:173::-;3934:17;;:::i;:::-;3974:46;:24;:44;:46::i;:::-;3967:53;;3854:173;:::o;1303:68:50:-;1340:6;;:::i;:::-;1361:5;1354:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1303:68;:::o;3577:111:48:-;3637:7;3659:14;:24;3674:8;3659:24;;;;;;;;;;;;;;;;;;;;;3652:31;;3577:111;;;:::o;4974:131:5:-;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;5070:28:5;5084:3;5089:8;5070:13;:28::i;:::-;4974:131;;:::o;6913:207::-;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;7024:44:5;7057:10;7024:19;:32;;:44;;;;:::i;:::-;7016:53;;;;;;;;7079:34;7098:8;7108:4;7079:18;:34::i;:::-;6913:207;;:::o;2887:87:50:-;2931:7;2953:9;:16;;;;2946:23;;2887:87;:::o;1659:63:5:-;;;;;;;;;;;;;;;;;;;;:::o;4366:172::-;4450:17;;:::i;:::-;4490:41;:19;:39;:41::i;:::-;4483:48;;4366:172;:::o;5793:206::-;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;5909:33:5;5928:8;5938:3;5909:18;:33::i;:::-;5952:40;5971:5;5978:3;5983:8;5952:18;:40::i;:::-;5793:206;;;:::o;2571:177:50:-;2653:7;2685:17;2695:6;2685:9;:17::i;:::-;2676:6;:26;2668:35;;;;;;;;2716:11;:19;2728:6;2716:19;;;;;;;;;;;;;;;2736:6;2716:27;;;;;;;;;;;;;;;;;;;2709:34;;2571:177;;;;:::o;4124:156:5:-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;4223:50:5;4253:6;4261:11;;;;;;;;;;;;;;;;;;4223:19;:29;;:50;;;;;:::i;:::-;4124:156;:::o;833:87:37:-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;568:6:37;;;;;;;;;;;560:15;;;;;;;;895:5;886:6;;:14;;;;;;;;;;;;;;;;;;906:9;;;;;;;;;;833:87::o;6175:214:5:-;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;6295:33:5;6314:8;6324:3;6295:18;:33::i;:::-;6338:44;6361:5;6368:3;6373:8;6338:22;:44::i;:::-;6175:214;;;:::o;2445:140:48:-;2500:4;2512:13;2528:10;:20;2539:8;2528:20;;;;;;;;;;;;;;;;;;;;;2512:36;;2578:1;2561:19;;:5;:19;;;;2554:26;;2445:140;;;;:::o;3298::50:-;3357:7;3389:13;:11;:13::i;:::-;3380:6;:22;3372:31;;;;;;;;3416:9;3426:6;3416:17;;;;;;;;;;;;;;;;;;;3409:24;;3298:140;;;:::o;247:26:37:-;;;;;;;;;;;;;:::o;2107:164:48:-;2163:7;2178:13;2194:10;:20;2205:8;2194:20;;;;;;;;;;;;;;;;;;;;;2178:36;;2245:1;2228:19;;:5;:19;;;;2220:28;;;;;;;;2261:5;2254:12;;2107:164;;;;:::o;1756:142::-;1812:7;1853:1;1835:20;;:6;:20;;;;1827:29;;;;;;;;1869:16;:24;1886:6;1869:24;;;;;;;;;;;;;;;;1862:31;;1756:142;;;:::o;1496:28:5:-;;;;;;;;;;;;;:::o;3589:178::-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;3690:70:5;3735:6;3743:16;;;;;;;;;;;;;;;;;;3690:24;:44;;:70;;;;;:::i;:::-;3589:178;:::o;666:85:37:-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;729:4;720:6;;:13;;;;;;;;;;;;;;;;;;739:7;;;;;;;;;;666:85::o;238:20:39:-;;;;;;;;;;;;;:::o;1466:72:50:-;1505:6;;:::i;:::-;1526:7;1519:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1466:72;:::o;2455:770:5:-;2773:13;2871:17;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;2810:49:5;2848:10;2810:24;:37;;:49;;;;:::i;:::-;2802:58;;;;;;;;2891:8;;;;;;;;;;;:15;;;2920:8;2942:12;2968:7;2989:12;3015:22;3051:14;3079:24;3117:5;2891:241;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2871:261;;3143:42;3155:12;3174:9;3169:15;;;3143:11;:42::i;:::-;3208:9;3203:15;;;3196:22;;2455:770;;;;;;;;;;;:::o;3324:162::-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;3419:60:5;3454:6;3462:16;;;;;;;;;;;;;;;;;;3419:24;:34;;:60;;;;;:::i;:::-;3324:162;:::o;5281:153::-;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;5388:39:5;5412:3;5417:9;5388:23;:39::i;:::-;5281:153;;:::o;5496:125::-;5571:43;5588:10;5600:3;5605:8;5571:16;:43::i;:::-;5496:125;;:::o;1728:53::-;;;;;;;;;;;;;;;;;;;;:::o;6565:234::-;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;6698:33:5;6717:8;6727:3;6698:18;:33::i;:::-;6741:51;6764:5;6771:3;6776:8;6786:5;6741:22;:51::i;:::-;6565:234;;;;:::o;1727:133:50:-;1784:6;;:::i;:::-;1806:16;1813:8;1806:6;:16::i;:::-;1798:25;;;;;;;;1836:9;:19;1846:8;1836:19;;;;;;;;;;;1829:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1727:133;;;:::o;4478:142:48:-;4560:4;4579:17;:25;4597:6;4579:25;;;;;;;;;;;;;;;:36;4605:9;4579:36;;;;;;;;;;;;;;;;;;;;;;;;;4572:43;;4478:142;;;;:::o;832:169:39:-;653:5;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;928:1;908:22;;:8;:22;;;;900:31;;;;;;;;965:8;937:37;;958:5;;;;;;;;;;;937:37;;;;;;;;;;;;988:8;980:5;;:16;;;;;;;;;;;;;;;;;;832:169;:::o;2121:1168:17:-;2489:25;2551:23;2619:19;2452:25;2465:4;2471:5;2452:12;:25::i;:::-;2444:34;;;;;;;;2517:4;:17;;:24;2535:5;2517:24;;;;;;;;;;;;;;;;2489:52;;2608:1;2577:4;:21;;:28;;;;:32;2551:58;;2641:4;:21;;2663:18;2641:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;2619:63;;2745:4;:15;;:22;2761:5;2745:22;;;;;;;;;;;;;;;;2738:29;;;;;;;;;;;2894:11;2848:4;:21;;2870:20;2848:43;;;;;;;;;;;;;;;;;;;:57;;;;;;;;;;;;;;;;;;3009:20;2976:4;:17;;:30;2994:11;2976:30;;;;;;;;;;;;;;;:53;;;;3046:4;:17;;:24;3064:5;3046:24;;;;;;;;;;;;;;;3039:31;;;3144:4;:21;;3166:18;3144:41;;;;;;;;;;;;;;;;;;;3137:48;;;;;;;;;;;3227:1;3195:4;:21;;:33;;;;;;;;;;;;;;:::i;:::-;;3260:5;3239:43;;;3267:14;3239:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2121:1168:17;;;;;;:::o;3646:162::-;3748:9;;:::i;:::-;3780:4;:21;;3773:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3646:162;;;:::o;2998:350:48:-;3059:13;3075:17;3083:8;3075:7;:17::i;:::-;3059:33;;3113:5;3106:12;;:3;:12;;;;3098:21;;;;;;;;3147:5;3133:19;;:10;:19;;;:58;;;;3156:35;3173:5;3180:10;3156:16;:35::i;:::-;3133:58;3125:67;;;;;;;;3236:1;3203:35;;:21;3215:8;3203:11;:21::i;:::-;:35;;;;:56;;;;3257:1;3242:17;;:3;:17;;;;3203:56;3199:145;;;3296:3;3269:14;:24;3284:8;3269:24;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;3323:3;3307:30;;3316:5;3307:30;;;3328:8;3307:30;;;;;;;;;;;;;;;;;;3199:145;2998:350;;;:::o;3295:166:17:-;3405:4;3432;:15;;:22;3448:5;3432:22;;;;;;;;;;;;;;;;;;;;;;;;;3425:29;;3295:166;;;;:::o;2085:130:50:-;2161:16;2168:8;2161:6;:16::i;:::-;2153:25;;;;;;;;2206:4;2184:9;:19;2194:8;2184:19;;;;;;;;;;;:26;;;;;;;;;;;;:::i;:::-;;2085:130;;:::o;7277:223:5:-;7414:3;7368:49;;:8;;;;;;;;;;;:23;;;7400:8;7392:17;;7368:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:49;;;;7364:130;;;7433:8;;;;;;;;;;;:26;;;7468:8;7460:17;;7479:3;7433:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7364:130;7277:223;;:::o;5042:315:48:-;5129:8;1516:39;1534:10;1546:8;1516:17;:39::i;:::-;1508:48;;;;;;;;5170:1;5153:19;;:5;:19;;;;5145:28;;;;;;;;5202:1;5187:17;;:3;:17;;;;5179:26;;;;;;;;5212:30;5226:5;5233:8;5212:13;:30::i;:::-;5248:32;5264:5;5271:8;5248:15;:32::i;:::-;5286:25;5297:3;5302:8;5286:10;:25::i;:::-;5338:3;5322:30;;5331:5;5322:30;;;5343:8;5322:30;;;;;;;;;;;;;;;;;;5042:315;;;;:::o;1732:383:17:-;1884:28;1900:4;1906:5;1884:15;:28::i;:::-;1876:37;;;;;;;;1949:4;1924;:15;;:22;1940:5;1924:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;1963:4;:21;;:33;;;;;;;;;;;:::i;:::-;;;;;;;;;;1990:5;1963:33;;;;;;;;;;;;;;;;;;;;;;;2064:1;2033:4;:21;;:28;;;;:32;2006:4;:17;;:24;2024:5;2006:24;;;;;;;;;;;;;;;:59;;;;2086:5;2075:33;;;2093:14;2075:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1732:383:17;;;:::o;5964:154:48:-;6055:8;1516:39;1534:10;1546:8;1516:17;:39::i;:::-;1508:48;;;;;;;;6071:42;6088:5;6095:3;6100:8;6071:42;;;;;;;;;;;;;:16;:42::i;:::-;5964:154;;;;:::o;5315:176:50:-;5376:26;5388:3;5393:8;5376:11;:26::i;:::-;5440:9;:16;;;;5413:14;:24;5428:8;5413:24;;;;;;;;;;;:43;;;;5462:9;:24;;;;;;;;;;;:::i;:::-;;;;;;;;;;5477:8;5462:24;;;;;;;5315:176;;:::o;3969:200:48:-;4053:10;4046:17;;:3;:17;;;;4038:26;;;;;;;;4107:9;4070:17;:29;4088:10;4070:29;;;;;;;;;;;;;;;:34;4100:3;4070:34;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;4149:3;4122:42;;4137:10;4122:42;;;4154:9;4122:42;;;;;;;;;;;;;;;;;;;;;;3969:200;;:::o;6794:227::-;6898:8;1516:39;1534:10;1546:8;1516:17;:39::i;:::-;1508:48;;;;;;;;6914:34;6927:5;6934:3;6939:8;6914:12;:34::i;:::-;6962:53;6987:5;6994:3;6999:8;7009:5;6962:24;:53::i;:::-;6954:62;;;;;;;;6794:227;;;;;:::o;7368:240::-;7454:4;7466:13;7482:17;7490:8;7482:7;:17::i;:::-;7466:33;;7524:5;7512:17;;:8;:17;;;:54;;;;7558:8;7533:33;;:21;7545:8;7533:11;:21::i;:::-;:33;;;7512:54;:91;;;;7570:33;7587:5;7594:8;7570:16;:33::i;:::-;7512:91;7505:98;;7368:240;;;;;:::o;8653:260::-;8754:6;8733:27;;:17;8741:8;8733:7;:17::i;:::-;:27;;;8725:36;;;;;;;;8807:1;8771:38;;:14;:24;8786:8;8771:24;;;;;;;;;;;;;;;;;;;;;:38;;;;8767:142;;;8854:1;8819:14;:24;8834:8;8819:24;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;8889:1;8864:38;;8873:6;8864:38;;;8893:8;8864:38;;;;;;;;;;;;;;;;;;8767:142;8653:260;;:::o;4198:856:50:-;4316:18;4369:22;4432:17;4271:38;4293:5;4300:8;4271:21;:38::i;:::-;4337:16;:26;4354:8;4337:26;;;;;;;;;;;;4316:47;;4394:32;4424:1;4394:11;:18;4406:5;4394:18;;;;;;;;;;;;;;;:25;;;;:29;;:32;;;;:::i;:::-;4369:57;;4452:11;:18;4464:5;4452:18;;;;;;;;;;;;;;;4471:14;4452:34;;;;;;;;;;;;;;;;;;;4432:54;;4526:9;4493:11;:18;4505:5;4493:18;;;;;;;;;;;;;;;4512:10;4493:30;;;;;;;;;;;;;;;;;;:42;;;;4578:1;4541:11;:18;4553:5;4541:18;;;;;;;;;;;;;;;4560:14;4541:34;;;;;;;;;;;;;;;;;;:38;;;;4940:11;:18;4952:5;4940:18;;;;;;;;;;;;;;;:27;;;;;;;;;;;;:::i;:::-;;5002:1;4973:16;:26;4990:8;4973:26;;;;;;;;;;;:30;;;;5039:10;5009:16;:27;5026:9;5009:27;;;;;;;;;;;:40;;;;4198:856;;;;;:::o;3697:226::-;3800:14;3763:31;3780:3;3785:8;3763:16;:31::i;:::-;3817:11;:16;3829:3;3817:16;;;;;;;;;;;;;;;:23;;;;3800:40;;3846:11;:16;3858:3;3846:16;;;;;;;;;;;;;;;:31;;;;;;;;;;;:::i;:::-;;;;;;;;;;3868:8;3846:31;;;;;;;3912:6;3883:16;:26;3900:8;3883:26;;;;;;;;;;;:35;;;;3697:226;;;:::o;3467:173:17:-;3580:4;3608:25;3621:4;3627:5;3608:12;:25::i;:::-;3607:26;3600:33;;3467:173;;;;:::o;7857:164:48:-;7941:1;7926:17;;:3;:17;;;;7918:26;;;;;;;;7950:25;7961:3;7966:8;7950:10;:25::i;:::-;8002:3;7981:35;;7998:1;7981:35;;;8007:8;7981:35;;;;;;;;;;;;;;;;;;7857:164;;:::o;10368:298::-;10479:4;10545:13;10496:16;:3;:14;;;:16::i;:::-;10495:17;10491:49;;;10529:4;10522:11;;;;10491:49;10576:3;10561:36;;;10598:5;10605:8;10615:5;10561:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10545:76:48;;605:10;10645:15;;10635:25;;;:6;:25;;;;10627:34;;10368:298;;;;;;;;:::o;9651:214::-;9753:5;9732:26;;:17;9740:8;9732:7;:17::i;:::-;:26;;;9724:35;;;;;;;;9791:30;9819:1;9791:16;:23;9808:5;9791:23;;;;;;;;;;;;;;;;:27;;:30;;;;:::i;:::-;9765:16;:23;9782:5;9765:23;;;;;;;;;;;;;;;:56;;;;9858:1;9827:10;:20;9838:8;9827:20;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;9651:214;;:::o;835:110:38:-;893:7;920:1;915;:6;;908:14;;;;;;939:1;935;:5;928:12;;835:110;;;;:::o;9172:204:48:-;9278:1;9246:34;;:10;:20;9257:8;9246:20;;;;;;;;;;;;;;;;;;;;;:34;;;9238:43;;;;;;;;9310:3;9287:10;:20;9298:8;9287:20;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;9343:28;9369:1;9343:16;:21;9360:3;9343:21;;;;;;;;;;;;;;;;:25;;:28;;;;:::i;:::-;9319:16;:21;9336:3;9319:21;;;;;;;;;;;;;;;:52;;;;9172:204;;:::o;451:150:36:-;508:4;520:12;569:4;557:11;549:25;;595:1;588:4;:8;581:15;;451:150;;;;:::o;1007:129:38:-;1065:7;1080:9;1096:1;1092;:5;1080:17;;1115:1;1110;:6;;1103:14;;;;;;1130:1;1123:8;;1007:129;;;;;:::o;1362:6140:5:-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\n// Internal dependencies.\nimport \"./DebtRegistry.sol\";\nimport \"./ERC165.sol\";\nimport { PermissionsLib, PermissionEvents } from \"./libraries/PermissionsLib.sol\";\n\n// External dependencies.\nimport \"zeppelin-solidity/contracts/lifecycle/Pausable.sol\";\nimport \"zeppelin-solidity/contracts/token/ERC721/ERC721Token.sol\";\nimport \"zeppelin-solidity/contracts/token/ERC20/ERC20.sol\";\n\n\n/**\n * The DebtToken contract governs all business logic for making a debt agreement\n * transferable as an ERC721 non-fungible token. Additionally, the contract\n * allows authorized contracts to trigger the minting of a debt agreement token\n * and, in turn, the insertion of a debt issuance into the DebtRegsitry.\n *\n * Author: Nadav Hollander -- Github: nadavhollander\n */\ncontract DebtToken is ERC721Token, ERC165, Pausable, PermissionEvents {\n using PermissionsLib for PermissionsLib.Permissions;\n\n DebtRegistry public registry;\n\n PermissionsLib.Permissions internal tokenCreationPermissions;\n PermissionsLib.Permissions internal tokenURIPermissions;\n\n string public constant CREATION_CONTEXT = \"debt-token-creation\";\n string public constant URI_CONTEXT = \"debt-token-uri\";\n\n /**\n * Constructor that sets the address of the debt registry.\n */\n function DebtToken(address _registry)\n public\n ERC721Token(\"DebtToken\", \"DDT\")\n {\n registry = DebtRegistry(_registry);\n }\n\n /**\n * ERC165 interface.\n * Returns true for ERC721, false otherwise\n */\n function supportsInterface(bytes4 interfaceID)\n external\n view\n returns (bool _isSupported)\n {\n return interfaceID == 0x80ac58cd; // ERC721\n }\n\n /**\n * Mints a unique debt token and inserts the associated issuance into\n * the debt registry, if the calling address is authorized to do so.\n */\n function create(\n address _version,\n address _beneficiary,\n address _debtor,\n address _underwriter,\n uint _underwriterRiskRating,\n address _termsContract,\n bytes32 _termsContractParameters,\n uint _salt\n )\n public\n whenNotPaused\n returns (uint _tokenId)\n {\n require(tokenCreationPermissions.isAuthorized(msg.sender));\n\n bytes32 entryHash = registry.insert(\n _version,\n _beneficiary,\n _debtor,\n _underwriter,\n _underwriterRiskRating,\n _termsContract,\n _termsContractParameters,\n _salt\n );\n\n super._mint(_beneficiary, uint(entryHash));\n\n return uint(entryHash);\n }\n\n /**\n * Adds an address to the list of agents authorized to mint debt tokens.\n */\n function addAuthorizedMintAgent(address _agent)\n public\n onlyOwner\n {\n tokenCreationPermissions.authorize(_agent, CREATION_CONTEXT);\n }\n\n /**\n * Removes an address from the list of agents authorized to mint debt tokens\n */\n function revokeMintAgentAuthorization(address _agent)\n public\n onlyOwner\n {\n tokenCreationPermissions.revokeAuthorization(_agent, CREATION_CONTEXT);\n }\n\n /**\n * Returns the list of agents authorized to mint debt tokens\n */\n function getAuthorizedMintAgents()\n public\n view\n returns (address[] _agents)\n {\n return tokenCreationPermissions.getAuthorizedAgents();\n }\n\n /**\n * Adds an address to the list of agents authorized to set token URIs.\n */\n function addAuthorizedTokenURIAgent(address _agent)\n public\n onlyOwner\n {\n tokenURIPermissions.authorize(_agent, URI_CONTEXT);\n }\n\n /**\n * Returns the list of agents authorized to set token URIs.\n */\n function getAuthorizedTokenURIAgents()\n public\n view\n returns (address[] _agents)\n {\n return tokenURIPermissions.getAuthorizedAgents();\n }\n\n /**\n * Removes an address from the list of agents authorized to set token URIs.\n */\n function revokeTokenURIAuthorization(address _agent)\n public\n onlyOwner\n {\n tokenURIPermissions.revokeAuthorization(_agent, URI_CONTEXT);\n }\n\n /**\n * We override approval method of the parent ERC721Token\n * contract to allow its functionality to be frozen in the case of an emergency\n */\n function approve(address _to, uint _tokenId)\n public\n whenNotPaused\n {\n super.approve(_to, _tokenId);\n }\n\n /**\n * We override setApprovalForAll method of the parent ERC721Token\n * contract to allow its functionality to be frozen in the case of an emergency\n */\n function setApprovalForAll(address _to, bool _approved)\n public\n whenNotPaused\n {\n super.setApprovalForAll(_to, _approved);\n }\n\n /**\n * Support deprecated ERC721 method\n */\n function transfer(address _to, uint _tokenId)\n public\n {\n safeTransferFrom(msg.sender, _to, _tokenId);\n }\n\n /**\n * We override transferFrom methods of the parent ERC721Token\n * contract to allow its functionality to be frozen in the case of an emergency\n */\n function transferFrom(address _from, address _to, uint _tokenId)\n public\n whenNotPaused\n {\n _modifyBeneficiary(_tokenId, _to);\n super.transferFrom(_from, _to, _tokenId);\n }\n\n /**\n * We override safeTransferFrom methods of the parent ERC721Token\n * contract to allow its functionality to be frozen in the case of an emergency\n */\n function safeTransferFrom(address _from, address _to, uint _tokenId)\n public\n whenNotPaused\n {\n _modifyBeneficiary(_tokenId, _to);\n super.safeTransferFrom(_from, _to, _tokenId);\n }\n\n /**\n * We override safeTransferFrom methods of the parent ERC721Token\n * contract to allow its functionality to be frozen in the case of an emergency\n */\n function safeTransferFrom(address _from, address _to, uint _tokenId, bytes _data)\n public\n whenNotPaused\n {\n _modifyBeneficiary(_tokenId, _to);\n super.safeTransferFrom(_from, _to, _tokenId, _data);\n }\n\n /**\n * Allows senders with special permissions to set the token URI for a given debt token.\n */\n function setTokenURI(uint256 _tokenId, string _uri)\n public\n whenNotPaused\n {\n require(tokenURIPermissions.isAuthorized(msg.sender));\n super._setTokenURI(_tokenId, _uri);\n }\n\n /**\n * _modifyBeneficiary mutates the debt registry. This function should be\n * called every time a token is transferred or minted\n */\n function _modifyBeneficiary(uint _tokenId, address _to)\n internal\n {\n if (registry.getBeneficiary(bytes32(_tokenId)) != _to) {\n registry.modifyBeneficiary(bytes32(_tokenId), _to);\n }\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/DebtToken.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/DebtToken.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/DebtToken.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/DebtToken.sol", "exportedSymbols": { "DebtToken": [ 3540 @@ -770,7 +770,7 @@ export const DebtToken = { "attributes": { "SourceUnit": 3159, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/DebtRegistry.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/DebtRegistry.sol", "file": "./DebtRegistry.sol", "scope": 3541, "symbolAliases": [ @@ -785,7 +785,7 @@ export const DebtToken = { "attributes": { "SourceUnit": 3551, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/ERC165.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/ERC165.sol", "file": "./ERC165.sol", "scope": 3541, "symbolAliases": [ @@ -800,7 +800,7 @@ export const DebtToken = { "attributes": { "SourceUnit": 6272, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/libraries/PermissionsLib.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/libraries/PermissionsLib.sol", "file": "./libraries/PermissionsLib.sol", "scope": 3541, "symbolAliases": [ @@ -6203,7 +6203,7 @@ export const DebtToken = } }, "links": {}, - "address": "0x3fd02c9e51dbf27b3f66e71ce1e5ce89ca1492d3" + "address": "0xa99e0834ce4ac707371cbd6d938773b660552b91" }, "70": { "events": { @@ -6342,5 +6342,5 @@ export const DebtToken = } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:16:13.726Z" + "updatedAt": "2018-10-09T17:53:04.888Z" } \ No newline at end of file diff --git a/artifacts/ts/DeprecatedERC721.ts b/artifacts/ts/DeprecatedERC721.ts index 59621a4d..f63a8075 100644 --- a/artifacts/ts/DeprecatedERC721.ts +++ b/artifacts/ts/DeprecatedERC721.ts @@ -790,5 +790,5 @@ export const DeprecatedERC721 = }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:48.049Z" + "updatedAt": "2018-10-09T17:45:35.433Z" } \ No newline at end of file diff --git a/artifacts/ts/DharmaMultiSigWallet.ts b/artifacts/ts/DharmaMultiSigWallet.ts index e380498e..54415556 100644 --- a/artifacts/ts/DharmaMultiSigWallet.ts +++ b/artifacts/ts/DharmaMultiSigWallet.ts @@ -628,15 +628,15 @@ export const DharmaMultiSigWallet = "type": "event" } ], - "bytecode": "0x606060405234156200001057600080fd5b60405162002765380380620027658339810160405280805182019190602001805190602001909190805190602001909190505082826000825182603282111580156200005c5750818111155b80156200006a575060008114155b801562000078575060008214155b15156200008457600080fd5b600092505b8451831015620001bf57600260008685815181101515620000a657fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015620001355750600085848151811015156200011257fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1614155b15156200014157600080fd5b60016002600087868151811015156200015657fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550828060010193505062000089565b8460039080519060200190620001d7929190620001f4565b5083600481905550505050505080600681905550505050620002c9565b82805482825590600052602060002090810192821562000270579160200282015b828111156200026f5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019062000215565b5b5090506200027f919062000283565b5090565b620002c691905b80821115620002c257600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055506001016200028a565b5090565b90565b61248c80620002d96000396000f300606060405260043610610149576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063025e7c27146101a3578063173825d91461020657806319b83a7b1461023f57806320ea8d8614610276578063215ff46f146102995780632f54bf6e146102bc5780633411c81c1461030d57806354741525146103675780637065cb48146103ab578063733e1b68146103e4578063784547a71461040d5780637ad28c51146104485780638b51d13f1461046b5780639ace38c2146104a2578063a0e67e2b146105a0578063a8abe69a1461060a578063b5dc40c3146106a1578063b77bf60014610719578063ba51a6df14610742578063c01a8c8414610765578063c642747414610788578063d74f8edd14610821578063dc8452cd1461084a578063e20056e614610873578063ee22610b146108cb575b60003411156101a1573373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a25b005b34156101ae57600080fd5b6101c460048080359060200190919050506108ee565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561021157600080fd5b61023d600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061092d565b005b341561024a57600080fd5b6102606004808035906020019091905050610bc9565b6040518082815260200191505060405180910390f35b341561028157600080fd5b6102976004808035906020019091905050610be1565b005b34156102a457600080fd5b6102ba6004808035906020019091905050610da0565b005b34156102c757600080fd5b6102f3600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610ebc565b604051808215151515815260200191505060405180910390f35b341561031857600080fd5b61034d600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610edc565b604051808215151515815260200191505060405180910390f35b341561037257600080fd5b610395600480803515159060200190919080351515906020019091905050610f0b565b6040518082815260200191505060405180910390f35b34156103b657600080fd5b6103e2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610f9d565b005b34156103ef57600080fd5b6103f761119f565b6040518082815260200191505060405180910390f35b341561041857600080fd5b61042e60048080359060200190919050506111a5565b604051808215151515815260200191505060405180910390f35b341561045357600080fd5b610469600480803590602001909190505061128b565b005b341561047657600080fd5b61048c6004808035906020019091905050611306565b6040518082815260200191505060405180910390f35b34156104ad57600080fd5b6104c360048080359060200190919050506113d2565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018315151515815260200182810382528481815460018160011615610100020316600290048152602001915080546001816001161561010002031660029004801561058e5780601f106105635761010080835404028352916020019161058e565b820191906000526020600020905b81548152906001019060200180831161057157829003601f168201915b50509550505050505060405180910390f35b34156105ab57600080fd5b6105b361142e565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156105f65780820151818401526020810190506105db565b505050509050019250505060405180910390f35b341561061557600080fd5b61064a6004808035906020019091908035906020019091908035151590602001909190803515159060200190919050506114c2565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561068d578082015181840152602081019050610672565b505050509050019250505060405180910390f35b34156106ac57600080fd5b6106c2600480803590602001909190505061162d565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156107055780820151818401526020810190506106ea565b505050509050019250505060405180910390f35b341561072457600080fd5b61072c611857565b6040518082815260200191505060405180910390f35b341561074d57600080fd5b610763600480803590602001909190505061185d565b005b341561077057600080fd5b6107866004808035906020019091905050611917565b005b341561079357600080fd5b61080b600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611b1b565b6040518082815260200191505060405180910390f35b341561082c57600080fd5b610834611b3a565b6040518082815260200191505060405180910390f35b341561085557600080fd5b61085d611b3f565b6040518082815260200191505060405180910390f35b341561087e57600080fd5b6108c9600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611b45565b005b34156108d657600080fd5b6108ec6004808035906020019091905050611e5c565b005b6003818154811015156108fd57fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561096957600080fd5b81600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615156109c257600080fd5b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600091505b600160038054905003821015610b4a578273ffffffffffffffffffffffffffffffffffffffff16600383815481101515610a5557fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610b3d576003600160038054905003815481101515610ab457fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600383815481101515610aef57fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610b4a565b8180600101925050610a1f565b6001600381818054905003915081610b62919061233b565b506003805490506004541115610b8157610b8060038054905061185d565b5b8273ffffffffffffffffffffffffffffffffffffffff167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a2505050565b60076020528060005260406000206000915090505481565b33600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610c3a57600080fd5b81336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610ca557600080fd5b8360008082815260200190815260200160002060030160009054906101000a900460ff16151515610cd557600080fd5b84610cdf816111a5565b151515610ceb57600080fd5b60006001600088815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550853373ffffffffffffffffffffffffffffffffffffffff167ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e960405160405180910390a3505050505050565b8060008082815260200190815260200160002060030160009054906101000a900460ff16151515610dd057600080fd5b81610dda816111a5565b1515610de557600080fd5b8260008060008381526020019081526020016000209050610ea1816002018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610e975780601f10610e6c57610100808354040283529160200191610e97565b820191906000526020600020905b815481529060010190602001808311610e7a57829003601f168201915b5050505050611ed7565b1515610eac57600080fd5b610eb585612019565b5050505050565b60026020528060005260406000206000915054906101000a900460ff1681565b60016020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b600080600090505b600554811015610f9657838015610f4a575060008082815260200190815260200160002060030160009054906101000a900460ff16155b80610f7d5750828015610f7c575060008082815260200190815260200160002060030160009054906101000a900460ff165b5b15610f89576001820191505b8080600101915050610f13565b5092915050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610fd757600080fd5b80600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151561103157600080fd5b8160008173ffffffffffffffffffffffffffffffffffffffff161415151561105857600080fd5b600160038054905001600454603282111580156110755750818111155b8015611082575060008114155b801561108f575060008214155b151561109a57600080fd5b6001600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600380548060010182816111069190612367565b9160005260206000209001600087909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508473ffffffffffffffffffffffffffffffffffffffff167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b60065481565b6000806000809150600090505b600380549050811015611283576001600085815260200190815260200160002060006003838154811015156111e357fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611263576001820191505b6004548214156112765760019250611284565b80806001019150506111b2565b5b5050919050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156112c557600080fd5b806006819055507fd1c9101a34feff75cccef14a28785a0279cb0b49c1f321f21f5f422e746b4377816040518082815260200191505060405180910390a150565b600080600090505b6003805490508110156113cc5760016000848152602001908152602001600020600060038381548110151561133f57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156113bf576001820191505b808060010191505061130e565b50919050565b60006020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201908060030160009054906101000a900460ff16905084565b611436612393565b60038054806020026020016040519081016040528092919081815260200182805480156114b857602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161146e575b5050505050905090565b6114ca6123a7565b6114d26123a7565b6000808688111515156114e457600080fd5b6005546040518059106114f45750595b9080825280602002602001820160405250925060009150600090505b6005548110156115b057858015611547575060008082815260200190815260200160002060030160009054906101000a900460ff16155b8061157a5750848015611579575060008082815260200190815260200160002060030160009054906101000a900460ff165b5b156115a35780838381518110151561158e57fe5b90602001906020020181815250506001820191505b8080600101915050611510565b8787036040518059106115c05750595b908082528060200260200182016040525093508790505b868110156116225782818151811015156115ed57fe5b906020019060200201518489830381518110151561160757fe5b906020019060200201818152505080806001019150506115d7565b505050949350505050565b611635612393565b61163d612393565b6000806003805490506040518059106116535750595b9080825280602002602001820160405250925060009150600090505b6003805490508110156117b2576001600086815260200190815260200160002060006003838154811015156116a057fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156117a55760038181548110151561172857fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16838381518110151561176257fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506001820191505b808060010191505061166f565b816040518059106117c05750595b90808252806020026020018201604052509350600090505b8181101561184f5782818151811015156117ee57fe5b90602001906020020151848281518110151561180657fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080806001019150506117d8565b505050919050565b60055481565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561189757600080fd5b60038054905081603282111580156118af5750818111155b80156118bc575060008114155b80156118c9575060008214155b15156118d457600080fd5b826004819055507fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a836040518082815260200191505060405180910390a1505050565b33600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151561197057600080fd5b81600080600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156119cc57600080fd5b82336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151515611a3857600080fd5b84611a42816111a5565b151515611a4e57600080fd5b600180600088815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550853373ffffffffffffffffffffffffffffffffffffffff167f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef60405160405180910390a3611b03866111a5565b15611b1357611b128642612195565b5b505050505050565b6000611b288484846121e9565b9050611b3381611917565b9392505050565b603281565b60045481565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b8157600080fd5b82600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515611bda57600080fd5b82600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151515611c3457600080fd5b600092505b600380549050831015611d1f578473ffffffffffffffffffffffffffffffffffffffff16600384815481101515611c6c57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611d125783600384815481101515611cc457fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611d1f565b8280600101935050611c39565b6000600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508473ffffffffffffffffffffffffffffffffffffffff167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a28373ffffffffffffffffffffffffffffffffffffffff167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b8060008082815260200190815260200160002060030160009054906101000a900460ff16151515611e8c57600080fd5b81611e96816111a5565b1515611ea157600080fd5b826006546007600083815260200190815260200160002054014210151515611ec857600080fd5b611ed184612019565b50505050565b600080600060405180807f7061757365282900000000000000000000000000000000000000000000000000815250600701905060405180910390209150600090505b600481101561200d578181600481101515611f3057fe5b1a7f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168482815181101515611f8357fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415156120005760009250612012565b8080600101915050611f19565b600192505b5050919050565b6000806000838152602001908152602001600020905060018160030160006101000a81548160ff0219169083151502179055508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681600101548260020160405180828054600181600116156101000203166002900480156120f55780601f106120ca576101008083540402835291602001916120f5565b820191906000526020600020905b8154815290600101906020018083116120d857829003601f168201915b505091505060006040518083038185876187965a03f1925050501561214657817f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7560405160405180910390a2612191565b817f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923660405160405180910390a260008160030160006101000a81548160ff0219169083151502179055505b5050565b806007600084815260200190815260200160002081905550817f0b237afe65f1514fd7ea3f923ea4fe792bdd07000a912b6cd1602a8e7f573c8d826040518082815260200191505060405180910390a25050565b60008360008173ffffffffffffffffffffffffffffffffffffffff161415151561221257600080fd5b60055491506080604051908101604052808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020016000151581525060008084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020190805190602001906122d19291906123bb565b5060608201518160030160006101000a81548160ff0219169083151502179055509050506001600560008282540192505081905550817fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5160405160405180910390a2509392505050565b81548183558181151161236257818360005260206000209182019101612361919061243b565b5b505050565b81548183558181151161238e5781836000526020600020918201910161238d919061243b565b5b505050565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106123fc57805160ff191683800117855561242a565b8280016001018555821561242a579182015b8281111561242957825182559160200191906001019061240e565b5b509050612437919061243b565b5090565b61245d91905b80821115612459576000816000905550600101612441565b5090565b905600a165627a7a72305820868fc44ce290a258609668772cd1608fa8d4e705b012978b98fead679305fc1d0029", - "deployedBytecode": "0x606060405260043610610149576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063025e7c27146101a3578063173825d91461020657806319b83a7b1461023f57806320ea8d8614610276578063215ff46f146102995780632f54bf6e146102bc5780633411c81c1461030d57806354741525146103675780637065cb48146103ab578063733e1b68146103e4578063784547a71461040d5780637ad28c51146104485780638b51d13f1461046b5780639ace38c2146104a2578063a0e67e2b146105a0578063a8abe69a1461060a578063b5dc40c3146106a1578063b77bf60014610719578063ba51a6df14610742578063c01a8c8414610765578063c642747414610788578063d74f8edd14610821578063dc8452cd1461084a578063e20056e614610873578063ee22610b146108cb575b60003411156101a1573373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a25b005b34156101ae57600080fd5b6101c460048080359060200190919050506108ee565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561021157600080fd5b61023d600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061092d565b005b341561024a57600080fd5b6102606004808035906020019091905050610bc9565b6040518082815260200191505060405180910390f35b341561028157600080fd5b6102976004808035906020019091905050610be1565b005b34156102a457600080fd5b6102ba6004808035906020019091905050610da0565b005b34156102c757600080fd5b6102f3600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610ebc565b604051808215151515815260200191505060405180910390f35b341561031857600080fd5b61034d600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610edc565b604051808215151515815260200191505060405180910390f35b341561037257600080fd5b610395600480803515159060200190919080351515906020019091905050610f0b565b6040518082815260200191505060405180910390f35b34156103b657600080fd5b6103e2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610f9d565b005b34156103ef57600080fd5b6103f761119f565b6040518082815260200191505060405180910390f35b341561041857600080fd5b61042e60048080359060200190919050506111a5565b604051808215151515815260200191505060405180910390f35b341561045357600080fd5b610469600480803590602001909190505061128b565b005b341561047657600080fd5b61048c6004808035906020019091905050611306565b6040518082815260200191505060405180910390f35b34156104ad57600080fd5b6104c360048080359060200190919050506113d2565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018315151515815260200182810382528481815460018160011615610100020316600290048152602001915080546001816001161561010002031660029004801561058e5780601f106105635761010080835404028352916020019161058e565b820191906000526020600020905b81548152906001019060200180831161057157829003601f168201915b50509550505050505060405180910390f35b34156105ab57600080fd5b6105b361142e565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156105f65780820151818401526020810190506105db565b505050509050019250505060405180910390f35b341561061557600080fd5b61064a6004808035906020019091908035906020019091908035151590602001909190803515159060200190919050506114c2565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561068d578082015181840152602081019050610672565b505050509050019250505060405180910390f35b34156106ac57600080fd5b6106c2600480803590602001909190505061162d565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156107055780820151818401526020810190506106ea565b505050509050019250505060405180910390f35b341561072457600080fd5b61072c611857565b6040518082815260200191505060405180910390f35b341561074d57600080fd5b610763600480803590602001909190505061185d565b005b341561077057600080fd5b6107866004808035906020019091905050611917565b005b341561079357600080fd5b61080b600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611b1b565b6040518082815260200191505060405180910390f35b341561082c57600080fd5b610834611b3a565b6040518082815260200191505060405180910390f35b341561085557600080fd5b61085d611b3f565b6040518082815260200191505060405180910390f35b341561087e57600080fd5b6108c9600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611b45565b005b34156108d657600080fd5b6108ec6004808035906020019091905050611e5c565b005b6003818154811015156108fd57fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561096957600080fd5b81600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615156109c257600080fd5b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600091505b600160038054905003821015610b4a578273ffffffffffffffffffffffffffffffffffffffff16600383815481101515610a5557fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610b3d576003600160038054905003815481101515610ab457fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600383815481101515610aef57fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610b4a565b8180600101925050610a1f565b6001600381818054905003915081610b62919061233b565b506003805490506004541115610b8157610b8060038054905061185d565b5b8273ffffffffffffffffffffffffffffffffffffffff167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a2505050565b60076020528060005260406000206000915090505481565b33600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610c3a57600080fd5b81336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610ca557600080fd5b8360008082815260200190815260200160002060030160009054906101000a900460ff16151515610cd557600080fd5b84610cdf816111a5565b151515610ceb57600080fd5b60006001600088815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550853373ffffffffffffffffffffffffffffffffffffffff167ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e960405160405180910390a3505050505050565b8060008082815260200190815260200160002060030160009054906101000a900460ff16151515610dd057600080fd5b81610dda816111a5565b1515610de557600080fd5b8260008060008381526020019081526020016000209050610ea1816002018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610e975780601f10610e6c57610100808354040283529160200191610e97565b820191906000526020600020905b815481529060010190602001808311610e7a57829003601f168201915b5050505050611ed7565b1515610eac57600080fd5b610eb585612019565b5050505050565b60026020528060005260406000206000915054906101000a900460ff1681565b60016020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b600080600090505b600554811015610f9657838015610f4a575060008082815260200190815260200160002060030160009054906101000a900460ff16155b80610f7d5750828015610f7c575060008082815260200190815260200160002060030160009054906101000a900460ff165b5b15610f89576001820191505b8080600101915050610f13565b5092915050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610fd757600080fd5b80600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151561103157600080fd5b8160008173ffffffffffffffffffffffffffffffffffffffff161415151561105857600080fd5b600160038054905001600454603282111580156110755750818111155b8015611082575060008114155b801561108f575060008214155b151561109a57600080fd5b6001600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600380548060010182816111069190612367565b9160005260206000209001600087909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508473ffffffffffffffffffffffffffffffffffffffff167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b60065481565b6000806000809150600090505b600380549050811015611283576001600085815260200190815260200160002060006003838154811015156111e357fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611263576001820191505b6004548214156112765760019250611284565b80806001019150506111b2565b5b5050919050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156112c557600080fd5b806006819055507fd1c9101a34feff75cccef14a28785a0279cb0b49c1f321f21f5f422e746b4377816040518082815260200191505060405180910390a150565b600080600090505b6003805490508110156113cc5760016000848152602001908152602001600020600060038381548110151561133f57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156113bf576001820191505b808060010191505061130e565b50919050565b60006020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201908060030160009054906101000a900460ff16905084565b611436612393565b60038054806020026020016040519081016040528092919081815260200182805480156114b857602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161146e575b5050505050905090565b6114ca6123a7565b6114d26123a7565b6000808688111515156114e457600080fd5b6005546040518059106114f45750595b9080825280602002602001820160405250925060009150600090505b6005548110156115b057858015611547575060008082815260200190815260200160002060030160009054906101000a900460ff16155b8061157a5750848015611579575060008082815260200190815260200160002060030160009054906101000a900460ff165b5b156115a35780838381518110151561158e57fe5b90602001906020020181815250506001820191505b8080600101915050611510565b8787036040518059106115c05750595b908082528060200260200182016040525093508790505b868110156116225782818151811015156115ed57fe5b906020019060200201518489830381518110151561160757fe5b906020019060200201818152505080806001019150506115d7565b505050949350505050565b611635612393565b61163d612393565b6000806003805490506040518059106116535750595b9080825280602002602001820160405250925060009150600090505b6003805490508110156117b2576001600086815260200190815260200160002060006003838154811015156116a057fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156117a55760038181548110151561172857fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16838381518110151561176257fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506001820191505b808060010191505061166f565b816040518059106117c05750595b90808252806020026020018201604052509350600090505b8181101561184f5782818151811015156117ee57fe5b90602001906020020151848281518110151561180657fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080806001019150506117d8565b505050919050565b60055481565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561189757600080fd5b60038054905081603282111580156118af5750818111155b80156118bc575060008114155b80156118c9575060008214155b15156118d457600080fd5b826004819055507fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a836040518082815260200191505060405180910390a1505050565b33600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151561197057600080fd5b81600080600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156119cc57600080fd5b82336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151515611a3857600080fd5b84611a42816111a5565b151515611a4e57600080fd5b600180600088815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550853373ffffffffffffffffffffffffffffffffffffffff167f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef60405160405180910390a3611b03866111a5565b15611b1357611b128642612195565b5b505050505050565b6000611b288484846121e9565b9050611b3381611917565b9392505050565b603281565b60045481565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b8157600080fd5b82600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515611bda57600080fd5b82600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151515611c3457600080fd5b600092505b600380549050831015611d1f578473ffffffffffffffffffffffffffffffffffffffff16600384815481101515611c6c57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611d125783600384815481101515611cc457fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611d1f565b8280600101935050611c39565b6000600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508473ffffffffffffffffffffffffffffffffffffffff167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a28373ffffffffffffffffffffffffffffffffffffffff167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b8060008082815260200190815260200160002060030160009054906101000a900460ff16151515611e8c57600080fd5b81611e96816111a5565b1515611ea157600080fd5b826006546007600083815260200190815260200160002054014210151515611ec857600080fd5b611ed184612019565b50505050565b600080600060405180807f7061757365282900000000000000000000000000000000000000000000000000815250600701905060405180910390209150600090505b600481101561200d578181600481101515611f3057fe5b1a7f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168482815181101515611f8357fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415156120005760009250612012565b8080600101915050611f19565b600192505b5050919050565b6000806000838152602001908152602001600020905060018160030160006101000a81548160ff0219169083151502179055508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681600101548260020160405180828054600181600116156101000203166002900480156120f55780601f106120ca576101008083540402835291602001916120f5565b820191906000526020600020905b8154815290600101906020018083116120d857829003601f168201915b505091505060006040518083038185876187965a03f1925050501561214657817f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7560405160405180910390a2612191565b817f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923660405160405180910390a260008160030160006101000a81548160ff0219169083151502179055505b5050565b806007600084815260200190815260200160002081905550817f0b237afe65f1514fd7ea3f923ea4fe792bdd07000a912b6cd1602a8e7f573c8d826040518082815260200191505060405180910390a25050565b60008360008173ffffffffffffffffffffffffffffffffffffffff161415151561221257600080fd5b60055491506080604051908101604052808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020016000151581525060008084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020190805190602001906122d19291906123bb565b5060608201518160030160006101000a81548160ff0219169083151502179055509050506001600560008282540192505081905550817fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5160405160405180910390a2509392505050565b81548183558181151161236257818360005260206000209182019101612361919061243b565b5b505050565b81548183558181151161238e5781836000526020600020918201910161238d919061243b565b5b505050565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106123fc57805160ff191683800117855561242a565b8280016001018555821561242a579182015b8281111561242957825182559160200191906001019061240e565b5b509050612437919061243b565b5090565b61245d91905b80821115612459576000816000905550600101612441565b5090565b905600a165627a7a72305820868fc44ce290a258609668772cd1608fa8d4e705b012978b98fead679305fc1d0029", + "bytecode": "0x606060405234156200001057600080fd5b60405162002765380380620027658339810160405280805182019190602001805190602001909190805190602001909190505082826000825182603282111580156200005c5750818111155b80156200006a575060008114155b801562000078575060008214155b15156200008457600080fd5b600092505b8451831015620001bf57600260008685815181101515620000a657fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015620001355750600085848151811015156200011257fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1614155b15156200014157600080fd5b60016002600087868151811015156200015657fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550828060010193505062000089565b8460039080519060200190620001d7929190620001f4565b5083600481905550505050505080600681905550505050620002c9565b82805482825590600052602060002090810192821562000270579160200282015b828111156200026f5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019062000215565b5b5090506200027f919062000283565b5090565b620002c691905b80821115620002c257600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055506001016200028a565b5090565b90565b61248c80620002d96000396000f300606060405260043610610149576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063025e7c27146101a3578063173825d91461020657806319b83a7b1461023f57806320ea8d8614610276578063215ff46f146102995780632f54bf6e146102bc5780633411c81c1461030d57806354741525146103675780637065cb48146103ab578063733e1b68146103e4578063784547a71461040d5780637ad28c51146104485780638b51d13f1461046b5780639ace38c2146104a2578063a0e67e2b146105a0578063a8abe69a1461060a578063b5dc40c3146106a1578063b77bf60014610719578063ba51a6df14610742578063c01a8c8414610765578063c642747414610788578063d74f8edd14610821578063dc8452cd1461084a578063e20056e614610873578063ee22610b146108cb575b60003411156101a1573373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a25b005b34156101ae57600080fd5b6101c460048080359060200190919050506108ee565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561021157600080fd5b61023d600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061092d565b005b341561024a57600080fd5b6102606004808035906020019091905050610bc9565b6040518082815260200191505060405180910390f35b341561028157600080fd5b6102976004808035906020019091905050610be1565b005b34156102a457600080fd5b6102ba6004808035906020019091905050610da0565b005b34156102c757600080fd5b6102f3600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610ebc565b604051808215151515815260200191505060405180910390f35b341561031857600080fd5b61034d600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610edc565b604051808215151515815260200191505060405180910390f35b341561037257600080fd5b610395600480803515159060200190919080351515906020019091905050610f0b565b6040518082815260200191505060405180910390f35b34156103b657600080fd5b6103e2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610f9d565b005b34156103ef57600080fd5b6103f761119f565b6040518082815260200191505060405180910390f35b341561041857600080fd5b61042e60048080359060200190919050506111a5565b604051808215151515815260200191505060405180910390f35b341561045357600080fd5b610469600480803590602001909190505061128b565b005b341561047657600080fd5b61048c6004808035906020019091905050611306565b6040518082815260200191505060405180910390f35b34156104ad57600080fd5b6104c360048080359060200190919050506113d2565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018315151515815260200182810382528481815460018160011615610100020316600290048152602001915080546001816001161561010002031660029004801561058e5780601f106105635761010080835404028352916020019161058e565b820191906000526020600020905b81548152906001019060200180831161057157829003601f168201915b50509550505050505060405180910390f35b34156105ab57600080fd5b6105b361142e565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156105f65780820151818401526020810190506105db565b505050509050019250505060405180910390f35b341561061557600080fd5b61064a6004808035906020019091908035906020019091908035151590602001909190803515159060200190919050506114c2565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561068d578082015181840152602081019050610672565b505050509050019250505060405180910390f35b34156106ac57600080fd5b6106c2600480803590602001909190505061162d565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156107055780820151818401526020810190506106ea565b505050509050019250505060405180910390f35b341561072457600080fd5b61072c611857565b6040518082815260200191505060405180910390f35b341561074d57600080fd5b610763600480803590602001909190505061185d565b005b341561077057600080fd5b6107866004808035906020019091905050611917565b005b341561079357600080fd5b61080b600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611b1b565b6040518082815260200191505060405180910390f35b341561082c57600080fd5b610834611b3a565b6040518082815260200191505060405180910390f35b341561085557600080fd5b61085d611b3f565b6040518082815260200191505060405180910390f35b341561087e57600080fd5b6108c9600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611b45565b005b34156108d657600080fd5b6108ec6004808035906020019091905050611e5c565b005b6003818154811015156108fd57fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561096957600080fd5b81600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615156109c257600080fd5b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600091505b600160038054905003821015610b4a578273ffffffffffffffffffffffffffffffffffffffff16600383815481101515610a5557fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610b3d576003600160038054905003815481101515610ab457fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600383815481101515610aef57fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610b4a565b8180600101925050610a1f565b6001600381818054905003915081610b62919061233b565b506003805490506004541115610b8157610b8060038054905061185d565b5b8273ffffffffffffffffffffffffffffffffffffffff167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a2505050565b60076020528060005260406000206000915090505481565b33600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610c3a57600080fd5b81336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610ca557600080fd5b8360008082815260200190815260200160002060030160009054906101000a900460ff16151515610cd557600080fd5b84610cdf816111a5565b151515610ceb57600080fd5b60006001600088815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550853373ffffffffffffffffffffffffffffffffffffffff167ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e960405160405180910390a3505050505050565b8060008082815260200190815260200160002060030160009054906101000a900460ff16151515610dd057600080fd5b81610dda816111a5565b1515610de557600080fd5b8260008060008381526020019081526020016000209050610ea1816002018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610e975780601f10610e6c57610100808354040283529160200191610e97565b820191906000526020600020905b815481529060010190602001808311610e7a57829003601f168201915b5050505050611ed7565b1515610eac57600080fd5b610eb585612019565b5050505050565b60026020528060005260406000206000915054906101000a900460ff1681565b60016020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b600080600090505b600554811015610f9657838015610f4a575060008082815260200190815260200160002060030160009054906101000a900460ff16155b80610f7d5750828015610f7c575060008082815260200190815260200160002060030160009054906101000a900460ff165b5b15610f89576001820191505b8080600101915050610f13565b5092915050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610fd757600080fd5b80600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151561103157600080fd5b8160008173ffffffffffffffffffffffffffffffffffffffff161415151561105857600080fd5b600160038054905001600454603282111580156110755750818111155b8015611082575060008114155b801561108f575060008214155b151561109a57600080fd5b6001600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600380548060010182816111069190612367565b9160005260206000209001600087909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508473ffffffffffffffffffffffffffffffffffffffff167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b60065481565b6000806000809150600090505b600380549050811015611283576001600085815260200190815260200160002060006003838154811015156111e357fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611263576001820191505b6004548214156112765760019250611284565b80806001019150506111b2565b5b5050919050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156112c557600080fd5b806006819055507fd1c9101a34feff75cccef14a28785a0279cb0b49c1f321f21f5f422e746b4377816040518082815260200191505060405180910390a150565b600080600090505b6003805490508110156113cc5760016000848152602001908152602001600020600060038381548110151561133f57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156113bf576001820191505b808060010191505061130e565b50919050565b60006020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201908060030160009054906101000a900460ff16905084565b611436612393565b60038054806020026020016040519081016040528092919081815260200182805480156114b857602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161146e575b5050505050905090565b6114ca6123a7565b6114d26123a7565b6000808688111515156114e457600080fd5b6005546040518059106114f45750595b9080825280602002602001820160405250925060009150600090505b6005548110156115b057858015611547575060008082815260200190815260200160002060030160009054906101000a900460ff16155b8061157a5750848015611579575060008082815260200190815260200160002060030160009054906101000a900460ff165b5b156115a35780838381518110151561158e57fe5b90602001906020020181815250506001820191505b8080600101915050611510565b8787036040518059106115c05750595b908082528060200260200182016040525093508790505b868110156116225782818151811015156115ed57fe5b906020019060200201518489830381518110151561160757fe5b906020019060200201818152505080806001019150506115d7565b505050949350505050565b611635612393565b61163d612393565b6000806003805490506040518059106116535750595b9080825280602002602001820160405250925060009150600090505b6003805490508110156117b2576001600086815260200190815260200160002060006003838154811015156116a057fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156117a55760038181548110151561172857fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16838381518110151561176257fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506001820191505b808060010191505061166f565b816040518059106117c05750595b90808252806020026020018201604052509350600090505b8181101561184f5782818151811015156117ee57fe5b90602001906020020151848281518110151561180657fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080806001019150506117d8565b505050919050565b60055481565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561189757600080fd5b60038054905081603282111580156118af5750818111155b80156118bc575060008114155b80156118c9575060008214155b15156118d457600080fd5b826004819055507fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a836040518082815260200191505060405180910390a1505050565b33600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151561197057600080fd5b81600080600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156119cc57600080fd5b82336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151515611a3857600080fd5b84611a42816111a5565b151515611a4e57600080fd5b600180600088815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550853373ffffffffffffffffffffffffffffffffffffffff167f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef60405160405180910390a3611b03866111a5565b15611b1357611b128642612195565b5b505050505050565b6000611b288484846121e9565b9050611b3381611917565b9392505050565b603281565b60045481565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b8157600080fd5b82600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515611bda57600080fd5b82600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151515611c3457600080fd5b600092505b600380549050831015611d1f578473ffffffffffffffffffffffffffffffffffffffff16600384815481101515611c6c57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611d125783600384815481101515611cc457fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611d1f565b8280600101935050611c39565b6000600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508473ffffffffffffffffffffffffffffffffffffffff167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a28373ffffffffffffffffffffffffffffffffffffffff167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b8060008082815260200190815260200160002060030160009054906101000a900460ff16151515611e8c57600080fd5b81611e96816111a5565b1515611ea157600080fd5b826006546007600083815260200190815260200160002054014210151515611ec857600080fd5b611ed184612019565b50505050565b600080600060405180807f7061757365282900000000000000000000000000000000000000000000000000815250600701905060405180910390209150600090505b600481101561200d578181600481101515611f3057fe5b1a7f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168482815181101515611f8357fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415156120005760009250612012565b8080600101915050611f19565b600192505b5050919050565b6000806000838152602001908152602001600020905060018160030160006101000a81548160ff0219169083151502179055508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681600101548260020160405180828054600181600116156101000203166002900480156120f55780601f106120ca576101008083540402835291602001916120f5565b820191906000526020600020905b8154815290600101906020018083116120d857829003601f168201915b505091505060006040518083038185876187965a03f1925050501561214657817f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7560405160405180910390a2612191565b817f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923660405160405180910390a260008160030160006101000a81548160ff0219169083151502179055505b5050565b806007600084815260200190815260200160002081905550817f0b237afe65f1514fd7ea3f923ea4fe792bdd07000a912b6cd1602a8e7f573c8d826040518082815260200191505060405180910390a25050565b60008360008173ffffffffffffffffffffffffffffffffffffffff161415151561221257600080fd5b60055491506080604051908101604052808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020016000151581525060008084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020190805190602001906122d19291906123bb565b5060608201518160030160006101000a81548160ff0219169083151502179055509050506001600560008282540192505081905550817fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5160405160405180910390a2509392505050565b81548183558181151161236257818360005260206000209182019101612361919061243b565b5b505050565b81548183558181151161238e5781836000526020600020918201910161238d919061243b565b5b505050565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106123fc57805160ff191683800117855561242a565b8280016001018555821561242a579182015b8281111561242957825182559160200191906001019061240e565b5b509050612437919061243b565b5090565b61245d91905b80821115612459576000816000905550600101612441565b5090565b905600a165627a7a72305820670aa210266ccc388354173d8da609316c6abb3b83159e9942819b3dc679d1930029", + "deployedBytecode": "0x606060405260043610610149576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063025e7c27146101a3578063173825d91461020657806319b83a7b1461023f57806320ea8d8614610276578063215ff46f146102995780632f54bf6e146102bc5780633411c81c1461030d57806354741525146103675780637065cb48146103ab578063733e1b68146103e4578063784547a71461040d5780637ad28c51146104485780638b51d13f1461046b5780639ace38c2146104a2578063a0e67e2b146105a0578063a8abe69a1461060a578063b5dc40c3146106a1578063b77bf60014610719578063ba51a6df14610742578063c01a8c8414610765578063c642747414610788578063d74f8edd14610821578063dc8452cd1461084a578063e20056e614610873578063ee22610b146108cb575b60003411156101a1573373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a25b005b34156101ae57600080fd5b6101c460048080359060200190919050506108ee565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561021157600080fd5b61023d600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061092d565b005b341561024a57600080fd5b6102606004808035906020019091905050610bc9565b6040518082815260200191505060405180910390f35b341561028157600080fd5b6102976004808035906020019091905050610be1565b005b34156102a457600080fd5b6102ba6004808035906020019091905050610da0565b005b34156102c757600080fd5b6102f3600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610ebc565b604051808215151515815260200191505060405180910390f35b341561031857600080fd5b61034d600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610edc565b604051808215151515815260200191505060405180910390f35b341561037257600080fd5b610395600480803515159060200190919080351515906020019091905050610f0b565b6040518082815260200191505060405180910390f35b34156103b657600080fd5b6103e2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610f9d565b005b34156103ef57600080fd5b6103f761119f565b6040518082815260200191505060405180910390f35b341561041857600080fd5b61042e60048080359060200190919050506111a5565b604051808215151515815260200191505060405180910390f35b341561045357600080fd5b610469600480803590602001909190505061128b565b005b341561047657600080fd5b61048c6004808035906020019091905050611306565b6040518082815260200191505060405180910390f35b34156104ad57600080fd5b6104c360048080359060200190919050506113d2565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018315151515815260200182810382528481815460018160011615610100020316600290048152602001915080546001816001161561010002031660029004801561058e5780601f106105635761010080835404028352916020019161058e565b820191906000526020600020905b81548152906001019060200180831161057157829003601f168201915b50509550505050505060405180910390f35b34156105ab57600080fd5b6105b361142e565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156105f65780820151818401526020810190506105db565b505050509050019250505060405180910390f35b341561061557600080fd5b61064a6004808035906020019091908035906020019091908035151590602001909190803515159060200190919050506114c2565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561068d578082015181840152602081019050610672565b505050509050019250505060405180910390f35b34156106ac57600080fd5b6106c2600480803590602001909190505061162d565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156107055780820151818401526020810190506106ea565b505050509050019250505060405180910390f35b341561072457600080fd5b61072c611857565b6040518082815260200191505060405180910390f35b341561074d57600080fd5b610763600480803590602001909190505061185d565b005b341561077057600080fd5b6107866004808035906020019091905050611917565b005b341561079357600080fd5b61080b600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611b1b565b6040518082815260200191505060405180910390f35b341561082c57600080fd5b610834611b3a565b6040518082815260200191505060405180910390f35b341561085557600080fd5b61085d611b3f565b6040518082815260200191505060405180910390f35b341561087e57600080fd5b6108c9600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611b45565b005b34156108d657600080fd5b6108ec6004808035906020019091905050611e5c565b005b6003818154811015156108fd57fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561096957600080fd5b81600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615156109c257600080fd5b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600091505b600160038054905003821015610b4a578273ffffffffffffffffffffffffffffffffffffffff16600383815481101515610a5557fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610b3d576003600160038054905003815481101515610ab457fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600383815481101515610aef57fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610b4a565b8180600101925050610a1f565b6001600381818054905003915081610b62919061233b565b506003805490506004541115610b8157610b8060038054905061185d565b5b8273ffffffffffffffffffffffffffffffffffffffff167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a2505050565b60076020528060005260406000206000915090505481565b33600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610c3a57600080fd5b81336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610ca557600080fd5b8360008082815260200190815260200160002060030160009054906101000a900460ff16151515610cd557600080fd5b84610cdf816111a5565b151515610ceb57600080fd5b60006001600088815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550853373ffffffffffffffffffffffffffffffffffffffff167ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e960405160405180910390a3505050505050565b8060008082815260200190815260200160002060030160009054906101000a900460ff16151515610dd057600080fd5b81610dda816111a5565b1515610de557600080fd5b8260008060008381526020019081526020016000209050610ea1816002018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610e975780601f10610e6c57610100808354040283529160200191610e97565b820191906000526020600020905b815481529060010190602001808311610e7a57829003601f168201915b5050505050611ed7565b1515610eac57600080fd5b610eb585612019565b5050505050565b60026020528060005260406000206000915054906101000a900460ff1681565b60016020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b600080600090505b600554811015610f9657838015610f4a575060008082815260200190815260200160002060030160009054906101000a900460ff16155b80610f7d5750828015610f7c575060008082815260200190815260200160002060030160009054906101000a900460ff165b5b15610f89576001820191505b8080600101915050610f13565b5092915050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610fd757600080fd5b80600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151561103157600080fd5b8160008173ffffffffffffffffffffffffffffffffffffffff161415151561105857600080fd5b600160038054905001600454603282111580156110755750818111155b8015611082575060008114155b801561108f575060008214155b151561109a57600080fd5b6001600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600380548060010182816111069190612367565b9160005260206000209001600087909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508473ffffffffffffffffffffffffffffffffffffffff167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b60065481565b6000806000809150600090505b600380549050811015611283576001600085815260200190815260200160002060006003838154811015156111e357fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611263576001820191505b6004548214156112765760019250611284565b80806001019150506111b2565b5b5050919050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156112c557600080fd5b806006819055507fd1c9101a34feff75cccef14a28785a0279cb0b49c1f321f21f5f422e746b4377816040518082815260200191505060405180910390a150565b600080600090505b6003805490508110156113cc5760016000848152602001908152602001600020600060038381548110151561133f57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156113bf576001820191505b808060010191505061130e565b50919050565b60006020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201908060030160009054906101000a900460ff16905084565b611436612393565b60038054806020026020016040519081016040528092919081815260200182805480156114b857602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161146e575b5050505050905090565b6114ca6123a7565b6114d26123a7565b6000808688111515156114e457600080fd5b6005546040518059106114f45750595b9080825280602002602001820160405250925060009150600090505b6005548110156115b057858015611547575060008082815260200190815260200160002060030160009054906101000a900460ff16155b8061157a5750848015611579575060008082815260200190815260200160002060030160009054906101000a900460ff165b5b156115a35780838381518110151561158e57fe5b90602001906020020181815250506001820191505b8080600101915050611510565b8787036040518059106115c05750595b908082528060200260200182016040525093508790505b868110156116225782818151811015156115ed57fe5b906020019060200201518489830381518110151561160757fe5b906020019060200201818152505080806001019150506115d7565b505050949350505050565b611635612393565b61163d612393565b6000806003805490506040518059106116535750595b9080825280602002602001820160405250925060009150600090505b6003805490508110156117b2576001600086815260200190815260200160002060006003838154811015156116a057fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156117a55760038181548110151561172857fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16838381518110151561176257fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506001820191505b808060010191505061166f565b816040518059106117c05750595b90808252806020026020018201604052509350600090505b8181101561184f5782818151811015156117ee57fe5b90602001906020020151848281518110151561180657fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080806001019150506117d8565b505050919050565b60055481565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561189757600080fd5b60038054905081603282111580156118af5750818111155b80156118bc575060008114155b80156118c9575060008214155b15156118d457600080fd5b826004819055507fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a836040518082815260200191505060405180910390a1505050565b33600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151561197057600080fd5b81600080600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156119cc57600080fd5b82336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151515611a3857600080fd5b84611a42816111a5565b151515611a4e57600080fd5b600180600088815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550853373ffffffffffffffffffffffffffffffffffffffff167f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef60405160405180910390a3611b03866111a5565b15611b1357611b128642612195565b5b505050505050565b6000611b288484846121e9565b9050611b3381611917565b9392505050565b603281565b60045481565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b8157600080fd5b82600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515611bda57600080fd5b82600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151515611c3457600080fd5b600092505b600380549050831015611d1f578473ffffffffffffffffffffffffffffffffffffffff16600384815481101515611c6c57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611d125783600384815481101515611cc457fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611d1f565b8280600101935050611c39565b6000600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508473ffffffffffffffffffffffffffffffffffffffff167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a28373ffffffffffffffffffffffffffffffffffffffff167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b8060008082815260200190815260200160002060030160009054906101000a900460ff16151515611e8c57600080fd5b81611e96816111a5565b1515611ea157600080fd5b826006546007600083815260200190815260200160002054014210151515611ec857600080fd5b611ed184612019565b50505050565b600080600060405180807f7061757365282900000000000000000000000000000000000000000000000000815250600701905060405180910390209150600090505b600481101561200d578181600481101515611f3057fe5b1a7f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168482815181101515611f8357fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415156120005760009250612012565b8080600101915050611f19565b600192505b5050919050565b6000806000838152602001908152602001600020905060018160030160006101000a81548160ff0219169083151502179055508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681600101548260020160405180828054600181600116156101000203166002900480156120f55780601f106120ca576101008083540402835291602001916120f5565b820191906000526020600020905b8154815290600101906020018083116120d857829003601f168201915b505091505060006040518083038185876187965a03f1925050501561214657817f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7560405160405180910390a2612191565b817f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923660405160405180910390a260008160030160006101000a81548160ff0219169083151502179055505b5050565b806007600084815260200190815260200160002081905550817f0b237afe65f1514fd7ea3f923ea4fe792bdd07000a912b6cd1602a8e7f573c8d826040518082815260200191505060405180910390a25050565b60008360008173ffffffffffffffffffffffffffffffffffffffff161415151561221257600080fd5b60055491506080604051908101604052808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020016000151581525060008084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020190805190602001906122d19291906123bb565b5060608201518160030160006101000a81548160ff0219169083151502179055509050506001600560008282540192505081905550817fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5160405160405180910390a2509392505050565b81548183558181151161236257818360005260206000209182019101612361919061243b565b5b505050565b81548183558181151161238e5781836000526020600020918201910161238d919061243b565b5b505050565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106123fc57805160ff191683800117855561242a565b8280016001018555821561242a579182015b8281111561242957825182559160200191906001019061240e565b5b509050612437919061243b565b5090565b61245d91905b80821115612459576000816000905550600101612441565b5090565b905600a165627a7a72305820670aa210266ccc388354173d8da609316c6abb3b83159e9942819b3dc679d1930029", "sourceMap": "642:5334:34:-;;;1548:237;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1706:7;1715:9;2975:6:35;2929:7;:14;2945:9;819:2;2253:10;:29;;:68;;;;;2311:10;2298:9;:23;;2253:68;:98;;;;;2350:1;2337:9;:14;;2253:98;:129;;;;;2381:1;2367:10;:15;;2253:129;2245:138;;;;;;;;2982:1;2975:8;;2970:151;2987:7;:14;2985:1;:16;2970:151;;;3031:7;:19;3039:7;3047:1;3039:10;;;;;;;;;;;;;;;;;;3031:19;;;;;;;;;;;;;;;;;;;;;;;;;3030:20;:39;;;;;3068:1;3054:7;3062:1;3054:10;;;;;;;;;;;;;;;;;;:15;;;;3030:39;3022:48;;;;;;;;3106:4;3084:7;:19;3092:7;3100:1;3092:10;;;;;;;;;;;;;;;;;;3084:19;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;3003:3;;;;;;;2970:151;;;3139:7;3130:6;:16;;;;;;;;;;;;:::i;:::-;;3167:9;3156:8;:20;;;;2830:353;;;;;1760:18:34;1740:17;:38;;;;1548:237;;;642:5334;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;", "deployedSourceMap": "642:5334:34:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2535:1:35;2523:9;:13;2519:61;;;2558:10;2550:30;;;2570:9;2550:30;;;;;;;;;;;;;;;;;;2519:61;642:5334:34;1030:23:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3710:460;;;;;;;;;;;;;;;;;;;;;;;;;;;;866:64:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3179:338;;;;;;;;;;;;;;;;;;;;;;;;;;4097:259;;;;;;;;;;;;;;;;;;;;;;;;;;984:40:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;914:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9221:315;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3310:277;;;;;;;;;;;;;;;;;;;;;;;;;;;;830:29:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7397:333:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1993:186:34;;;;;;;;;;;;;;;;;;;;;;;;;;8711:248:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;859:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9620:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;10830:702:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;9910:571:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;1085:28:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4992:207;;;;;;;;;;;;;;;;;;;;;;;;;;2337:604:34;;;;;;;;;;;;;;;;;;;;;;;;;;5458:244:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;780:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1059:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4372:449;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3646:234:34;;;;;;;;;;;;;;;;;;;;;;;;;;1030:23:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3710:460::-;3858:6;1339:4;1317:27;;:10;:27;;;1309:36;;;;;;;;3800:5;1523:7;:14;1531:5;1523:14;;;;;;;;;;;;;;;;;;;;;;;;;1515:23;;;;;;;;3838:5;3821:7;:14;3829:5;3821:14;;;;;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;3865:1;3858:8;;3853:170;3886:1;3870:6;:13;;;;:17;3868:1;:19;3853:170;;;3923:5;3910:18;;:6;3917:1;3910:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;:18;;;3906:117;;;3960:6;3983:1;3967:6;:13;;;;:17;3960:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;3948:6;3955:1;3948:9;;;;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;4003:5;;3906:117;3889:3;;;;;;;3853:170;;;4049:1;4032:6;:18;;;;;;;;;;;;;;:::i;:::-;;4075:6;:13;;;;4064:8;;:24;4060:74;;;4102:32;4120:6;:13;;;;4102:17;:32::i;:::-;4060:74;4157:5;4144:19;;;;;;;;;;;;1355:1;3710:460;;:::o;866:64:34:-;;;;;;;;;;;;;;;;;:::o;3179:338::-;3262:10;1523:7:35;:14;1531:5;1523:14;;;;;;;;;;;;;;;;;;;;;;;;;1515:23;;;;;;;;3292:13:34;3307:10;1768:13:35;:28;1782:13;1768:28;;;;;;;;;;;:35;1797:5;1768:35;;;;;;;;;;;;;;;;;;;;;;;;;1760:44;;;;;;;;3339:13:34;2024:12:35;:27;2037:13;2024:27;;;;;;;;;;;:36;;;;;;;;;;;;2023:37;2015:46;;;;;;;;3386:13:34;1129:26;1141:13;1129:11;:26::i;:::-;1128:27;1120:36;;;;;;;;3458:5;3415:13;:28;3429:13;3415:28;;;;;;;;;;;:40;3444:10;3415:40;;;;;;;;;;;;;;;;:48;;;;;;;;;;;;;;;;;;3496:13;3484:10;3473:37;;;;;;;;;;;;2071:1:35;1814;1548;;3179:338:34;;:::o;4097:259::-;4196:13;2024:12:35;:27;2037:13;2024:27;;;;;;;;;;;:36;;;;;;;;;;;;2023:37;2015:46;;;;;;;;4241:13:34;1006:26;1018:13;1006:11;:26::i;:::-;998:35;;;;;;;;4286:13;1414:23;1440:12;:27;1453:13;1440:27;;;;;;;;;;;1414:53;;1486:37;1514:3;:8;;1486:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:27;:37::i;:::-;1478:46;;;;;;;;4315:34;4335:13;4315:19;:34::i;:::-;1043:1;;2071::35;4097:259:34;;:::o;984:40:35:-;;;;;;;;;;;;;;;;;;;;;;:::o;914:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;9221:315::-;9324:10;9355:6;9362:1;9355:8;;9350:179;9367:16;;9365:1;:18;9350:179;;;9409:7;:36;;;;;9421:12;:15;9434:1;9421:15;;;;;;;;;;;:24;;;;;;;;;;;;9420:25;9409:36;:92;;;;9465:8;:36;;;;;9477:12;:15;9490:1;9477:15;;;;;;;;;;;:24;;;;;;;;;;;;9465:36;9409:92;9402:127;;;9528:1;9519:10;;;;9402:127;9385:3;;;;;;;9350:179;;;9221:315;;;;;:::o;3310:277::-;1339:4;1317:27;;:10;:27;;;1309:36;;;;;;;;3403:5;1430:7;:14;1438:5;1430:14;;;;;;;;;;;;;;;;;;;;;;;;;1429:15;1421:24;;;;;;;;3426:5;2150:1;2138:8;:13;;;;2130:22;;;;;;;;3474:1;3458:6;:13;;;;:17;3477:8;;819:2;2253:10;:29;;:68;;;;;2311:10;2298:9;:23;;2253:68;:98;;;;;2350:1;2337:9;:14;;2253:98;:129;;;;;2381:1;2367:10;:15;;2253:129;2245:138;;;;;;;;3518:4;3501:7;:14;3509:5;3501:14;;;;;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;3532:6;:18;;;;;;;;;;;:::i;:::-;;;;;;;;;;3544:5;3532:18;;;;;;;;;;;;;;;;;;;;;;;3574:5;3560:20;;;;;;;;;;;;2162:1;;1455;1355;3310:277;:::o;830:29:34:-;;;;:::o;7397:333:35:-;7483:4;7503:10;7532:6;7516:1;7503:14;;7539:1;7532:8;;7527:197;7544:6;:13;;;;7542:1;:15;7527:197;;;7582:13;:28;7596:13;7582:28;;;;;;;;;;;:39;7611:6;7618:1;7611:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;7582:39;;;;;;;;;;;;;;;;;;;;;;;;;7578:71;;;7648:1;7639:10;;;;7578:71;7676:8;;7667:5;:17;7663:50;;;7709:4;7702:11;;;;7663:50;7559:3;;;;;;;7527:197;;;7397:333;;;;;;:::o;1993:186:34:-;1339:4:35;1317:27;;:10;:27;;;1309:36;;;;;;;;2110:18:34;2090:17;:38;;;;2138:34;2153:18;2138:34;;;;;;;;;;;;;;;;;;1993:186;:::o;8711:248:35:-;8806:10;8837:6;8844:1;8837:8;;8832:120;8849:6;:13;;;;8847:1;:15;8832:120;;;8885:13;:28;8899:13;8885:28;;;;;;;;;;;:39;8914:6;8921:1;8914:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;8885:39;;;;;;;;;;;;;;;;;;;;;;;;;8881:71;;;8951:1;8942:10;;;;8881:71;8864:3;;;;;;;8832:120;;;8711:248;;;;:::o;859:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;9620:111::-;9686:9;;:::i;:::-;9718:6;9711:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9620:111;:::o;10830:702::-;10951:22;;:::i;:::-;11019:32;;:::i;:::-;11092:10;11116:6;11005:2;10997:4;:10;;10989:19;;;;;;;;11065:16;;11054:28;;;;;;;;;;;;;;;;;;;;;;;;11019:63;;11105:1;11092:14;;11139:1;11137:3;;11132:250;11144:16;;11142:1;:18;11132:250;;;11186:7;:36;;;;;11198:12;:15;11211:1;11198:15;;;;;;;;;;;:24;;;;;;;;;;;;11197:25;11186:36;:92;;;;11242:8;:36;;;;;11254:12;:15;11267:1;11254:15;;;;;;;;;;;:24;;;;;;;;;;;;11242:36;11186:92;11179:203;;;11338:1;11310:18;11329:5;11310:25;;;;;;;;;;;;;;;;;:29;;;;;11366:1;11357:10;;;;11179:203;11162:3;;;;;;;11132:250;;;11425:4;11420:2;:9;11409:21;;;;;;;;;;;;;;;;;;;;;;;;11391:39;;11447:4;11445:6;;11440:85;11455:2;11453:1;:4;11440:85;;;11504:18;11523:1;11504:21;;;;;;;;;;;;;;;;;;11476:15;11496:4;11492:1;:8;11476:25;;;;;;;;;;;;;;;;;:49;;;;;11459:3;;;;;;;11440:85;;;10830:702;;;;;;;;;:::o;9910:571::-;10001:24;;:::i;:::-;10041:34;;:::i;:::-;10116:10;10140:6;10092;:13;;;;10078:28;;;;;;;;;;;;;;;;;;;;;;;;10041:65;;10129:1;10116:14;;10163:1;10161:3;;10156:186;10168:6;:13;;;;10166:1;:15;10156:186;;;10204:13;:28;10218:13;10204:28;;;;;;;;;;;:39;10233:6;10240:1;10233:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;10204:39;;;;;;;;;;;;;;;;;;;;;;;;;10200:142;;;10290:6;10297:1;10290:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;10263:17;10281:5;10263:24;;;;;;;;;;;;;;;;;:36;;;;;;;;;;;10326:1;10317:10;;;;10200:142;10183:3;;;;;;;10156:186;;;10382:5;10368:20;;;;;;;;;;;;;;;;;;;;;;;;10351:37;;10405:1;10403:3;;10398:76;10410:5;10408:1;:7;10398:76;;;10454:17;10472:1;10454:20;;;;;;;;;;;;;;;;;;10434:14;10449:1;10434:17;;;;;;;;;;;;;;;;;:40;;;;;;;;;;;10417:3;;;;;;;10398:76;;;9910:571;;;;;;:::o;1085:28::-;;;;:::o;4992:207::-;1339:4;1317:27;;:10;:27;;;1309:36;;;;;;;;5094:6;:13;;;;5109:9;819:2;2253:10;:29;;:68;;;;;2311:10;2298:9;:23;;2253:68;:98;;;;;2350:1;2337:9;:14;;2253:98;:129;;;;;2381:1;2367:10;:15;;2253:129;2245:138;;;;;;;;5145:9;5134:8;:20;;;;5164:28;5182:9;5164:28;;;;;;;;;;;;;;;;;;1355:1;;4992:207;:::o;2337:604:34:-;2420:10;1523:7:35;:14;1531:5;1523:14;;;;;;;;;;;;;;;;;;;;;;;;;1515:23;;;;;;;;2458:13:34;1670:1:35;1627:12;:27;1640:13;1627:27;;;;;;;;;;;:39;;;;;;;;;;;;:44;;;;1619:53;;;;;;;;2494:13:34;2509:10;1904:13:35;:28;1918:13;1904:28;;;;;;;;;;;:35;1933:5;1904:35;;;;;;;;;;;;;;;;;;;;;;;;;1903:36;1895:45;;;;;;;;2553:13:34;1129:26;1141:13;1129:11;:26::i;:::-;1128:27;1120:36;;;;;;;;2625:4;2582:13;:28;2596:13;2582:28;;;;;;;;;;;:40;2611:10;2582:40;;;;;;;;;;;;;;;;:47;;;;;;;;;;;;;;;;;;2664:13;2652:10;2639:39;;;;;;;;;;;;2830:26;2842:13;2830:11;:26::i;:::-;2826:109;;;2872:52;2893:13;2908:15;2872:20;:52::i;:::-;2826:109;1950:1:35;1682;;1548;2337:604:34;;:::o;5458:244:35:-;5562:18;5612:40;5627:11;5640:5;5647:4;5612:14;:40::i;:::-;5596:56;;5662:33;5681:13;5662:18;:33::i;:::-;5458:244;;;;;:::o;780:41::-;819:2;780:41;:::o;1059:20::-;;;;:::o;4372:449::-;4543:6;1339:4;1317:27;;:10;:27;;;1309:36;;;;;;;;4481:5;1523:7;:14;1531:5;1523:14;;;;;;;;;;;;;;;;;;;;;;;;;1515:23;;;;;;;;4514:8;1430:7;:14;1438:5;1430:14;;;;;;;;;;;;;;;;;;;;;;;;;1429:15;1421:24;;;;;;;;4550:1;4543:8;;4538:149;4555:6;:13;;;;4553:1;:15;4538:149;;;4604:5;4591:18;;:6;4598:1;4591:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;:18;;;4587:100;;;4641:8;4629:6;4636:1;4629:9;;;;;;;;;;;;;;;;;;;:20;;;;;;;;;;;;;;;;;;4667:5;;4587:100;4570:3;;;;;;;4538:149;;;4713:5;4696:7;:14;4704:5;4696:14;;;;;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;4748:4;4728:7;:17;4736:8;4728:17;;;;;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;4775:5;4762:19;;;;;;;;;;;;4805:8;4791:23;;;;;;;;;;;;1548:1;1355;4372:449;;;:::o;3646:234:34:-;3729:13;2024:12:35;:27;2037:13;2024:27;;;;;;;;;;;:36;;;;;;;;;;;;2023:37;2015:46;;;;;;;;3774:13:34;1006:26;1018:13;1006:11;:26::i;:::-;998:35;;;;;;;;3810:13;1311:17;;1259:34;:49;1294:13;1259:49;;;;;;;;;;;;:69;1240:15;:88;;1232:97;;;;;;;;3839:34;3859:13;3839:19;:34::i;:::-;1043:1;2071::35;3646:234:34;;:::o;5620:354::-;5716:4;5736:29;5811:6;5775:20;;;;;;;;;;;;;;;;;;;5736:60;;5820:1;5811:10;;5806:140;5827:1;5823;:5;5806:140;;;5864:22;5887:1;5864:25;;;;;;;;;;;;5853:36;;;:4;5858:1;5853:7;;;;;;;;;;;;;;;;;;;;:36;;;;;5849:87;;;5916:5;5909:12;;;;5849:87;5830:3;;;;;;;5806:140;;;5963:4;5956:11;;5620:354;;;;;;:::o;4548:372::-;4628:23;4654:12;:27;4667:13;4654:27;;;;;;;;;;;4628:53;;4706:4;4691:3;:12;;;:19;;;;;;;;;;;;;;;;;;4724:3;:15;;;;;;;;;;;;:20;;4751:3;:9;;;4762:3;:8;;4724:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4720:194;;;4795:13;4785:24;;;;;;;;;;4720:194;;;4855:13;4838:31;;;;;;;;;;4898:5;4883:3;:12;;;:20;;;;;;;;;;;;;;;;;;4720:194;4548:372;;:::o;5074:241::-;5230:16;5178:34;:49;5213:13;5178:49;;;;;;;;;;;:68;;;;5276:13;5256:52;5291:16;5256:52;;;;;;;;;;;;;;;;;;5074:241;;:::o;8063:451:35:-;8195:18;8165:11;2150:1;2138:8;:13;;;;2130:22;;;;;;;;8245:16;;8229:32;;8301:140;;;;;;;;;8340:11;8301:140;;;;;;8372:5;8301:140;;;;8397:4;8301:140;;;;8425:5;8301:140;;;;;8271:12;:27;8284:13;8271:27;;;;;;;;;;;:170;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8471:1;8451:16;;:21;;;;;;;;;;;8493:13;8482:25;;;;;;;;;;8063:451;;;;;;:::o;642:5334:34:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", "source": "/*\n\n Copyright 2018 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\nimport \"./MultiSigWallet.sol\";\n\n\ncontract DharmaMultiSigWallet is MultiSigWallet {\n\n event ConfirmationTimeSet(uint indexed transactionId, uint confirmationTime);\n event TimeLockChange(uint timelockInSeconds);\n\n uint public timelockInSeconds;\n\n mapping (uint => uint) public transactionConfirmedBlockTimestamp;\n\n modifier sufficientlyConfirmed(uint transactionId) {\n require(isConfirmed(transactionId));\n _;\n }\n\n modifier insufficientlyConfirmed(uint transactionId) {\n require(!isConfirmed(transactionId));\n _;\n }\n\n modifier pastTimeLock(uint transactionId) {\n require(block.timestamp >= transactionConfirmedBlockTimestamp[transactionId] + timelockInSeconds);\n _;\n }\n\n modifier validPauseTransaction(uint transactionId) {\n Transaction storage txn = transactions[transactionId];\n\n require(_isPauseFunctionTransaction(txn.data));\n _;\n }\n\n function DharmaMultiSigWallet(\n address[] _owners,\n uint _required,\n uint _timelockInSeconds\n )\n public\n MultiSigWallet(_owners, _required)\n {\n timelockInSeconds = _timelockInSeconds;\n }\n\n ////////////////////////\n // EXTERNAL FUNCTIONS //\n ////////////////////////\n\n /**\n * Changes the duration of the time lock for transactions. Can only be called by the wallet.\n */\n function changeTimeLock(uint _timelockInSeconds)\n public\n onlyWallet\n {\n timelockInSeconds = _timelockInSeconds;\n TimeLockChange(_timelockInSeconds);\n }\n\n /**\n * Allows an owner to confirm a transaction if the transaction has\n * not yet received a sufficient threshold of confirmations.\n */\n function confirmTransaction(uint transactionId)\n public\n ownerExists(msg.sender)\n transactionExists(transactionId)\n notConfirmed(transactionId, msg.sender)\n insufficientlyConfirmed(transactionId)\n {\n confirmations[transactionId][msg.sender] = true;\n Confirmation(msg.sender, transactionId);\n\n // If the transaction is now sufficiently confirmed, we record\n // the timestamp in order to kick off the timelock period\n if (isConfirmed(transactionId)) {\n _setConfirmationTime(transactionId, block.timestamp);\n }\n }\n\n /**\n * Allows an owner to revoke a confirmation they've submitted\n * previously for the transaction if the transaction has not\n * already been sufficiently confirmed (and entered the timelock\n * period).\n */\n function revokeConfirmation(uint transactionId)\n public\n ownerExists(msg.sender)\n confirmed(transactionId, msg.sender)\n notExecuted(transactionId)\n insufficientlyConfirmed(transactionId)\n {\n confirmations[transactionId][msg.sender] = false;\n Revocation(msg.sender, transactionId);\n }\n\n /**\n * Allows anyone to execute a transaction if it has been\n * confirmed and the timelock has passed.\n */\n function executeTransaction(uint transactionId)\n public\n notExecuted(transactionId)\n sufficientlyConfirmed(transactionId)\n pastTimeLock(transactionId)\n {\n _executeTransaction(transactionId);\n }\n\n /**\n * In case of an emergency, allows anyone to execute a transaction if it has\n * been confirmed and matches the \"pause\" function signature WITHOUT waiting\n * for the timelock to pass.\n */\n function executePauseTransactionImmediately(uint transactionId)\n public\n notExecuted(transactionId)\n sufficientlyConfirmed(transactionId)\n validPauseTransaction(transactionId)\n {\n _executeTransaction(transactionId);\n }\n\n ////////////////////////\n // INTERNAL FUNCTIONS //\n ////////////////////////\n\n /**\n * Internal helper function that attempts to execute a confirmed transaction.\n */\n function _executeTransaction(uint transactionId)\n internal\n {\n Transaction storage txn = transactions[transactionId];\n txn.executed = true;\n if (txn.destination.call.value(txn.value)(txn.data))\n Execution(transactionId);\n else {\n ExecutionFailure(transactionId);\n txn.executed = false;\n }\n }\n\n /**\n * Internal function that records the time at which\n * a transaction reached the minimal threshold of\n * confirmations.\n */\n function _setConfirmationTime(uint transactionId, uint confirmationTime)\n internal\n {\n transactionConfirmedBlockTimestamp[transactionId] = confirmationTime;\n ConfirmationTimeSet(transactionId, confirmationTime);\n }\n\n /**\n * Returns true if the first four bytes of the given data matches\n * the function selector Method ID for the \"pause\" method --\n * for more information, see the Ethereum wiki's contract ABI specification:\n * https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI\n */\n function _isPauseFunctionTransaction(bytes data)\n internal\n view\n returns (bool)\n {\n bytes4 pauseFunctionSignature = bytes4(keccak256(\"pause()\"));\n for (uint i = 0; i < 4; i++) {\n if (data[i] != pauseFunctionSignature[i]) {\n return false;\n }\n }\n\n return true;\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/wallet/DharmaMultiSigWallet.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/wallet/DharmaMultiSigWallet.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/wallet/DharmaMultiSigWallet.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/wallet/DharmaMultiSigWallet.sol", "exportedSymbols": { "DharmaMultiSigWallet": [ 12928 @@ -659,7 +659,7 @@ export const DharmaMultiSigWallet = { "attributes": { "SourceUnit": 13919, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/wallet/MultiSigWallet.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/wallet/MultiSigWallet.sol", "file": "./MultiSigWallet.sol", "scope": 12929, "symbolAliases": [ @@ -5192,7 +5192,7 @@ export const DharmaMultiSigWallet = "42": { "events": {}, "links": {}, - "address": "0xc6846f1c094c354055d5cf4c093127f398753546" + "address": "0x73b8e624c2e0e55e7eaf5ff669a7c63f95781bb4" }, "70": { "events": {}, @@ -5201,5 +5201,5 @@ export const DharmaMultiSigWallet = } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:16:36.723Z" + "updatedAt": "2018-10-09T17:53:24.844Z" } \ No newline at end of file diff --git a/artifacts/ts/DummyContract.ts b/artifacts/ts/DummyContract.ts index 349d8ce2..03c06262 100644 --- a/artifacts/ts/DummyContract.ts +++ b/artifacts/ts/DummyContract.ts @@ -187,15 +187,15 @@ export const DummyContract = "type": "event" } ], - "bytecode": "0x6060604052341561000f57600080fd5b610cc68061001e6000396000f3006060604052600436106100a4576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633dd6020f146100a95780633fe1b53314610137578063589e9a75146101705780637a381130146101da5780638eb509a11461022b578063a224cfac14610264578063b38b5e58146102ce578063bcd3486614610307578063c305630214610340578063ffe1712114610391575b600080fd5b34156100b457600080fd5b6100bc61041f565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100fc5780820151818401526020810190506100e1565b50505050905090810190601f1680156101295780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561014257600080fd5b61016e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610458565b005b341561017b57600080fd5b6101836104a6565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156101c65780820151818401526020810190506101ab565b505050509050019250505060405180910390f35b34156101e557600080fd5b610211600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506104bd565b604051808215151515815260200191505060405180910390f35b341561023657600080fd5b610262600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506104da565b005b341561026f57600080fd5b610277610528565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156102ba57808201518184015260208101905061029f565b505050509050019250505060405180910390f35b34156102d957600080fd5b610305600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061053f565b005b341561031257600080fd5b61033e600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061058d565b005b341561034b57600080fd5b610377600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506105db565b604051808215151515815260200191505060405180910390f35b341561039c57600080fd5b6103a46105f8565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103e45780820151818401526020810190506103c9565b50505050905090810190601f1680156104115780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6040805190810160405280601981526020017f64756d6d792d636f6e74726163742d7365636f6e642d7365740000000000000081525081565b6104a3816040805190810160405280601881526020017f64756d6d792d636f6e74726163742d66697273742d736574000000000000000081525060006106319092919063ffffffff16565b50565b6104ae610c09565b6104b86003610927565b905090565b60006104d38260036109bf90919063ffffffff16565b9050919050565b610525816040805190810160405280601981526020017f64756d6d792d636f6e74726163742d7365636f6e642d7365740000000000000081525060036106319092919063ffffffff16565b50565b610530610c09565b61053a6000610927565b905090565b61058a816040805190810160405280601981526020017f64756d6d792d636f6e74726163742d7365636f6e642d736574000000000000008152506003610a189092919063ffffffff16565b50565b6105d8816040805190810160405280601881526020017f64756d6d792d636f6e74726163742d66697273742d73657400000000000000008152506000610a189092919063ffffffff16565b50565b60006105f18260006109bf90919063ffffffff16565b9050919050565b6040805190810160405280601881526020017f64756d6d792d636f6e74726163742d66697273742d736574000000000000000081525081565b600080600061064086866109bf565b151561064b57600080fd5b8560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205492506001866002018054905003915085600201828154811015156106ad57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff021916905580866002018481548110151561073e57fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055856002018281548110151561082357fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001866002018181805490500391508161086b9190610c1d565b508473ffffffffffffffffffffffffffffffffffffffff167f0814e4ee85854cea446b4a27a460e5ffb41516230dbc02f226c07907e432241c856040518080602001828103825283818151815260200191508051906020019080838360005b838110156108e55780820151818401526020810190506108ca565b50505050905090810190601f1680156109125780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050505050565b61092f610c09565b816002018054806020026020016040519081016040528092919081815260200182805480156109b357602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610969575b50505050509050919050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610a228383610bf4565b1515610a2d57600080fd5b60018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550826002018054806001018281610a9d9190610c49565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060018360020180549050038360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f571925c699f9072cec76b6c6c000571cc8d0bb5c47e5819202e2e9496c6508b5826040518080602001828103825283818151815260200191508051906020019080838360005b83811015610bb5578082015181840152602081019050610b9a565b50505050905090810190601f168015610be25780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b6000610c0083836109bf565b15905092915050565b602060405190810160405280600081525090565b815481835581811511610c4457818360005260206000209182019101610c439190610c75565b5b505050565b815481835581811511610c7057818360005260206000209182019101610c6f9190610c75565b5b505050565b610c9791905b80821115610c93576000816000905550600101610c7b565b5090565b905600a165627a7a7230582064883f9a4c3cb7c4539d84bea2868effc17918d95047339155a82b6e1f99ece90029", - "deployedBytecode": "0x6060604052600436106100a4576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633dd6020f146100a95780633fe1b53314610137578063589e9a75146101705780637a381130146101da5780638eb509a11461022b578063a224cfac14610264578063b38b5e58146102ce578063bcd3486614610307578063c305630214610340578063ffe1712114610391575b600080fd5b34156100b457600080fd5b6100bc61041f565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100fc5780820151818401526020810190506100e1565b50505050905090810190601f1680156101295780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561014257600080fd5b61016e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610458565b005b341561017b57600080fd5b6101836104a6565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156101c65780820151818401526020810190506101ab565b505050509050019250505060405180910390f35b34156101e557600080fd5b610211600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506104bd565b604051808215151515815260200191505060405180910390f35b341561023657600080fd5b610262600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506104da565b005b341561026f57600080fd5b610277610528565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156102ba57808201518184015260208101905061029f565b505050509050019250505060405180910390f35b34156102d957600080fd5b610305600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061053f565b005b341561031257600080fd5b61033e600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061058d565b005b341561034b57600080fd5b610377600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506105db565b604051808215151515815260200191505060405180910390f35b341561039c57600080fd5b6103a46105f8565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103e45780820151818401526020810190506103c9565b50505050905090810190601f1680156104115780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6040805190810160405280601981526020017f64756d6d792d636f6e74726163742d7365636f6e642d7365740000000000000081525081565b6104a3816040805190810160405280601881526020017f64756d6d792d636f6e74726163742d66697273742d736574000000000000000081525060006106319092919063ffffffff16565b50565b6104ae610c09565b6104b86003610927565b905090565b60006104d38260036109bf90919063ffffffff16565b9050919050565b610525816040805190810160405280601981526020017f64756d6d792d636f6e74726163742d7365636f6e642d7365740000000000000081525060036106319092919063ffffffff16565b50565b610530610c09565b61053a6000610927565b905090565b61058a816040805190810160405280601981526020017f64756d6d792d636f6e74726163742d7365636f6e642d736574000000000000008152506003610a189092919063ffffffff16565b50565b6105d8816040805190810160405280601881526020017f64756d6d792d636f6e74726163742d66697273742d73657400000000000000008152506000610a189092919063ffffffff16565b50565b60006105f18260006109bf90919063ffffffff16565b9050919050565b6040805190810160405280601881526020017f64756d6d792d636f6e74726163742d66697273742d736574000000000000000081525081565b600080600061064086866109bf565b151561064b57600080fd5b8560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205492506001866002018054905003915085600201828154811015156106ad57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff021916905580866002018481548110151561073e57fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055856002018281548110151561082357fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001866002018181805490500391508161086b9190610c1d565b508473ffffffffffffffffffffffffffffffffffffffff167f0814e4ee85854cea446b4a27a460e5ffb41516230dbc02f226c07907e432241c856040518080602001828103825283818151815260200191508051906020019080838360005b838110156108e55780820151818401526020810190506108ca565b50505050905090810190601f1680156109125780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050505050565b61092f610c09565b816002018054806020026020016040519081016040528092919081815260200182805480156109b357602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610969575b50505050509050919050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610a228383610bf4565b1515610a2d57600080fd5b60018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550826002018054806001018281610a9d9190610c49565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060018360020180549050038360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f571925c699f9072cec76b6c6c000571cc8d0bb5c47e5819202e2e9496c6508b5826040518080602001828103825283818151815260200191508051906020019080838360005b83811015610bb5578082015181840152602081019050610b9a565b50505050905090810190601f168015610be25780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b6000610c0083836109bf565b15905092915050565b602060405190810160405280600081525090565b815481835581811511610c4457818360005260206000209182019101610c439190610c75565b5b505050565b815481835581811511610c7057818360005260206000209182019101610c6f9190610c75565b5b505050565b610c9791905b80821115610c93576000816000905550600101610c7b565b5090565b905600a165627a7a7230582064883f9a4c3cb7c4539d84bea2868effc17918d95047339155a82b6e1f99ece90029", + "bytecode": "0x6060604052341561000f57600080fd5b610cc68061001e6000396000f3006060604052600436106100a4576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633dd6020f146100a95780633fe1b53314610137578063589e9a75146101705780637a381130146101da5780638eb509a11461022b578063a224cfac14610264578063b38b5e58146102ce578063bcd3486614610307578063c305630214610340578063ffe1712114610391575b600080fd5b34156100b457600080fd5b6100bc61041f565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100fc5780820151818401526020810190506100e1565b50505050905090810190601f1680156101295780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561014257600080fd5b61016e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610458565b005b341561017b57600080fd5b6101836104a6565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156101c65780820151818401526020810190506101ab565b505050509050019250505060405180910390f35b34156101e557600080fd5b610211600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506104bd565b604051808215151515815260200191505060405180910390f35b341561023657600080fd5b610262600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506104da565b005b341561026f57600080fd5b610277610528565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156102ba57808201518184015260208101905061029f565b505050509050019250505060405180910390f35b34156102d957600080fd5b610305600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061053f565b005b341561031257600080fd5b61033e600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061058d565b005b341561034b57600080fd5b610377600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506105db565b604051808215151515815260200191505060405180910390f35b341561039c57600080fd5b6103a46105f8565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103e45780820151818401526020810190506103c9565b50505050905090810190601f1680156104115780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6040805190810160405280601981526020017f64756d6d792d636f6e74726163742d7365636f6e642d7365740000000000000081525081565b6104a3816040805190810160405280601881526020017f64756d6d792d636f6e74726163742d66697273742d736574000000000000000081525060006106319092919063ffffffff16565b50565b6104ae610c09565b6104b86003610927565b905090565b60006104d38260036109bf90919063ffffffff16565b9050919050565b610525816040805190810160405280601981526020017f64756d6d792d636f6e74726163742d7365636f6e642d7365740000000000000081525060036106319092919063ffffffff16565b50565b610530610c09565b61053a6000610927565b905090565b61058a816040805190810160405280601981526020017f64756d6d792d636f6e74726163742d7365636f6e642d736574000000000000008152506003610a189092919063ffffffff16565b50565b6105d8816040805190810160405280601881526020017f64756d6d792d636f6e74726163742d66697273742d73657400000000000000008152506000610a189092919063ffffffff16565b50565b60006105f18260006109bf90919063ffffffff16565b9050919050565b6040805190810160405280601881526020017f64756d6d792d636f6e74726163742d66697273742d736574000000000000000081525081565b600080600061064086866109bf565b151561064b57600080fd5b8560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205492506001866002018054905003915085600201828154811015156106ad57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff021916905580866002018481548110151561073e57fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055856002018281548110151561082357fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001866002018181805490500391508161086b9190610c1d565b508473ffffffffffffffffffffffffffffffffffffffff167f0814e4ee85854cea446b4a27a460e5ffb41516230dbc02f226c07907e432241c856040518080602001828103825283818151815260200191508051906020019080838360005b838110156108e55780820151818401526020810190506108ca565b50505050905090810190601f1680156109125780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050505050565b61092f610c09565b816002018054806020026020016040519081016040528092919081815260200182805480156109b357602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610969575b50505050509050919050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610a228383610bf4565b1515610a2d57600080fd5b60018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550826002018054806001018281610a9d9190610c49565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060018360020180549050038360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f571925c699f9072cec76b6c6c000571cc8d0bb5c47e5819202e2e9496c6508b5826040518080602001828103825283818151815260200191508051906020019080838360005b83811015610bb5578082015181840152602081019050610b9a565b50505050905090810190601f168015610be25780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b6000610c0083836109bf565b15905092915050565b602060405190810160405280600081525090565b815481835581811511610c4457818360005260206000209182019101610c439190610c75565b5b505050565b815481835581811511610c7057818360005260206000209182019101610c6f9190610c75565b5b505050565b610c9791905b80821115610c93576000816000905550600101610c7b565b5090565b905600a165627a7a72305820bac620d71c35e25e3105a656b7b02ddb91f13d34260ff3cc0f1d603c1690e8600029", + "deployedBytecode": "0x6060604052600436106100a4576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633dd6020f146100a95780633fe1b53314610137578063589e9a75146101705780637a381130146101da5780638eb509a11461022b578063a224cfac14610264578063b38b5e58146102ce578063bcd3486614610307578063c305630214610340578063ffe1712114610391575b600080fd5b34156100b457600080fd5b6100bc61041f565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100fc5780820151818401526020810190506100e1565b50505050905090810190601f1680156101295780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561014257600080fd5b61016e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610458565b005b341561017b57600080fd5b6101836104a6565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156101c65780820151818401526020810190506101ab565b505050509050019250505060405180910390f35b34156101e557600080fd5b610211600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506104bd565b604051808215151515815260200191505060405180910390f35b341561023657600080fd5b610262600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506104da565b005b341561026f57600080fd5b610277610528565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156102ba57808201518184015260208101905061029f565b505050509050019250505060405180910390f35b34156102d957600080fd5b610305600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061053f565b005b341561031257600080fd5b61033e600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061058d565b005b341561034b57600080fd5b610377600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506105db565b604051808215151515815260200191505060405180910390f35b341561039c57600080fd5b6103a46105f8565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103e45780820151818401526020810190506103c9565b50505050905090810190601f1680156104115780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6040805190810160405280601981526020017f64756d6d792d636f6e74726163742d7365636f6e642d7365740000000000000081525081565b6104a3816040805190810160405280601881526020017f64756d6d792d636f6e74726163742d66697273742d736574000000000000000081525060006106319092919063ffffffff16565b50565b6104ae610c09565b6104b86003610927565b905090565b60006104d38260036109bf90919063ffffffff16565b9050919050565b610525816040805190810160405280601981526020017f64756d6d792d636f6e74726163742d7365636f6e642d7365740000000000000081525060036106319092919063ffffffff16565b50565b610530610c09565b61053a6000610927565b905090565b61058a816040805190810160405280601981526020017f64756d6d792d636f6e74726163742d7365636f6e642d736574000000000000008152506003610a189092919063ffffffff16565b50565b6105d8816040805190810160405280601881526020017f64756d6d792d636f6e74726163742d66697273742d73657400000000000000008152506000610a189092919063ffffffff16565b50565b60006105f18260006109bf90919063ffffffff16565b9050919050565b6040805190810160405280601881526020017f64756d6d792d636f6e74726163742d66697273742d736574000000000000000081525081565b600080600061064086866109bf565b151561064b57600080fd5b8560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205492506001866002018054905003915085600201828154811015156106ad57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff021916905580866002018481548110151561073e57fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055856002018281548110151561082357fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001866002018181805490500391508161086b9190610c1d565b508473ffffffffffffffffffffffffffffffffffffffff167f0814e4ee85854cea446b4a27a460e5ffb41516230dbc02f226c07907e432241c856040518080602001828103825283818151815260200191508051906020019080838360005b838110156108e55780820151818401526020810190506108ca565b50505050905090810190601f1680156109125780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050505050565b61092f610c09565b816002018054806020026020016040519081016040528092919081815260200182805480156109b357602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610969575b50505050509050919050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610a228383610bf4565b1515610a2d57600080fd5b60018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550826002018054806001018281610a9d9190610c49565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060018360020180549050038360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f571925c699f9072cec76b6c6c000571cc8d0bb5c47e5819202e2e9496c6508b5826040518080602001828103825283818151815260200191508051906020019080838360005b83811015610bb5578082015181840152602081019050610b9a565b50505050905090810190601f168015610be25780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b6000610c0083836109bf565b15905092915050565b602060405190810160405280600081525090565b815481835581811511610c4457818360005260206000209182019101610c439190610c75565b5b505050565b815481835581811511610c7057818360005260206000209182019101610c6f9190610c75565b5b505050565b610c9791905b80821115610c93576000816000905550600101610c7b565b5090565b905600a165627a7a72305820bac620d71c35e25e3105a656b7b02ddb91f13d34260ff3cc0f1d603c1690e8600029", "sourceMap": "653:1438:19:-;;;;;;;;;;;;;;;;;", "deployedSourceMap": "653:1438:19:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;947:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1260:121:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;1952:137;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;1663:142:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1387:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;1811:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;1137:117:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;1017:114;;;;;;;;;;;;;;;;;;;;;;;;;;;;1517:140;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;880:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;947:63:19;;;;;;;;;;;;;;;;;;;;:::o;1260:121::-;1318:56;1357:5;1364:9;;;;;;;;;;;;;;;;;;1318:18;:38;;:56;;;;;:::i;:::-;1260:121;:::o;1952:137::-;2013:9;;:::i;:::-;2041:41;:19;:39;:41::i;:::-;2034:48;;1952:137;:::o;1663:142::-;1736:4;1759:39;1792:5;1759:19;:32;;:39;;;;:::i;:::-;1752:46;;1663:142;;;:::o;1387:124::-;1446:58;1486:5;1493:10;;;;;;;;;;;;;;;;;;1446:19;:39;;:58;;;;;:::i;:::-;1387:124;:::o;1811:135::-;1871:9;;:::i;:::-;1899:40;:18;:38;:40::i;:::-;1892:47;;1811:135;:::o;1137:117::-;1199:48;1229:5;1236:10;;;;;;;;;;;;;;;;;;1199:19;:29;;:48;;;;;:::i;:::-;1137:117;:::o;1017:114::-;1078:46;1107:5;1114:9;;;;;;;;;;;;;;;;;;1078:18;:28;;:46;;;;;:::i;:::-;1017:114;:::o;1517:140::-;1589:4;1612:38;1644:5;1612:18;:31;;:38;;;;:::i;:::-;1605:45;;1517:140;;;:::o;880:61::-;;;;;;;;;;;;;;;;;;;;:::o;2121:1168:17:-;2489:25;2551:23;2619:19;2452:25;2465:4;2471:5;2452:12;:25::i;:::-;2444:34;;;;;;;;2517:4;:17;;:24;2535:5;2517:24;;;;;;;;;;;;;;;;2489:52;;2608:1;2577:4;:21;;:28;;;;:32;2551:58;;2641:4;:21;;2663:18;2641:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;2619:63;;2745:4;:15;;:22;2761:5;2745:22;;;;;;;;;;;;;;;;2738:29;;;;;;;;;;;2894:11;2848:4;:21;;2870:20;2848:43;;;;;;;;;;;;;;;;;;;:57;;;;;;;;;;;;;;;;;;3009:20;2976:4;:17;;:30;2994:11;2976:30;;;;;;;;;;;;;;;:53;;;;3046:4;:17;;:24;3064:5;3046:24;;;;;;;;;;;;;;;3039:31;;;3144:4;:21;;3166:18;3144:41;;;;;;;;;;;;;;;;;;;3137:48;;;;;;;;;;;3227:1;3195:4;:21;;:33;;;;;;;;;;;;;;:::i;:::-;;3260:5;3239:43;;;3267:14;3239:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2121:1168:17;;;;;;:::o;3646:162::-;3748:9;;:::i;:::-;3780:4;:21;;3773:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3646:162;;;:::o;3295:166::-;3405:4;3432;:15;;:22;3448:5;3432:22;;;;;;;;;;;;;;;;;;;;;;;;;3425:29;;3295:166;;;;:::o;1732:383::-;1884:28;1900:4;1906:5;1884:15;:28::i;:::-;1876:37;;;;;;;;1949:4;1924;:15;;:22;1940:5;1924:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;1963:4;:21;;:33;;;;;;;;;;;:::i;:::-;;;;;;;;;;1990:5;1963:33;;;;;;;;;;;;;;;;;;;;;;;2064:1;2033:4;:21;;:28;;;;:32;2006:4;:17;;:24;2024:5;2006:24;;;;;;;;;;;;;;;:59;;;;2086:5;2075:33;;;2093:14;2075:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1732:383:17;;;:::o;3467:173::-;3580:4;3608:25;3621:4;3627:5;3608:12;:25::i;:::-;3607:26;3600:33;;3467:173;;;;:::o;653:1438:19:-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\nimport \"../libraries/PermissionsLib.sol\";\n\n\ncontract DummyContract is PermissionEvents {\n using PermissionsLib for PermissionsLib.Permissions;\n\n PermissionsLib.Permissions private firstPermissionSet;\n PermissionsLib.Permissions private secondPermissionSet;\n\n string public constant FIRST_SET = \"dummy-contract-first-set\";\n string public constant SECOND_SET = \"dummy-contract-second-set\";\n\n function authorizeInFirstSet(address agent) public {\n firstPermissionSet.authorize(agent, FIRST_SET);\n }\n\n function authorizeInSecondSet(address agent) public {\n secondPermissionSet.authorize(agent, SECOND_SET);\n }\n\n function revokeInFirstSet(address agent) public {\n firstPermissionSet.revokeAuthorization(agent, FIRST_SET);\n }\n\n function revokeInSecondSet(address agent) public {\n secondPermissionSet.revokeAuthorization(agent, SECOND_SET);\n }\n\n function isAuthorizedInFirstSet(address agent) public constant returns (bool) {\n return firstPermissionSet.isAuthorized(agent);\n }\n\n function isAuthorizedInSecondSet(address agent) public constant returns (bool) {\n return secondPermissionSet.isAuthorized(agent);\n }\n\n function getFirstSetAuthorizedAgents() public view returns (address[]) {\n return firstPermissionSet.getAuthorizedAgents();\n }\n\n function getSecondSetAuthorizedAgents() public view returns (address[]) {\n return secondPermissionSet.getAuthorizedAgents();\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/DummyContract.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/DummyContract.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/DummyContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/DummyContract.sol", "exportedSymbols": { "DummyContract": [ 9935 @@ -218,7 +218,7 @@ export const DummyContract = { "attributes": { "SourceUnit": 6272, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/libraries/PermissionsLib.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/libraries/PermissionsLib.sol", "file": "../libraries/PermissionsLib.sol", "scope": 9936, "symbolAliases": [ @@ -1770,7 +1770,7 @@ export const DummyContract = "42": { "events": {}, "links": {}, - "address": "0x6b5b54ab51ab15d4fd5e8991791c8dc1d90df5e2" + "address": "0x64481c13201a7baabd3a440eeba57170336f0e70" }, "70": { "events": {}, @@ -1779,5 +1779,5 @@ export const DummyContract = } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:13:01.009Z" + "updatedAt": "2018-10-09T17:50:01.258Z" } \ No newline at end of file diff --git a/artifacts/ts/DummyToken.ts b/artifacts/ts/DummyToken.ts index 253c0277..85bee6d0 100644 --- a/artifacts/ts/DummyToken.ts +++ b/artifacts/ts/DummyToken.ts @@ -428,15 +428,15 @@ export const DummyToken = "type": "event" } ], - "bytecode": "0x60606040526000600360146101000a81548160ff02191690831515021790555034156200002b57600080fd5b60405162001bfc38038062001bfc83398101604052808051820191906020018051820191906020018051906020019091908051906020019091908051820191905050600080600033600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508760049080519060200190620000cb9291906200018d565b508660059080519060200190620000e49291906200018d565b50856006819055508460018190555083519250600091505b828210156200017f5783828151811015156200011457fe5b906020019060200201519050826001548115156200012e57fe5b046000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508180600101925050620000fc565b50505050505050506200023c565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620001d057805160ff191683800117855562000201565b8280016001018555821562000201579182015b8281111562000200578251825591602001919060010190620001e3565b5b50905062000210919062000214565b5090565b6200023991905b80821115620002355760008160009055506001016200021b565b5090565b90565b6119b0806200024c6000396000f3006060604052600436106100f1576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806305d2035b146100f657806306fdde0314610123578063095ea7b3146101b157806318160ddd1461020b57806323b872dd14610234578063313ce567146102ad57806340c10f19146102d6578063661884631461033057806370a082311461038a5780637d64bcb4146103d75780638da5cb5b1461040457806395d89b4114610459578063a9059cbb146104e7578063d73dd62314610541578063dd62ed3e1461059b578063e30443bc14610607578063f2fde38b14610649575b600080fd5b341561010157600080fd5b610109610682565b604051808215151515815260200191505060405180910390f35b341561012e57600080fd5b610136610695565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561017657808201518184015260208101905061015b565b50505050905090810190601f1680156101a35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101bc57600080fd5b6101f1600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610733565b604051808215151515815260200191505060405180910390f35b341561021657600080fd5b61021e610825565b6040518082815260200191505060405180910390f35b341561023f57600080fd5b610293600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061082f565b604051808215151515815260200191505060405180910390f35b34156102b857600080fd5b6102c0610be9565b6040518082815260200191505060405180910390f35b34156102e157600080fd5b610316600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610bef565b604051808215151515815260200191505060405180910390f35b341561033b57600080fd5b610370600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610dd5565b604051808215151515815260200191505060405180910390f35b341561039557600080fd5b6103c1600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611066565b6040518082815260200191505060405180910390f35b34156103e257600080fd5b6103ea6110ae565b604051808215151515815260200191505060405180910390f35b341561040f57600080fd5b610417611176565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561046457600080fd5b61046c61119c565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104ac578082015181840152602081019050610491565b50505050905090810190601f1680156104d95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156104f257600080fd5b610527600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061123a565b604051808215151515815260200191505060405180910390f35b341561054c57600080fd5b610581600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611459565b604051808215151515815260200191505060405180910390f35b34156105a657600080fd5b6105f1600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611655565b6040518082815260200191505060405180910390f35b341561061257600080fd5b610647600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506116dc565b005b341561065457600080fd5b610680600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506117f5565b005b600360149054906101000a900460ff1681565b60048054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561072b5780601f106107005761010080835404028352916020019161072b565b820191906000526020600020905b81548152906001019060200180831161070e57829003601f168201915b505050505081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600154905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561086c57600080fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111515156108b957600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561094457600080fd5b610995826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461194d90919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610a28826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461196690919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610af982600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461194d90919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b60065481565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610c4d57600080fd5b600360149054906101000a900460ff16151515610c6957600080fd5b610c7e8260015461196690919063ffffffff16565b600181905550610cd5826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461196690919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885836040518082815260200191505060405180910390a28273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905080831115610ee6576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f7a565b610ef9838261194d90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561110c57600080fd5b600360149054906101000a900460ff1615151561112857600080fd5b6001600360146101000a81548160ff0219169083151502179055507fae5184fba832cb2b1f702aca6117b8d265eaf03ad33eb133f19dde0f5920fa0860405160405180910390a16001905090565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60058054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156112325780601f1061120757610100808354040283529160200191611232565b820191906000526020600020905b81548152906001019060200180831161121557829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561127757600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111515156112c457600080fd5b611315826000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461194d90919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506113a8826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461196690919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b60006114ea82600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461196690919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561173a57600080fd5b61174383611066565b90508082101561177f57611774611763838361194d90919063ffffffff16565b60015461194d90919063ffffffff16565b6001819055506117ad565b6117a6611795828461194d90919063ffffffff16565b60015461196690919063ffffffff16565b6001819055505b816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561185157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561188d57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600082821115151561195b57fe5b818303905092915050565b600080828401905083811015151561197a57fe5b80915050929150505600a165627a7a72305820fc88baf7bbca20a9e8f5d4a785227ef6c81b35cafaa47ce68d68441eb59760160029", - "deployedBytecode": "0x6060604052600436106100f1576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806305d2035b146100f657806306fdde0314610123578063095ea7b3146101b157806318160ddd1461020b57806323b872dd14610234578063313ce567146102ad57806340c10f19146102d6578063661884631461033057806370a082311461038a5780637d64bcb4146103d75780638da5cb5b1461040457806395d89b4114610459578063a9059cbb146104e7578063d73dd62314610541578063dd62ed3e1461059b578063e30443bc14610607578063f2fde38b14610649575b600080fd5b341561010157600080fd5b610109610682565b604051808215151515815260200191505060405180910390f35b341561012e57600080fd5b610136610695565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561017657808201518184015260208101905061015b565b50505050905090810190601f1680156101a35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101bc57600080fd5b6101f1600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610733565b604051808215151515815260200191505060405180910390f35b341561021657600080fd5b61021e610825565b6040518082815260200191505060405180910390f35b341561023f57600080fd5b610293600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061082f565b604051808215151515815260200191505060405180910390f35b34156102b857600080fd5b6102c0610be9565b6040518082815260200191505060405180910390f35b34156102e157600080fd5b610316600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610bef565b604051808215151515815260200191505060405180910390f35b341561033b57600080fd5b610370600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610dd5565b604051808215151515815260200191505060405180910390f35b341561039557600080fd5b6103c1600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611066565b6040518082815260200191505060405180910390f35b34156103e257600080fd5b6103ea6110ae565b604051808215151515815260200191505060405180910390f35b341561040f57600080fd5b610417611176565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561046457600080fd5b61046c61119c565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104ac578082015181840152602081019050610491565b50505050905090810190601f1680156104d95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156104f257600080fd5b610527600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061123a565b604051808215151515815260200191505060405180910390f35b341561054c57600080fd5b610581600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611459565b604051808215151515815260200191505060405180910390f35b34156105a657600080fd5b6105f1600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611655565b6040518082815260200191505060405180910390f35b341561061257600080fd5b610647600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506116dc565b005b341561065457600080fd5b610680600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506117f5565b005b600360149054906101000a900460ff1681565b60048054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561072b5780601f106107005761010080835404028352916020019161072b565b820191906000526020600020905b81548152906001019060200180831161070e57829003601f168201915b505050505081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600154905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561086c57600080fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111515156108b957600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561094457600080fd5b610995826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461194d90919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610a28826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461196690919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610af982600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461194d90919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b60065481565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610c4d57600080fd5b600360149054906101000a900460ff16151515610c6957600080fd5b610c7e8260015461196690919063ffffffff16565b600181905550610cd5826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461196690919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885836040518082815260200191505060405180910390a28273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905080831115610ee6576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f7a565b610ef9838261194d90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561110c57600080fd5b600360149054906101000a900460ff1615151561112857600080fd5b6001600360146101000a81548160ff0219169083151502179055507fae5184fba832cb2b1f702aca6117b8d265eaf03ad33eb133f19dde0f5920fa0860405160405180910390a16001905090565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60058054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156112325780601f1061120757610100808354040283529160200191611232565b820191906000526020600020905b81548152906001019060200180831161121557829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561127757600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111515156112c457600080fd5b611315826000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461194d90919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506113a8826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461196690919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b60006114ea82600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461196690919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561173a57600080fd5b61174383611066565b90508082101561177f57611774611763838361194d90919063ffffffff16565b60015461194d90919063ffffffff16565b6001819055506117ad565b6117a6611795828461194d90919063ffffffff16565b60015461196690919063ffffffff16565b6001819055505b816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561185157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561188d57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600082821115151561195b57fe5b818303905092915050565b600080828401905083811015151561197a57fe5b80915050929150505600a165627a7a72305820fc88baf7bbca20a9e8f5d4a785227ef6c81b35cafaa47ce68d68441eb59760160029", + "bytecode": "0x60606040526000600360146101000a81548160ff02191690831515021790555034156200002b57600080fd5b60405162001bfc38038062001bfc83398101604052808051820191906020018051820191906020018051906020019091908051906020019091908051820191905050600080600033600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508760049080519060200190620000cb9291906200018d565b508660059080519060200190620000e49291906200018d565b50856006819055508460018190555083519250600091505b828210156200017f5783828151811015156200011457fe5b906020019060200201519050826001548115156200012e57fe5b046000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508180600101925050620000fc565b50505050505050506200023c565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620001d057805160ff191683800117855562000201565b8280016001018555821562000201579182015b8281111562000200578251825591602001919060010190620001e3565b5b50905062000210919062000214565b5090565b6200023991905b80821115620002355760008160009055506001016200021b565b5090565b90565b6119b0806200024c6000396000f3006060604052600436106100f1576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806305d2035b146100f657806306fdde0314610123578063095ea7b3146101b157806318160ddd1461020b57806323b872dd14610234578063313ce567146102ad57806340c10f19146102d6578063661884631461033057806370a082311461038a5780637d64bcb4146103d75780638da5cb5b1461040457806395d89b4114610459578063a9059cbb146104e7578063d73dd62314610541578063dd62ed3e1461059b578063e30443bc14610607578063f2fde38b14610649575b600080fd5b341561010157600080fd5b610109610682565b604051808215151515815260200191505060405180910390f35b341561012e57600080fd5b610136610695565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561017657808201518184015260208101905061015b565b50505050905090810190601f1680156101a35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101bc57600080fd5b6101f1600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610733565b604051808215151515815260200191505060405180910390f35b341561021657600080fd5b61021e610825565b6040518082815260200191505060405180910390f35b341561023f57600080fd5b610293600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061082f565b604051808215151515815260200191505060405180910390f35b34156102b857600080fd5b6102c0610be9565b6040518082815260200191505060405180910390f35b34156102e157600080fd5b610316600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610bef565b604051808215151515815260200191505060405180910390f35b341561033b57600080fd5b610370600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610dd5565b604051808215151515815260200191505060405180910390f35b341561039557600080fd5b6103c1600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611066565b6040518082815260200191505060405180910390f35b34156103e257600080fd5b6103ea6110ae565b604051808215151515815260200191505060405180910390f35b341561040f57600080fd5b610417611176565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561046457600080fd5b61046c61119c565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104ac578082015181840152602081019050610491565b50505050905090810190601f1680156104d95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156104f257600080fd5b610527600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061123a565b604051808215151515815260200191505060405180910390f35b341561054c57600080fd5b610581600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611459565b604051808215151515815260200191505060405180910390f35b34156105a657600080fd5b6105f1600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611655565b6040518082815260200191505060405180910390f35b341561061257600080fd5b610647600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506116dc565b005b341561065457600080fd5b610680600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506117f5565b005b600360149054906101000a900460ff1681565b60048054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561072b5780601f106107005761010080835404028352916020019161072b565b820191906000526020600020905b81548152906001019060200180831161070e57829003601f168201915b505050505081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600154905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561086c57600080fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111515156108b957600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561094457600080fd5b610995826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461194d90919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610a28826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461196690919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610af982600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461194d90919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b60065481565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610c4d57600080fd5b600360149054906101000a900460ff16151515610c6957600080fd5b610c7e8260015461196690919063ffffffff16565b600181905550610cd5826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461196690919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885836040518082815260200191505060405180910390a28273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905080831115610ee6576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f7a565b610ef9838261194d90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561110c57600080fd5b600360149054906101000a900460ff1615151561112857600080fd5b6001600360146101000a81548160ff0219169083151502179055507fae5184fba832cb2b1f702aca6117b8d265eaf03ad33eb133f19dde0f5920fa0860405160405180910390a16001905090565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60058054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156112325780601f1061120757610100808354040283529160200191611232565b820191906000526020600020905b81548152906001019060200180831161121557829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561127757600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111515156112c457600080fd5b611315826000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461194d90919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506113a8826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461196690919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b60006114ea82600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461196690919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561173a57600080fd5b61174383611066565b90508082101561177f57611774611763838361194d90919063ffffffff16565b60015461194d90919063ffffffff16565b6001819055506117ad565b6117a6611795828461194d90919063ffffffff16565b60015461196690919063ffffffff16565b6001819055505b816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561185157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561188d57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600082821115151561195b57fe5b818303905092915050565b600080828401905083811015151561197a57fe5b80915050929150505600a165627a7a723058204f0837d94d911389c3ac6c5dbd30a75b8d11fb82276226d87b0900d885ef3c210029", + "deployedBytecode": "0x6060604052600436106100f1576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806305d2035b146100f657806306fdde0314610123578063095ea7b3146101b157806318160ddd1461020b57806323b872dd14610234578063313ce567146102ad57806340c10f19146102d6578063661884631461033057806370a082311461038a5780637d64bcb4146103d75780638da5cb5b1461040457806395d89b4114610459578063a9059cbb146104e7578063d73dd62314610541578063dd62ed3e1461059b578063e30443bc14610607578063f2fde38b14610649575b600080fd5b341561010157600080fd5b610109610682565b604051808215151515815260200191505060405180910390f35b341561012e57600080fd5b610136610695565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561017657808201518184015260208101905061015b565b50505050905090810190601f1680156101a35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101bc57600080fd5b6101f1600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610733565b604051808215151515815260200191505060405180910390f35b341561021657600080fd5b61021e610825565b6040518082815260200191505060405180910390f35b341561023f57600080fd5b610293600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061082f565b604051808215151515815260200191505060405180910390f35b34156102b857600080fd5b6102c0610be9565b6040518082815260200191505060405180910390f35b34156102e157600080fd5b610316600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610bef565b604051808215151515815260200191505060405180910390f35b341561033b57600080fd5b610370600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610dd5565b604051808215151515815260200191505060405180910390f35b341561039557600080fd5b6103c1600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611066565b6040518082815260200191505060405180910390f35b34156103e257600080fd5b6103ea6110ae565b604051808215151515815260200191505060405180910390f35b341561040f57600080fd5b610417611176565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561046457600080fd5b61046c61119c565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104ac578082015181840152602081019050610491565b50505050905090810190601f1680156104d95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156104f257600080fd5b610527600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061123a565b604051808215151515815260200191505060405180910390f35b341561054c57600080fd5b610581600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611459565b604051808215151515815260200191505060405180910390f35b34156105a657600080fd5b6105f1600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611655565b6040518082815260200191505060405180910390f35b341561061257600080fd5b610647600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506116dc565b005b341561065457600080fd5b610680600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506117f5565b005b600360149054906101000a900460ff1681565b60048054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561072b5780601f106107005761010080835404028352916020019161072b565b820191906000526020600020905b81548152906001019060200180831161070e57829003601f168201915b505050505081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600154905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561086c57600080fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111515156108b957600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561094457600080fd5b610995826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461194d90919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610a28826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461196690919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610af982600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461194d90919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b60065481565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610c4d57600080fd5b600360149054906101000a900460ff16151515610c6957600080fd5b610c7e8260015461196690919063ffffffff16565b600181905550610cd5826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461196690919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885836040518082815260200191505060405180910390a28273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905080831115610ee6576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f7a565b610ef9838261194d90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561110c57600080fd5b600360149054906101000a900460ff1615151561112857600080fd5b6001600360146101000a81548160ff0219169083151502179055507fae5184fba832cb2b1f702aca6117b8d265eaf03ad33eb133f19dde0f5920fa0860405160405180910390a16001905090565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60058054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156112325780601f1061120757610100808354040283529160200191611232565b820191906000526020600020905b81548152906001019060200180831161121557829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561127757600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111515156112c457600080fd5b611315826000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461194d90919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506113a8826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461196690919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b60006114ea82600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461196690919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561173a57600080fd5b61174383611066565b90508082101561177f57611774611763838361194d90919063ffffffff16565b60015461194d90919063ffffffff16565b6001819055506117ad565b6117a6611795828461194d90919063ffffffff16565b60015461196690919063ffffffff16565b6001819055505b816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561185157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561188d57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600082821115151561195b57fe5b818303905092915050565b600080828401905083811015151561197a57fe5b80915050929150505600a165627a7a723058204f0837d94d911389c3ac6c5dbd30a75b8d11fb82276226d87b0900d885ef3c210029", "sourceMap": "151:1173:21:-;;;544:5:43;514:35;;;;;;;;;;;;;;;;;;;;300:656:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;605:29;762:6;823:15;509:10:39;501:5;;:18;;;;;;;;;;;;;;;;;;496:5:21;489:4;:12;;;;;;;;;;;;:::i;:::-;;520:7;511:6;:16;;;;;;;;;;;;:::i;:::-;;548:9;537:8;:20;;;;582:12;567;:27;;;;637:22;:29;605:61;;771:1;762:10;;757:193;778:24;774:1;:28;757:193;;;841:22;864:1;841:25;;;;;;;;;;;;;;;;;;823:43;;915:24;900:12;;:39;;;;;;;;880:8;:17;889:7;880:17;;;;;;;;;;;;;;;:59;;;;804:3;;;;;;;757:193;;;300:656;;;;;;;;151:1173;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;", "deployedSourceMap": "151:1173:21:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;514:35:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;223:18:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1798:183:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;371:83:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;736:439:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;273:20:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;853:264:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3602:398:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1189:107:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1231:135:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;238:20:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;247::21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;608:379:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2883:257:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2300:126;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;962:360:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;832:169:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;514:35:43;;;;;;;;;;;;;:::o;223:18:21:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1798:183:44:-;1865:4;1909:6;1877:7;:19;1885:10;1877:19;;;;;;;;;;;;;;;:29;1897:8;1877:29;;;;;;;;;;;;;;;:38;;;;1942:8;1921:38;;1930:10;1921:38;;;1952:6;1921:38;;;;;;;;;;;;;;;;;;1972:4;1965:11;;1798:183;;;;:::o;371:83:40:-;415:7;437:12;;430:19;;371:83;:::o;736:439:44:-;818:4;853:1;838:17;;:3;:17;;;;830:26;;;;;;;;880:8;:15;889:5;880:15;;;;;;;;;;;;;;;;870:6;:25;;862:34;;;;;;;;920:7;:14;928:5;920:14;;;;;;;;;;;;;;;:26;935:10;920:26;;;;;;;;;;;;;;;;910:6;:36;;902:45;;;;;;;;972:27;992:6;972:8;:15;981:5;972:15;;;;;;;;;;;;;;;;:19;;:27;;;;:::i;:::-;954:8;:15;963:5;954:15;;;;;;;;;;;;;;;:45;;;;1021:25;1039:6;1021:8;:13;1030:3;1021:13;;;;;;;;;;;;;;;;:17;;:25;;;;:::i;:::-;1005:8;:13;1014:3;1005:13;;;;;;;;;;;;;;;:41;;;;1081:38;1112:6;1081:7;:14;1089:5;1081:14;;;;;;;;;;;;;;;:26;1096:10;1081:26;;;;;;;;;;;;;;;;:30;;:38;;;;:::i;:::-;1052:7;:14;1060:5;1052:14;;;;;;;;;;;;;;;:26;1067:10;1052:26;;;;;;;;;;;;;;;:67;;;;1141:3;1125:28;;1134:5;1125:28;;;1146:6;1125:28;;;;;;;;;;;;;;;;;;1166:4;1159:11;;736:439;;;;;:::o;273:20:21:-;;;;:::o;853:264:43:-;931:4;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;589:15:43;;;;;;;;;;;588:16;580:25;;;;;;;;958;975:7;958:12;;:16;;:25;;;;:::i;:::-;943:12;:40;;;;1005:26;1023:7;1005:8;:13;1014:3;1005:13;;;;;;;;;;;;;;;;:17;;:26;;;;:::i;:::-;989:8;:13;998:3;989:13;;;;;;;;;;;;;;;:42;;;;1042:3;1037:18;;;1047:7;1037:18;;;;;;;;;;;;;;;;;;1082:3;1061:34;;1078:1;1061:34;;;1087:7;1061:34;;;;;;;;;;;;;;;;;;1108:4;1101:11;;853:264;;;;:::o;3602:398:44:-;3685:4;3697:13;3713:7;:19;3721:10;3713:19;;;;;;;;;;;;;;;:29;3733:8;3713:29;;;;;;;;;;;;;;;;3697:45;;3771:8;3752:16;:27;3748:164;;;3821:1;3789:7;:19;3797:10;3789:19;;;;;;;;;;;;;;;:29;3809:8;3789:29;;;;;;;;;;;;;;;:33;;;;3748:164;;;3875:30;3888:16;3875:8;:12;;:30;;;;:::i;:::-;3843:7;:19;3851:10;3843:19;;;;;;;;;;;;;;;:29;3863:8;3843:29;;;;;;;;;;;;;;;:62;;;;3748:164;3938:8;3917:61;;3926:10;3917:61;;;3948:7;:19;3956:10;3948:19;;;;;;;;;;;;;;;:29;3968:8;3948:29;;;;;;;;;;;;;;;;3917:61;;;;;;;;;;;;;;;;;;3991:4;3984:11;;3602:398;;;;;:::o;1189:107:40:-;1245:15;1275:8;:16;1284:6;1275:16;;;;;;;;;;;;;;;;1268:23;;1189:107;;;:::o;1231:135:43:-;1290:4;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;589:15:43;;;;;;;;;;;588:16;580:25;;;;;;;;1320:4;1302:15;;:22;;;;;;;;;;;;;;;;;;1330:14;;;;;;;;;;1357:4;1350:11;;1231:135;:::o;238:20:39:-;;;;;;;;;;;;;:::o;247::21:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;608:379:40:-;671:4;706:1;691:17;;:3;:17;;;;683:26;;;;;;;;733:8;:20;742:10;733:20;;;;;;;;;;;;;;;;723:6;:30;;715:39;;;;;;;;847:32;872:6;847:8;:20;856:10;847:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;824:8;:20;833:10;824:20;;;;;;;;;;;;;;;:55;;;;901:25;919:6;901:8;:13;910:3;901:13;;;;;;;;;;;;;;;;:17;;:25;;;;:::i;:::-;885:8;:13;894:3;885:13;;;;;;;;;;;;;;;:41;;;;953:3;932:33;;941:10;932:33;;;958:6;932:33;;;;;;;;;;;;;;;;;;978:4;971:11;;608:379;;;;:::o;2883:257:44:-;2961:4;3005:46;3039:11;3005:7;:19;3013:10;3005:19;;;;;;;;;;;;;;;:29;3025:8;3005:29;;;;;;;;;;;;;;;;:33;;:46;;;;:::i;:::-;2973:7;:19;2981:10;2973:19;;;;;;;;;;;;;;;:29;2993:8;2973:29;;;;;;;;;;;;;;;:78;;;;3078:8;3057:61;;3066:10;3057:61;;;3088:7;:19;3096:10;3088:19;;;;;;;;;;;;;;;:29;3108:8;3088:29;;;;;;;;;;;;;;;;3057:61;;;;;;;;;;;;;;;;;;3131:4;3124:11;;2883:257;;;;:::o;2300:126::-;2374:7;2396;:15;2404:6;2396:15;;;;;;;;;;;;;;;:25;2412:8;2396:25;;;;;;;;;;;;;;;;2389:32;;2300:126;;;;:::o;962:360:21:-;1039:16;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;1058:18:21;1068:7;1058:9;:18::i;:::-;1039:37;;1099:11;1090:6;:20;1086:194;;;1141:41;1158:23;1174:6;1158:11;:15;;:23;;;;:::i;:::-;1141:12;;:16;;:41;;;;:::i;:::-;1126:12;:56;;;;1086:194;;;1228:41;1245:23;1256:11;1245:6;:10;;:23;;;;:::i;:::-;1228:12;;:16;;:41;;;;:::i;:::-;1213:12;:56;;;;1086:194;1309:6;1289:8;:17;1298:7;1289:17;;;;;;;;;;;;;;;:26;;;;962:360;;;:::o;832:169:39:-;653:5;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;928:1;908:22;;:8;:22;;;;900:31;;;;;;;;965:8;937:37;;958:5;;;;;;;;;;;937:37;;;;;;;;;;;;988:8;980:5;;:16;;;;;;;;;;;;;;;;;;832:169;:::o;835:110:38:-;893:7;920:1;915;:6;;908:14;;;;;;939:1;935;:5;928:12;;835:110;;;;:::o;1007:129::-;1065:7;1080:9;1096:1;1092;:5;1080:17;;1115:1;1110;:6;;1103:14;;;;;;1130:1;1123:8;;1007:129;;;;;:::o", "source": "pragma solidity 0.4.18;\n\nimport \"zeppelin-solidity/contracts/token/ERC20/MintableToken.sol\";\nimport \"zeppelin-solidity/contracts/math/SafeMath.sol\";\n\n\ncontract DummyToken is MintableToken {\n using SafeMath for uint;\n string public name;\n string public symbol;\n uint public decimals;\n\n function DummyToken(\n string _name,\n string _symbol,\n uint _decimals,\n uint _totalSupply,\n address[] _initialBalanceHolders)\n public\n {\n name = _name;\n symbol = _symbol;\n decimals = _decimals;\n totalSupply_ = _totalSupply;\n\n uint numInitialBalanceHolders = _initialBalanceHolders.length;\n\n // Distribute the total supply evenly among the initial balance holders\n for (uint i = 0; i < numInitialBalanceHolders; i++) {\n address account = _initialBalanceHolders[i];\n balances[account] = totalSupply_ / numInitialBalanceHolders;\n }\n }\n\n function setBalance(address _target, uint _value) public onlyOwner {\n uint currBalance = balanceOf(_target);\n if (_value < currBalance) {\n totalSupply_ = totalSupply_.sub(currBalance.sub(_value));\n } else {\n totalSupply_ = totalSupply_.add(_value.sub(currBalance));\n }\n balances[_target] = _value;\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/dummy_tokens/DummyToken.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/dummy_tokens/DummyToken.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/dummy_tokens/DummyToken.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/dummy_tokens/DummyToken.sol", "exportedSymbols": { "DummyToken": [ 10118 @@ -2153,5 +2153,5 @@ export const DummyToken = }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:11:37.139Z" + "updatedAt": "2018-10-09T17:48:16.849Z" } \ No newline at end of file diff --git a/artifacts/ts/ERC165.ts b/artifacts/ts/ERC165.ts index 07e06df4..a57bb538 100644 --- a/artifacts/ts/ERC165.ts +++ b/artifacts/ts/ERC165.ts @@ -27,10 +27,10 @@ export const ERC165 = "sourceMap": "", "deployedSourceMap": "", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\n\n/**\n * ERC165 interface required by ERC721 non-fungible token.\n *\n * https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md\n * https://github.com/ethereum/EIPs/blob/master/EIPS/eip-165.md\n */\ninterface ERC165 {\n /// @notice Query if a contract implements an interface\n /// @param interfaceID The interface identifier, as specified in ERC-165\n /// @dev Interface identification is specified in ERC-165. This function\n /// uses less than 30,000 gas.\n /// @return `true` if the contract implements `interfaceID` and\n /// `interfaceID` is not 0xffffffff, `false` otherwise\n function supportsInterface(bytes4 interfaceID) external view returns (bool);\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/ERC165.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/ERC165.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/ERC165.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/ERC165.sol", "exportedSymbols": { "ERC165": [ 3550 @@ -172,5 +172,5 @@ export const ERC165 = }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:47.577Z" + "updatedAt": "2018-10-09T17:45:35.420Z" } \ No newline at end of file diff --git a/artifacts/ts/ERC20.ts b/artifacts/ts/ERC20.ts index 17ddea4a..0934cc41 100644 --- a/artifacts/ts/ERC20.ts +++ b/artifacts/ts/ERC20.ts @@ -742,5 +742,5 @@ export const ERC20 = }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:48.047Z" + "updatedAt": "2018-10-09T17:45:35.433Z" } \ No newline at end of file diff --git a/artifacts/ts/ERC20Basic.ts b/artifacts/ts/ERC20Basic.ts index 211a549d..e823f783 100644 --- a/artifacts/ts/ERC20Basic.ts +++ b/artifacts/ts/ERC20Basic.ts @@ -511,5 +511,5 @@ export const ERC20Basic = }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:48.048Z" + "updatedAt": "2018-10-09T17:45:35.427Z" } \ No newline at end of file diff --git a/artifacts/ts/ERC721.ts b/artifacts/ts/ERC721.ts index b4c5e154..30b3eac1 100644 --- a/artifacts/ts/ERC721.ts +++ b/artifacts/ts/ERC721.ts @@ -1111,5 +1111,5 @@ export const ERC721 = }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:48.049Z" + "updatedAt": "2018-10-09T17:45:35.439Z" } \ No newline at end of file diff --git a/artifacts/ts/ERC721Basic.ts b/artifacts/ts/ERC721Basic.ts index e76dbe78..550aea6b 100644 --- a/artifacts/ts/ERC721Basic.ts +++ b/artifacts/ts/ERC721Basic.ts @@ -1664,5 +1664,5 @@ export const ERC721Basic = }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:48.052Z" + "updatedAt": "2018-10-09T17:45:35.452Z" } \ No newline at end of file diff --git a/artifacts/ts/ERC721BasicToken.ts b/artifacts/ts/ERC721BasicToken.ts index 6441c4d6..ff7de97e 100644 --- a/artifacts/ts/ERC721BasicToken.ts +++ b/artifacts/ts/ERC721BasicToken.ts @@ -8710,5 +8710,5 @@ export const ERC721BasicToken = }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:48.056Z" + "updatedAt": "2018-10-09T17:45:35.625Z" } \ No newline at end of file diff --git a/artifacts/ts/ERC721CollateralizedSimpleInterestTermsContract.ts b/artifacts/ts/ERC721CollateralizedSimpleInterestTermsContract.ts index 9c5ce6bb..bba20135 100644 --- a/artifacts/ts/ERC721CollateralizedSimpleInterestTermsContract.ts +++ b/artifacts/ts/ERC721CollateralizedSimpleInterestTermsContract.ts @@ -400,15 +400,15 @@ export const ERC721CollateralizedSimpleInterestTermsContract = "type": "event" } ], - "bytecode": "0x6060604052341561000f57600080fd5b604051604080611ab3833981016040528080519060200190919080519060200190919050508180600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050506119ea806100c96000396000f3006060604052600436106100f1576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a896a1146100f65780630776298214610131578063208638941461015a5780632762dd8c1461018357806340018a0d146101be5780635f0280ba146101e75780636f69c96f1461028c57806379035396146102b55780638b47e58a1461030a57806393529cdf14610333578063977a5e641461035c57806399114d84146103ba578063abf410e5146103fe578063de53a13c14610453578063ed8907d71461047c578063fd127a41146104d3578063fd40d52e146104fc575b600080fd5b341561010157600080fd5b61011b600480803560001916906020019091905050610537565b6040518082815260200191505060405180910390f35b341561013c57600080fd5b61014461055b565b6040518082815260200191505060405180910390f35b341561016557600080fd5b61016d610564565b6040518082815260200191505060405180910390f35b341561018e57600080fd5b6101a8600480803560001916906020019091905050610570565b6040518082815260200191505060405180910390f35b34156101c957600080fd5b6101d1610592565b6040518082815260200191505060405180910390f35b34156101f257600080fd5b61027260048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061059e565b604051808215151515815260200191505060405180910390f35b341561029757600080fd5b61029f610813565b6040518082815260200191505060405180910390f35b34156102c057600080fd5b6102c8610819565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561031557600080fd5b61031d61083f565b6040518082815260200191505060405180910390f35b341561033e57600080fd5b610346610844565b6040518082815260200191505060405180910390f35b341561036757600080fd5b6103a060048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061084a565b604051808215151515815260200191505060405180910390f35b34156103c557600080fd5b6103e8600480803560001916906020019091908035906020019091905050610a43565b6040518082815260200191505060405180910390f35b341561040957600080fd5b610411610c4f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561045e57600080fd5b610466610c75565b6040518082815260200191505060405180910390f35b341561048757600080fd5b6104a1600480803560001916906020019091905050610c7e565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b34156104de57600080fd5b6104e6610d76565b6040518082815260200191505060405180910390f35b341561050757600080fd5b610521600480803560001916906020019091905050610d83565b6040518082815260200191505060405180910390f35b60008060008360001916600019168152602001908152602001600020549050919050565b6018610e100281565b601e6018610e10020281565b600061057a61195f565b61058383610d9b565b90508060600151915050919050565b60076018610e10020281565b60006105a861195f565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636fa9d0566000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561063657600080fd5b6102c65a03f1151561064757600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561068a57600080fd5b61069387610d9b565b9050806000015173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610804576106fa846000808a600019166000191681526020019081526020016000205461129790919063ffffffff16565b6000808960001916600019168152602001908152602001600020819055507ff1a888d220228f843ac3044ef257c80642e6434d1ddc7ebee0a2813cced3406c87878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405180910390a160019150610809565b600091505b5095945050505050565b610e1081565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600581565b61271081565b6000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663079dd4b76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156108dd57600080fd5b6102c65a03f115156108ee57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561093157600080fd5b61093b85856112b5565b9150600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663649404bd86866000604051602001526040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1515610a1257600080fd5b6102c65a03f11515610a2357600080fd5b505050604051805190509050818015610a395750805b9250505092915050565b6000610a4d61195f565b60008085600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610adf57600080fd5b6102c65a03f11515610af057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663f6f494c9826000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610b7857600080fd5b6102c65a03f11515610b8957600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16141515610bcc57600080fd5b610bd587610d9b565b9350610be084611746565b9250836040015186111515610bf85760009450610c45565b836060015186101515610c0d57829450610c45565b610c17868561179c565b9150610c428460a00151610c3484866117e690919063ffffffff16565b61182190919063ffffffff16565b94505b5050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60646127100281565b6000806000806000806000806000807fff000000000000000000000000000000000000000000000000000000000000006001028b1694507effffffffffffffffffffffff000000000000000000000000000000000000006001028b16935072ffffff000000000000000000000000000000006001028b1692506ff00000000000000000000000000000006001028b1691506f0ffff0000000000000000000000000006001028b169050610d328560f861183c565b610d3d85609861183c565b610d4885608061183c565b610d5385607c61183c565b610d5e85606c61183c565b99509950995099509950505050505091939590929450565b61016d6018610e10020281565b60006020528060005260406000206000915090505481565b610da361195f565b600080600080600080600080600080600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610e4357600080fd5b6102c65a03f11515610e5457600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663314a522e8f6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610edc57600080fd5b6102c65a03f11515610eed57600080fd5b505050604051805190509b50610f028c610c7e565b809b50819c50829d50839e50849f505050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d23c4c76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610fa457600080fd5b6102c65a03f11515610fb557600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16635715c5b78c6000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561103557600080fd5b6102c65a03f1151561104657600080fd5b505050604051805190509550600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415151561108e57600080fd5b60048081111561109a57fe5b88111515156110a857600080fd5b8760048111156110b457fe5b94506110bf85611859565b9350600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561114f57600080fd5b6102c65a03f1151561116057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663d69dbf638f6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156111e857600080fd5b6102c65a03f115156111f957600080fd5b50505060405180519050925061121884886117e690919063ffffffff16565b915061122d838361129790919063ffffffff16565b905060e0604051908101604052808773ffffffffffffffffffffffffffffffffffffffff1681526020018b815260200184815260200182815260200186600481111561127557fe5b81526020018881526020018a8152509c50505050505050505050505050919050565b60008082840190508381101515156112ab57fe5b8091505092915050565b6000806000806000806000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663079dd4b76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561135157600080fd5b6102c65a03f1151561136257600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156113a557600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561143357600080fd5b6102c65a03f1151561144457600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16636be39bda8c6000604051604001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082600019166000191681526020019150506040805180830381600087803b15156114cb57600080fd5b6102c65a03f115156114dc57600080fd5b5050506040518051906020018051905080985081995050506114fd87610c7e565b809650819750829850839950849a505050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d23c4c76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561159f57600080fd5b6102c65a03f115156115b057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16635715c5b7876000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561163057600080fd5b6102c65a03f1151561164157600080fd5b505050604051805190509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561168a5750600583105b80156116c157503073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b1561173357828173ffffffffffffffffffffffffffffffffffffffff168c600019167f2c500aaec6833a053693d8c2a18a3ed5649a4609699abaf7778c3d389cc40c0588888760405180848152602001838152602001828152602001935050505060405180910390a460019850611738565b600098505b505050505050505092915050565b60008061177b60646127100261176d8560c0015186602001516117e690919063ffffffff16565b61182190919063ffffffff16565b905061179481846020015161129790919063ffffffff16565b915050919050565b60008060006117b884604001518661194690919063ffffffff16565b91506117c78460800151611859565b90506117dc818361182190919063ffffffff16565b9250505092915050565b60008060008414156117fb576000915061181a565b828402905082848281151561180c57fe5b0414151561181657fe5b8091505b5092915050565b600080828481151561182f57fe5b0490508091505092915050565b60008160020a836001900481151561185057fe5b04905092915050565b600080600481111561186757fe5b82600481111561187357fe5b141561188357610e109050611941565b6001600481111561189057fe5b82600481111561189c57fe5b14156118af576018610e10029050611941565b600260048111156118bc57fe5b8260048111156118c857fe5b14156118de5760076018610e1002029050611941565b600360048111156118eb57fe5b8260048111156118f757fe5b141561190d57601e6018610e1002029050611941565b60048081111561191957fe5b82600481111561192557fe5b141561193c5761016d6018610e1002029050611941565b600080fd5b919050565b600082821115151561195457fe5b818303905092915050565b60e060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600060048111156119aa57fe5b8152602001600081526020016000815250905600a165627a7a72305820b26d3a4b77ce7858ba09572df89d326a11d6337e397ef5fe830c8858913e60360029", - "deployedBytecode": "0x6060604052600436106100f1576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a896a1146100f65780630776298214610131578063208638941461015a5780632762dd8c1461018357806340018a0d146101be5780635f0280ba146101e75780636f69c96f1461028c57806379035396146102b55780638b47e58a1461030a57806393529cdf14610333578063977a5e641461035c57806399114d84146103ba578063abf410e5146103fe578063de53a13c14610453578063ed8907d71461047c578063fd127a41146104d3578063fd40d52e146104fc575b600080fd5b341561010157600080fd5b61011b600480803560001916906020019091905050610537565b6040518082815260200191505060405180910390f35b341561013c57600080fd5b61014461055b565b6040518082815260200191505060405180910390f35b341561016557600080fd5b61016d610564565b6040518082815260200191505060405180910390f35b341561018e57600080fd5b6101a8600480803560001916906020019091905050610570565b6040518082815260200191505060405180910390f35b34156101c957600080fd5b6101d1610592565b6040518082815260200191505060405180910390f35b34156101f257600080fd5b61027260048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061059e565b604051808215151515815260200191505060405180910390f35b341561029757600080fd5b61029f610813565b6040518082815260200191505060405180910390f35b34156102c057600080fd5b6102c8610819565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561031557600080fd5b61031d61083f565b6040518082815260200191505060405180910390f35b341561033e57600080fd5b610346610844565b6040518082815260200191505060405180910390f35b341561036757600080fd5b6103a060048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061084a565b604051808215151515815260200191505060405180910390f35b34156103c557600080fd5b6103e8600480803560001916906020019091908035906020019091905050610a43565b6040518082815260200191505060405180910390f35b341561040957600080fd5b610411610c4f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561045e57600080fd5b610466610c75565b6040518082815260200191505060405180910390f35b341561048757600080fd5b6104a1600480803560001916906020019091905050610c7e565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b34156104de57600080fd5b6104e6610d76565b6040518082815260200191505060405180910390f35b341561050757600080fd5b610521600480803560001916906020019091905050610d83565b6040518082815260200191505060405180910390f35b60008060008360001916600019168152602001908152602001600020549050919050565b6018610e100281565b601e6018610e10020281565b600061057a61195f565b61058383610d9b565b90508060600151915050919050565b60076018610e10020281565b60006105a861195f565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636fa9d0566000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561063657600080fd5b6102c65a03f1151561064757600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561068a57600080fd5b61069387610d9b565b9050806000015173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610804576106fa846000808a600019166000191681526020019081526020016000205461129790919063ffffffff16565b6000808960001916600019168152602001908152602001600020819055507ff1a888d220228f843ac3044ef257c80642e6434d1ddc7ebee0a2813cced3406c87878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405180910390a160019150610809565b600091505b5095945050505050565b610e1081565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600581565b61271081565b6000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663079dd4b76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156108dd57600080fd5b6102c65a03f115156108ee57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561093157600080fd5b61093b85856112b5565b9150600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663649404bd86866000604051602001526040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1515610a1257600080fd5b6102c65a03f11515610a2357600080fd5b505050604051805190509050818015610a395750805b9250505092915050565b6000610a4d61195f565b60008085600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610adf57600080fd5b6102c65a03f11515610af057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663f6f494c9826000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610b7857600080fd5b6102c65a03f11515610b8957600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16141515610bcc57600080fd5b610bd587610d9b565b9350610be084611746565b9250836040015186111515610bf85760009450610c45565b836060015186101515610c0d57829450610c45565b610c17868561179c565b9150610c428460a00151610c3484866117e690919063ffffffff16565b61182190919063ffffffff16565b94505b5050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60646127100281565b6000806000806000806000806000807fff000000000000000000000000000000000000000000000000000000000000006001028b1694507effffffffffffffffffffffff000000000000000000000000000000000000006001028b16935072ffffff000000000000000000000000000000006001028b1692506ff00000000000000000000000000000006001028b1691506f0ffff0000000000000000000000000006001028b169050610d328560f861183c565b610d3d85609861183c565b610d4885608061183c565b610d5385607c61183c565b610d5e85606c61183c565b99509950995099509950505050505091939590929450565b61016d6018610e10020281565b60006020528060005260406000206000915090505481565b610da361195f565b600080600080600080600080600080600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610e4357600080fd5b6102c65a03f11515610e5457600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663314a522e8f6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610edc57600080fd5b6102c65a03f11515610eed57600080fd5b505050604051805190509b50610f028c610c7e565b809b50819c50829d50839e50849f505050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d23c4c76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610fa457600080fd5b6102c65a03f11515610fb557600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16635715c5b78c6000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561103557600080fd5b6102c65a03f1151561104657600080fd5b505050604051805190509550600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415151561108e57600080fd5b60048081111561109a57fe5b88111515156110a857600080fd5b8760048111156110b457fe5b94506110bf85611859565b9350600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561114f57600080fd5b6102c65a03f1151561116057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663d69dbf638f6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156111e857600080fd5b6102c65a03f115156111f957600080fd5b50505060405180519050925061121884886117e690919063ffffffff16565b915061122d838361129790919063ffffffff16565b905060e0604051908101604052808773ffffffffffffffffffffffffffffffffffffffff1681526020018b815260200184815260200182815260200186600481111561127557fe5b81526020018881526020018a8152509c50505050505050505050505050919050565b60008082840190508381101515156112ab57fe5b8091505092915050565b6000806000806000806000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663079dd4b76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561135157600080fd5b6102c65a03f1151561136257600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156113a557600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561143357600080fd5b6102c65a03f1151561144457600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16636be39bda8c6000604051604001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082600019166000191681526020019150506040805180830381600087803b15156114cb57600080fd5b6102c65a03f115156114dc57600080fd5b5050506040518051906020018051905080985081995050506114fd87610c7e565b809650819750829850839950849a505050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d23c4c76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561159f57600080fd5b6102c65a03f115156115b057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16635715c5b7876000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561163057600080fd5b6102c65a03f1151561164157600080fd5b505050604051805190509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561168a5750600583105b80156116c157503073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b1561173357828173ffffffffffffffffffffffffffffffffffffffff168c600019167f2c500aaec6833a053693d8c2a18a3ed5649a4609699abaf7778c3d389cc40c0588888760405180848152602001838152602001828152602001935050505060405180910390a460019850611738565b600098505b505050505050505092915050565b60008061177b60646127100261176d8560c0015186602001516117e690919063ffffffff16565b61182190919063ffffffff16565b905061179481846020015161129790919063ffffffff16565b915050919050565b60008060006117b884604001518661194690919063ffffffff16565b91506117c78460800151611859565b90506117dc818361182190919063ffffffff16565b9250505092915050565b60008060008414156117fb576000915061181a565b828402905082848281151561180c57fe5b0414151561181657fe5b8091505b5092915050565b600080828481151561182f57fe5b0490508091505092915050565b60008160020a836001900481151561185057fe5b04905092915050565b600080600481111561186757fe5b82600481111561187357fe5b141561188357610e109050611941565b6001600481111561189057fe5b82600481111561189c57fe5b14156118af576018610e10029050611941565b600260048111156118bc57fe5b8260048111156118c857fe5b14156118de5760076018610e1002029050611941565b600360048111156118eb57fe5b8260048111156118f757fe5b141561190d57601e6018610e1002029050611941565b60048081111561191957fe5b82600481111561192557fe5b141561193c5761016d6018610e1002029050611941565b600080fd5b919050565b600082821115151561195457fe5b818303905092915050565b60e060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600060048111156119aa57fe5b8152602001600081526020016000815250905600a165627a7a72305820b26d3a4b77ce7858ba09572df89d326a11d6337e397ef5fe830c8858913e60360029", + "bytecode": "0x6060604052341561000f57600080fd5b604051604080611ab3833981016040528080519060200190919080519060200190919050508180600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050506119ea806100c96000396000f3006060604052600436106100f1576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a896a1146100f65780630776298214610131578063208638941461015a5780632762dd8c1461018357806340018a0d146101be5780635f0280ba146101e75780636f69c96f1461028c57806379035396146102b55780638b47e58a1461030a57806393529cdf14610333578063977a5e641461035c57806399114d84146103ba578063abf410e5146103fe578063de53a13c14610453578063ed8907d71461047c578063fd127a41146104d3578063fd40d52e146104fc575b600080fd5b341561010157600080fd5b61011b600480803560001916906020019091905050610537565b6040518082815260200191505060405180910390f35b341561013c57600080fd5b61014461055b565b6040518082815260200191505060405180910390f35b341561016557600080fd5b61016d610564565b6040518082815260200191505060405180910390f35b341561018e57600080fd5b6101a8600480803560001916906020019091905050610570565b6040518082815260200191505060405180910390f35b34156101c957600080fd5b6101d1610592565b6040518082815260200191505060405180910390f35b34156101f257600080fd5b61027260048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061059e565b604051808215151515815260200191505060405180910390f35b341561029757600080fd5b61029f610813565b6040518082815260200191505060405180910390f35b34156102c057600080fd5b6102c8610819565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561031557600080fd5b61031d61083f565b6040518082815260200191505060405180910390f35b341561033e57600080fd5b610346610844565b6040518082815260200191505060405180910390f35b341561036757600080fd5b6103a060048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061084a565b604051808215151515815260200191505060405180910390f35b34156103c557600080fd5b6103e8600480803560001916906020019091908035906020019091905050610a43565b6040518082815260200191505060405180910390f35b341561040957600080fd5b610411610c4f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561045e57600080fd5b610466610c75565b6040518082815260200191505060405180910390f35b341561048757600080fd5b6104a1600480803560001916906020019091905050610c7e565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b34156104de57600080fd5b6104e6610d76565b6040518082815260200191505060405180910390f35b341561050757600080fd5b610521600480803560001916906020019091905050610d83565b6040518082815260200191505060405180910390f35b60008060008360001916600019168152602001908152602001600020549050919050565b6018610e100281565b601e6018610e10020281565b600061057a61195f565b61058383610d9b565b90508060600151915050919050565b60076018610e10020281565b60006105a861195f565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636fa9d0566000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561063657600080fd5b6102c65a03f1151561064757600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561068a57600080fd5b61069387610d9b565b9050806000015173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610804576106fa846000808a600019166000191681526020019081526020016000205461129790919063ffffffff16565b6000808960001916600019168152602001908152602001600020819055507ff1a888d220228f843ac3044ef257c80642e6434d1ddc7ebee0a2813cced3406c87878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405180910390a160019150610809565b600091505b5095945050505050565b610e1081565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600581565b61271081565b6000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663079dd4b76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156108dd57600080fd5b6102c65a03f115156108ee57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561093157600080fd5b61093b85856112b5565b9150600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663649404bd86866000604051602001526040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1515610a1257600080fd5b6102c65a03f11515610a2357600080fd5b505050604051805190509050818015610a395750805b9250505092915050565b6000610a4d61195f565b60008085600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610adf57600080fd5b6102c65a03f11515610af057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663f6f494c9826000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610b7857600080fd5b6102c65a03f11515610b8957600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16141515610bcc57600080fd5b610bd587610d9b565b9350610be084611746565b9250836040015186111515610bf85760009450610c45565b836060015186101515610c0d57829450610c45565b610c17868561179c565b9150610c428460a00151610c3484866117e690919063ffffffff16565b61182190919063ffffffff16565b94505b5050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60646127100281565b6000806000806000806000806000807fff000000000000000000000000000000000000000000000000000000000000006001028b1694507effffffffffffffffffffffff000000000000000000000000000000000000006001028b16935072ffffff000000000000000000000000000000006001028b1692506ff00000000000000000000000000000006001028b1691506f0ffff0000000000000000000000000006001028b169050610d328560f861183c565b610d3d85609861183c565b610d4885608061183c565b610d5385607c61183c565b610d5e85606c61183c565b99509950995099509950505050505091939590929450565b61016d6018610e10020281565b60006020528060005260406000206000915090505481565b610da361195f565b600080600080600080600080600080600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610e4357600080fd5b6102c65a03f11515610e5457600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663314a522e8f6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610edc57600080fd5b6102c65a03f11515610eed57600080fd5b505050604051805190509b50610f028c610c7e565b809b50819c50829d50839e50849f505050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d23c4c76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610fa457600080fd5b6102c65a03f11515610fb557600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16635715c5b78c6000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561103557600080fd5b6102c65a03f1151561104657600080fd5b505050604051805190509550600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415151561108e57600080fd5b60048081111561109a57fe5b88111515156110a857600080fd5b8760048111156110b457fe5b94506110bf85611859565b9350600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561114f57600080fd5b6102c65a03f1151561116057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663d69dbf638f6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156111e857600080fd5b6102c65a03f115156111f957600080fd5b50505060405180519050925061121884886117e690919063ffffffff16565b915061122d838361129790919063ffffffff16565b905060e0604051908101604052808773ffffffffffffffffffffffffffffffffffffffff1681526020018b815260200184815260200182815260200186600481111561127557fe5b81526020018881526020018a8152509c50505050505050505050505050919050565b60008082840190508381101515156112ab57fe5b8091505092915050565b6000806000806000806000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663079dd4b76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561135157600080fd5b6102c65a03f1151561136257600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156113a557600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561143357600080fd5b6102c65a03f1151561144457600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16636be39bda8c6000604051604001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082600019166000191681526020019150506040805180830381600087803b15156114cb57600080fd5b6102c65a03f115156114dc57600080fd5b5050506040518051906020018051905080985081995050506114fd87610c7e565b809650819750829850839950849a505050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d23c4c76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561159f57600080fd5b6102c65a03f115156115b057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16635715c5b7876000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561163057600080fd5b6102c65a03f1151561164157600080fd5b505050604051805190509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561168a5750600583105b80156116c157503073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b1561173357828173ffffffffffffffffffffffffffffffffffffffff168c600019167f2c500aaec6833a053693d8c2a18a3ed5649a4609699abaf7778c3d389cc40c0588888760405180848152602001838152602001828152602001935050505060405180910390a460019850611738565b600098505b505050505050505092915050565b60008061177b60646127100261176d8560c0015186602001516117e690919063ffffffff16565b61182190919063ffffffff16565b905061179481846020015161129790919063ffffffff16565b915050919050565b60008060006117b884604001518661194690919063ffffffff16565b91506117c78460800151611859565b90506117dc818361182190919063ffffffff16565b9250505092915050565b60008060008414156117fb576000915061181a565b828402905082848281151561180c57fe5b0414151561181657fe5b8091505b5092915050565b600080828481151561182f57fe5b0490508091505092915050565b60008160020a836001900481151561185057fe5b04905092915050565b600080600481111561186757fe5b82600481111561187357fe5b141561188357610e109050611941565b6001600481111561189057fe5b82600481111561189c57fe5b14156118af576018610e10029050611941565b600260048111156118bc57fe5b8260048111156118c857fe5b14156118de5760076018610e1002029050611941565b600360048111156118eb57fe5b8260048111156118f757fe5b141561190d57601e6018610e1002029050611941565b60048081111561191957fe5b82600481111561192557fe5b141561193c5761016d6018610e1002029050611941565b600080fd5b919050565b600082821115151561195457fe5b818303905092915050565b60e060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600060048111156119aa57fe5b8152602001600081526020016000815250905600a165627a7a72305820a218433efc34d5d86e128ee9006cec41f8bfea23c5d2b1b339a73c9b29a46caf0029", + "deployedBytecode": "0x6060604052600436106100f1576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a896a1146100f65780630776298214610131578063208638941461015a5780632762dd8c1461018357806340018a0d146101be5780635f0280ba146101e75780636f69c96f1461028c57806379035396146102b55780638b47e58a1461030a57806393529cdf14610333578063977a5e641461035c57806399114d84146103ba578063abf410e5146103fe578063de53a13c14610453578063ed8907d71461047c578063fd127a41146104d3578063fd40d52e146104fc575b600080fd5b341561010157600080fd5b61011b600480803560001916906020019091905050610537565b6040518082815260200191505060405180910390f35b341561013c57600080fd5b61014461055b565b6040518082815260200191505060405180910390f35b341561016557600080fd5b61016d610564565b6040518082815260200191505060405180910390f35b341561018e57600080fd5b6101a8600480803560001916906020019091905050610570565b6040518082815260200191505060405180910390f35b34156101c957600080fd5b6101d1610592565b6040518082815260200191505060405180910390f35b34156101f257600080fd5b61027260048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061059e565b604051808215151515815260200191505060405180910390f35b341561029757600080fd5b61029f610813565b6040518082815260200191505060405180910390f35b34156102c057600080fd5b6102c8610819565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561031557600080fd5b61031d61083f565b6040518082815260200191505060405180910390f35b341561033e57600080fd5b610346610844565b6040518082815260200191505060405180910390f35b341561036757600080fd5b6103a060048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061084a565b604051808215151515815260200191505060405180910390f35b34156103c557600080fd5b6103e8600480803560001916906020019091908035906020019091905050610a43565b6040518082815260200191505060405180910390f35b341561040957600080fd5b610411610c4f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561045e57600080fd5b610466610c75565b6040518082815260200191505060405180910390f35b341561048757600080fd5b6104a1600480803560001916906020019091905050610c7e565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b34156104de57600080fd5b6104e6610d76565b6040518082815260200191505060405180910390f35b341561050757600080fd5b610521600480803560001916906020019091905050610d83565b6040518082815260200191505060405180910390f35b60008060008360001916600019168152602001908152602001600020549050919050565b6018610e100281565b601e6018610e10020281565b600061057a61195f565b61058383610d9b565b90508060600151915050919050565b60076018610e10020281565b60006105a861195f565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636fa9d0566000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561063657600080fd5b6102c65a03f1151561064757600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561068a57600080fd5b61069387610d9b565b9050806000015173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610804576106fa846000808a600019166000191681526020019081526020016000205461129790919063ffffffff16565b6000808960001916600019168152602001908152602001600020819055507ff1a888d220228f843ac3044ef257c80642e6434d1ddc7ebee0a2813cced3406c87878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405180910390a160019150610809565b600091505b5095945050505050565b610e1081565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600581565b61271081565b6000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663079dd4b76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156108dd57600080fd5b6102c65a03f115156108ee57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561093157600080fd5b61093b85856112b5565b9150600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663649404bd86866000604051602001526040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1515610a1257600080fd5b6102c65a03f11515610a2357600080fd5b505050604051805190509050818015610a395750805b9250505092915050565b6000610a4d61195f565b60008085600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610adf57600080fd5b6102c65a03f11515610af057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663f6f494c9826000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610b7857600080fd5b6102c65a03f11515610b8957600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16141515610bcc57600080fd5b610bd587610d9b565b9350610be084611746565b9250836040015186111515610bf85760009450610c45565b836060015186101515610c0d57829450610c45565b610c17868561179c565b9150610c428460a00151610c3484866117e690919063ffffffff16565b61182190919063ffffffff16565b94505b5050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60646127100281565b6000806000806000806000806000807fff000000000000000000000000000000000000000000000000000000000000006001028b1694507effffffffffffffffffffffff000000000000000000000000000000000000006001028b16935072ffffff000000000000000000000000000000006001028b1692506ff00000000000000000000000000000006001028b1691506f0ffff0000000000000000000000000006001028b169050610d328560f861183c565b610d3d85609861183c565b610d4885608061183c565b610d5385607c61183c565b610d5e85606c61183c565b99509950995099509950505050505091939590929450565b61016d6018610e10020281565b60006020528060005260406000206000915090505481565b610da361195f565b600080600080600080600080600080600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610e4357600080fd5b6102c65a03f11515610e5457600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663314a522e8f6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610edc57600080fd5b6102c65a03f11515610eed57600080fd5b505050604051805190509b50610f028c610c7e565b809b50819c50829d50839e50849f505050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d23c4c76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610fa457600080fd5b6102c65a03f11515610fb557600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16635715c5b78c6000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561103557600080fd5b6102c65a03f1151561104657600080fd5b505050604051805190509550600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415151561108e57600080fd5b60048081111561109a57fe5b88111515156110a857600080fd5b8760048111156110b457fe5b94506110bf85611859565b9350600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561114f57600080fd5b6102c65a03f1151561116057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663d69dbf638f6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156111e857600080fd5b6102c65a03f115156111f957600080fd5b50505060405180519050925061121884886117e690919063ffffffff16565b915061122d838361129790919063ffffffff16565b905060e0604051908101604052808773ffffffffffffffffffffffffffffffffffffffff1681526020018b815260200184815260200182815260200186600481111561127557fe5b81526020018881526020018a8152509c50505050505050505050505050919050565b60008082840190508381101515156112ab57fe5b8091505092915050565b6000806000806000806000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663079dd4b76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561135157600080fd5b6102c65a03f1151561136257600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156113a557600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561143357600080fd5b6102c65a03f1151561144457600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16636be39bda8c6000604051604001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082600019166000191681526020019150506040805180830381600087803b15156114cb57600080fd5b6102c65a03f115156114dc57600080fd5b5050506040518051906020018051905080985081995050506114fd87610c7e565b809650819750829850839950849a505050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d23c4c76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561159f57600080fd5b6102c65a03f115156115b057600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16635715c5b7876000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561163057600080fd5b6102c65a03f1151561164157600080fd5b505050604051805190509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561168a5750600583105b80156116c157503073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b1561173357828173ffffffffffffffffffffffffffffffffffffffff168c600019167f2c500aaec6833a053693d8c2a18a3ed5649a4609699abaf7778c3d389cc40c0588888760405180848152602001838152602001828152602001935050505060405180910390a460019850611738565b600098505b505050505050505092915050565b60008061177b60646127100261176d8560c0015186602001516117e690919063ffffffff16565b61182190919063ffffffff16565b905061179481846020015161129790919063ffffffff16565b915050919050565b60008060006117b884604001518661194690919063ffffffff16565b91506117c78460800151611859565b90506117dc818361182190919063ffffffff16565b9250505092915050565b60008060008414156117fb576000915061181a565b828402905082848281151561180c57fe5b0414151561181657fe5b8091505b5092915050565b600080828481151561182f57fe5b0490508091505092915050565b60008160020a836001900481151561185057fe5b04905092915050565b600080600481111561186757fe5b82600481111561187357fe5b141561188357610e109050611941565b6001600481111561189057fe5b82600481111561189c57fe5b14156118af576018610e10029050611941565b600260048111156118bc57fe5b8260048111156118c857fe5b14156118de5760076018610e1002029050611941565b600360048111156118eb57fe5b8260048111156118f757fe5b141561190d57601e6018610e1002029050611941565b60048081111561191957fe5b82600481111561192557fe5b141561193c5761016d6018610e1002029050611941565b600080fd5b919050565b600082821115151561195457fe5b818303905092915050565b60e060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600060048111156119aa57fe5b8152602001600081526020016000815250905600a165627a7a72305820a218433efc34d5d86e128ee9006cec41f8bfea23c5d2b1b339a73c9b29a46caf0029", "sourceMap": "873:1479:15:-;;;1022:274;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1194:17;3551::16;3515:16;;:54;;;;;;;;;;;;;;;;;;3408:168;1267:21:15;1223:20;;:66;;;;;;;;;;;;;;;;;;1022:274;;873:1479;;;;;;", "deployedSourceMap": "873:1479:15:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9334:167:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1532:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1687:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2091:259:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1610:71:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6636:742;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1473:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;967:48:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;860:52:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2025:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1583:372:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7987:1066:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2492:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2329:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9507:2790;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1766:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2441:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9334:167;9430:17;9470:11;:24;9482:11;9470:24;;;;;;;;;;;;;;;;;;9463:31;;9334:167;;;:::o;1532:72::-;1602:2;1519:7;1577:27;1532:72;:::o;1687:73::-;1758:2;1602;1519:7;1577:27;1734:26;1687:73;:::o;2091:259:15:-;2201:4;2221:34;;:::i;:::-;2258:40;2285:12;2258:26;:40::i;:::-;2221:77;;2316:6;:27;;;2309:34;;2091:259;;;;:::o;1610:71:16:-;1680:1;1602:2;1519:7;1577:27;1656:25;1610:71;:::o;6636:742::-;6865:13;6894:34;;:::i;:::-;3051:16;;;;;;;;;;;:32;;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3029:57;;:10;:57;;;3021:66;;;;;;;;6931:39;6958:11;6931:26;:39::i;:::-;6894:76;;7001:6;:28;;;6985:44;;:12;:44;;;6981:368;;;7072:46;7101:16;7072:11;:24;7084:11;7072:24;;;;;;;;;;;;;;;;;;:28;;:46;;;;:::i;:::-;7045:11;:24;7057:11;7045:24;;;;;;;;;;;;;;;;;:73;;;;7133:179;7171:11;7200:5;7223:11;7252:16;7286:12;7133:179;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7334:4;7327:11;;;;6981:368;7366:5;7359:12;;3097:1;6636:742;;;;;;;;:::o;1473:53::-;1519:7;1473:53;:::o;967:48:15:-;;;;;;;;;;;;;:::o;860:52:16:-;911:1;860:52;:::o;2025:67::-;2085:7;2025:67;:::o;1583:372:15:-;1724:13;1753:15;1825:19;3353:16:16;;;;;;;;;;;:27;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3331:52;;:10;:52;;;3323:61;;;;;;;;1771:44:15;1795:11;1808:6;1771:23;:44::i;:::-;1753:62;;1847:20;;;;;;;;;;;:34;;;1882:11;1895:6;1847:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1825:77;;1920:10;:28;;;;;1934:14;1920:28;1913:35;;1583:372;;;;;;:::o;7987:1066:16:-;8175:28;8219:34;;:::i;:::-;8305:26;8871:13;8145:11;3201:16;;;;;;;;;;;:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:48;;;3250:11;3201:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3184:78;;3192:4;3184:78;;;3176:87;;;;;;;;8256:39;8283:11;8256:26;:39::i;:::-;8219:76;;8334:43;8370:6;8334:35;:43::i;:::-;8305:72;;8405:6;:29;;;8392:9;:42;;8388:659;;;8587:1;8580:8;;;;8388:659;8622:6;:27;;;8609:9;:40;;8605:442;;;8819:21;8812:28;;;;8605:442;8887:51;8920:9;8931:6;8887:32;:51::i;:::-;8871:67;;8959:77;8999:6;:36;;;8959:35;8985:8;8959:21;:25;;:35;;;;:::i;:::-;:39;;:77;;;;:::i;:::-;8952:84;;3273:1;7987:1066;;;;;;;;:::o;2492:40::-;;;;;;;;;;;;;:::o;2329:105::-;2431:3;2085:7;2392:42;2329:105;:::o;9507:2790::-;9620:25;9659:21;9694:18;9726:26;9766:35;9940:34;10160:30;10372:27;10588:35;10845:44;10002:66;9989:79;;:10;:79;9940:128;;10218:66;10205:79;;:10;:79;10160:124;;10427:66;10414:79;;:10;:79;10372:121;;10651:66;10638:79;;:10;:79;10588:129;;10917:66;10904:79;;:10;:79;10845:138;;11994:46;12008:26;12036:3;11994:13;:46::i;:::-;12054:42;12068:22;12092:3;12054:13;:42::i;:::-;12110:39;12124:19;12145:3;12110:13;:39::i;:::-;12163:47;12177:27;12206:3;12163:13;:47::i;:::-;12224:56;12238:36;12276:3;12224:13;:56::i;:::-;11973:317;;;;;;;;;;9507:2790;;;;;;;;;;;;:::o;1766:73::-;1836:3;1602:2;1519:7;1577:27;1812;1766:73;:::o;2441:44::-;;;;;;;;;;;;;;;;;:::o;14136:2420::-;14241:27;;:::i;:::-;14284:18;14467:24;14574:20;14664:17;14782:28;14917:34;15133:29;15568:41;15668:36;15785:27;15907:24;16022:25;14305:16;;;;;;;;;;;:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:58;;;14364:11;14305:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14284:92;;15085:37;15111:10;15085:25;:37::i;:::-;14962:160;;;;;;;;;;;;;;;;;;;;15177:16;;;;;;;;;;;:30;;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:55;;;15233:19;15177:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15133:120;;15373:1;15340:35;;:21;:35;;;;15332:44;;;;;;;;15529:26;15524:32;;;;;;;;15497:23;:59;;15489:68;;;;;;;;15633:23;15612:45;;;;;;;;15568:89;;15719:56;15754:20;15719:34;:56::i;:::-;15668:107;;15827:16;;;;;;;;;;;:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:57;;;15885:11;15827:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15785:112;;15946:66;15980:31;15946:29;:33;;:66;;;;:::i;:::-;15907:105;;16062:47;16086:22;16062:19;:23;;:47;;;;:::i;:::-;16022:87;;16127:422;;;;;;;;;16185:21;16127:422;;;;;;16237:15;16127:422;;;;16330:22;16127:422;;;;16388:20;16127:422;;;;16444:20;16127:422;;;;;;;;;;;;16509:29;16127:422;;;;16280:12;16127:422;;;16120:429;;14136:2420;;;;;;;;;;;;;;;:::o;1007:129:38:-;1065:7;1080:9;1096:1;1092;:5;1080:17;;1115:1;1110;:6;;1103:14;;;;;;1130:1;1123:8;;1007:129;;;;;:::o;4229:1696:16:-;4370:13;4399:21;4430:31;4579:24;4613:20;4643:17;4670:25;4705:34;4931:29;3353:16;;;;;;;;;;;:27;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3331:52;;:10;:52;;;3323:61;;;;;;;;4515:16;;;;;;;;;;;:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:40;;;4556:11;4515:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4472:96;;;;;;;;4870:50;4896:23;4870:25;:50::i;:::-;4750:170;;;;;;;;;;;;;;;;;;;;4975:16;;;;;;;;;;;:30;;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:55;;;5031:19;4975:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4931:120;;5473:1;5440:35;;:21;:35;;;;:101;;;;;911:1;5491:20;:50;5440:101;:147;;;;;5582:4;5557:30;;:13;:30;;;5440:147;5436:460;;;5778:20;5676:21;5603:256;;5647:11;5603:256;;;;5715:15;5748:12;5816:29;5603:256;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5881:4;5874:11;;;;5436:460;5913:5;5906:12;;3394:1;4229:1696;;;;;;;;;;;;:::o;13492:638::-;13614:27;13925:18;13946:118;2431:3;2085:7;2392:42;13946:60;13986:6;:19;;;13946:6;:22;;;:39;;:60;;;;:::i;:::-;:77;;:118;;;;:::i;:::-;13925:139;;14082:41;14109:13;14082:6;:22;;;:26;;:41;;;;:::i;:::-;14075:48;;13492:638;;;;:::o;12707:404::-;12850:10;12876;12943:36;12889:44;12903:6;:29;;;12889:9;:13;;:44;;;;:::i;:::-;12876:57;;12982:63;13017:6;:27;;;12982:34;:63::i;:::-;12943:102;;13062:42;13072:31;13062:5;:9;;:42;;;;:::i;:::-;13055:49;;12707:404;;;;;;:::o;203:173:38:-;261:7;316:9;285:1;280;:6;276:35;;;303:1;296:8;;;;276:35;332:1;328;:5;316:17;;355:1;350;346;:5;;;;;;;;:10;339:18;;;;;;370:1;363:8;;203:173;;;;;;:::o;458:265::-;516:7;605:9;621:1;617;:5;;;;;;;;605:17;;717:1;710:8;;458:265;;;;;:::o;12544:157:16:-;12642:4;12688:6;12683:1;:11;12674:5;12669:11;;;:25;;;;;;;;12662:32;;12544:157;;;;:::o;16562:806::-;16696:37;16777:26;16753:50;;;;;;;;:20;:50;;;;;;;;;16749:613;;;1519:7;16819:29;;;;16749:613;16893:25;16869:49;;;;;;;;:20;:49;;;;;;;;;16865:497;;;1602:2;1519:7;1577:27;16934:28;;;;16865:497;17007:26;16983:50;;;;;;;;:20;:50;;;;;;;;;16979:383;;;1680:1;1602:2;1519:7;1577:27;1656:25;17049:29;;;;16979:383;17123:27;17099:51;;;;;;;;:20;:51;;;;;;;;;17095:267;;;1758:2;1602;1519:7;1577:27;1734:26;17166:30;;;;17095:267;17241:26;17217:50;;;;;;;;:20;:50;;;;;;;;;17213:149;;;1836:3;1602:2;1519:7;1577:27;1812;17283:29;;;;17213:149;17343:8;;;16562:806;;;;:::o;835:110:38:-;893:7;920:1;915;:6;;908:14;;;;;;939:1;935;:5;928:12;;835:110;;;;:::o;873:1479:15:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\nimport \"./SimpleInterestTermsContract.sol\";\nimport \"../ERC721Collateralizer.sol\";\n\n\n/**\n * A Terms Contract that can be used for debt agreements where the collateral token is a\n * non-fungible ERC721 token. It contains functionality for simple interest loans.\n */\ncontract ERC721CollateralizedSimpleInterestTermsContract is SimpleInterestTermsContract {\n ERC721Collateralizer public erc721Collateralizer;\n\n function ERC721CollateralizedSimpleInterestTermsContract(\n address _contractRegistry,\n address _erc721Collateralizer\n ) public SimpleInterestTermsContract(_contractRegistry) {\n erc721Collateralizer = ERC721Collateralizer(_erc721Collateralizer);\n }\n\n /**\n * This method is called by the DebtKernel when an Debt Order is filled. Here, we use it\n * as a hook to collateralize the debtor's ERC721 asset, and to call the same method on the\n * parent contract - which registers that the debt agreement has begun.\n */\n function registerTermStart(\n bytes32 agreementId,\n address debtor\n )\n public\n onlyDebtKernel\n returns (bool _success)\n {\n bool registered = super.registerTermStart(agreementId, debtor);\n bool collateralized = erc721Collateralizer.collateralize(agreementId, debtor);\n\n return registered && collateralized;\n }\n\n /**\n * A method that returns a Unix timestamp representing the end of the debt agreement's term.\n * contract.\n */\n function getTermEndTimestamp(\n bytes32 _agreementId\n )\n public\n view\n returns (uint)\n {\n SimpleInterestParams memory params = unpackParamsForAgreementID(_agreementId);\n\n return params.termEndUnixTimestamp;\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/examples/ERC721CollateralizedSimpleInterestTermsContract.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/examples/ERC721CollateralizedSimpleInterestTermsContract.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/examples/ERC721CollateralizedSimpleInterestTermsContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/examples/ERC721CollateralizedSimpleInterestTermsContract.sol", "exportedSymbols": { "ERC721CollateralizedSimpleInterestTermsContract": [ 5348 @@ -431,7 +431,7 @@ export const ERC721CollateralizedSimpleInterestTermsContract = { "attributes": { "SourceUnit": 6053, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/examples/SimpleInterestTermsContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/examples/SimpleInterestTermsContract.sol", "file": "./SimpleInterestTermsContract.sol", "scope": 5349, "symbolAliases": [ @@ -446,7 +446,7 @@ export const ERC721CollateralizedSimpleInterestTermsContract = { "attributes": { "SourceUnit": 4167, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/ERC721Collateralizer.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/ERC721Collateralizer.sol", "file": "../ERC721Collateralizer.sol", "scope": 5349, "symbolAliases": [ @@ -1446,7 +1446,7 @@ export const ERC721CollateralizedSimpleInterestTermsContract = "42": { "events": {}, "links": {}, - "address": "0x13a93b0e027f419556271a3cb1060ef7156103e6" + "address": "0xe44c8dbcb6dab51c4d5291788ec3fb82d2fbad12" }, "70": { "events": {}, @@ -1455,5 +1455,5 @@ export const ERC721CollateralizedSimpleInterestTermsContract = } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:16:13.721Z" + "updatedAt": "2018-10-09T17:53:04.862Z" } \ No newline at end of file diff --git a/artifacts/ts/ERC721Collateralizer.ts b/artifacts/ts/ERC721Collateralizer.ts index 80c0c299..8a8035b4 100644 --- a/artifacts/ts/ERC721Collateralizer.ts +++ b/artifacts/ts/ERC721Collateralizer.ts @@ -457,15 +457,15 @@ export const ERC721Collateralizer = "type": "event" } ], - "bytecode": "0x606060405260008060146101000a81548160ff021916908315150217905550341561002957600080fd5b6040516060806127ab833981016040528080519060200190919080519060200190919080519060200190919050506000336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508390508073ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561010857600080fd5b6102c65a03f1151561011957600080fd5b50505060405180519050600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050506125b3806101f86000396000f300606060405260043610610107576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632e667c4e1461010c5780632f866f731461019a578063399f120f146101ef5780633f4ba83a1461029057806344c4ea95146102a55780635c975abb146102cc57806361a52a36146102f9578063649404bd14610322578063656e903b146103805780636f16f14a146103e75780638456cb591461043c5780638da5cb5b146104515780639ae1c1f3146104a65780639d23c4c7146104df578063ae72c6ef14610534578063ca0626471461056d578063ed8e52bd146105ba578063f2fde38b146105e1578063f466f42e1461061a575b600080fd5b341561011757600080fd5b61011f610684565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561015f578082015181840152602081019050610144565b50505050905090810190601f16801561018c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101a557600080fd5b6101ad6106bd565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101fa57600080fd5b6102146004808035600019169060200190919050506106e3565b604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390f35b341561029b57600080fd5b6102a3610946565b005b34156102b057600080fd5b6102ca600480803560001916906020019091905050610a04565b005b34156102d757600080fd5b6102df611062565b604051808215151515815260200191505060405180910390f35b341561030457600080fd5b61030c611075565b6040518082815260200191505060405180910390f35b341561032d57600080fd5b61036660048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061107c565b604051808215151515815260200191505060405180910390f35b341561038b57600080fd5b6103a5600480803560001916906020019091905050611435565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103f257600080fd5b6103fa611468565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561044757600080fd5b61044f61148e565b005b341561045c57600080fd5b61046461154e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104b157600080fd5b6104dd600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611573565b005b34156104ea57600080fd5b6104f261161c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561053f57600080fd5b61056b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611642565b005b341561057857600080fd5b6105926004808035600019169060200190919050506116eb565b6040518084151515158152602001838152602001828152602001935050505060405180910390f35b34156105c557600080fd5b6105df60048080356000191690602001909190505061176e565b005b34156105ec57600080fd5b610618600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611db2565b005b341561062557600080fd5b61062d611f07565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610670578082015181840152602081019050610655565b505050509050019250505060405180910390f35b6040805190810160405280601481526020017f455243373231436f6c6c61746572616c697a657200000000000000000000000081525081565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000806000806000806000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636be39bda8d6000604051604001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082600019166000191681526020019150506040805180830381600087803b151561079457600080fd5b6102c65a03f115156107a557600080fd5b5050506040518051906020018051905080985081995050506107c6876116eb565b809650819750829850505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635715c5b7866000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561086b57600080fd5b6102c65a03f1151561087c57600080fd5b505050604051805190509150819050851561092a578073ffffffffffffffffffffffffffffffffffffffff16634f6ccce7856000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561090857600080fd5b6102c65a03f1151561091957600080fd5b50505060405180519050925061092e565b8392505b8183899a509a509a5050505050505050509193909250565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156109a157600080fd5b600060149054906101000a900460ff1615156109bc57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b60008060008060008060149054906101000a900460ff16151515610a2757600080fd5b610a30866106e3565b809550819650829750505050600073ffffffffffffffffffffffffffffffffffffffff1660046000886000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515610ab357600080fd5b60046000876000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915060046000876000191660001916815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690558273ffffffffffffffffffffffffffffffffffffffff166303a896a1876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610bae57600080fd5b6102c65a03f11515610bbf57600080fd5b505050604051805190508373ffffffffffffffffffffffffffffffffffffffff166399114d84888673ffffffffffffffffffffffffffffffffffffffff16632762dd8c8b6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610c6557600080fd5b6102c65a03f11515610c7657600080fd5b505050604051805190506000604051602001526040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050602060405180830381600087803b1515610ce957600080fd5b6102c65a03f11515610cfa57600080fd5b5050506040518051905011151515610d1157600080fd5b8490508473ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610e21578073ffffffffffffffffffffffffffffffffffffffff1663095ea7b330866040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1515610e0c57600080fd5b6102c65a03f11515610e1d57600080fd5b5050505b8073ffffffffffffffffffffffffffffffffffffffff166323b872dd3084876040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1515610ef757600080fd5b6102c65a03f11515610f0857600080fd5b5050508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e866000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515610f9957600080fd5b6102c65a03f11515610faa57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16141515610fd357fe5b8173ffffffffffffffffffffffffffffffffffffffff1686600019167f2621540e2b91ca10330d6a7cbd6fb8cab2396f91c4935ad76b1183770819fa1f8787604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a3505050505050565b600060149054906101000a900460ff1681565b6201518081565b600080600080600080611099336005611f1e90919063ffffffff16565b15156110a457600080fd5b600060149054906101000a900460ff161515156110c057600080fd5b6110c9886106e3565b8095508196508297505050503373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151561110f57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415151561114b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600460008a6000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156111c157600080fd5b86600460008a6000191660001916815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508491503090508173ffffffffffffffffffffffffffffffffffffffff166323b872dd8883876040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b15156112f757600080fd5b6102c65a03f1151561130857600080fd5b5050508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16636352211e866000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561139957600080fd5b6102c65a03f115156113aa57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff161415156113d357fe5b8473ffffffffffffffffffffffffffffffffffffffff1688600019167f38f12634ebefbe7f6767652aae05e220f95e0ca8ef8353c9c9c5ae439a592aec866040518082815260200191505060405180910390a360019550505050505092915050565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156114e957600080fd5b600060149054906101000a900460ff1615151561150557600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156115ce57600080fd5b611619816040805190810160405280601481526020017f455243373231436f6c6c61746572616c697a65720000000000000000000000008152506005611f779092919063ffffffff16565b50565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561169d57600080fd5b6116e8816040805190810160405280601481526020017f455243373231436f6c6c61746572616c697a6572000000000000000000000000815250600561226d9092919063ffffffff16565b50565b60008060008060008060008060018002891694506d0ffffffffffff00000000000000060010289169350670ffffffffffffff060010289169250671000000000000000846001900481151561173c57fe5b0491506010836001900481151561174f57fe5b0490506001856001900414828297509750975050505050509193909250565b60008060008060008060149054906101000a900460ff1615151561179157600080fd5b61179a866106e3565b809550819650829750505050600073ffffffffffffffffffffffffffffffffffffffff1660046000886000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561181d57600080fd5b60046000876000191660001916815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690558273ffffffffffffffffffffffffffffffffffffffff166303a896a1876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156118da57600080fd5b6102c65a03f115156118eb57600080fd5b505050604051805190508373ffffffffffffffffffffffffffffffffffffffff166399114d8488426000604051602001526040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050602060405180830381600087803b151561197c57600080fd5b6102c65a03f1151561198d57600080fd5b505050604051805190501115156119a357600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ba20dda4876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515611a4457600080fd5b6102c65a03f11515611a5557600080fd5b5050506040518051905091508490508473ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611b71578073ffffffffffffffffffffffffffffffffffffffff1663095ea7b330866040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1515611b5c57600080fd5b6102c65a03f11515611b6d57600080fd5b5050505b8073ffffffffffffffffffffffffffffffffffffffff166323b872dd3084876040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1515611c4757600080fd5b6102c65a03f11515611c5857600080fd5b5050508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e866000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515611ce957600080fd5b6102c65a03f11515611cfa57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16141515611d2357fe5b8173ffffffffffffffffffffffffffffffffffffffff1686600019167f50d195a4b80a950617a8e0e18ac9dd4c0236ac72d5e12355d881443823870d398787604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a3505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611e0d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611e4957600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611f0f6124f6565b611f196005612449565b905090565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000806000611f868686611f1e565b1515611f9157600080fd5b8560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600186600201805490500391508560020182815481101515611ff357fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff021916905580866002018481548110151561208457fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055856002018281548110151561216957fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600186600201818180549050039150816121b1919061250a565b508473ffffffffffffffffffffffffffffffffffffffff167f0814e4ee85854cea446b4a27a460e5ffb41516230dbc02f226c07907e432241c856040518080602001828103825283818151815260200191508051906020019080838360005b8381101561222b578082015181840152602081019050612210565b50505050905090810190601f1680156122585780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050505050565b61227783836124e1565b151561228257600080fd5b60018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508260020180548060010182816122f29190612536565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060018360020180549050038360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f571925c699f9072cec76b6c6c000571cc8d0bb5c47e5819202e2e9496c6508b5826040518080602001828103825283818151815260200191508051906020019080838360005b8381101561240a5780820151818401526020810190506123ef565b50505050905090810190601f1680156124375780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b6124516124f6565b816002018054806020026020016040519081016040528092919081815260200182805480156124d557602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161248b575b50505050509050919050565b60006124ed8383611f1e565b15905092915050565b602060405190810160405280600081525090565b815481835581811511612531578183600052602060002091820191016125309190612562565b5b505050565b81548183558181151161255d5781836000526020600020918201910161255c9190612562565b5b505050565b61258491905b80821115612580576000816000905550600101612568565b5090565b905600a165627a7a723058205ae7c5eda77b75a6a5bd7b4f19339aa2b15640aab6ebf045e59b47b1a439ddc60029", - "deployedBytecode": "0x606060405260043610610107576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632e667c4e1461010c5780632f866f731461019a578063399f120f146101ef5780633f4ba83a1461029057806344c4ea95146102a55780635c975abb146102cc57806361a52a36146102f9578063649404bd14610322578063656e903b146103805780636f16f14a146103e75780638456cb591461043c5780638da5cb5b146104515780639ae1c1f3146104a65780639d23c4c7146104df578063ae72c6ef14610534578063ca0626471461056d578063ed8e52bd146105ba578063f2fde38b146105e1578063f466f42e1461061a575b600080fd5b341561011757600080fd5b61011f610684565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561015f578082015181840152602081019050610144565b50505050905090810190601f16801561018c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101a557600080fd5b6101ad6106bd565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101fa57600080fd5b6102146004808035600019169060200190919050506106e3565b604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390f35b341561029b57600080fd5b6102a3610946565b005b34156102b057600080fd5b6102ca600480803560001916906020019091905050610a04565b005b34156102d757600080fd5b6102df611062565b604051808215151515815260200191505060405180910390f35b341561030457600080fd5b61030c611075565b6040518082815260200191505060405180910390f35b341561032d57600080fd5b61036660048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061107c565b604051808215151515815260200191505060405180910390f35b341561038b57600080fd5b6103a5600480803560001916906020019091905050611435565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103f257600080fd5b6103fa611468565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561044757600080fd5b61044f61148e565b005b341561045c57600080fd5b61046461154e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104b157600080fd5b6104dd600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611573565b005b34156104ea57600080fd5b6104f261161c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561053f57600080fd5b61056b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611642565b005b341561057857600080fd5b6105926004808035600019169060200190919050506116eb565b6040518084151515158152602001838152602001828152602001935050505060405180910390f35b34156105c557600080fd5b6105df60048080356000191690602001909190505061176e565b005b34156105ec57600080fd5b610618600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611db2565b005b341561062557600080fd5b61062d611f07565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610670578082015181840152602081019050610655565b505050509050019250505060405180910390f35b6040805190810160405280601481526020017f455243373231436f6c6c61746572616c697a657200000000000000000000000081525081565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000806000806000806000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636be39bda8d6000604051604001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082600019166000191681526020019150506040805180830381600087803b151561079457600080fd5b6102c65a03f115156107a557600080fd5b5050506040518051906020018051905080985081995050506107c6876116eb565b809650819750829850505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635715c5b7866000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561086b57600080fd5b6102c65a03f1151561087c57600080fd5b505050604051805190509150819050851561092a578073ffffffffffffffffffffffffffffffffffffffff16634f6ccce7856000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561090857600080fd5b6102c65a03f1151561091957600080fd5b50505060405180519050925061092e565b8392505b8183899a509a509a5050505050505050509193909250565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156109a157600080fd5b600060149054906101000a900460ff1615156109bc57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b60008060008060008060149054906101000a900460ff16151515610a2757600080fd5b610a30866106e3565b809550819650829750505050600073ffffffffffffffffffffffffffffffffffffffff1660046000886000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515610ab357600080fd5b60046000876000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915060046000876000191660001916815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690558273ffffffffffffffffffffffffffffffffffffffff166303a896a1876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610bae57600080fd5b6102c65a03f11515610bbf57600080fd5b505050604051805190508373ffffffffffffffffffffffffffffffffffffffff166399114d84888673ffffffffffffffffffffffffffffffffffffffff16632762dd8c8b6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610c6557600080fd5b6102c65a03f11515610c7657600080fd5b505050604051805190506000604051602001526040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050602060405180830381600087803b1515610ce957600080fd5b6102c65a03f11515610cfa57600080fd5b5050506040518051905011151515610d1157600080fd5b8490508473ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610e21578073ffffffffffffffffffffffffffffffffffffffff1663095ea7b330866040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1515610e0c57600080fd5b6102c65a03f11515610e1d57600080fd5b5050505b8073ffffffffffffffffffffffffffffffffffffffff166323b872dd3084876040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1515610ef757600080fd5b6102c65a03f11515610f0857600080fd5b5050508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e866000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515610f9957600080fd5b6102c65a03f11515610faa57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16141515610fd357fe5b8173ffffffffffffffffffffffffffffffffffffffff1686600019167f2621540e2b91ca10330d6a7cbd6fb8cab2396f91c4935ad76b1183770819fa1f8787604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a3505050505050565b600060149054906101000a900460ff1681565b6201518081565b600080600080600080611099336005611f1e90919063ffffffff16565b15156110a457600080fd5b600060149054906101000a900460ff161515156110c057600080fd5b6110c9886106e3565b8095508196508297505050503373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151561110f57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415151561114b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600460008a6000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156111c157600080fd5b86600460008a6000191660001916815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508491503090508173ffffffffffffffffffffffffffffffffffffffff166323b872dd8883876040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b15156112f757600080fd5b6102c65a03f1151561130857600080fd5b5050508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16636352211e866000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561139957600080fd5b6102c65a03f115156113aa57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff161415156113d357fe5b8473ffffffffffffffffffffffffffffffffffffffff1688600019167f38f12634ebefbe7f6767652aae05e220f95e0ca8ef8353c9c9c5ae439a592aec866040518082815260200191505060405180910390a360019550505050505092915050565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156114e957600080fd5b600060149054906101000a900460ff1615151561150557600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156115ce57600080fd5b611619816040805190810160405280601481526020017f455243373231436f6c6c61746572616c697a65720000000000000000000000008152506005611f779092919063ffffffff16565b50565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561169d57600080fd5b6116e8816040805190810160405280601481526020017f455243373231436f6c6c61746572616c697a6572000000000000000000000000815250600561226d9092919063ffffffff16565b50565b60008060008060008060008060018002891694506d0ffffffffffff00000000000000060010289169350670ffffffffffffff060010289169250671000000000000000846001900481151561173c57fe5b0491506010836001900481151561174f57fe5b0490506001856001900414828297509750975050505050509193909250565b60008060008060008060149054906101000a900460ff1615151561179157600080fd5b61179a866106e3565b809550819650829750505050600073ffffffffffffffffffffffffffffffffffffffff1660046000886000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561181d57600080fd5b60046000876000191660001916815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690558273ffffffffffffffffffffffffffffffffffffffff166303a896a1876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156118da57600080fd5b6102c65a03f115156118eb57600080fd5b505050604051805190508373ffffffffffffffffffffffffffffffffffffffff166399114d8488426000604051602001526040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050602060405180830381600087803b151561197c57600080fd5b6102c65a03f1151561198d57600080fd5b505050604051805190501115156119a357600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ba20dda4876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515611a4457600080fd5b6102c65a03f11515611a5557600080fd5b5050506040518051905091508490508473ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611b71578073ffffffffffffffffffffffffffffffffffffffff1663095ea7b330866040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1515611b5c57600080fd5b6102c65a03f11515611b6d57600080fd5b5050505b8073ffffffffffffffffffffffffffffffffffffffff166323b872dd3084876040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1515611c4757600080fd5b6102c65a03f11515611c5857600080fd5b5050508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e866000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515611ce957600080fd5b6102c65a03f11515611cfa57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16141515611d2357fe5b8173ffffffffffffffffffffffffffffffffffffffff1686600019167f50d195a4b80a950617a8e0e18ac9dd4c0236ac72d5e12355d881443823870d398787604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a3505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611e0d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611e4957600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611f0f6124f6565b611f196005612449565b905090565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000806000611f868686611f1e565b1515611f9157600080fd5b8560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600186600201805490500391508560020182815481101515611ff357fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff021916905580866002018481548110151561208457fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055856002018281548110151561216957fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600186600201818180549050039150816121b1919061250a565b508473ffffffffffffffffffffffffffffffffffffffff167f0814e4ee85854cea446b4a27a460e5ffb41516230dbc02f226c07907e432241c856040518080602001828103825283818151815260200191508051906020019080838360005b8381101561222b578082015181840152602081019050612210565b50505050905090810190601f1680156122585780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050505050565b61227783836124e1565b151561228257600080fd5b60018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508260020180548060010182816122f29190612536565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060018360020180549050038360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f571925c699f9072cec76b6c6c000571cc8d0bb5c47e5819202e2e9496c6508b5826040518080602001828103825283818151815260200191508051906020019080838360005b8381101561240a5780820151818401526020810190506123ef565b50505050905090810190601f1680156124375780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b6124516124f6565b816002018054806020026020016040519081016040528092919081815260200182805480156124d557602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161248b575b50505050509050919050565b60006124ed8383611f1e565b15905092915050565b602060405190810160405280600081525090565b815481835581811511612531578183600052602060002091820191016125309190612562565b5b505050565b81548183558181151161255d5781836000526020600020918201910161255c9190612562565b5b505050565b61258491905b80821115612580576000816000905550600101612568565b5090565b905600a165627a7a723058205ae7c5eda77b75a6a5bd7b4f19339aa2b15640aab6ebf045e59b47b1a439ddc60029", + "bytecode": "0x606060405260008060146101000a81548160ff021916908315150217905550341561002957600080fd5b6040516060806127ab833981016040528080519060200190919080519060200190919080519060200190919050506000336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508390508073ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561010857600080fd5b6102c65a03f1151561011957600080fd5b50505060405180519050600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050506125b3806101f86000396000f300606060405260043610610107576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632e667c4e1461010c5780632f866f731461019a578063399f120f146101ef5780633f4ba83a1461029057806344c4ea95146102a55780635c975abb146102cc57806361a52a36146102f9578063649404bd14610322578063656e903b146103805780636f16f14a146103e75780638456cb591461043c5780638da5cb5b146104515780639ae1c1f3146104a65780639d23c4c7146104df578063ae72c6ef14610534578063ca0626471461056d578063ed8e52bd146105ba578063f2fde38b146105e1578063f466f42e1461061a575b600080fd5b341561011757600080fd5b61011f610684565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561015f578082015181840152602081019050610144565b50505050905090810190601f16801561018c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101a557600080fd5b6101ad6106bd565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101fa57600080fd5b6102146004808035600019169060200190919050506106e3565b604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390f35b341561029b57600080fd5b6102a3610946565b005b34156102b057600080fd5b6102ca600480803560001916906020019091905050610a04565b005b34156102d757600080fd5b6102df611062565b604051808215151515815260200191505060405180910390f35b341561030457600080fd5b61030c611075565b6040518082815260200191505060405180910390f35b341561032d57600080fd5b61036660048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061107c565b604051808215151515815260200191505060405180910390f35b341561038b57600080fd5b6103a5600480803560001916906020019091905050611435565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103f257600080fd5b6103fa611468565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561044757600080fd5b61044f61148e565b005b341561045c57600080fd5b61046461154e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104b157600080fd5b6104dd600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611573565b005b34156104ea57600080fd5b6104f261161c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561053f57600080fd5b61056b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611642565b005b341561057857600080fd5b6105926004808035600019169060200190919050506116eb565b6040518084151515158152602001838152602001828152602001935050505060405180910390f35b34156105c557600080fd5b6105df60048080356000191690602001909190505061176e565b005b34156105ec57600080fd5b610618600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611db2565b005b341561062557600080fd5b61062d611f07565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610670578082015181840152602081019050610655565b505050509050019250505060405180910390f35b6040805190810160405280601481526020017f455243373231436f6c6c61746572616c697a657200000000000000000000000081525081565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000806000806000806000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636be39bda8d6000604051604001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082600019166000191681526020019150506040805180830381600087803b151561079457600080fd5b6102c65a03f115156107a557600080fd5b5050506040518051906020018051905080985081995050506107c6876116eb565b809650819750829850505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635715c5b7866000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561086b57600080fd5b6102c65a03f1151561087c57600080fd5b505050604051805190509150819050851561092a578073ffffffffffffffffffffffffffffffffffffffff16634f6ccce7856000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561090857600080fd5b6102c65a03f1151561091957600080fd5b50505060405180519050925061092e565b8392505b8183899a509a509a5050505050505050509193909250565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156109a157600080fd5b600060149054906101000a900460ff1615156109bc57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b60008060008060008060149054906101000a900460ff16151515610a2757600080fd5b610a30866106e3565b809550819650829750505050600073ffffffffffffffffffffffffffffffffffffffff1660046000886000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515610ab357600080fd5b60046000876000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915060046000876000191660001916815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690558273ffffffffffffffffffffffffffffffffffffffff166303a896a1876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610bae57600080fd5b6102c65a03f11515610bbf57600080fd5b505050604051805190508373ffffffffffffffffffffffffffffffffffffffff166399114d84888673ffffffffffffffffffffffffffffffffffffffff16632762dd8c8b6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610c6557600080fd5b6102c65a03f11515610c7657600080fd5b505050604051805190506000604051602001526040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050602060405180830381600087803b1515610ce957600080fd5b6102c65a03f11515610cfa57600080fd5b5050506040518051905011151515610d1157600080fd5b8490508473ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610e21578073ffffffffffffffffffffffffffffffffffffffff1663095ea7b330866040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1515610e0c57600080fd5b6102c65a03f11515610e1d57600080fd5b5050505b8073ffffffffffffffffffffffffffffffffffffffff166323b872dd3084876040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1515610ef757600080fd5b6102c65a03f11515610f0857600080fd5b5050508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e866000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515610f9957600080fd5b6102c65a03f11515610faa57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16141515610fd357fe5b8173ffffffffffffffffffffffffffffffffffffffff1686600019167f2621540e2b91ca10330d6a7cbd6fb8cab2396f91c4935ad76b1183770819fa1f8787604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a3505050505050565b600060149054906101000a900460ff1681565b6201518081565b600080600080600080611099336005611f1e90919063ffffffff16565b15156110a457600080fd5b600060149054906101000a900460ff161515156110c057600080fd5b6110c9886106e3565b8095508196508297505050503373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151561110f57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415151561114b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600460008a6000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156111c157600080fd5b86600460008a6000191660001916815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508491503090508173ffffffffffffffffffffffffffffffffffffffff166323b872dd8883876040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b15156112f757600080fd5b6102c65a03f1151561130857600080fd5b5050508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16636352211e866000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561139957600080fd5b6102c65a03f115156113aa57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff161415156113d357fe5b8473ffffffffffffffffffffffffffffffffffffffff1688600019167f38f12634ebefbe7f6767652aae05e220f95e0ca8ef8353c9c9c5ae439a592aec866040518082815260200191505060405180910390a360019550505050505092915050565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156114e957600080fd5b600060149054906101000a900460ff1615151561150557600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156115ce57600080fd5b611619816040805190810160405280601481526020017f455243373231436f6c6c61746572616c697a65720000000000000000000000008152506005611f779092919063ffffffff16565b50565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561169d57600080fd5b6116e8816040805190810160405280601481526020017f455243373231436f6c6c61746572616c697a6572000000000000000000000000815250600561226d9092919063ffffffff16565b50565b60008060008060008060008060018002891694506d0ffffffffffff00000000000000060010289169350670ffffffffffffff060010289169250671000000000000000846001900481151561173c57fe5b0491506010836001900481151561174f57fe5b0490506001856001900414828297509750975050505050509193909250565b60008060008060008060149054906101000a900460ff1615151561179157600080fd5b61179a866106e3565b809550819650829750505050600073ffffffffffffffffffffffffffffffffffffffff1660046000886000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561181d57600080fd5b60046000876000191660001916815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690558273ffffffffffffffffffffffffffffffffffffffff166303a896a1876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156118da57600080fd5b6102c65a03f115156118eb57600080fd5b505050604051805190508373ffffffffffffffffffffffffffffffffffffffff166399114d8488426000604051602001526040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050602060405180830381600087803b151561197c57600080fd5b6102c65a03f1151561198d57600080fd5b505050604051805190501115156119a357600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ba20dda4876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515611a4457600080fd5b6102c65a03f11515611a5557600080fd5b5050506040518051905091508490508473ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611b71578073ffffffffffffffffffffffffffffffffffffffff1663095ea7b330866040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1515611b5c57600080fd5b6102c65a03f11515611b6d57600080fd5b5050505b8073ffffffffffffffffffffffffffffffffffffffff166323b872dd3084876040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1515611c4757600080fd5b6102c65a03f11515611c5857600080fd5b5050508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e866000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515611ce957600080fd5b6102c65a03f11515611cfa57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16141515611d2357fe5b8173ffffffffffffffffffffffffffffffffffffffff1686600019167f50d195a4b80a950617a8e0e18ac9dd4c0236ac72d5e12355d881443823870d398787604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a3505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611e0d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611e4957600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611f0f6124f6565b611f196005612449565b905090565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000806000611f868686611f1e565b1515611f9157600080fd5b8560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600186600201805490500391508560020182815481101515611ff357fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff021916905580866002018481548110151561208457fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055856002018281548110151561216957fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600186600201818180549050039150816121b1919061250a565b508473ffffffffffffffffffffffffffffffffffffffff167f0814e4ee85854cea446b4a27a460e5ffb41516230dbc02f226c07907e432241c856040518080602001828103825283818151815260200191508051906020019080838360005b8381101561222b578082015181840152602081019050612210565b50505050905090810190601f1680156122585780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050505050565b61227783836124e1565b151561228257600080fd5b60018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508260020180548060010182816122f29190612536565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060018360020180549050038360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f571925c699f9072cec76b6c6c000571cc8d0bb5c47e5819202e2e9496c6508b5826040518080602001828103825283818151815260200191508051906020019080838360005b8381101561240a5780820151818401526020810190506123ef565b50505050905090810190601f1680156124375780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b6124516124f6565b816002018054806020026020016040519081016040528092919081815260200182805480156124d557602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161248b575b50505050509050919050565b60006124ed8383611f1e565b15905092915050565b602060405190810160405280600081525090565b815481835581811511612531578183600052602060002091820191016125309190612562565b5b505050565b81548183558181151161255d5781836000526020600020918201910161255c9190612562565b5b505050565b61258491905b80821115612580576000816000905550600101612568565b5090565b905600a165627a7a72305820174fc2db41de3309c96220bced24b21e31ba65315015272c9874182b9cf3b6d60029", + "deployedBytecode": "0x606060405260043610610107576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632e667c4e1461010c5780632f866f731461019a578063399f120f146101ef5780633f4ba83a1461029057806344c4ea95146102a55780635c975abb146102cc57806361a52a36146102f9578063649404bd14610322578063656e903b146103805780636f16f14a146103e75780638456cb591461043c5780638da5cb5b146104515780639ae1c1f3146104a65780639d23c4c7146104df578063ae72c6ef14610534578063ca0626471461056d578063ed8e52bd146105ba578063f2fde38b146105e1578063f466f42e1461061a575b600080fd5b341561011757600080fd5b61011f610684565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561015f578082015181840152602081019050610144565b50505050905090810190601f16801561018c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101a557600080fd5b6101ad6106bd565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101fa57600080fd5b6102146004808035600019169060200190919050506106e3565b604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390f35b341561029b57600080fd5b6102a3610946565b005b34156102b057600080fd5b6102ca600480803560001916906020019091905050610a04565b005b34156102d757600080fd5b6102df611062565b604051808215151515815260200191505060405180910390f35b341561030457600080fd5b61030c611075565b6040518082815260200191505060405180910390f35b341561032d57600080fd5b61036660048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061107c565b604051808215151515815260200191505060405180910390f35b341561038b57600080fd5b6103a5600480803560001916906020019091905050611435565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103f257600080fd5b6103fa611468565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561044757600080fd5b61044f61148e565b005b341561045c57600080fd5b61046461154e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104b157600080fd5b6104dd600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611573565b005b34156104ea57600080fd5b6104f261161c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561053f57600080fd5b61056b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611642565b005b341561057857600080fd5b6105926004808035600019169060200190919050506116eb565b6040518084151515158152602001838152602001828152602001935050505060405180910390f35b34156105c557600080fd5b6105df60048080356000191690602001909190505061176e565b005b34156105ec57600080fd5b610618600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611db2565b005b341561062557600080fd5b61062d611f07565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610670578082015181840152602081019050610655565b505050509050019250505060405180910390f35b6040805190810160405280601481526020017f455243373231436f6c6c61746572616c697a657200000000000000000000000081525081565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000806000806000806000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636be39bda8d6000604051604001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082600019166000191681526020019150506040805180830381600087803b151561079457600080fd5b6102c65a03f115156107a557600080fd5b5050506040518051906020018051905080985081995050506107c6876116eb565b809650819750829850505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635715c5b7866000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561086b57600080fd5b6102c65a03f1151561087c57600080fd5b505050604051805190509150819050851561092a578073ffffffffffffffffffffffffffffffffffffffff16634f6ccce7856000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561090857600080fd5b6102c65a03f1151561091957600080fd5b50505060405180519050925061092e565b8392505b8183899a509a509a5050505050505050509193909250565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156109a157600080fd5b600060149054906101000a900460ff1615156109bc57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b60008060008060008060149054906101000a900460ff16151515610a2757600080fd5b610a30866106e3565b809550819650829750505050600073ffffffffffffffffffffffffffffffffffffffff1660046000886000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515610ab357600080fd5b60046000876000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915060046000876000191660001916815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690558273ffffffffffffffffffffffffffffffffffffffff166303a896a1876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610bae57600080fd5b6102c65a03f11515610bbf57600080fd5b505050604051805190508373ffffffffffffffffffffffffffffffffffffffff166399114d84888673ffffffffffffffffffffffffffffffffffffffff16632762dd8c8b6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610c6557600080fd5b6102c65a03f11515610c7657600080fd5b505050604051805190506000604051602001526040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050602060405180830381600087803b1515610ce957600080fd5b6102c65a03f11515610cfa57600080fd5b5050506040518051905011151515610d1157600080fd5b8490508473ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610e21578073ffffffffffffffffffffffffffffffffffffffff1663095ea7b330866040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1515610e0c57600080fd5b6102c65a03f11515610e1d57600080fd5b5050505b8073ffffffffffffffffffffffffffffffffffffffff166323b872dd3084876040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1515610ef757600080fd5b6102c65a03f11515610f0857600080fd5b5050508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e866000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515610f9957600080fd5b6102c65a03f11515610faa57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16141515610fd357fe5b8173ffffffffffffffffffffffffffffffffffffffff1686600019167f2621540e2b91ca10330d6a7cbd6fb8cab2396f91c4935ad76b1183770819fa1f8787604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a3505050505050565b600060149054906101000a900460ff1681565b6201518081565b600080600080600080611099336005611f1e90919063ffffffff16565b15156110a457600080fd5b600060149054906101000a900460ff161515156110c057600080fd5b6110c9886106e3565b8095508196508297505050503373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151561110f57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415151561114b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600460008a6000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156111c157600080fd5b86600460008a6000191660001916815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508491503090508173ffffffffffffffffffffffffffffffffffffffff166323b872dd8883876040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b15156112f757600080fd5b6102c65a03f1151561130857600080fd5b5050508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16636352211e866000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561139957600080fd5b6102c65a03f115156113aa57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff161415156113d357fe5b8473ffffffffffffffffffffffffffffffffffffffff1688600019167f38f12634ebefbe7f6767652aae05e220f95e0ca8ef8353c9c9c5ae439a592aec866040518082815260200191505060405180910390a360019550505050505092915050565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156114e957600080fd5b600060149054906101000a900460ff1615151561150557600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156115ce57600080fd5b611619816040805190810160405280601481526020017f455243373231436f6c6c61746572616c697a65720000000000000000000000008152506005611f779092919063ffffffff16565b50565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561169d57600080fd5b6116e8816040805190810160405280601481526020017f455243373231436f6c6c61746572616c697a6572000000000000000000000000815250600561226d9092919063ffffffff16565b50565b60008060008060008060008060018002891694506d0ffffffffffff00000000000000060010289169350670ffffffffffffff060010289169250671000000000000000846001900481151561173c57fe5b0491506010836001900481151561174f57fe5b0490506001856001900414828297509750975050505050509193909250565b60008060008060008060149054906101000a900460ff1615151561179157600080fd5b61179a866106e3565b809550819650829750505050600073ffffffffffffffffffffffffffffffffffffffff1660046000886000191660001916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561181d57600080fd5b60046000876000191660001916815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690558273ffffffffffffffffffffffffffffffffffffffff166303a896a1876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156118da57600080fd5b6102c65a03f115156118eb57600080fd5b505050604051805190508373ffffffffffffffffffffffffffffffffffffffff166399114d8488426000604051602001526040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200182815260200192505050602060405180830381600087803b151561197c57600080fd5b6102c65a03f1151561198d57600080fd5b505050604051805190501115156119a357600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ba20dda4876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515611a4457600080fd5b6102c65a03f11515611a5557600080fd5b5050506040518051905091508490508473ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611b71578073ffffffffffffffffffffffffffffffffffffffff1663095ea7b330866040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1515611b5c57600080fd5b6102c65a03f11515611b6d57600080fd5b5050505b8073ffffffffffffffffffffffffffffffffffffffff166323b872dd3084876040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1515611c4757600080fd5b6102c65a03f11515611c5857600080fd5b5050508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e866000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515611ce957600080fd5b6102c65a03f11515611cfa57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16141515611d2357fe5b8173ffffffffffffffffffffffffffffffffffffffff1686600019167f50d195a4b80a950617a8e0e18ac9dd4c0236ac72d5e12355d881443823870d398787604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a3505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611e0d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611e4957600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611f0f6124f6565b611f196005612449565b905090565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000806000611f868686611f1e565b1515611f9157600080fd5b8560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600186600201805490500391508560020182815481101515611ff357fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff021916905580866002018481548110151561208457fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055856002018281548110151561216957fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600186600201818180549050039150816121b1919061250a565b508473ffffffffffffffffffffffffffffffffffffffff167f0814e4ee85854cea446b4a27a460e5ffb41516230dbc02f226c07907e432241c856040518080602001828103825283818151815260200191508051906020019080838360005b8381101561222b578082015181840152602081019050612210565b50505050905090810190601f1680156122585780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050505050565b61227783836124e1565b151561228257600080fd5b60018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508260020180548060010182816122f29190612536565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060018360020180549050038360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f571925c699f9072cec76b6c6c000571cc8d0bb5c47e5819202e2e9496c6508b5826040518080602001828103825283818151815260200191508051906020019080838360005b8381101561240a5780820151818401526020810190506123ef565b50505050905090810190601f1680156124375780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b6124516124f6565b816002018054806020026020016040519081016040528092919081815260200182805480156124d557602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161248b575b50505050509050919050565b60006124ed8383611f1e565b15905092915050565b602060405190810160405280600081525090565b815481835581811511612531578183600052602060002091820191016125309190612562565b5b505050565b81548183558181151161255d5781836000526020600020918201910161255c9190612562565b5b505050565b61258491905b80821115612580576000816000905550600101612568565b5090565b905600a165627a7a72305820174fc2db41de3309c96220bced24b21e31ba65315015272c9874182b9cf3b6d60029", "sourceMap": "1353:14629:7:-;;;268:5:37;247:26;;;;;;;;;;;;;;;;;;;;2885:620:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3045:33;509:10:39;501:5;;:18;;;;;;;;;;;;;;;;;;3098:17:7;3045:71;;3210:16;:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3195:12;;:46;;;;;;;;;;;;;;;;;;3348:14;3312:13;;:51;;;;;;;;;;;;;;;;;;3476:22;3452:21;;:46;;;;;;;;;;;;;;;;;;2885:620;;;;1353:14629;;;;;;", "deployedSourceMap": "1353:14629:7:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2091:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1506:32:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14227:1753;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;833:87:37;;;;;;;;;;;;;;6098:2355:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;247:26:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2034:50:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3748:2091;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1904:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1779:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;666:85:37;;;;;;;;;;;;;;238:20:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11482:175:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;1544:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11188:164;;;;;;;;;;;;;;;;;;;;;;;;;;;;12101:1816;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8713:2350;;;;;;;;;;;;;;;;;;;;;;;;;;;;;832:169:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;11762:178:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;2091:55:7;;;;;;;;;;;;;;;;;;;;:::o;1506:32::-;;;;;;;;;;;;;:::o;14227:1753::-;14344:31;14389:26;14429:28;14482;14520:31;14737:17;14764:28;14802:26;14838:22;15242:30;15346:18;14692:12;;;;;;;;;;;:21;;;14714:11;14692:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14642:84;;;;;;;;15075:60;15111:23;15075:35;:60::i;:::-;14966:169;;;;;;;;;;;;15275:13;;;;;;;;;;;:36;;;15312:23;15275:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15242:94;;15374:22;15346:51;;15658:12;15654:176;;;15706:11;:24;;;15731:18;15706:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15686:64;;15654:176;;;15801:18;15781:38;;15654:176;15861:22;15897:17;15942:20;15840:133;;;;;;14227:1753;;;;;;;;;;;;;:::o;833:87:37:-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;568:6:37;;;;;;;;;;;560:15;;;;;;;;895:5;886:6;;:14;;;;;;;;;;;;;;;;;;906:9;;;;;;;;;;833:87::o;6098:2355:7:-;6257:30;6386:25;6506:27;7110:14;7693:18;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;6711:41:7;6740:11;6711:28;:41::i;:::-;6604:148;;;;;;;;;;;;7049:1;7007:44;;:17;:30;7025:11;7007:30;;;;;;;;;;;;;;;;;;;;;;;;;;;:44;;;;6999:53;;;;;;;;7127:17;:30;7145:11;7127:30;;;;;;;;;;;;;;;;;;;;;;;;;;;7110:47;;7269:17;:30;7287:11;7269:30;;;;;;;;;;;;;;;;;;7262:37;;;;;;;;;;;7543:13;:34;;;7578:11;7543:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7393:13;:39;;;7450:11;7479:13;:33;;;7513:11;7479:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7393:146;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:197;;7372:228;;;;;;;;7721:22;7693:51;;7879:22;7854:47;;:21;;;;;;;;;;;:47;;;7850:131;;;7917:11;:19;;;7945:4;7952:17;7917:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7850:131;8082:11;:24;;;8115:4;8122:6;8130:17;8082:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8255:6;8213:48;;:11;:19;;;8233:17;8213:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:48;;;8206:56;;;;;;8363:6;8306:140;;8338:11;8306:140;;;;8383:22;8419:17;8306:140;;;;;;;;;;;;;;;;;;;;;;;;;;;;6098:2355;;;;;;:::o;247:26:37:-;;;;;;;;;;;;;:::o;2034:50:7:-;2072:12;2034:50;:::o;3748:2091::-;3922:13;3998:30;4127:25;4247:27;5295:18;5356:17;2807:53;2849:10;2807:28;:41;;:53;;;;:::i;:::-;2799:62;;;;;;;;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;4451:41:7;4480:11;4451:28;:41::i;:::-;4344:148;;;;;;;;;;;;4528:10;4511:27;;:13;:27;;;4503:36;;;;;;;;4591:1;4557:36;;:22;:36;;;;4549:45;;;;;;;;5129:1;5087:44;;:17;:30;5105:11;5087:30;;;;;;;;;;;;;;;;;;;;;;;;;;;:44;;;5079:53;;;;;;;;5278:6;5245:17;:30;5263:11;5245:30;;;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;5323:22;5295:51;;5384:4;5356:33;;5459:11;:24;;;5484:6;5492:9;5503:17;5459:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5658:9;5616:51;;:11;:19;;;5636:17;5616:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:51;;;5609:59;;;;;;5768:22;5738:72;;5755:11;5738:72;;;;5792:17;5738:72;;;;;;;;;;;;;;;;;;5828:4;5821:11;;3748:2091;;;;;;;;;:::o;1904:52::-;;;;;;;;;;;;;;;;;;;;;;:::o;1779:36::-;;;;;;;;;;;;;:::o;666:85:37:-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;729:4;720:6;;:13;;;;;;;;;;;;;;;;;;739:7;;;;;;;;;;666:85::o;238:20:39:-;;;;;;;;;;;;;:::o;11482:175:7:-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;11586:64:7;11635:5;11642:7;;;;;;;;;;;;;;;;;;11586:28;:48;;:64;;;;;:::i;:::-;11482:175;:::o;1544:40::-;;;;;;;;;;;;;:::o;11188:164::-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;11291:54:7;11330:5;11337:7;;;;;;;;;;;;;;;;;;11291:28;:38;;:54;;;;;:::i;:::-;11188:164;:::o;12101:1816::-;12211:4;12217;12223;12478:20;12853:38;13307:23;13501:28;13641:13;12526:66;12513:79;;:10;:79;12478:114;;12919:66;12906:79;;:10;:79;12853:132;;13358:66;13345:79;;:10;:79;13307:117;;13571:7;13537:30;13532:36;;;:46;;;;;;;;13501:77;;13681:6;13662:15;13657:21;;;:30;;;;;;;;13641:46;;13840:1;13823:12;13818:18;;;:23;13855;13892:8;13698:212;;;;;;12101:1816;;;;;;;;;;:::o;8713:2350::-;8872:30;9001:25;9121:27;10138:19;10293:18;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;9326:41:7;9355:11;9326:28;:41::i;:::-;9219:148;;;;;;;;;;;;9661:1;9619:44;;:17;:30;9637:11;9619:30;;;;;;;;;;;;;;;;;;;;;;;;;;;:44;;;;9611:53;;;;;;;;9776:17;:30;9794:11;9776:30;;;;;;;;;;;;;;;;;;9769:37;;;;;;;;;;;10005:13;:34;;;10040:11;10005:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9887:13;:39;;;9944:11;9973:15;9887:115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:165;9866:196;;;;;;;;10160:12;;;;;;;;;;;:27;;;10188:11;10160:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10138:62;;10321:22;10293:51;;10479:22;10454:47;;:21;;;;;;;;;;;:47;;;10450:131;;;10517:11;:19;;;10545:4;10552:17;10517:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10450:131;10678:11;:24;;;10711:4;10718:11;10731:17;10678:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10856:11;10814:53;;:11;:19;;;10834:17;10814:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:53;;;10807:61;;;;;;10968:11;10913:143;;10943:11;10913:143;;;;10993:22;11029:17;10913:143;;;;;;;;;;;;;;;;;;;;;;;;;;;;8713:2350;;;;;;:::o;832:169:39:-;653:5;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;928:1;908:22;;:8;:22;;;;900:31;;;;;;;;965:8;937:37;;958:5;;;;;;;;;;;937:37;;;;;;;;;;;;988:8;980:5;;:16;;;;;;;;;;;;;;;;;;832:169;:::o;11762:178:7:-;11851:9;;:::i;:::-;11883:50;:28;:48;:50::i;:::-;11876:57;;11762:178;:::o;3295:166:17:-;3405:4;3432;:15;;:22;3448:5;3432:22;;;;;;;;;;;;;;;;;;;;;;;;;3425:29;;3295:166;;;;:::o;2121:1168::-;2489:25;2551:23;2619:19;2452:25;2465:4;2471:5;2452:12;:25::i;:::-;2444:34;;;;;;;;2517:4;:17;;:24;2535:5;2517:24;;;;;;;;;;;;;;;;2489:52;;2608:1;2577:4;:21;;:28;;;;:32;2551:58;;2641:4;:21;;2663:18;2641:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;2619:63;;2745:4;:15;;:22;2761:5;2745:22;;;;;;;;;;;;;;;;2738:29;;;;;;;;;;;2894:11;2848:4;:21;;2870:20;2848:43;;;;;;;;;;;;;;;;;;;:57;;;;;;;;;;;;;;;;;;3009:20;2976:4;:17;;:30;2994:11;2976:30;;;;;;;;;;;;;;;:53;;;;3046:4;:17;;:24;3064:5;3046:24;;;;;;;;;;;;;;;3039:31;;;3144:4;:21;;3166:18;3144:41;;;;;;;;;;;;;;;;;;;3137:48;;;;;;;;;;;3227:1;3195:4;:21;;:33;;;;;;;;;;;;;;:::i;:::-;;3260:5;3239:43;;;3267:14;3239:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2121:1168:17;;;;;;:::o;1732:383::-;1884:28;1900:4;1906:5;1884:15;:28::i;:::-;1876:37;;;;;;;;1949:4;1924;:15;;:22;1940:5;1924:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;1963:4;:21;;:33;;;;;;;;;;;:::i;:::-;;;;;;;;;;1990:5;1963:33;;;;;;;;;;;;;;;;;;;;;;;2064:1;2033:4;:21;;:28;;;;:32;2006:4;:17;;:24;2024:5;2006:24;;;;;;;;;;;;;;;:59;;;;2086:5;2075:33;;;2093:14;2075:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1732:383:17;;;:::o;3646:162::-;3748:9;;:::i;:::-;3780:4;:21;;3773:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3646:162;;;:::o;3467:173::-;3580:4;3608:25;3621:4;3627:5;3608:12;:25::i;:::-;3607:26;3600:33;;3467:173;;;;:::o;1353:14629:7:-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\nimport \"zeppelin-solidity/contracts/math/SafeMath.sol\";\nimport \"zeppelin-solidity/contracts/token/ERC721/ERC721.sol\";\n\nimport \"./TermsContract.sol\";\nimport \"./DebtRegistry.sol\";\nimport \"./ContractRegistry.sol\";\nimport \"./ERC721TokenRegistry.sol\";\n\nimport {PermissionsLib, PermissionEvents} from \"./libraries/PermissionsLib.sol\";\n\n\n/**\n * Contains functionality for collateralizing NFTs, including a `collateralize` method for\n * transferring a debtor's asset to this contract, as well as methods for returning\n * or seizing collateral depending on the state of the underlying debt agreement.\n *\n * NOTE: The `collateralize` method in this contract can only be called by a trusted TermsContract,\n * specified by the contract's owner.\n */\ncontract ERC721Collateralizer is Pausable, PermissionEvents {\n using PermissionsLib for PermissionsLib.Permissions;\n using SafeMath for uint;\n\n DebtRegistry public debtRegistry;\n ERC721TokenRegistry public tokenRegistry;\n\n // We store the address of the CryptoKitties contract, in order to work around a minor issue\n // relating to transfers, since its contract does not comply with the ERC721 standard.\n address public cryptoKittiesContract;\n\n // Debtor here refers to the owner of the asset that is being collateralized.\n mapping(bytes32 => address) public agreementToDebtor;\n\n PermissionsLib.Permissions internal collateralizationPermissions;\n\n uint public constant SECONDS_IN_DAY = 24 * 60 * 60;\n\n string public constant CONTEXT = \"ERC721Collateralizer\";\n\n event CollateralLocked(\n bytes32 indexed agreementID,\n // The address of the ERC721 contract for the token.\n address indexed erc721Contract,\n // The id of the token associated with the ERC721 contract.\n uint256 tokenID\n );\n\n event CollateralReturned(\n bytes32 indexed agreementID,\n address indexed debtor,\n address erc721Contract,\n uint256 tokenID\n );\n\n event CollateralSeized(\n bytes32 indexed agreementID,\n address indexed beneficiary,\n address erc721Contract,\n uint256 tokenID\n );\n\n modifier onlyAuthorizedToCollateralize() {\n require(collateralizationPermissions.isAuthorized(msg.sender));\n _;\n }\n\n function ERC721Collateralizer(\n address _contractRegistry,\n address _tokenRegistry,\n address _cryptoKittiesContract\n ) public {\n ContractRegistry contractRegistry = ContractRegistry(_contractRegistry);\n\n // Get the DebtRegistry contract from the ContractRegistry.\n debtRegistry = contractRegistry.debtRegistry();\n // Instantiate a special token registry for ERC721s.\n tokenRegistry = ERC721TokenRegistry(_tokenRegistry);\n // Keep track of the CryptoKitties contract, for specific workarounds.\n cryptoKittiesContract = _cryptoKittiesContract;\n }\n\n /**\n * Transfers collateral from the debtor to the current contract, as custodian.\n *\n * @param agreementId bytes32 The debt agreement's ID\n * @param debtor address The owner of the asset being collateralized\n */\n function collateralize(\n bytes32 agreementId,\n address debtor\n )\n public\n onlyAuthorizedToCollateralize\n whenNotPaused\n returns (bool _success)\n {\n // The address of the ERC721 contract.\n address collateralTokenAddress;\n // The token id, associating the collateral token and the given ERC721 contract.\n uint256 collateralTokenID;\n // The terms contract according to which this asset is being collateralized.\n TermsContract termsContract;\n\n // Fetch all relevant collateralization parameters\n (\n collateralTokenAddress,\n collateralTokenID,\n termsContract\n ) = retrieveCollateralParameters(agreementId);\n\n require(termsContract == msg.sender);\n require(collateralTokenAddress != address(0));\n\n /*\n Ensure that the agreement has not already been collateralized.\n\n If the agreement has already been collateralized, this check will fail\n because any valid collateralization must have some sort of valid\n address associated with it as a debtor. Given that it is impossible\n to send transactions from address 0x0, this check will only fail\n when the agreement is already collateralized.\n */\n require(agreementToDebtor[agreementId] == address(0));\n\n // Store debtor in mapping, effectively demarcating that the agreement is now collateralized.\n agreementToDebtor[agreementId] = debtor;\n\n ERC721 erc721token = ERC721(collateralTokenAddress);\n address custodian = address(this);\n\n // Transfer the collateral asset to this contract.\n erc721token.transferFrom(debtor, custodian, collateralTokenID);\n\n // Ensure that this contract is in fact the owner of the collateral.\n assert(erc721token.ownerOf(collateralTokenID) == custodian);\n\n // Emit an event that collateral has been secured.\n CollateralLocked(agreementId, collateralTokenAddress, collateralTokenID);\n\n return true;\n }\n\n /**\n * Returns collateral to the debt agreement's debtor if and only if the debt agreement's\n * term has lapsed and the total expected repayment value has been repaid.\n *\n * @param agreementId bytes32 The debt agreement's ID\n */\n function returnCollateral(\n bytes32 agreementId\n )\n public\n whenNotPaused\n {\n // The address of the ERC721 contract.\n address collateralTokenAddress;\n // The token id, associating the collateral token and the given ERC721 contract.\n uint256 collateralTokenID;\n // The terms contract according to which this asset is being collateralized.\n TermsContract termsContract;\n\n // Fetch all relevant collateralization parameters.\n (\n collateralTokenAddress,\n collateralTokenID,\n termsContract\n ) = retrieveCollateralParameters(agreementId);\n\n // Withdrawal can only occur if the collateral has yet to be withdrawn.\n // When we withdraw collateral, we reset the collateral agreement\n // in a gas-efficient manner by resetting the address of the debtor to 0.\n require(agreementToDebtor[agreementId] != address(0));\n\n // Determine debtor of the collateral.\n address debtor = agreementToDebtor[agreementId];\n\n // Mark agreement's collateral as withdrawn by setting the agreement's debtor to 0x0.\n delete agreementToDebtor[agreementId];\n\n // Ensure that the debt is not in a state of default.\n require(\n termsContract.getExpectedRepaymentValue(\n agreementId,\n termsContract.getTermEndTimestamp(agreementId)\n ) <= termsContract.getValueRepaidToDate(agreementId)\n );\n\n // Instantiate an instance of the token, in order to initiate a transfer.\n ERC721 erc721token = ERC721(collateralTokenAddress);\n\n // Apply a hack for CryptoKitties, granting transfer approval to this contract itself.\n if (cryptoKittiesContract == collateralTokenAddress) {\n erc721token.approve(address(this), collateralTokenID);\n }\n\n // Transfer the collateral this contract was holding in escrow back to the debtor.\n erc721token.transferFrom(address(this), debtor, collateralTokenID);\n\n // Ensure that transfer has succeeded.\n assert(erc721token.ownerOf(collateralTokenID) == debtor);\n\n // Log the return event.\n CollateralReturned(\n agreementId,\n debtor,\n collateralTokenAddress,\n collateralTokenID\n );\n }\n\n /**\n * Seizes the collateral from the given debt agreement and\n * transfers it to the debt agreement's current beneficiary\n * (i.e. the person who \"owns\" the debt).\n *\n * @param agreementId bytes32 The debt agreement's ID\n */\n function seizeCollateral(\n bytes32 agreementId\n )\n public\n whenNotPaused\n {\n\n // The address of the ERC721 contract.\n address collateralTokenAddress;\n // The token id, associating the collateral token and the given ERC721 contract.\n uint256 collateralTokenID;\n // The terms contract according to which this asset is being collateralized.\n TermsContract termsContract;\n\n // Fetch all relevant collateralization parameters.\n (\n collateralTokenAddress,\n collateralTokenID,\n termsContract\n ) = retrieveCollateralParameters(agreementId);\n\n // Seizure can only occur if the collateral has yet to be withdrawn.\n // When we withdraw collateral, we reset the collateral agreement\n // in a gas-efficient manner by resetting the address of the debtor to 0.\n require(agreementToDebtor[agreementId] != address(0));\n\n // Mark agreement's collateral as withdrawn by setting the agreement's debtor to 0x0.\n delete agreementToDebtor[agreementId];\n\n // Ensure debt is in a state of default.\n require(\n termsContract.getExpectedRepaymentValue(\n agreementId,\n block.timestamp\n ) > termsContract.getValueRepaidToDate(agreementId)\n );\n\n // Determine beneficiary of the collateral to be seized.\n address beneficiary = debtRegistry.getBeneficiary(agreementId);\n\n // Instantiate an instance of the token, in order to initiate a transfer.\n ERC721 erc721token = ERC721(collateralTokenAddress);\n\n // Apply a hack for CryptoKitties, granting transfer approval to this contract itself.\n if (cryptoKittiesContract == collateralTokenAddress) {\n erc721token.approve(address(this), collateralTokenID);\n }\n\n // Transfer the collateral this contract was holding in escrow to beneficiary.\n erc721token.transferFrom(address(this), beneficiary, collateralTokenID);\n\n // Ensure that transfer has succeeded.\n assert(erc721token.ownerOf(collateralTokenID) == beneficiary);\n\n // Log the seizure event.\n CollateralSeized(\n agreementId,\n beneficiary,\n collateralTokenAddress,\n collateralTokenID\n );\n }\n\n /**\n * Adds an address to the list of agents authorized\n * to invoke the `collateralize` function.\n */\n function addAuthorizedCollateralizeAgent(address agent)\n public\n onlyOwner\n {\n collateralizationPermissions.authorize(agent, CONTEXT);\n }\n\n /**\n * Removes an address from the list of agents authorized\n * to invoke the `collateralize` function.\n */\n function revokeCollateralizeAuthorization(address agent)\n public\n onlyOwner\n {\n collateralizationPermissions.revokeAuthorization(agent, CONTEXT);\n }\n\n /**\n * Returns the list of agents authorized to invoke the 'collateralize' function.\n */\n function getAuthorizedCollateralizeAgents()\n public\n view\n returns (address[])\n {\n return collateralizationPermissions.getAuthorizedAgents();\n }\n\n /**\n * Unpacks collateralization-specific parameters from their tightly-packed\n * representation in a terms contract parameter string.\n */\n function unpackCollateralParametersFromBytes(bytes32 parameters)\n public\n pure\n returns (bool, uint, uint)\n {\n // We use use a flag, 0 or 1, to specify whether the given collateral token's contract\n // implements the Enumerable extension. If so, we can refer to a token by its index instead\n // of its ID to conserve space.\n bytes32 isEnumerable =\n parameters & 0x0000000000000000000000000000000000000000000000000000000000000001;\n // Here we get the index of the ERC721 contract within the ERC721TokenRegistry.\n // In its raw form it will be \"shifted\" 15 characters to the left (I.E. it has 15 \"0\"s after\n // the actual value), so we still need to unshift it.\n bytes32 collateralContractIndexShifted =\n parameters & 0x0000000000000000000000000000000000000ffffffffffff000000000000000;\n // We get the id or index of the ERC721 token associated with the ERC721 contract.\n // To retrieve this token reference, we take only the value of the specific\n // parameters that encode it, and then shift that value 1 place to the right - thereby\n // ignoring all other parameters.\n bytes32 tokenRefShifted =\n parameters & 0x0000000000000000000000000000000000000000000000000ffffffffffffff0;\n\n // Shift the contract index value 15 places to the right.\n uint collateralContractIndex = uint(collateralContractIndexShifted) / 2 ** 60;\n // Shift the token ref 1 space to the right.\n uint tokenRef = uint(tokenRefShifted) / 2 ** 4;\n\n return (\n // Since we want to return a boolean, we return whether or not the flag is equal to 1.\n uint(isEnumerable) == 1,\n collateralContractIndex,\n tokenRef\n );\n }\n\n /**\n * Unpacks the terms contract parameters, and uses those parameters to retrieve specific\n * values that are pertinent to this collateralizer contract -- such as the address of the\n * collateral token and the token's ID, which are not encoded in the terms contract parameters.\n */\n function retrieveCollateralParameters(bytes32 agreementId)\n public\n view\n returns (\n address _collateralTokenAddress,\n uint256 _collateralTokenID,\n TermsContract _termsContract\n )\n {\n address termsContractAddress;\n bytes32 termsContractParameters;\n\n // Pull the terms contract and associated parameters for the agreement.\n (termsContractAddress, termsContractParameters) = debtRegistry.getTerms(agreementId);\n\n bool isEnumerable;\n uint collateralContractIndex;\n uint256 collateralTokenRef;\n uint collateralTokenID;\n\n // Unpack terms contract parameters in order to get collateralization-specific params.\n (\n isEnumerable,\n collateralContractIndex,\n collateralTokenRef,\n ) = unpackCollateralParametersFromBytes(termsContractParameters);\n\n // Resolve address of ERC721 contract associated with this agreement in token registry.\n address collateralTokenAddress = tokenRegistry.getTokenAddressByIndex(collateralContractIndex);\n ERC721 erc721token = ERC721(collateralTokenAddress);\n\n // If the contract implements the Enumerable extension, then we can use the token reference\n // parameters as an index to the token. Otherwise, we assume that the token reference parameter\n // refers to the token id itself.\n if (isEnumerable) {\n collateralTokenID = erc721token.tokenByIndex(collateralTokenRef);\n } else {\n collateralTokenID = collateralTokenRef;\n }\n\n return (\n collateralTokenAddress,\n collateralTokenID,\n TermsContract(termsContractAddress)\n );\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/ERC721Collateralizer.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/ERC721Collateralizer.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/ERC721Collateralizer.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/ERC721Collateralizer.sol", "exportedSymbols": { "ERC721Collateralizer": [ 4166 @@ -518,7 +518,7 @@ export const ERC721Collateralizer = { "attributes": { "SourceUnit": 4758, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/TermsContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/TermsContract.sol", "file": "./TermsContract.sol", "scope": 4167, "symbolAliases": [ @@ -533,7 +533,7 @@ export const ERC721Collateralizer = { "attributes": { "SourceUnit": 3159, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/DebtRegistry.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/DebtRegistry.sol", "file": "./DebtRegistry.sol", "scope": 4167, "symbolAliases": [ @@ -548,7 +548,7 @@ export const ERC721Collateralizer = { "attributes": { "SourceUnit": 924, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/ContractRegistry.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/ContractRegistry.sol", "file": "./ContractRegistry.sol", "scope": 4167, "symbolAliases": [ @@ -563,7 +563,7 @@ export const ERC721Collateralizer = { "attributes": { "SourceUnit": 4458, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/ERC721TokenRegistry.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/ERC721TokenRegistry.sol", "file": "./ERC721TokenRegistry.sol", "scope": 4167, "symbolAliases": [ @@ -578,7 +578,7 @@ export const ERC721Collateralizer = { "attributes": { "SourceUnit": 6272, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/libraries/PermissionsLib.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/libraries/PermissionsLib.sol", "file": "./libraries/PermissionsLib.sol", "scope": 4167, "symbolAliases": [ @@ -9499,7 +9499,7 @@ export const ERC721Collateralizer = } }, "links": {}, - "address": "0xc241691f9c1663b4452c3d867de6cb72ce4ccb4b" + "address": "0xf3abfc01a071e8bbf3f820c2629510b9bc5e3229" }, "70": { "events": { @@ -9648,5 +9648,5 @@ export const ERC721Collateralizer = } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:16:13.736Z" + "updatedAt": "2018-10-09T17:53:04.896Z" } \ No newline at end of file diff --git a/artifacts/ts/ERC721Enumerable.ts b/artifacts/ts/ERC721Enumerable.ts index 36372be7..91eda6cf 100644 --- a/artifacts/ts/ERC721Enumerable.ts +++ b/artifacts/ts/ERC721Enumerable.ts @@ -1064,5 +1064,5 @@ export const ERC721Enumerable = }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:48.050Z" + "updatedAt": "2018-10-09T17:45:35.440Z" } \ No newline at end of file diff --git a/artifacts/ts/ERC721Metadata.ts b/artifacts/ts/ERC721Metadata.ts index 3248cdd7..2f21e3ef 100644 --- a/artifacts/ts/ERC721Metadata.ts +++ b/artifacts/ts/ERC721Metadata.ts @@ -1055,5 +1055,5 @@ export const ERC721Metadata = }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:48.050Z" + "updatedAt": "2018-10-09T17:45:35.441Z" } \ No newline at end of file diff --git a/artifacts/ts/ERC721Receiver.ts b/artifacts/ts/ERC721Receiver.ts index c67f405f..aff24b93 100644 --- a/artifacts/ts/ERC721Receiver.ts +++ b/artifacts/ts/ERC721Receiver.ts @@ -275,5 +275,5 @@ export const ERC721Receiver = }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:48.053Z" + "updatedAt": "2018-10-09T17:45:35.427Z" } \ No newline at end of file diff --git a/artifacts/ts/ERC721Token.ts b/artifacts/ts/ERC721Token.ts index 6f091dcc..d4fb4e40 100644 --- a/artifacts/ts/ERC721Token.ts +++ b/artifacts/ts/ERC721Token.ts @@ -5400,7 +5400,7 @@ export const ERC721Token = "42": { "events": {}, "links": {}, - "address": "0x29fbda47ddc8b9853a0cf9bf0abf4611ff5f3abe" + "address": "0xebc1a917d464d779ad5eba480de9935bf4ce9760" }, "70": { "events": {}, @@ -5409,5 +5409,5 @@ export const ERC721Token = } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:13:01.017Z" + "updatedAt": "2018-10-09T17:50:01.301Z" } \ No newline at end of file diff --git a/artifacts/ts/ERC721TokenRegistry.ts b/artifacts/ts/ERC721TokenRegistry.ts index 0e525030..69374d62 100644 --- a/artifacts/ts/ERC721TokenRegistry.ts +++ b/artifacts/ts/ERC721TokenRegistry.ts @@ -298,15 +298,15 @@ export const ERC721TokenRegistry = "type": "event" } ], - "bytecode": "0x6060604052336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061190b806100536000396000f3006060604052600436106100d0576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680631e71f8d1146100d55780632e1e1bb3146102105780633550b6d9146102815780633dbe284a1461031e5780635715c5b7146104155780636e7cbb0d146104785780638052348b146105145780638da5cb5b1461062457806395f121bf14610679578063bd7b564d14610715578063c0d0b6ff146107eb578063c51ccb40146108aa578063f2fde38b146108df578063fa7f369714610918575b600080fd5b34156100e057600080fd5b6100f660048080359060200190919050506109b4565b604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018060200180602001838103835285818151815260200191508051906020019080838360005b8381101561016c578082015181840152602081019050610151565b50505050905090810190601f1680156101995780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b838110156101d25780820151818401526020810190506101b7565b50505050905090810190601f1680156101ff5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b341561021b57600080fd5b61026b600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610b34565b6040518082815260200191505060405180910390f35b341561028c57600080fd5b6102dc600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610bc9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561032957600080fd5b610343600480803560001916906020019091905050610c7e565b604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001806020018281038252838181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156104045780601f106103d957610100808354040283529160200191610404565b820191906000526020600020905b8154815290600101906020018083116103e757829003601f168201915b505094505050505060405180910390f35b341561042057600080fd5b6104366004808035906020019091905050610cc7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561048357600080fd5b6104996004808035906020019091905050610d89565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104d95780820151818401526020810190506104be565b50505050905090810190601f1680156105065780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561051f57600080fd5b61056f600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610e44565b604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156105e75780820151818401526020810190506105cc565b50505050905090810190601f1680156106145780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b341561062f57600080fd5b610637610fad565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561068457600080fd5b61069a6004808035906020019091905050610fd2565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156106da5780820151818401526020810190506106bf565b50505050905090810190601f1680156107075780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561072057600080fd5b610770600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611087565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156107b0578082015181840152602081019050610795565b50505050905090810190601f1680156107dd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156107f657600080fd5b6108a8600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506111ba565b005b34156108b557600080fd5b6108bd6115ad565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b34156108ea57600080fd5b610916600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506115c7565b005b341561092357600080fd5b610939600480803590602001909190505061171c565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561097957808201518184015260208101905061095e565b50505050905090810190601f1680156109a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b60006109be611754565b6109c6611754565b6109ce611754565b6000806109da87610d89565b9250826040518082805190602001908083835b602083101515610a1257805182526020820191506020810190506020830392506109ed565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168382600201808054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610b1d5780601f10610af257610100808354040283529160200191610b1d565b820191906000526020600020905b815481529060010190602001808311610b0057829003601f168201915b505050505090509550955095505050509193909250565b6000806000836040518082805190602001908083835b602083101515610b6f5780518252602082019150602081019050602083039250610b4a565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902091506001600083600019166000191681526020019081526020016000209050806001015492505050919050565b6000806000836040518082805190602001908083835b602083101515610c045780518252602082019150602081019050602083039250610bdf565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692505050919050565b60016020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201905083565b60008060028363ffffffff81101515610cdc57fe5b019050610d81818054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610d775780601f10610d4c57610100808354040283529160200191610d77565b820191906000526020600020905b815481529060010190602001808311610d5a57829003601f168201915b5050505050610bc9565b915050919050565b610d91611754565b60028263ffffffff81101515610da357fe5b018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610e385780601f10610e0d57610100808354040283529160200191610e38565b820191906000526020600020905b815481529060010190602001808311610e1b57829003601f168201915b50505050509050919050565b600080610e4f611754565b600080856040518082805190602001908083835b602083101515610e885780518252602082019150602081019050602083039250610e63565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816001015482600201808054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f975780601f10610f6c57610100808354040283529160200191610f97565b820191906000526020600020905b815481529060010190602001808311610f7a57829003601f168201915b5050505050905094509450945050509193909250565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60028163ffffffff81101515610fe457fe5b016000915090508054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561107f5780601f106110545761010080835404028352916020019161107f565b820191906000526020600020905b81548152906001019060200180831161106257829003601f168201915b505050505081565b61108f611754565b600080836040518082805190602001908083835b6020831015156110c857805182526020820191506020810190506020830392506110a3565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902091506001600083600019166000191681526020019081526020016000209050806002018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156111ac5780601f10611181576101008083540402835291602001916111ac565b820191906000526020600020905b81548152906001019060200180831161118f57829003601f168201915b505050505092505050919050565b60006111c4611768565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561121f57600080fd5b846040518082805190602001908083835b6020831015156112555780518252602082019150602081019050602083039250611230565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209150600160008360001916600019168152602001908152602001600020606060405190810160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113a45780601f10611379576101008083540402835291602001916113a4565b820191906000526020600020905b81548152906001019060200180831161138757829003601f168201915b5050505050815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614156114d75783816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505082816040018190525064010000000160009054906101000a900463ffffffff1663ffffffff1681602001818152505084600264010000000160009054906101000a900463ffffffff1663ffffffff1663ffffffff8110151561147e57fe5b0190805190602001906114929291906117a6565b50640100000001600081819054906101000a900463ffffffff168092919060010191906101000a81548163ffffffff021916908363ffffffff16021790555050611519565b83816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508281604001819052505b8060016000846000191660001916815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020190805190602001906115a2929190611826565b509050505050505050565b64010000000160009054906101000a900463ffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561162257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561165e57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611724611754565b61172c611754565b611734611754565b61173d84610d89565b915061174882611087565b90508092505050919050565b602060405190810160405280600081525090565b606060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016117a06118a6565b81525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106117e757805160ff1916838001178555611815565b82800160010185558215611815579182015b828111156118145782518255916020019190600101906117f9565b5b50905061182291906118ba565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061186757805160ff1916838001178555611895565b82800160010185558215611895579182015b82811115611894578251825591602001919060010190611879565b5b5090506118a291906118ba565b5090565b602060405190810160405280600081525090565b6118dc91905b808211156118d85760008160009055506001016118c0565b5090565b905600a165627a7a72305820f22d5c2dca4b280dc3e034bc981fb302c312a7b910a5a1b99d91838dc3c28f420029", - "deployedBytecode": "0x6060604052600436106100d0576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680631e71f8d1146100d55780632e1e1bb3146102105780633550b6d9146102815780633dbe284a1461031e5780635715c5b7146104155780636e7cbb0d146104785780638052348b146105145780638da5cb5b1461062457806395f121bf14610679578063bd7b564d14610715578063c0d0b6ff146107eb578063c51ccb40146108aa578063f2fde38b146108df578063fa7f369714610918575b600080fd5b34156100e057600080fd5b6100f660048080359060200190919050506109b4565b604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018060200180602001838103835285818151815260200191508051906020019080838360005b8381101561016c578082015181840152602081019050610151565b50505050905090810190601f1680156101995780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b838110156101d25780820151818401526020810190506101b7565b50505050905090810190601f1680156101ff5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b341561021b57600080fd5b61026b600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610b34565b6040518082815260200191505060405180910390f35b341561028c57600080fd5b6102dc600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610bc9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561032957600080fd5b610343600480803560001916906020019091905050610c7e565b604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001806020018281038252838181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156104045780601f106103d957610100808354040283529160200191610404565b820191906000526020600020905b8154815290600101906020018083116103e757829003601f168201915b505094505050505060405180910390f35b341561042057600080fd5b6104366004808035906020019091905050610cc7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561048357600080fd5b6104996004808035906020019091905050610d89565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104d95780820151818401526020810190506104be565b50505050905090810190601f1680156105065780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561051f57600080fd5b61056f600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610e44565b604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156105e75780820151818401526020810190506105cc565b50505050905090810190601f1680156106145780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b341561062f57600080fd5b610637610fad565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561068457600080fd5b61069a6004808035906020019091905050610fd2565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156106da5780820151818401526020810190506106bf565b50505050905090810190601f1680156107075780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561072057600080fd5b610770600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611087565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156107b0578082015181840152602081019050610795565b50505050905090810190601f1680156107dd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156107f657600080fd5b6108a8600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506111ba565b005b34156108b557600080fd5b6108bd6115ad565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b34156108ea57600080fd5b610916600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506115c7565b005b341561092357600080fd5b610939600480803590602001909190505061171c565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561097957808201518184015260208101905061095e565b50505050905090810190601f1680156109a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b60006109be611754565b6109c6611754565b6109ce611754565b6000806109da87610d89565b9250826040518082805190602001908083835b602083101515610a1257805182526020820191506020810190506020830392506109ed565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168382600201808054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610b1d5780601f10610af257610100808354040283529160200191610b1d565b820191906000526020600020905b815481529060010190602001808311610b0057829003601f168201915b505050505090509550955095505050509193909250565b6000806000836040518082805190602001908083835b602083101515610b6f5780518252602082019150602081019050602083039250610b4a565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902091506001600083600019166000191681526020019081526020016000209050806001015492505050919050565b6000806000836040518082805190602001908083835b602083101515610c045780518252602082019150602081019050602083039250610bdf565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692505050919050565b60016020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201905083565b60008060028363ffffffff81101515610cdc57fe5b019050610d81818054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610d775780601f10610d4c57610100808354040283529160200191610d77565b820191906000526020600020905b815481529060010190602001808311610d5a57829003601f168201915b5050505050610bc9565b915050919050565b610d91611754565b60028263ffffffff81101515610da357fe5b018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610e385780601f10610e0d57610100808354040283529160200191610e38565b820191906000526020600020905b815481529060010190602001808311610e1b57829003601f168201915b50505050509050919050565b600080610e4f611754565b600080856040518082805190602001908083835b602083101515610e885780518252602082019150602081019050602083039250610e63565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816001015482600201808054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f975780601f10610f6c57610100808354040283529160200191610f97565b820191906000526020600020905b815481529060010190602001808311610f7a57829003601f168201915b5050505050905094509450945050509193909250565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60028163ffffffff81101515610fe457fe5b016000915090508054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561107f5780601f106110545761010080835404028352916020019161107f565b820191906000526020600020905b81548152906001019060200180831161106257829003601f168201915b505050505081565b61108f611754565b600080836040518082805190602001908083835b6020831015156110c857805182526020820191506020810190506020830392506110a3565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902091506001600083600019166000191681526020019081526020016000209050806002018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156111ac5780601f10611181576101008083540402835291602001916111ac565b820191906000526020600020905b81548152906001019060200180831161118f57829003601f168201915b505050505092505050919050565b60006111c4611768565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561121f57600080fd5b846040518082805190602001908083835b6020831015156112555780518252602082019150602081019050602083039250611230565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209150600160008360001916600019168152602001908152602001600020606060405190810160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113a45780601f10611379576101008083540402835291602001916113a4565b820191906000526020600020905b81548152906001019060200180831161138757829003601f168201915b5050505050815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614156114d75783816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505082816040018190525064010000000160009054906101000a900463ffffffff1663ffffffff1681602001818152505084600264010000000160009054906101000a900463ffffffff1663ffffffff1663ffffffff8110151561147e57fe5b0190805190602001906114929291906117a6565b50640100000001600081819054906101000a900463ffffffff168092919060010191906101000a81548163ffffffff021916908363ffffffff16021790555050611519565b83816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508281604001819052505b8060016000846000191660001916815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020190805190602001906115a2929190611826565b509050505050505050565b64010000000160009054906101000a900463ffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561162257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561165e57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611724611754565b61172c611754565b611734611754565b61173d84610d89565b915061174882611087565b90508092505050919050565b602060405190810160405280600081525090565b606060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016117a06118a6565b81525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106117e757805160ff1916838001178555611815565b82800160010185558215611815579182015b828111156118145782518255916020019190600101906117f9565b5b50905061182291906118ba565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061186757805160ff1916838001178555611895565b82800160010185558215611895579182015b82811115611894578251825591602001919060010190611879565b5b5090506118a291906118ba565b5090565b602060405190810160405280600081525090565b6118dc91905b808211156118d85760008160009055506001016118c0565b5090565b905600a165627a7a72305820f22d5c2dca4b280dc3e034bc981fb302c312a7b910a5a1b99d91838dc3c28f420029", + "bytecode": "0x6060604052336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061190b806100536000396000f3006060604052600436106100d0576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680631e71f8d1146100d55780632e1e1bb3146102105780633550b6d9146102815780633dbe284a1461031e5780635715c5b7146104155780636e7cbb0d146104785780638052348b146105145780638da5cb5b1461062457806395f121bf14610679578063bd7b564d14610715578063c0d0b6ff146107eb578063c51ccb40146108aa578063f2fde38b146108df578063fa7f369714610918575b600080fd5b34156100e057600080fd5b6100f660048080359060200190919050506109b4565b604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018060200180602001838103835285818151815260200191508051906020019080838360005b8381101561016c578082015181840152602081019050610151565b50505050905090810190601f1680156101995780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b838110156101d25780820151818401526020810190506101b7565b50505050905090810190601f1680156101ff5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b341561021b57600080fd5b61026b600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610b34565b6040518082815260200191505060405180910390f35b341561028c57600080fd5b6102dc600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610bc9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561032957600080fd5b610343600480803560001916906020019091905050610c7e565b604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001806020018281038252838181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156104045780601f106103d957610100808354040283529160200191610404565b820191906000526020600020905b8154815290600101906020018083116103e757829003601f168201915b505094505050505060405180910390f35b341561042057600080fd5b6104366004808035906020019091905050610cc7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561048357600080fd5b6104996004808035906020019091905050610d89565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104d95780820151818401526020810190506104be565b50505050905090810190601f1680156105065780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561051f57600080fd5b61056f600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610e44565b604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156105e75780820151818401526020810190506105cc565b50505050905090810190601f1680156106145780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b341561062f57600080fd5b610637610fad565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561068457600080fd5b61069a6004808035906020019091905050610fd2565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156106da5780820151818401526020810190506106bf565b50505050905090810190601f1680156107075780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561072057600080fd5b610770600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611087565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156107b0578082015181840152602081019050610795565b50505050905090810190601f1680156107dd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156107f657600080fd5b6108a8600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506111ba565b005b34156108b557600080fd5b6108bd6115ad565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b34156108ea57600080fd5b610916600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506115c7565b005b341561092357600080fd5b610939600480803590602001909190505061171c565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561097957808201518184015260208101905061095e565b50505050905090810190601f1680156109a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b60006109be611754565b6109c6611754565b6109ce611754565b6000806109da87610d89565b9250826040518082805190602001908083835b602083101515610a1257805182526020820191506020810190506020830392506109ed565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168382600201808054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610b1d5780601f10610af257610100808354040283529160200191610b1d565b820191906000526020600020905b815481529060010190602001808311610b0057829003601f168201915b505050505090509550955095505050509193909250565b6000806000836040518082805190602001908083835b602083101515610b6f5780518252602082019150602081019050602083039250610b4a565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902091506001600083600019166000191681526020019081526020016000209050806001015492505050919050565b6000806000836040518082805190602001908083835b602083101515610c045780518252602082019150602081019050602083039250610bdf565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692505050919050565b60016020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201905083565b60008060028363ffffffff81101515610cdc57fe5b019050610d81818054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610d775780601f10610d4c57610100808354040283529160200191610d77565b820191906000526020600020905b815481529060010190602001808311610d5a57829003601f168201915b5050505050610bc9565b915050919050565b610d91611754565b60028263ffffffff81101515610da357fe5b018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610e385780601f10610e0d57610100808354040283529160200191610e38565b820191906000526020600020905b815481529060010190602001808311610e1b57829003601f168201915b50505050509050919050565b600080610e4f611754565b600080856040518082805190602001908083835b602083101515610e885780518252602082019150602081019050602083039250610e63565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816001015482600201808054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f975780601f10610f6c57610100808354040283529160200191610f97565b820191906000526020600020905b815481529060010190602001808311610f7a57829003601f168201915b5050505050905094509450945050509193909250565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60028163ffffffff81101515610fe457fe5b016000915090508054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561107f5780601f106110545761010080835404028352916020019161107f565b820191906000526020600020905b81548152906001019060200180831161106257829003601f168201915b505050505081565b61108f611754565b600080836040518082805190602001908083835b6020831015156110c857805182526020820191506020810190506020830392506110a3565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902091506001600083600019166000191681526020019081526020016000209050806002018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156111ac5780601f10611181576101008083540402835291602001916111ac565b820191906000526020600020905b81548152906001019060200180831161118f57829003601f168201915b505050505092505050919050565b60006111c4611768565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561121f57600080fd5b846040518082805190602001908083835b6020831015156112555780518252602082019150602081019050602083039250611230565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209150600160008360001916600019168152602001908152602001600020606060405190810160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113a45780601f10611379576101008083540402835291602001916113a4565b820191906000526020600020905b81548152906001019060200180831161138757829003601f168201915b5050505050815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614156114d75783816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505082816040018190525064010000000160009054906101000a900463ffffffff1663ffffffff1681602001818152505084600264010000000160009054906101000a900463ffffffff1663ffffffff1663ffffffff8110151561147e57fe5b0190805190602001906114929291906117a6565b50640100000001600081819054906101000a900463ffffffff168092919060010191906101000a81548163ffffffff021916908363ffffffff16021790555050611519565b83816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508281604001819052505b8060016000846000191660001916815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020190805190602001906115a2929190611826565b509050505050505050565b64010000000160009054906101000a900463ffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561162257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561165e57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611724611754565b61172c611754565b611734611754565b61173d84610d89565b915061174882611087565b90508092505050919050565b602060405190810160405280600081525090565b606060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016117a06118a6565b81525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106117e757805160ff1916838001178555611815565b82800160010185558215611815579182015b828111156118145782518255916020019190600101906117f9565b5b50905061182291906118ba565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061186757805160ff1916838001178555611895565b82800160010185558215611895579182015b82811115611894578251825591602001919060010190611879565b5b5090506118a291906118ba565b5090565b602060405190810160405280600081525090565b6118dc91905b808211156118d85760008160009055506001016118c0565b5090565b905600a165627a7a7230582093736f14a2a7953661c655fbb4db97570aa227e6101717eb0a4801c1606e56140029", + "deployedBytecode": "0x6060604052600436106100d0576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680631e71f8d1146100d55780632e1e1bb3146102105780633550b6d9146102815780633dbe284a1461031e5780635715c5b7146104155780636e7cbb0d146104785780638052348b146105145780638da5cb5b1461062457806395f121bf14610679578063bd7b564d14610715578063c0d0b6ff146107eb578063c51ccb40146108aa578063f2fde38b146108df578063fa7f369714610918575b600080fd5b34156100e057600080fd5b6100f660048080359060200190919050506109b4565b604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018060200180602001838103835285818151815260200191508051906020019080838360005b8381101561016c578082015181840152602081019050610151565b50505050905090810190601f1680156101995780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b838110156101d25780820151818401526020810190506101b7565b50505050905090810190601f1680156101ff5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b341561021b57600080fd5b61026b600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610b34565b6040518082815260200191505060405180910390f35b341561028c57600080fd5b6102dc600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610bc9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561032957600080fd5b610343600480803560001916906020019091905050610c7e565b604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001806020018281038252838181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156104045780601f106103d957610100808354040283529160200191610404565b820191906000526020600020905b8154815290600101906020018083116103e757829003601f168201915b505094505050505060405180910390f35b341561042057600080fd5b6104366004808035906020019091905050610cc7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561048357600080fd5b6104996004808035906020019091905050610d89565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104d95780820151818401526020810190506104be565b50505050905090810190601f1680156105065780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561051f57600080fd5b61056f600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610e44565b604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156105e75780820151818401526020810190506105cc565b50505050905090810190601f1680156106145780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b341561062f57600080fd5b610637610fad565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561068457600080fd5b61069a6004808035906020019091905050610fd2565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156106da5780820151818401526020810190506106bf565b50505050905090810190601f1680156107075780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561072057600080fd5b610770600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611087565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156107b0578082015181840152602081019050610795565b50505050905090810190601f1680156107dd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156107f657600080fd5b6108a8600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506111ba565b005b34156108b557600080fd5b6108bd6115ad565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b34156108ea57600080fd5b610916600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506115c7565b005b341561092357600080fd5b610939600480803590602001909190505061171c565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561097957808201518184015260208101905061095e565b50505050905090810190601f1680156109a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b60006109be611754565b6109c6611754565b6109ce611754565b6000806109da87610d89565b9250826040518082805190602001908083835b602083101515610a1257805182526020820191506020810190506020830392506109ed565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168382600201808054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610b1d5780601f10610af257610100808354040283529160200191610b1d565b820191906000526020600020905b815481529060010190602001808311610b0057829003601f168201915b505050505090509550955095505050509193909250565b6000806000836040518082805190602001908083835b602083101515610b6f5780518252602082019150602081019050602083039250610b4a565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902091506001600083600019166000191681526020019081526020016000209050806001015492505050919050565b6000806000836040518082805190602001908083835b602083101515610c045780518252602082019150602081019050602083039250610bdf565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692505050919050565b60016020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201905083565b60008060028363ffffffff81101515610cdc57fe5b019050610d81818054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610d775780601f10610d4c57610100808354040283529160200191610d77565b820191906000526020600020905b815481529060010190602001808311610d5a57829003601f168201915b5050505050610bc9565b915050919050565b610d91611754565b60028263ffffffff81101515610da357fe5b018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610e385780601f10610e0d57610100808354040283529160200191610e38565b820191906000526020600020905b815481529060010190602001808311610e1b57829003601f168201915b50505050509050919050565b600080610e4f611754565b600080856040518082805190602001908083835b602083101515610e885780518252602082019150602081019050602083039250610e63565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816001015482600201808054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f975780601f10610f6c57610100808354040283529160200191610f97565b820191906000526020600020905b815481529060010190602001808311610f7a57829003601f168201915b5050505050905094509450945050509193909250565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60028163ffffffff81101515610fe457fe5b016000915090508054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561107f5780601f106110545761010080835404028352916020019161107f565b820191906000526020600020905b81548152906001019060200180831161106257829003601f168201915b505050505081565b61108f611754565b600080836040518082805190602001908083835b6020831015156110c857805182526020820191506020810190506020830392506110a3565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902091506001600083600019166000191681526020019081526020016000209050806002018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156111ac5780601f10611181576101008083540402835291602001916111ac565b820191906000526020600020905b81548152906001019060200180831161118f57829003601f168201915b505050505092505050919050565b60006111c4611768565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561121f57600080fd5b846040518082805190602001908083835b6020831015156112555780518252602082019150602081019050602083039250611230565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209150600160008360001916600019168152602001908152602001600020606060405190810160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113a45780601f10611379576101008083540402835291602001916113a4565b820191906000526020600020905b81548152906001019060200180831161138757829003601f168201915b5050505050815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614156114d75783816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505082816040018190525064010000000160009054906101000a900463ffffffff1663ffffffff1681602001818152505084600264010000000160009054906101000a900463ffffffff1663ffffffff1663ffffffff8110151561147e57fe5b0190805190602001906114929291906117a6565b50640100000001600081819054906101000a900463ffffffff168092919060010191906101000a81548163ffffffff021916908363ffffffff16021790555050611519565b83816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508281604001819052505b8060016000846000191660001916815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020190805190602001906115a2929190611826565b509050505050505050565b64010000000160009054906101000a900463ffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561162257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561165e57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611724611754565b61172c611754565b611734611754565b61173d84610d89565b915061174882611087565b90508092505050919050565b602060405190810160405280600081525090565b606060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016117a06118a6565b81525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106117e757805160ff1916838001178555611815565b82800160010185558215611815579182015b828111156118145782518255916020019190600101906117f9565b5b50905061182291906118ba565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061186757805160ff1916838001178555611895565b82800160010185558215611895579182015b82811115611894578251825591602001919060010190611879565b5b5090506118a291906118ba565b5090565b602060405190810160405280600081525090565b6118dc91905b808211156118d85760008160009055506001016118c0565b5090565b905600a165627a7a7230582093736f14a2a7953661c655fbb4db97570aa227e6101717eb0a4801c1606e56140029", "sourceMap": "723:5693:8:-;;;509:10:39;501:5;;:18;;;;;;;;;;;;;;;;;;723:5693:8;;;;;;", "deployedSourceMap": "723:5693:8:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5927:487;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3453:256:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2686:263;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;769:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3122:188;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3845:120;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5170:442:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;238:20:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1070:41:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4106:251:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1529:1045:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1117:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;832:169:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;4606:232:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5927:487:8;6033:7;6054:6;;:::i;:::-;6074;;:::i;:::-;6105:20;;:::i;:::-;6168:18;6217:34;6128:29;6150:6;6128:21;:29::i;:::-;6105:52;;6199:6;6189:17;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;6168:38:8;;6254:27;:39;6282:10;6254:39;;;;;;;;;;;;;;;;;6217:76;;6325:10;:23;;;;;;;;;;;;6362:6;6382:10;:15;;6304:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5927:487;;;;;;;;:::o;3453:256::-;3521:4;3537:18;3587:34;3568:7;3558:18;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;3537:39:8;;3624:27;:39;3652:10;3624:39;;;;;;;;;;;;;;;;;3587:76;;3681:10;:21;;;3674:28;;3453:256;;;;;:::o;2686:263::-;2756:7;2775:18;2825:34;2806:7;2796:18;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;2775:39:8;;2862:27;:39;2890:10;2862:39;;;;;;;;;;;;;;;;;2825:76;;2919:10;:23;;;;;;;;;;;;2912:30;;2686:263;;;;;:::o;769:71::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3122:188::-;3188:7;3207:21;3231:15;3247:6;3231:23;;;;;;;;;;3207:47;;3272:31;3296:6;3272:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:23;:31::i;:::-;3265:38;;3122:188;;;;:::o;3845:120::-;3910:6;;:::i;:::-;3935:15;3951:6;3935:23;;;;;;;;;;3928:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3845:120;;;:::o;5170:442::-;5280:7;5301:4;5319:6;;:::i;:::-;5350:18;5400:34;5381:7;5371:18;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;5350:39:8;;5437:27;:39;5465:10;5437:39;;;;;;;;;;;;;;;;;5400:76;;5508:10;:23;;;;;;;;;;;;5545:10;:21;;;5580:10;:15;;5487:118;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5170:442;;;;;;;:::o;238:20:39:-;;;;;;;;;;;;;:::o;1070:41:8:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4106:251::-;4173:6;;:::i;:::-;4191:18;4241:34;4222:7;4212:18;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;4191:39:8;;4278:27;:39;4306:10;4278:39;;;;;;;;;;;;;;;;;4241:76;;4335:10;:15;;4328:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4106:251;;;;;:::o;1529:1045::-;1684:18;1807:33;;:::i;:::-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;1715:7:8;1705:18;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;1684:39:8;;1843:27;:39;1871:10;1843:39;;;;;;;;;;;;;;;;;1807:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1932:1;1897:37;;:10;:23;;;:37;;;1893:569;;;2041:13;2015:10;:23;;:39;;;;;;;;;;;2086:10;2068;:15;;:28;;;;2134:21;;;;;;;;;;;2110:45;;:10;:21;;:45;;;;;2211:7;2170:15;2186:21;;;;;;;;;;;2170:38;;;;;;;;;;;;:48;;;;;;;;;;;;:::i;:::-;;2232:21;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1893:569;;;2396:13;2370:10;:23;;:39;;;;;;;;;;;2441:10;2423;:15;;:28;;;;1893:569;2557:10;2515:27;:39;2543:10;2515:39;;;;;;;;;;;;;;;;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;1529:1045;;;;;:::o;1117:35::-;;;;;;;;;;;;;:::o;832:169:39:-;653:5;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;928:1;908:22;;:8;:22;;;;900:31;;;;;;;;965:8;937:37;;958:5;;;;;;;;;;;937:37;;;;;;;;;;;;988:8;980:5;;:16;;;;;;;;;;;;;;;;;;832:169;:::o;4606:232:8:-;4669:6;;:::i;:::-;4687:20;;:::i;:::-;4750:23;;:::i;:::-;4710:29;4732:6;4710:21;:29::i;:::-;4687:52;;4776:28;4797:6;4776:20;:28::i;:::-;4750:54;;4822:9;4815:16;;4606:232;;;;;:::o;723:5693::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", "source": "pragma solidity 0.4.18;\n\nimport \"zeppelin-solidity/contracts/ownership/Ownable.sol\";\n\n\n/**\n * The ERC721TokenRegistry is a basic registry mapping token symbols\n * to their known, deployed addresses on the current blockchain.\n *\n * Note that the TokenRegistry does *not* mediate any of the\n * core protocol's business logic, but, rather, is a helpful\n * utility for Terms Contracts to use in encoding, decoding, and\n * resolving the addresses of currently deployed tokens.\n *\n * At this point in time, administration of the Token Registry is\n * under Dharma Labs' control. With more sophisticated decentralized\n * governance mechanisms, we intend to shift ownership of this utility\n * contract to the Dharma community.\n */\ncontract ERC721TokenRegistry is Ownable {\n mapping (bytes32 => TokenAttributes) public symbolHashToTokenAttributes;\n // Solidity prevents us from declaring a dynamically sized string array (since a string is\n // itself an array, and 2D arrays are not supported), and so here we specify the maximum\n // size of the tokenSymbolList.\n string[4294967295] public tokenSymbolList;\n uint32 public tokenSymbolListLength;\n\n struct TokenAttributes {\n // The ERC721 contract address.\n address tokenAddress;\n // The index in `tokenSymbolList` where the token's symbol can be found.\n uint tokenIndex;\n // The name of the given token, e.g. \"CryptoKitties\"\n string name;\n }\n\n /**\n * Maps the given symbol to the given token attributes.\n */\n function setTokenAttributes(\n string _symbol,\n address _tokenAddress,\n string _tokenName\n )\n public onlyOwner\n {\n bytes32 symbolHash = keccak256(_symbol);\n\n // Attempt to retrieve the token's attributes from the registry.\n TokenAttributes memory attributes = symbolHashToTokenAttributes[symbolHash];\n\n if (attributes.tokenAddress == address(0)) {\n // The token has not yet been added to the registry.\n attributes.tokenAddress = _tokenAddress;\n attributes.name = _tokenName;\n attributes.tokenIndex = tokenSymbolListLength;\n\n tokenSymbolList[tokenSymbolListLength] = _symbol;\n tokenSymbolListLength++;\n } else {\n // The token has already been added to the registry; update attributes.\n attributes.tokenAddress = _tokenAddress;\n attributes.name = _tokenName;\n }\n\n // Update this contract's storage.\n symbolHashToTokenAttributes[symbolHash] = attributes;\n }\n\n /**\n * Given a symbol, resolves the current address of the token the symbol is mapped to.\n */\n function getTokenAddressBySymbol(string _symbol) public view returns (address) {\n bytes32 symbolHash = keccak256(_symbol);\n\n TokenAttributes storage attributes = symbolHashToTokenAttributes[symbolHash];\n\n return attributes.tokenAddress;\n }\n\n /**\n * Given the known index of a token within the registry's symbol list,\n * returns the address of the token mapped to the symbol at that index.\n */\n function getTokenAddressByIndex(uint _index) public view returns (address) {\n string storage symbol = tokenSymbolList[_index];\n\n return getTokenAddressBySymbol(symbol);\n }\n\n /**\n * Given a symbol, resolves the index of the token the symbol is mapped to within the registry's\n * symbol list.\n */\n function getTokenIndexBySymbol(string _symbol) public view returns (uint) {\n bytes32 symbolHash = keccak256(_symbol);\n\n TokenAttributes storage attributes = symbolHashToTokenAttributes[symbolHash];\n\n return attributes.tokenIndex;\n }\n\n /**\n * Given an index, resolves the symbol of the token at that index in the registry's\n * token symbol list.\n */\n function getTokenSymbolByIndex(uint _index) public view returns (string) {\n return tokenSymbolList[_index];\n }\n\n /**\n * Given a symbol, returns the name of the token the symbol is mapped to within the registry's\n * symbol list.\n */\n function getTokenNameBySymbol(string _symbol) public view returns (string) {\n bytes32 symbolHash = keccak256(_symbol);\n\n TokenAttributes storage attributes = symbolHashToTokenAttributes[symbolHash];\n\n return attributes.name;\n }\n\n /**\n * Given the index for a token in the registry, returns the name of the token as provided in\n * the associated TokensAttribute struct.\n *\n * Example:\n * getTokenNameByIndex(1);\n * => \"CryptoKitties\"\n */\n function getTokenNameByIndex(uint _index) public view returns (string) {\n string memory symbol = getTokenSymbolByIndex(_index);\n\n string memory tokenName = getTokenNameBySymbol(symbol);\n\n return tokenName;\n }\n\n /**\n * Given the symbol for a token in the registry, returns a tuple containing the token's address,\n * the token's index in the registry, and the token's name.\n *\n * Example:\n * getTokenAttributesBySymbol(\"CK\");\n * => [\"0x06012c8cf97BEaD5deAe237070F9587f8E7A266d\", 1, \"CryptoKitties\"]\n */\n function getTokenAttributesBySymbol(string _symbol)\n public\n view\n returns (\n address,\n uint,\n string\n )\n {\n bytes32 symbolHash = keccak256(_symbol);\n\n TokenAttributes storage attributes = symbolHashToTokenAttributes[symbolHash];\n\n return (\n attributes.tokenAddress,\n attributes.tokenIndex,\n attributes.name\n );\n }\n\n /**\n * Given the index for a token in the registry, returns a tuple containing the token's address,\n * the token's symbol, and the token's name.\n *\n * Example:\n * getTokenAttributesByIndex(1);\n * => [\"0x06012c8cf97BEaD5deAe237070F9587f8E7A266d\", \"CK\", \"CryptoKitties\"]\n */\n function getTokenAttributesByIndex(uint _index)\n public\n view\n returns (\n address,\n string,\n string\n )\n {\n string memory symbol = getTokenSymbolByIndex(_index);\n\n bytes32 symbolHash = keccak256(symbol);\n\n TokenAttributes storage attributes = symbolHashToTokenAttributes[symbolHash];\n\n return (\n attributes.tokenAddress,\n symbol,\n attributes.name\n );\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/ERC721TokenRegistry.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/ERC721TokenRegistry.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/ERC721TokenRegistry.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/ERC721TokenRegistry.sol", "exportedSymbols": { "ERC721TokenRegistry": [ 4457 @@ -4184,7 +4184,7 @@ export const ERC721TokenRegistry = } }, "links": {}, - "address": "0xc7e95d984d2abdb012e25975c622477f31a0473f" + "address": "0xd1ec79ec665dddf7a65024c44dd75f625e88271f" }, "70": { "events": { @@ -4211,5 +4211,5 @@ export const ERC721TokenRegistry = } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:16:13.717Z" + "updatedAt": "2018-10-09T17:53:04.870Z" } \ No newline at end of file diff --git a/artifacts/ts/GeneScienceInterface.ts b/artifacts/ts/GeneScienceInterface.ts index 74237e66..11b213a1 100644 --- a/artifacts/ts/GeneScienceInterface.ts +++ b/artifacts/ts/GeneScienceInterface.ts @@ -49,10 +49,10 @@ export const GeneScienceInterface = "sourceMap": "", "deployedSourceMap": "", "source": "pragma solidity 0.4.18;\n\n/**\n The following contract code, titled KittyCore, was written by Cryptokitties and published\n and retrieved from https://etherscan.io/address/0x06012c8cf97bead5deae237070f9587f8e7a266d#code.\n\n It is included in the current project for test purposes, to ensure that our collateralizer can\n handle ERC721 tokens created by the KittyCore contract.\n*/\n\n/**\n * @title KittiesOwnable\n * @dev The KittiesOwnable contract has an owner address, and provides basic authorization control\n * functions, this simplifies the implementation of \"user permissions\".\n */\ncontract KittiesOwnable {\n address public owner;\n\n\n /**\n\t * @dev The KittiesOwnable constructor sets the original `owner` of the contract to the sender\n\t * account.\n\t */\n function KittiesOwnable() {\n owner = msg.sender;\n }\n\n\n /**\n\t * @dev Throws if called by any account other than the owner.\n\t */\n modifier onlyOwner() {\n require(msg.sender == owner);\n _;\n }\n\n\n /**\n\t * @dev Allows the current owner to transfer control of the contract to a newOwner.\n\t * @param newOwner The address to transfer ownership to.\n\t */\n function transferOwnership(address newOwner) onlyOwner {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n\n}\n\n\n\n/// @title Interface for contracts conforming to ERC-721: Non-Fungible Tokens\n/// @author Dieter Shirley (https://github.com/dete)\ncontract KittiesERC721 {\n // Required methods\n function totalSupply() public view returns (uint256 total);\n function balanceOf(address _owner) public view returns (uint256 balance);\n function ownerOf(uint256 _tokenId) external view returns (address owner);\n function approve(address _to, uint256 _tokenId) external;\n function transfer(address _to, uint256 _tokenId) external;\n function transferFrom(address _from, address _to, uint256 _tokenId) external;\n\n // Events\n event Transfer(address from, address to, uint256 tokenId);\n event Approval(address owner, address approved, uint256 tokenId);\n\n // Optional\n // function name() public view returns (string name);\n // function symbol() public view returns (string symbol);\n // function tokensOfOwner(address _owner) external view returns (uint256[] tokenIds);\n // function tokenMetadata(uint256 _tokenId, string _preferredTransport) public view returns (string infoUrl);\n\n // ERC-165 Compatibility (https://github.com/ethereum/EIPs/issues/165)\n function supportsInterface(bytes4 _interfaceID) external view returns (bool);\n}\n\n\n// // Auction wrapper functions\n\n\n// Auction wrapper functions\n\n\n\n\n\n\n\n/// @title SEKRETOOOO\ncontract GeneScienceInterface {\n /// @dev simply a boolean to indicate this is the contract we expect to be\n function isGeneScience() public pure returns (bool);\n\n /// @dev given genes of kitten 1 & 2, return a genetic combination - may have a random factor\n /// @param genes1 genes of mom\n /// @param genes2 genes of sire\n /// @return the genes that are supposed to be passed down the child\n function mixGenes(uint256 genes1, uint256 genes2, uint256 targetBlock) public returns (uint256);\n}\n\n\n\n\n\n\n\n/// @title A facet of KittyCore that manages special access privileges.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyAccessControl {\n // This facet controls access control for CryptoKitties. There are four roles managed here:\n //\n // - The CEO: The CEO can reassign other roles and change the addresses of our dependent smart\n // contracts. It is also the only role that can unpause the smart contract. It is initially\n // set to the address that created the smart contract in the KittyCore constructor.\n //\n // - The CFO: The CFO can withdraw funds from KittyCore and its auction contracts.\n //\n // - The COO: The COO can release gen0 kitties to auction, and mint promo cats.\n //\n // It should be noted that these roles are distinct without overlap in their access abilities, the\n // abilities listed for each role above are exhaustive. In particular, while the CEO can assign any\n // address to any role, the CEO address itself doesn't have the ability to act in those roles. This\n // restriction is intentional so that we aren't tempted to use the CEO address frequently out of\n // convenience. The less we use an address, the less likely it is that we somehow compromise the\n // account.\n\n /// @dev Emited when contract is upgraded - See README.md for updgrade plan\n event ContractUpgrade(address newContract);\n\n // The addresses of the accounts (or contracts) that can execute actions within each roles.\n address public ceoAddress;\n address public cfoAddress;\n address public cooAddress;\n\n // @dev Keeps track whether the contract is paused. When that is true, most actions are blocked\n bool public paused = false;\n\n /// @dev Access modifier for CEO-only functionality\n modifier onlyCEO() {\n require(msg.sender == ceoAddress);\n _;\n }\n\n /// @dev Access modifier for CFO-only functionality\n modifier onlyCFO() {\n require(msg.sender == cfoAddress);\n _;\n }\n\n /// @dev Access modifier for COO-only functionality\n modifier onlyCOO() {\n require(msg.sender == cooAddress);\n _;\n }\n\n modifier onlyCLevel() {\n require(\n msg.sender == cooAddress ||\n msg.sender == ceoAddress ||\n msg.sender == cfoAddress\n );\n _;\n }\n\n /// @dev Assigns a new address to act as the CEO. Only available to the current CEO.\n /// @param _newCEO The address of the new CEO\n function setCEO(address _newCEO) external onlyCEO {\n require(_newCEO != address(0));\n\n ceoAddress = _newCEO;\n }\n\n /// @dev Assigns a new address to act as the CFO. Only available to the current CEO.\n /// @param _newCFO The address of the new CFO\n function setCFO(address _newCFO) external onlyCEO {\n require(_newCFO != address(0));\n\n cfoAddress = _newCFO;\n }\n\n /// @dev Assigns a new address to act as the COO. Only available to the current CEO.\n /// @param _newCOO The address of the new COO\n function setCOO(address _newCOO) external onlyCEO {\n require(_newCOO != address(0));\n\n cooAddress = _newCOO;\n }\n\n /*** KittiesPausable functionality adapted from OpenZeppelin ***/\n\n /// @dev Modifier to allow actions only when the contract IS NOT paused\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /// @dev Modifier to allow actions only when the contract IS paused\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /// @dev Called by any \"C-level\" role to pause the contract. Used only when\n /// a bug or exploit is detected and we need to limit damage.\n function pause() external onlyCLevel whenNotPaused {\n paused = true;\n }\n\n /// @dev Unpauses the smart contract. Can only be called by the CEO, since\n /// one reason we may pause the contract is when CFO or COO accounts are\n /// compromised.\n /// @notice This is public rather than external so it can be called by\n /// derived contracts.\n function unpause() public onlyCEO whenPaused {\n // can't unpause if contract was upgraded\n paused = false;\n }\n}\n\n\n\n\n/// @title Base contract for CryptoKitties. Holds all common structs, events and base variables.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBase is KittyAccessControl {\n /*** EVENTS ***/\n\n /// @dev The Birth event is fired whenever a new kitten comes into existence. This obviously\n /// includes any time a cat is created through the giveBirth method, but it is also called\n /// when a new gen0 cat is created.\n event Birth(address owner, uint256 kittyId, uint256 matronId, uint256 sireId, uint256 genes);\n\n /// @dev Transfer event as defined in current draft of ERC721. Emitted every time a kitten\n /// ownership is assigned, including births.\n event Transfer(address from, address to, uint256 tokenId);\n\n /*** DATA TYPES ***/\n\n /// @dev The main Kitty struct. Every cat in CryptoKitties is represented by a copy\n /// of this structure, so great care was taken to ensure that it fits neatly into\n /// exactly two 256-bit words. Note that the order of the members in this structure\n /// is important because of the byte-packing rules used by Ethereum.\n /// Ref: http://solidity.readthedocs.io/en/develop/miscellaneous.html\n struct Kitty {\n // The Kitty's genetic code is packed into these 256-bits, the format is\n // sooper-sekret! A cat's genes never change.\n uint256 genes;\n\n // The timestamp from the block when this cat came into existence.\n uint64 birthTime;\n\n // The minimum timestamp after which this cat can engage in breeding\n // activities again. This same timestamp is used for the pregnancy\n // timer (for matrons) as well as the siring cooldown.\n uint64 cooldownEndBlock;\n\n // The ID of the parents of this kitty, set to 0 for gen0 cats.\n // Note that using 32-bit unsigned integers limits us to a \"mere\"\n // 4 billion cats. This number might seem small until you realize\n // that Ethereum currently has a limit of about 500 million\n // transactions per year! So, this definitely won't be a problem\n // for several years (even as Ethereum learns to scale).\n uint32 matronId;\n uint32 sireId;\n\n // Set to the ID of the sire cat for matrons that are pregnant,\n // zero otherwise. A non-zero value here is how we know a cat\n // is pregnant. Used to retrieve the genetic material for the new\n // kitten when the birth transpires.\n uint32 siringWithId;\n\n // Set to the index in the cooldown array (see below) that represents\n // the current cooldown duration for this Kitty. This starts at zero\n // for gen0 cats, and is initialized to floor(generation/2) for others.\n // Incremented by one for each successful breeding action, regardless\n // of whether this cat is acting as matron or sire.\n uint16 cooldownIndex;\n\n // The \"generation number\" of this cat. Cats minted by the CK contract\n // for sale are called \"gen0\" and have a generation number of 0. The\n // generation number of all other cats is the larger of the two generation\n // numbers of their parents, plus one.\n // (i.e. max(matron.generation, sire.generation) + 1)\n uint16 generation;\n }\n\n /*** CONSTANTS ***/\n\n /// @dev A lookup table indicating the cooldown duration after any successful\n /// breeding action, called \"pregnancy time\" for matrons and \"siring cooldown\"\n /// for sires. Designed such that the cooldown roughly doubles each time a cat\n /// is bred, encouraging owners not to just keep breeding the same cat over\n /// and over again. Caps out at one week (a cat can breed an unbounded number\n /// of times, and the maximum cooldown is always seven days).\n uint32[14] public cooldowns = [\n uint32(1 minutes),\n uint32(2 minutes),\n uint32(5 minutes),\n uint32(10 minutes),\n uint32(30 minutes),\n uint32(1 hours),\n uint32(2 hours),\n uint32(4 hours),\n uint32(8 hours),\n uint32(16 hours),\n uint32(1 days),\n uint32(2 days),\n uint32(4 days),\n uint32(7 days)\n ];\n\n // An approximation of currently how many seconds are in between blocks.\n uint256 public secondsPerBlock = 15;\n\n /*** STORAGE ***/\n\n /// @dev An array containing the Kitty struct for all Kitties in existence. The ID\n /// of each cat is actually an index into this array. Note that ID 0 is a negacat,\n /// the unKitty, the mythical beast that is the parent of all gen0 cats. A bizarre\n /// creature that is both matron and sire... to itself! Has an invalid genetic code.\n /// In other words, cat ID 0 is invalid... ;-)\n Kitty[] kitties;\n\n /// @dev A mapping from cat IDs to the address that owns them. All cats have\n /// some valid owner address, even gen0 cats are created with a non-zero owner.\n mapping (uint256 => address) public kittyIndexToOwner;\n\n // @dev A mapping from owner address to count of tokens that address owns.\n // Used internally inside balanceOf() to resolve ownership count.\n mapping (address => uint256) ownershipTokenCount;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to call\n /// transferFrom(). Each Kitty can only have one approved address for transfer\n /// at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public kittyIndexToApproved;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to use\n /// this Kitty for siring via breedWith(). Each Kitty can only have one approved\n /// address for siring at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public sireAllowedToAddress;\n\n /// @dev The address of the ClockAuction contract that handles sales of Kitties. This\n /// same contract handles both peer-to-peer sales as well as the gen0 sales which are\n /// initiated every 15 minutes.\n SaleClockAuction public saleAuction;\n\n /// @dev The address of a custom ClockAuction subclassed contract that handles siring\n /// auctions. Needs to be separate from saleAuction because the actions taken on success\n /// after a sales and siring auction are quite different.\n SiringClockAuction public siringAuction;\n\n /// @dev Assigns ownership of a specific Kitty to an address.\n function _transfer(address _from, address _to, uint256 _tokenId) internal {\n // Since the number of kittens is capped to 2^32 we can't overflow this\n ownershipTokenCount[_to]++;\n // transfer ownership\n kittyIndexToOwner[_tokenId] = _to;\n // When creating new kittens _from is 0x0, but we can't account that address.\n if (_from != address(0)) {\n ownershipTokenCount[_from]--;\n // once the kitten is transferred also clear sire allowances\n delete sireAllowedToAddress[_tokenId];\n // clear any previously approved ownership exchange\n delete kittyIndexToApproved[_tokenId];\n }\n // Emit the transfer event.\n Transfer(_from, _to, _tokenId);\n }\n\n /// @dev An internal method that creates a new kitty and stores it. This\n /// method doesn't do any checking and should only be called when the\n /// input data is known to be valid. Will generate both a Birth event\n /// and a Transfer event.\n /// @param _matronId The kitty ID of the matron of this cat (zero for gen0)\n /// @param _sireId The kitty ID of the sire of this cat (zero for gen0)\n /// @param _generation The generation number of this cat, must be computed by caller.\n /// @param _genes The kitty's genetic code.\n /// @param _owner The inital owner of this cat, must be non-zero (except for the unKitty, ID 0)\n function _createKitty(\n uint256 _matronId,\n uint256 _sireId,\n uint256 _generation,\n uint256 _genes,\n address _owner\n )\n internal\n returns (uint)\n {\n // These requires are not strictly necessary, our calling code should make\n // sure that these conditions are never broken. However! _createKitty() is already\n // an expensive call (for storage), and it doesn't hurt to be especially careful\n // to ensure our data structures are always valid.\n require(_matronId == uint256(uint32(_matronId)));\n require(_sireId == uint256(uint32(_sireId)));\n require(_generation == uint256(uint16(_generation)));\n\n // New kitty starts with the same cooldown as parent gen/2\n uint16 cooldownIndex = uint16(_generation / 2);\n if (cooldownIndex > 13) {\n cooldownIndex = 13;\n }\n\n Kitty memory _kitty = Kitty({\n genes: _genes,\n birthTime: uint64(now),\n cooldownEndBlock: 0,\n matronId: uint32(_matronId),\n sireId: uint32(_sireId),\n siringWithId: 0,\n cooldownIndex: cooldownIndex,\n generation: uint16(_generation)\n });\n uint256 newKittenId = kitties.push(_kitty) - 1;\n\n // It's probably never going to happen, 4 billion cats is A LOT, but\n // let's just be 100% sure we never let this happen.\n require(newKittenId == uint256(uint32(newKittenId)));\n\n // emit the birth event\n Birth(\n _owner,\n newKittenId,\n uint256(_kitty.matronId),\n uint256(_kitty.sireId),\n _kitty.genes\n );\n\n // This will assign ownership, and also emit the Transfer event as\n // per ERC721 draft\n _transfer(0, _owner, newKittenId);\n\n return newKittenId;\n }\n\n // Any C-level can fix how many seconds per blocks are currently observed.\n function setSecondsPerBlock(uint256 secs) external onlyCLevel {\n require(secs < cooldowns[0]);\n secondsPerBlock = secs;\n }\n}\n\n\n\n\n\n/// @title The external contract that is responsible for generating metadata for the kitties,\n/// it has one function that will return the data as bytes.\ncontract KittiesERC721Metadata {\n /// @dev Given a token Id, returns a byte array that is supposed to be converted into string.\n function getMetadata(uint256 _tokenId, string) public view returns (bytes32[4] buffer, uint256 count) {\n if (_tokenId == 1) {\n buffer[0] = \"Hello World! :D\";\n count = 15;\n } else if (_tokenId == 2) {\n buffer[0] = \"I would definitely choose a medi\";\n buffer[1] = \"um length string.\";\n count = 49;\n } else if (_tokenId == 3) {\n buffer[0] = \"Lorem ipsum dolor sit amet, mi e\";\n buffer[1] = \"st accumsan dapibus augue lorem,\";\n buffer[2] = \" tristique vestibulum id, libero\";\n buffer[3] = \" suscipit varius sapien aliquam.\";\n count = 128;\n }\n }\n}\n\n\n/// @title The facet of the CryptoKitties core contract that manages ownership, ERC-721 (draft) compliant.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev Ref: https://github.com/ethereum/EIPs/issues/721\n/// See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyOwnership is KittyBase, KittiesERC721 {\n\n /// @notice Name and symbol of the non fungible token, as defined in ERC721.\n string public constant name = \"CryptoKitties\";\n string public constant symbol = \"CK\";\n\n // The contract that will return kitty metadata\n KittiesERC721Metadata public erc721Metadata;\n\n bytes4 constant InterfaceSignature_ERC165 =\n bytes4(keccak256('supportsInterface(bytes4)'));\n\n bytes4 constant InterfaceSignature_ERC721 =\n bytes4(keccak256('name()')) ^\n bytes4(keccak256('symbol()')) ^\n bytes4(keccak256('totalSupply()')) ^\n bytes4(keccak256('balanceOf(address)')) ^\n bytes4(keccak256('ownerOf(uint256)')) ^\n bytes4(keccak256('approve(address,uint256)')) ^\n bytes4(keccak256('transfer(address,uint256)')) ^\n bytes4(keccak256('transferFrom(address,address,uint256)')) ^\n bytes4(keccak256('tokensOfOwner(address)')) ^\n bytes4(keccak256('tokenMetadata(uint256,string)'));\n\n /// @notice Introspection interface as per ERC-165 (https://github.com/ethereum/EIPs/issues/165).\n /// Returns true for any standardized interfaces implemented by this contract. We implement\n /// ERC-165 (obviously!) and ERC-721.\n function supportsInterface(bytes4 _interfaceID) external view returns (bool)\n {\n // DEBUG ONLY\n //require((InterfaceSignature_ERC165 == 0x01ffc9a7) && (InterfaceSignature_ERC721 == 0x9a20483d));\n\n return ((_interfaceID == InterfaceSignature_ERC165) || (_interfaceID == InterfaceSignature_ERC721));\n }\n\n /// @dev Set the address of the sibling contract that tracks metadata.\n /// CEO only.\n function setMetadataAddress(address _contractAddress) public onlyCEO {\n erc721Metadata = KittiesERC721Metadata(_contractAddress);\n }\n\n // Internal utility functions: These functions all assume that their input arguments\n // are valid. We leave it to public methods to sanitize their inputs and follow\n // the required logic.\n\n /// @dev Checks if a given address is the current owner of a particular Kitty.\n /// @param _claimant the address we are validating against.\n /// @param _tokenId kitten id, only valid when > 0\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToOwner[_tokenId] == _claimant;\n }\n\n /// @dev Checks if a given address currently has transferApproval for a particular Kitty.\n /// @param _claimant the address we are confirming kitten is approved for.\n /// @param _tokenId kitten id, only valid when > 0\n function _approvedFor(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToApproved[_tokenId] == _claimant;\n }\n\n /// @dev Marks an address as being approved for transferFrom(), overwriting any previous\n /// approval. Setting _approved to address(0) clears all transfer approval.\n /// NOTE: _approve() does NOT send the Approval event. This is intentional because\n /// _approve() and transferFrom() are used together for putting Kitties on auction, and\n /// there is no value in spamming the log with Approval events in that case.\n function _approve(uint256 _tokenId, address _approved) internal {\n kittyIndexToApproved[_tokenId] = _approved;\n }\n\n /// @notice Returns the number of Kitties owned by a specific address.\n /// @param _owner The owner address to check.\n /// @dev Required for ERC-721 compliance\n function balanceOf(address _owner) public view returns (uint256 count) {\n return ownershipTokenCount[_owner];\n }\n\n /// @notice Transfers a Kitty to another address. If transferring to a smart\n /// contract be VERY CAREFUL to ensure that it is aware of ERC-721 (or\n /// CryptoKitties specifically) or your Kitty may be lost forever. Seriously.\n /// @param _to The address of the recipient, can be a user or contract.\n /// @param _tokenId The ID of the Kitty to transfer.\n /// @dev Required for ERC-721 compliance.\n function transfer(\n address _to,\n uint256 _tokenId\n )\n external\n whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Disallow transfers to the auction contracts to prevent accidental\n // misuse. Auction contracts should only take ownership of kitties\n // through the allow + transferFrom flow.\n require(_to != address(saleAuction));\n require(_to != address(siringAuction));\n\n // You can only send your own cat.\n require(_owns(msg.sender, _tokenId));\n\n // Reassign ownership, clear pending approvals, emit Transfer event.\n _transfer(msg.sender, _to, _tokenId);\n }\n\n /// @notice Grant another address the right to transfer a specific Kitty via\n /// transferFrom(). This is the preferred flow for transfering NFTs to contracts.\n /// @param _to The address to be granted transfer approval. Pass address(0) to\n /// clear all approvals.\n /// @param _tokenId The ID of the Kitty that can be transferred if this call succeeds.\n /// @dev Required for ERC-721 compliance.\n function approve(\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Only an owner can grant transfer approval.\n require(_owns(msg.sender, _tokenId));\n\n // Register the approval (replacing any previous approval).\n _approve(_tokenId, _to);\n\n // Emit approval event.\n Approval(msg.sender, _to, _tokenId);\n }\n\n /// @notice Transfer a Kitty owned by another address, for which the calling address\n /// has previously been granted transfer approval by the owner.\n /// @param _from The address that owns the Kitty to be transfered.\n /// @param _to The address that should take ownership of the Kitty. Can be any address,\n /// including the caller.\n /// @param _tokenId The ID of the Kitty to be transferred.\n /// @dev Required for ERC-721 compliance.\n function transferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Check for approval and valid ownership\n require(_approvedFor(msg.sender, _tokenId));\n require(_owns(_from, _tokenId));\n\n // Reassign ownership (also clears pending approvals and emits Transfer event).\n _transfer(_from, _to, _tokenId);\n }\n\n /// @notice Returns the total number of Kitties currently in existence.\n /// @dev Required for ERC-721 compliance.\n function totalSupply() public view returns (uint) {\n return kitties.length - 1;\n }\n\n /// @notice Returns the address currently assigned ownership of a given Kitty.\n /// @dev Required for ERC-721 compliance.\n function ownerOf(uint256 _tokenId)\n external\n view\n returns (address owner)\n {\n owner = kittyIndexToOwner[_tokenId];\n\n require(owner != address(0));\n }\n\n /// @notice Returns a list of all Kitty IDs assigned to an address.\n /// @param _owner The owner whose Kitties we are interested in.\n /// @dev This method MUST NEVER be called by smart contract code. First, it's fairly\n /// expensive (it walks the entire Kitty array looking for cats belonging to owner),\n /// but it also returns a dynamic array, which is only supported for web3 calls, and\n /// not contract-to-contract calls.\n function tokensOfOwner(address _owner) external view returns(uint256[] ownerTokens) {\n uint256 tokenCount = balanceOf(_owner);\n\n if (tokenCount == 0) {\n // Return an empty array\n return new uint256[](0);\n } else {\n uint256[] memory result = new uint256[](tokenCount);\n uint256 totalCats = totalSupply();\n uint256 resultIndex = 0;\n\n // We count on the fact that all cats have IDs starting at 1 and increasing\n // sequentially up to the totalCat count.\n uint256 catId;\n\n for (catId = 1; catId <= totalCats; catId++) {\n if (kittyIndexToOwner[catId] == _owner) {\n result[resultIndex] = catId;\n resultIndex++;\n }\n }\n\n return result;\n }\n }\n\n /// @dev Adapted from memcpy() by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _memcpy(uint _dest, uint _src, uint _len) private view {\n // Copy word-length chunks while possible\n for(; _len >= 32; _len -= 32) {\n assembly {\n mstore(_dest, mload(_src))\n }\n _dest += 32;\n _src += 32;\n }\n\n // Copy remaining bytes\n uint256 mask = 256 ** (32 - _len) - 1;\n assembly {\n let srcpart := and(mload(_src), not(mask))\n let destpart := and(mload(_dest), mask)\n mstore(_dest, or(destpart, srcpart))\n }\n }\n\n /// @dev Adapted from toString(slice) by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _toString(bytes32[4] _rawBytes, uint256 _stringLength) private view returns (string) {\n var outputString = new string(_stringLength);\n uint256 outputPtr;\n uint256 bytesPtr;\n\n assembly {\n outputPtr := add(outputString, 32)\n bytesPtr := _rawBytes\n }\n\n _memcpy(outputPtr, bytesPtr, _stringLength);\n\n return outputString;\n }\n\n /// @notice Returns a URI pointing to a metadata package for this token conforming to\n /// ERC-721 (https://github.com/ethereum/EIPs/issues/721)\n /// @param _tokenId The ID number of the Kitty whose metadata should be returned.\n function tokenMetadata(uint256 _tokenId, string _preferredTransport) external view returns (string infoUrl) {\n require(erc721Metadata != address(0));\n bytes32[4] memory buffer;\n uint256 count;\n (buffer, count) = erc721Metadata.getMetadata(_tokenId, _preferredTransport);\n\n return _toString(buffer, count);\n }\n}\n\n\n\n/// @title A facet of KittyCore that manages Kitty siring, gestation, and birth.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBreeding is KittyOwnership {\n\n /// @dev The Pregnant event is fired when two cats successfully breed and the pregnancy\n /// timer begins for the matron.\n event Pregnant(address owner, uint256 matronId, uint256 sireId, uint256 cooldownEndBlock);\n\n /// @notice The minimum payment required to use breedWithAuto(). This fee goes towards\n /// the gas cost paid by whatever calls giveBirth(), and can be dynamically updated by\n /// the COO role as the gas price changes.\n uint256 public autoBirthFee = 2 finney;\n\n // Keeps track of number of pregnant kitties.\n uint256 public pregnantKitties;\n\n /// @dev The address of the sibling contract that is used to implement the sooper-sekret\n /// genetic combination algorithm.\n GeneScienceInterface public geneScience;\n\n /// @dev Update the address of the genetic contract, can only be called by the CEO.\n /// @param _address An address of a GeneScience contract instance to be used from this point forward.\n function setGeneScienceAddress(address _address) external onlyCEO {\n GeneScienceInterface candidateContract = GeneScienceInterface(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isGeneScience());\n\n // Set the new contract address\n geneScience = candidateContract;\n }\n\n /// @dev Checks that a given kitten is able to breed. Requires that the\n /// current cooldown is finished (for sires) and also checks that there is\n /// no pending pregnancy.\n function _isReadyToBreed(Kitty _kit) internal view returns (bool) {\n // In addition to checking the cooldownEndBlock, we also need to check to see if\n // the cat has a pending birth; there can be some period of time between the end\n // of the pregnacy timer and the birth event.\n return (_kit.siringWithId == 0) && (_kit.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @dev Check if a sire has authorized breeding with this matron. True if both sire\n /// and matron have the same owner, or if the sire has given siring permission to\n /// the matron's owner (via approveSiring()).\n function _isSiringPermitted(uint256 _sireId, uint256 _matronId) internal view returns (bool) {\n address matronOwner = kittyIndexToOwner[_matronId];\n address sireOwner = kittyIndexToOwner[_sireId];\n\n // Siring is okay if they have same owner, or if the matron's owner was given\n // permission to breed with this sire.\n return (matronOwner == sireOwner || sireAllowedToAddress[_sireId] == matronOwner);\n }\n\n /// @dev Set the cooldownEndTime for the given Kitty, based on its current cooldownIndex.\n /// Also increments the cooldownIndex (unless it has hit the cap).\n /// @param _kitten A reference to the Kitty in storage which needs its timer started.\n function _triggerCooldown(Kitty storage _kitten) internal {\n // Compute an estimation of the cooldown time in blocks (based on current cooldownIndex).\n _kitten.cooldownEndBlock = uint64((cooldowns[_kitten.cooldownIndex]/secondsPerBlock) + block.number);\n\n // Increment the breeding count, clamping it at 13, which is the length of the\n // cooldowns array. We could check the array size dynamically, but hard-coding\n // this as a constant saves gas. Yay, Solidity!\n if (_kitten.cooldownIndex < 13) {\n _kitten.cooldownIndex += 1;\n }\n }\n\n /// @notice Grants approval to another user to sire with one of your Kitties.\n /// @param _addr The address that will be able to sire with your Kitty. Set to\n /// address(0) to clear all siring approvals for this Kitty.\n /// @param _sireId A Kitty that you own that _addr will now be able to sire with.\n function approveSiring(address _addr, uint256 _sireId)\n external\n whenNotPaused\n {\n require(_owns(msg.sender, _sireId));\n sireAllowedToAddress[_sireId] = _addr;\n }\n\n /// @dev Updates the minimum payment required for calling giveBirthAuto(). Can only\n /// be called by the COO address. (This fee is used to offset the gas cost incurred\n /// by the autobirth daemon).\n function setAutoBirthFee(uint256 val) external onlyCOO {\n autoBirthFee = val;\n }\n\n /// @dev Checks to see if a given Kitty is pregnant and (if so) if the gestation\n /// period has passed.\n function _isReadyToGiveBirth(Kitty _matron) private view returns (bool) {\n return (_matron.siringWithId != 0) && (_matron.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @notice Checks that a given kitten is able to breed (i.e. it is not pregnant or\n /// in the middle of a siring cooldown).\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isReadyToBreed(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n Kitty storage kit = kitties[_kittyId];\n return _isReadyToBreed(kit);\n }\n\n /// @dev Checks whether a kitty is currently pregnant.\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isPregnant(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n // A kitty is pregnant if and only if this field is set\n return kitties[_kittyId].siringWithId != 0;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair. DOES NOT\n /// check ownership permissions (that is up to the caller).\n /// @param _matron A reference to the Kitty struct of the potential matron.\n /// @param _matronId The matron's ID.\n /// @param _sire A reference to the Kitty struct of the potential sire.\n /// @param _sireId The sire's ID\n function _isValidMatingPair(\n Kitty storage _matron,\n uint256 _matronId,\n Kitty storage _sire,\n uint256 _sireId\n )\n private\n view\n returns(bool)\n {\n // A Kitty can't breed with itself!\n if (_matronId == _sireId) {\n return false;\n }\n\n // Kitties can't breed with their parents.\n if (_matron.matronId == _sireId || _matron.sireId == _sireId) {\n return false;\n }\n if (_sire.matronId == _matronId || _sire.sireId == _matronId) {\n return false;\n }\n\n // We can short circuit the sibling check (below) if either cat is\n // gen zero (has a matron ID of zero).\n if (_sire.matronId == 0 || _matron.matronId == 0) {\n return true;\n }\n\n // Kitties can't breed with full or half siblings.\n if (_sire.matronId == _matron.matronId || _sire.matronId == _matron.sireId) {\n return false;\n }\n if (_sire.sireId == _matron.matronId || _sire.sireId == _matron.sireId) {\n return false;\n }\n\n // Everything seems cool! Let's get DTF.\n return true;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair for\n /// breeding via auction (i.e. skips ownership and siring approval checks).\n function _canBreedWithViaAuction(uint256 _matronId, uint256 _sireId)\n internal\n view\n returns (bool)\n {\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId);\n }\n\n /// @notice Checks to see if two cats can breed together, including checks for\n /// ownership and siring approvals. Does NOT check that both cats are ready for\n /// breeding (i.e. breedWith could still fail until the cooldowns are finished).\n /// TODO: Shouldn't this check pregnancy and cooldowns?!?\n /// @param _matronId The ID of the proposed matron.\n /// @param _sireId The ID of the proposed sire.\n function canBreedWith(uint256 _matronId, uint256 _sireId)\n external\n view\n returns(bool)\n {\n require(_matronId > 0);\n require(_sireId > 0);\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId) &&\n _isSiringPermitted(_sireId, _matronId);\n }\n\n /// @dev Internal utility function to initiate breeding, assumes that all breeding\n /// requirements have been checked.\n function _breedWith(uint256 _matronId, uint256 _sireId) internal {\n // Grab a reference to the Kitties from storage.\n Kitty storage sire = kitties[_sireId];\n Kitty storage matron = kitties[_matronId];\n\n // Mark the matron as pregnant, keeping track of who the sire is.\n matron.siringWithId = uint32(_sireId);\n\n // Trigger the cooldown for both parents.\n _triggerCooldown(sire);\n _triggerCooldown(matron);\n\n // Clear siring permission for both parents. This may not be strictly necessary\n // but it's likely to avoid confusion!\n delete sireAllowedToAddress[_matronId];\n delete sireAllowedToAddress[_sireId];\n\n // Every time a kitty gets pregnant, counter is incremented.\n pregnantKitties++;\n\n // Emit the pregnancy event.\n Pregnant(kittyIndexToOwner[_matronId], _matronId, _sireId, matron.cooldownEndBlock);\n }\n\n /// @notice Breed a Kitty you own (as matron) with a sire that you own, or for which you\n /// have previously been given Siring approval. Will either make your cat pregnant, or will\n /// fail entirely. Requires a pre-payment of the fee given out to the first caller of giveBirth()\n /// @param _matronId The ID of the Kitty acting as matron (will end up pregnant if successful)\n /// @param _sireId The ID of the Kitty acting as sire (will begin its siring cooldown if successful)\n function breedWithAuto(uint256 _matronId, uint256 _sireId)\n external\n payable\n whenNotPaused\n {\n // Checks for payment.\n require(msg.value >= autoBirthFee);\n\n // Caller must own the matron.\n require(_owns(msg.sender, _matronId));\n\n // Neither sire nor matron are allowed to be on auction during a normal\n // breeding operation, but we don't need to check that explicitly.\n // For matron: The caller of this function can't be the owner of the matron\n // because the owner of a Kitty on auction is the auction house, and the\n // auction house will never call breedWith().\n // For sire: Similarly, a sire on auction will be owned by the auction house\n // and the act of transferring ownership will have cleared any oustanding\n // siring approval.\n // Thus we don't need to spend gas explicitly checking to see if either cat\n // is on auction.\n\n // Check that matron and sire are both owned by caller, or that the sire\n // has given siring permission to caller (i.e. matron's owner).\n // Will fail for _sireId = 0\n require(_isSiringPermitted(_sireId, _matronId));\n\n // Grab a reference to the potential matron\n Kitty storage matron = kitties[_matronId];\n\n // Make sure matron isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(matron));\n\n // Grab a reference to the potential sire\n Kitty storage sire = kitties[_sireId];\n\n // Make sure sire isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(sire));\n\n // Test that these cats are a valid mating pair.\n require(_isValidMatingPair(\n matron,\n _matronId,\n sire,\n _sireId\n ));\n\n // All checks passed, kitty gets pregnant!\n _breedWith(_matronId, _sireId);\n }\n\n /// @notice Have a pregnant Kitty give birth!\n /// @param _matronId A Kitty ready to give birth.\n /// @return The Kitty ID of the new kitten.\n /// @dev Looks at a given Kitty and, if pregnant and if the gestation period has passed,\n /// combines the genes of the two parents to create a new kitten. The new Kitty is assigned\n /// to the current owner of the matron. Upon successful completion, both the matron and the\n /// new kitten will be ready to breed again. Note that anyone can call this function (if they\n /// are willing to pay the gas!), but the new kitten always goes to the mother's owner.\n function giveBirth(uint256 _matronId)\n external\n whenNotPaused\n returns(uint256)\n {\n // Grab a reference to the matron in storage.\n Kitty storage matron = kitties[_matronId];\n\n // Check that the matron is a valid cat.\n require(matron.birthTime != 0);\n\n // Check that the matron is pregnant, and that its time has come!\n require(_isReadyToGiveBirth(matron));\n\n // Grab a reference to the sire in storage.\n uint256 sireId = matron.siringWithId;\n Kitty storage sire = kitties[sireId];\n\n // Determine the higher generation number of the two parents\n uint16 parentGen = matron.generation;\n if (sire.generation > matron.generation) {\n parentGen = sire.generation;\n }\n\n // Call the sooper-sekret gene mixing operation.\n uint256 childGenes = geneScience.mixGenes(matron.genes, sire.genes, matron.cooldownEndBlock - 1);\n\n // Make the new kitten!\n address owner = kittyIndexToOwner[_matronId];\n uint256 kittenId = _createKitty(_matronId, matron.siringWithId, parentGen + 1, childGenes, owner);\n\n // Clear the reference to sire from the matron (REQUIRED! Having siringWithId\n // set is what marks a matron as being pregnant.)\n delete matron.siringWithId;\n\n // Every time a kitty gives birth counter is decremented.\n pregnantKitties--;\n\n // Send the balance fee to the person who made birth happen.\n msg.sender.send(autoBirthFee);\n\n // return the new kitten's ID\n return kittenId;\n }\n}\n\n\n\n\n\n\n\n\n\n\n/// @title Auction Core\n/// @dev Contains models, variables, and internal methods for the auction.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuctionBase {\n\n // Represents an auction on an NFT\n struct Auction {\n // Current owner of NFT\n address seller;\n // Price (in wei) at beginning of auction\n uint128 startingPrice;\n // Price (in wei) at end of auction\n uint128 endingPrice;\n // Duration (in seconds) of auction\n uint64 duration;\n // Time when auction started\n // NOTE: 0 if this auction has been concluded\n uint64 startedAt;\n }\n\n // Reference to contract tracking NFT ownership\n KittiesERC721 public nonFungibleContract;\n\n // Cut owner takes on each auction, measured in basis points (1/100 of a percent).\n // Values 0-10,000 map to 0%-100%\n uint256 public ownerCut;\n\n // Map from token ID to their corresponding auction.\n mapping (uint256 => Auction) tokenIdToAuction;\n\n event AuctionCreated(uint256 tokenId, uint256 startingPrice, uint256 endingPrice, uint256 duration);\n event AuctionSuccessful(uint256 tokenId, uint256 totalPrice, address winner);\n event AuctionCancelled(uint256 tokenId);\n\n /// @dev Returns true if the claimant owns the token.\n /// @param _claimant - Address claiming to own the token.\n /// @param _tokenId - ID of token whose ownership to verify.\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return (nonFungibleContract.ownerOf(_tokenId) == _claimant);\n }\n\n /// @dev Escrows the NFT, assigning ownership to this contract.\n /// Throws if the escrow fails.\n /// @param _owner - Current owner address of token to escrow.\n /// @param _tokenId - ID of token whose approval to verify.\n function _escrow(address _owner, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transferFrom(_owner, this, _tokenId);\n }\n\n /// @dev Transfers an NFT owned by this contract to another address.\n /// Returns true if the transfer succeeds.\n /// @param _receiver - Address to transfer NFT to.\n /// @param _tokenId - ID of token to transfer.\n function _transfer(address _receiver, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transfer(_receiver, _tokenId);\n }\n\n /// @dev Adds an auction to the list of open auctions. Also fires the\n /// AuctionCreated event.\n /// @param _tokenId The ID of the token to be put on auction.\n /// @param _auction Auction to add.\n function _addAuction(uint256 _tokenId, Auction _auction) internal {\n // Require that all auctions have a duration of\n // at least one minute. (Keeps our math from getting hairy!)\n require(_auction.duration >= 1 minutes);\n\n tokenIdToAuction[_tokenId] = _auction;\n\n AuctionCreated(\n uint256(_tokenId),\n uint256(_auction.startingPrice),\n uint256(_auction.endingPrice),\n uint256(_auction.duration)\n );\n }\n\n /// @dev Cancels an auction unconditionally.\n function _cancelAuction(uint256 _tokenId, address _seller) internal {\n _removeAuction(_tokenId);\n _transfer(_seller, _tokenId);\n AuctionCancelled(_tokenId);\n }\n\n /// @dev Computes the price and transfers winnings.\n /// Does NOT transfer ownership of token.\n function _bid(uint256 _tokenId, uint256 _bidAmount)\n internal\n returns (uint256)\n {\n // Get a reference to the auction struct\n Auction storage auction = tokenIdToAuction[_tokenId];\n\n // Explicitly check that this auction is currently live.\n // (Because of how Ethereum mappings work, we can't just count\n // on the lookup above failing. An invalid _tokenId will just\n // return an auction object that is all zeros.)\n require(_isOnAuction(auction));\n\n // Check that the bid is greater than or equal to the current price\n uint256 price = _currentPrice(auction);\n require(_bidAmount >= price);\n\n // Grab a reference to the seller before the auction struct\n // gets deleted.\n address seller = auction.seller;\n\n // The bid is good! Remove the auction before sending the fees\n // to the sender so we can't have a reentrancy attack.\n _removeAuction(_tokenId);\n\n // Transfer proceeds to seller (if there are any!)\n if (price > 0) {\n // Calculate the auctioneer's cut.\n // (NOTE: _computeCut() is guaranteed to return a\n // value <= price, so this subtraction can't go negative.)\n uint256 auctioneerCut = _computeCut(price);\n uint256 sellerProceeds = price - auctioneerCut;\n\n // NOTE: Doing a transfer() in the middle of a complex\n // method like this is generally discouraged because of\n // reentrancy attacks and DoS attacks if the seller is\n // a contract with an invalid fallback function. We explicitly\n // guard against reentrancy attacks by removing the auction\n // before calling transfer(), and the only thing the seller\n // can DoS is the sale of their own asset! (And if it's an\n // accident, they can call cancelAuction(). )\n seller.transfer(sellerProceeds);\n }\n\n // Calculate any excess funds included with the bid. If the excess\n // is anything worth worrying about, transfer it back to bidder.\n // NOTE: We checked above that the bid amount is greater than or\n // equal to the price so this cannot underflow.\n uint256 bidExcess = _bidAmount - price;\n\n // Return the funds. Similar to the previous transfer, this is\n // not susceptible to a re-entry attack because the auction is\n // removed before any transfers occur.\n msg.sender.transfer(bidExcess);\n\n // Tell the world!\n AuctionSuccessful(_tokenId, price, msg.sender);\n\n return price;\n }\n\n /// @dev Removes an auction from the list of open auctions.\n /// @param _tokenId - ID of NFT on auction.\n function _removeAuction(uint256 _tokenId) internal {\n delete tokenIdToAuction[_tokenId];\n }\n\n /// @dev Returns true if the NFT is on auction.\n /// @param _auction - Auction to check.\n function _isOnAuction(Auction storage _auction) internal view returns (bool) {\n return (_auction.startedAt > 0);\n }\n\n /// @dev Returns current price of an NFT on auction. Broken into two\n /// functions (this one, that computes the duration from the auction\n /// structure, and the other that does the price computation) so we\n /// can easily test that the price computation works correctly.\n function _currentPrice(Auction storage _auction)\n internal\n view\n returns (uint256)\n {\n uint256 secondsPassed = 0;\n\n // A bit of insurance against negative values (or wraparound).\n // Probably not necessary (since Ethereum guarnatees that the\n // now variable doesn't ever go backwards).\n if (now > _auction.startedAt) {\n secondsPassed = now - _auction.startedAt;\n }\n\n return _computeCurrentPrice(\n _auction.startingPrice,\n _auction.endingPrice,\n _auction.duration,\n secondsPassed\n );\n }\n\n /// @dev Computes the current price of an auction. Factored out\n /// from _currentPrice so we can run extensive unit tests.\n /// When testing, make this function public and turn on\n /// `Current price computation` test suite.\n function _computeCurrentPrice(\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n uint256 _secondsPassed\n )\n internal\n pure\n returns (uint256)\n {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our public functions carefully cap the maximum values for\n // time (at 64-bits) and currency (at 128-bits). _duration is\n // also known to be non-zero (see the require() statement in\n // _addAuction())\n if (_secondsPassed >= _duration) {\n // We've reached the end of the dynamic pricing portion\n // of the auction, just return the end price.\n return _endingPrice;\n } else {\n // Starting price can be higher than ending price (and often is!), so\n // this delta can be negative.\n int256 totalPriceChange = int256(_endingPrice) - int256(_startingPrice);\n\n // This multiplication can't overflow, _secondsPassed will easily fit within\n // 64-bits, and totalPriceChange will easily fit within 128-bits, their product\n // will always fit within 256-bits.\n int256 currentPriceChange = totalPriceChange * int256(_secondsPassed) / int256(_duration);\n\n // currentPriceChange can be negative, but if so, will have a magnitude\n // less that _startingPrice. Thus, this result will always end up positive.\n int256 currentPrice = int256(_startingPrice) + currentPriceChange;\n\n return uint256(currentPrice);\n }\n }\n\n /// @dev Computes owner's cut of a sale.\n /// @param _price - Sale price of NFT.\n function _computeCut(uint256 _price) internal view returns (uint256) {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our entry functions carefully cap the maximum values for\n // currency (at 128-bits), and ownerCut <= 10000 (see the require()\n // statement in the ClockAuction constructor). The result of this\n // function is always guaranteed to be <= _price.\n return _price * ownerCut / 10000;\n }\n\n}\n\n\n\n\n\n\n\n/**\n * @title KittiesPausable\n * @dev Base contract which allows children to implement an emergency stop mechanism.\n */\ncontract KittiesPausable is KittiesOwnable {\n event Pause();\n event Unpause();\n\n bool public paused = false;\n\n\n /**\n\t * @dev modifier to allow actions only when the contract IS paused\n\t */\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /**\n\t * @dev modifier to allow actions only when the contract IS NOT paused\n\t */\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /**\n\t * @dev called by the owner to pause, triggers stopped state\n\t */\n function pause() onlyOwner whenNotPaused returns (bool) {\n paused = true;\n Pause();\n return true;\n }\n\n /**\n\t * @dev called by the owner to unpause, returns to normal state\n\t */\n function unpause() onlyOwner whenPaused returns (bool) {\n paused = false;\n Unpause();\n return true;\n }\n}\n\n\n/// @title Clock auction for non-fungible tokens.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuction is KittiesPausable, ClockAuctionBase {\n\n /// @dev The ERC-165 interface signature for ERC-721.\n /// Ref: https://github.com/ethereum/EIPs/issues/165\n /// Ref: https://github.com/ethereum/EIPs/issues/721\n bytes4 constant InterfaceSignature_ERC721 = bytes4(0x9a20483d);\n\n /// @dev Constructor creates a reference to the NFT ownership contract\n /// and verifies the owner cut is in the valid range.\n /// @param _nftAddress - address of a deployed contract implementing\n /// the Nonfungible Interface.\n /// @param _cut - percent cut the owner takes on each auction, must be\n /// between 0-10,000.\n function ClockAuction(address _nftAddress, uint256 _cut) public {\n require(_cut <= 10000);\n ownerCut = _cut;\n\n KittiesERC721 candidateContract = KittiesERC721(_nftAddress);\n require(candidateContract.supportsInterface(InterfaceSignature_ERC721));\n nonFungibleContract = candidateContract;\n }\n\n /// @dev Remove all Ether from the contract, which is the owner's cuts\n /// as well as any Ether sent directly to the contract address.\n /// Always transfers to the NFT contract, but can be called either by\n /// the owner or the NFT contract.\n function withdrawBalance() external {\n address nftAddress = address(nonFungibleContract);\n\n require(\n msg.sender == owner ||\n msg.sender == nftAddress\n );\n // We are using this boolean method to make sure that even if one fails it will still work\n bool res = nftAddress.send(this.balance);\n }\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of time to move between starting\n /// price and ending price (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n whenNotPaused\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(_owns(msg.sender, _tokenId));\n _escrow(msg.sender, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Bids on an open auction, completing the auction and transferring\n /// ownership of the NFT if enough Ether is supplied.\n /// @param _tokenId - ID of token to bid on.\n function bid(uint256 _tokenId)\n external\n payable\n whenNotPaused\n {\n // _bid will throw if the bid or funds transfer fails\n _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n }\n\n /// @dev Cancels an auction that hasn't been won yet.\n /// Returns the NFT to original owner.\n /// @notice This is a state-modifying function that can\n /// be called while the contract is paused.\n /// @param _tokenId - ID of token on auction\n function cancelAuction(uint256 _tokenId)\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n address seller = auction.seller;\n require(msg.sender == seller);\n _cancelAuction(_tokenId, seller);\n }\n\n /// @dev Cancels an auction when the contract is paused.\n /// Only the owner may do this, and NFTs are returned to\n /// the seller. This should only be used in emergencies.\n /// @param _tokenId - ID of the NFT on auction to cancel.\n function cancelAuctionWhenPaused(uint256 _tokenId)\n whenPaused\n onlyOwner\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n _cancelAuction(_tokenId, auction.seller);\n }\n\n /// @dev Returns auction info for an NFT on auction.\n /// @param _tokenId - ID of NFT on auction.\n function getAuction(uint256 _tokenId)\n external\n view\n returns\n (\n address seller,\n uint256 startingPrice,\n uint256 endingPrice,\n uint256 duration,\n uint256 startedAt\n ) {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return (\n auction.seller,\n auction.startingPrice,\n auction.endingPrice,\n auction.duration,\n auction.startedAt\n );\n }\n\n /// @dev Returns the current price of an auction.\n /// @param _tokenId - ID of the token price we are checking.\n function getCurrentPrice(uint256 _tokenId)\n external\n view\n returns (uint256)\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return _currentPrice(auction);\n }\n\n}\n\n\n/// @title Reverse auction modified for siring\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SiringClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSiringAuctionAddress() call.\n bool public isSiringClockAuction = true;\n\n // Delegate constructor\n function SiringClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction. Since this function is wrapped,\n /// require sender to be KittyCore contract.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Places a bid for siring. Requires the sender\n /// is the KittyCore contract because all bid methods\n /// should be wrapped. Also returns the kitty to the\n /// seller rather than the winner.\n function bid(uint256 _tokenId)\n external\n payable\n {\n require(msg.sender == address(nonFungibleContract));\n address seller = tokenIdToAuction[_tokenId].seller;\n // _bid checks that token ID is valid and will throw if bid fails\n _bid(_tokenId, msg.value);\n // We transfer the kitty back to the seller, the winner will get\n // the offspring\n _transfer(seller, _tokenId);\n }\n\n}\n\n\n\n\n\n/// @title Clock auction modified for sale of kitties\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SaleClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSaleAuctionAddress() call.\n bool public isSaleClockAuction = true;\n\n // Tracks last 5 sale price of gen0 kitty sales\n uint256 public gen0SaleCount;\n uint256[5] public lastGen0SalePrices;\n\n // Delegate constructor\n function SaleClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Updates lastSalePrice if seller is the nft contract\n /// Otherwise, works the same as default bid method.\n function bid(uint256 _tokenId)\n external\n payable\n {\n // _bid verifies token ID size\n address seller = tokenIdToAuction[_tokenId].seller;\n uint256 price = _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n\n // If not a gen0 auction, exit\n if (seller == address(nonFungibleContract)) {\n // Track gen0 sale prices\n lastGen0SalePrices[gen0SaleCount % 5] = price;\n gen0SaleCount++;\n }\n }\n\n function averageGen0SalePrice() external view returns (uint256) {\n uint256 sum = 0;\n for (uint256 i = 0; i < 5; i++) {\n sum += lastGen0SalePrices[i];\n }\n return sum / 5;\n }\n\n}\n\n\n/// @title Handles creating auctions for sale and siring of kitties.\n/// This wrapper of ReverseAuction exists only so that users can create\n/// auctions with only one transaction.\ncontract KittyAuction is KittyBreeding {\n\n // @notice The auction contract variables are defined in KittyBase to allow\n // us to refer to them in KittyOwnership to prevent accidental transfers.\n // `saleAuction` refers to the auction for gen0 and p2p sale of kitties.\n // `siringAuction` refers to the auction for siring rights of kitties.\n\n /// @dev Sets the reference to the sale auction.\n /// @param _address - Address of sale contract.\n function setSaleAuctionAddress(address _address) external onlyCEO {\n SaleClockAuction candidateContract = SaleClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSaleClockAuction());\n\n // Set the new contract address\n saleAuction = candidateContract;\n }\n\n /// @dev Sets the reference to the siring auction.\n /// @param _address - Address of siring contract.\n function setSiringAuctionAddress(address _address) external onlyCEO {\n SiringClockAuction candidateContract = SiringClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSiringClockAuction());\n\n // Set the new contract address\n siringAuction = candidateContract;\n }\n\n /// @dev Put a kitty up for auction.\n /// Does some ownership trickery to create auctions in one tx.\n function createSaleAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n // Ensure the kitty is not pregnant to prevent the auction\n // contract accidentally receiving ownership of the child.\n // NOTE: the kitty IS allowed to be in a cooldown.\n require(!isPregnant(_kittyId));\n _approve(_kittyId, saleAuction);\n // Sale auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n saleAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Put a kitty up for auction to be sire.\n /// Performs checks to ensure the kitty can be sired, then\n /// delegates to reverse auction.\n function createSiringAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n require(isReadyToBreed(_kittyId));\n _approve(_kittyId, siringAuction);\n // Siring auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n siringAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Completes a siring auction by bidding.\n /// Immediately breeds the winning matron with the sire on auction.\n /// @param _sireId - ID of the sire on auction.\n /// @param _matronId - ID of the matron owned by the bidder.\n function bidOnSiringAuction(\n uint256 _sireId,\n uint256 _matronId\n )\n external\n payable\n whenNotPaused\n {\n // Auction contract checks input sizes\n require(_owns(msg.sender, _matronId));\n require(isReadyToBreed(_matronId));\n require(_canBreedWithViaAuction(_matronId, _sireId));\n\n // Define the current price of the auction.\n uint256 currentPrice = siringAuction.getCurrentPrice(_sireId);\n require(msg.value >= currentPrice + autoBirthFee);\n\n // Siring auction will throw if the bid fails.\n siringAuction.bid.value(msg.value - autoBirthFee)(_sireId);\n _breedWith(uint32(_matronId), uint32(_sireId));\n }\n\n /// @dev Transfers the balance of the sale auction contract\n /// to the KittyCore contract. We use two-step withdrawal to\n /// prevent two transfer calls in the auction bid function.\n function withdrawAuctionBalances() external onlyCLevel {\n saleAuction.withdrawBalance();\n siringAuction.withdrawBalance();\n }\n}\n\n\n/// @title all functions related to creating kittens\ncontract KittyMinting is KittyAuction {\n\n // Limits the number of cats the contract owner can ever create.\n uint256 public constant PROMO_CREATION_LIMIT = 5000;\n uint256 public constant GEN0_CREATION_LIMIT = 45000;\n\n // Constants for gen0 auctions.\n uint256 public constant GEN0_STARTING_PRICE = 10 finney;\n uint256 public constant GEN0_AUCTION_DURATION = 1 days;\n\n // Counts the number of cats the contract owner has created.\n uint256 public promoCreatedCount;\n uint256 public gen0CreatedCount;\n\n /// @dev we can create promo kittens, up to a limit. Only callable by COO\n /// @param _genes the encoded genes of the kitten to be created, any value is accepted\n /// @param _owner the future owner of the created kittens. Default to contract COO\n function createPromoKitty(uint256 _genes, address _owner) external onlyCOO {\n address kittyOwner = _owner;\n if (kittyOwner == address(0)) {\n kittyOwner = cooAddress;\n }\n require(promoCreatedCount < PROMO_CREATION_LIMIT);\n\n promoCreatedCount++;\n _createKitty(0, 0, 0, _genes, kittyOwner);\n }\n\n /// @dev Creates a new gen0 kitty with the given genes and\n /// creates an auction for it.\n function createGen0Auction(uint256 _genes) external onlyCOO {\n require(gen0CreatedCount < GEN0_CREATION_LIMIT);\n\n uint256 kittyId = _createKitty(0, 0, 0, _genes, address(this));\n _approve(kittyId, saleAuction);\n\n saleAuction.createAuction(\n kittyId,\n _computeNextGen0Price(),\n 0,\n GEN0_AUCTION_DURATION,\n address(this)\n );\n\n gen0CreatedCount++;\n }\n\n /// @dev Computes the next gen0 auction starting price, given\n /// the average of the past 5 prices + 50%.\n function _computeNextGen0Price() internal view returns (uint256) {\n uint256 avePrice = saleAuction.averageGen0SalePrice();\n\n // Sanity check to ensure we don't overflow arithmetic\n require(avePrice == uint256(uint128(avePrice)));\n\n uint256 nextPrice = avePrice + (avePrice / 2);\n\n // We never auction for less than starting price\n if (nextPrice < GEN0_STARTING_PRICE) {\n nextPrice = GEN0_STARTING_PRICE;\n }\n\n return nextPrice;\n }\n}\n\n\n/// @title CryptoKitties: Collectible, breedable, and oh-so-adorable cats on the Ethereum blockchain.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev The main CryptoKitties contract, keeps track of kittens so they don't wander around and get lost.\ncontract KittyCore is KittyMinting {\n\n // This is the main CryptoKitties contract. In order to keep our code seperated into logical sections,\n // we've broken it up in two ways. First, we have several seperately-instantiated sibling contracts\n // that handle auctions and our super-top-secret genetic combination algorithm. The auctions are\n // seperate since their logic is somewhat complex and there's always a risk of subtle bugs. By keeping\n // them in their own contracts, we can upgrade them without disrupting the main contract that tracks\n // kitty ownership. The genetic combination algorithm is kept seperate so we can open-source all of\n // the rest of our code without making it _too_ easy for folks to figure out how the genetics work.\n // Don't worry, I'm sure someone will reverse engineer it soon enough!\n //\n // Secondly, we break the core contract into multiple files using inheritence, one for each major\n // facet of functionality of CK. This allows us to keep related code bundled together while still\n // avoiding a single giant file with everything in it. The breakdown is as follows:\n //\n // - KittyBase: This is where we define the most fundamental code shared throughout the core\n // functionality. This includes our main data storage, constants and data types, plus\n // internal functions for managing these items.\n //\n // - KittyAccessControl: This contract manages the various addresses and constraints for operations\n // that can be executed only by specific roles. Namely CEO, CFO and COO.\n //\n // - KittyOwnership: This provides the methods required for basic non-fungible token\n // transactions, following the draft ERC-721 spec (https://github.com/ethereum/EIPs/issues/721).\n //\n // - KittyBreeding: This file contains the methods necessary to breed cats together, including\n // keeping track of siring offers, and relies on an external genetic combination contract.\n //\n // - KittyAuctions: Here we have the public methods for auctioning or bidding on cats or siring\n // services. The actual auction functionality is handled in two sibling contracts (one\n // for sales and one for siring), while auction creation and bidding is mostly mediated\n // through this facet of the core contract.\n //\n // - KittyMinting: This final facet contains the functionality we use for creating new gen0 cats.\n // We can make up to 5000 \"promo\" cats that can be given away (especially important when\n // the community is new), and all others can only be created and then immediately put up\n // for auction via an algorithmically determined starting price. Regardless of how they\n // are created, there is a hard limit of 50k gen0 cats. After that, it's all up to the\n // community to breed, breed, breed!\n\n // Set in case the core contract is broken and an upgrade is required\n address public newContractAddress;\n\n /// @notice Creates the main CryptoKitties smart contract instance.\n function KittyCore() public {\n // Starts paused.\n paused = true;\n\n // the creator of the contract is the initial CEO\n ceoAddress = msg.sender;\n\n // the creator of the contract is also the initial COO\n cooAddress = msg.sender;\n\n // start with the mythical kitten 0 - so we don't have generation-0 parent issues\n _createKitty(0, 0, 0, uint256(-1), address(0));\n }\n\n /// @dev Used to mark the smart contract as upgraded, in case there is a serious\n /// breaking bug. This method does nothing but keep track of the new contract and\n /// emit a message indicating that the new address is set. It's up to clients of this\n /// contract to update to the new contract address in that case. (This contract will\n /// be paused indefinitely if such an upgrade takes place.)\n /// @param _v2Address new address\n function setNewAddress(address _v2Address) external onlyCEO whenPaused {\n // See README.md for updgrade plan\n newContractAddress = _v2Address;\n ContractUpgrade(_v2Address);\n }\n\n /// @notice No tipping!\n /// @dev Reject all Ether from being sent here, unless it's from one of the\n /// two auction contracts. (Hopefully, we can prevent user accidents.)\n function() external payable {\n require(\n msg.sender == address(saleAuction) ||\n msg.sender == address(siringAuction)\n );\n }\n\n /// @notice Returns all the relevant information about a specific kitty.\n /// @param _id The ID of the kitty of interest.\n function getKitty(uint256 _id)\n external\n view\n returns (\n bool isGestating,\n bool isReady,\n uint256 cooldownIndex,\n uint256 nextActionAt,\n uint256 siringWithId,\n uint256 birthTime,\n uint256 matronId,\n uint256 sireId,\n uint256 generation,\n uint256 genes\n ) {\n Kitty storage kit = kitties[_id];\n\n // if this variable is 0 then it's not gestating\n isGestating = (kit.siringWithId != 0);\n isReady = (kit.cooldownEndBlock <= block.number);\n cooldownIndex = uint256(kit.cooldownIndex);\n nextActionAt = uint256(kit.cooldownEndBlock);\n siringWithId = uint256(kit.siringWithId);\n birthTime = uint256(kit.birthTime);\n matronId = uint256(kit.matronId);\n sireId = uint256(kit.sireId);\n generation = uint256(kit.generation);\n genes = kit.genes;\n }\n\n /// @dev Override unpause so it requires all external contract addresses\n /// to be set before contract can be unpaused. Also, we can't have\n /// newContractAddress set either, because then the contract was upgraded.\n /// @notice This is public rather than external so we can call super.unpause\n /// without using an expensive CALL.\n function unpause() public onlyCEO whenPaused {\n require(saleAuction != address(0));\n require(siringAuction != address(0));\n require(geneScience != address(0));\n require(newContractAddress == address(0));\n\n // Actually unpause the contract.\n super.unpause();\n }\n\n // @dev Allows the CFO to capture the balance available to the contract.\n function withdrawBalance() external onlyCFO {\n uint256 balance = this.balance;\n // Subtract all the currently pregnant kittens we have, plus 1 of margin.\n uint256 subtractFees = (pregnantKitties + 1) * autoBirthFee;\n\n if (balance > subtractFees) {\n cfoAddress.send(balance - subtractFees);\n }\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "exportedSymbols": { "ClockAuction": [ 8872 @@ -51684,5 +51684,5 @@ export const GeneScienceInterface = }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:47.655Z" + "updatedAt": "2018-10-09T17:45:35.863Z" } \ No newline at end of file diff --git a/artifacts/ts/IncompatibleTermsContract.ts b/artifacts/ts/IncompatibleTermsContract.ts index 9cf3209b..c860a9a4 100644 --- a/artifacts/ts/IncompatibleTermsContract.ts +++ b/artifacts/ts/IncompatibleTermsContract.ts @@ -122,15 +122,15 @@ export const IncompatibleTermsContract = "type": "function" } ], - "bytecode": "0x6060604052341561000f57600080fd5b6102938061001e6000396000f30060606040526004361061006d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a896a1146100725780632762dd8c146100ad5780635f0280ba146100e8578063977a5e641461018d57806399114d84146101eb575b600080fd5b341561007d57600080fd5b61009760048080356000191690602001909190505061022f565b6040518082815260200191505060405180910390f35b34156100b857600080fd5b6100d2600480803560001916906020019091905050610239565b6040518082815260200191505060405180910390f35b34156100f357600080fd5b61017360048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610243565b604051808215151515815260200191505060405180910390f35b341561019857600080fd5b6101d160048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610251565b604051808215151515815260200191505060405180910390f35b34156101f657600080fd5b61021960048080356000191690602001909190803590602001909190505061025c565b6040518082815260200191505060405180910390f35b6000809050919050565b6000809050919050565b600080905095945050505050565b600080905092915050565b6000809050929150505600a165627a7a72305820f828956284b3469c869d4f46dddc071c3a378bca4d3d6aca9ec5e60ab8b00d0d0029", - "deployedBytecode": "0x60606040526004361061006d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a896a1146100725780632762dd8c146100ad5780635f0280ba146100e8578063977a5e641461018d57806399114d84146101eb575b600080fd5b341561007d57600080fd5b61009760048080356000191690602001909190505061022f565b6040518082815260200191505060405180910390f35b34156100b857600080fd5b6100d2600480803560001916906020019091905050610239565b6040518082815260200191505060405180910390f35b34156100f357600080fd5b61017360048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610243565b604051808215151515815260200191505060405180910390f35b341561019857600080fd5b6101d160048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610251565b604051808215151515815260200191505060405180910390f35b34156101f657600080fd5b61021960048080356000191690602001909190803590602001909190505061025c565b6040518082815260200191505060405180910390f35b6000809050919050565b6000809050919050565b600080905095945050505050565b600080905092915050565b6000809050929150505600a165627a7a72305820f828956284b3469c869d4f46dddc071c3a378bca4d3d6aca9ec5e60ab8b00d0d0029", + "bytecode": "0x6060604052341561000f57600080fd5b6102938061001e6000396000f30060606040526004361061006d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a896a1146100725780632762dd8c146100ad5780635f0280ba146100e8578063977a5e641461018d57806399114d84146101eb575b600080fd5b341561007d57600080fd5b61009760048080356000191690602001909190505061022f565b6040518082815260200191505060405180910390f35b34156100b857600080fd5b6100d2600480803560001916906020019091905050610239565b6040518082815260200191505060405180910390f35b34156100f357600080fd5b61017360048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610243565b604051808215151515815260200191505060405180910390f35b341561019857600080fd5b6101d160048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610251565b604051808215151515815260200191505060405180910390f35b34156101f657600080fd5b61021960048080356000191690602001909190803590602001909190505061025c565b6040518082815260200191505060405180910390f35b6000809050919050565b6000809050919050565b600080905095945050505050565b600080905092915050565b6000809050929150505600a165627a7a72305820c4bfd6f0bbdb820edb18acbc4375ad54a62a711c6e72e7da475dcf237dcdec3d0029", + "deployedBytecode": "0x60606040526004361061006d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a896a1146100725780632762dd8c146100ad5780635f0280ba146100e8578063977a5e641461018d57806399114d84146101eb575b600080fd5b341561007d57600080fd5b61009760048080356000191690602001909190505061022f565b6040518082815260200191505060405180910390f35b34156100b857600080fd5b6100d2600480803560001916906020019091905050610239565b6040518082815260200191505060405180910390f35b34156100f357600080fd5b61017360048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610243565b604051808215151515815260200191505060405180910390f35b341561019857600080fd5b6101d160048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610251565b604051808215151515815260200191505060405180910390f35b34156101f657600080fd5b61021960048080356000191690602001909190803590602001909190505061025c565b6040518082815260200191505060405180910390f35b6000809050919050565b6000809050919050565b600080905095945050505050565b600080905092915050565b6000809050929150505600a165627a7a72305820c4bfd6f0bbdb820edb18acbc4375ad54a62a711c6e72e7da475dcf237dcdec3d0029", "sourceMap": "867:3132:33:-;;;;;;;;;;;;;;;;;", "deployedSourceMap": "867:3132:33:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3726:144;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3876:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2377:258;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1500:166;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3244:201;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3726:144;3822:17;3862:1;3855:8;;3726:144;;;:::o;3876:121::-;3962:4;3989:1;3982:8;;3876:121;;;:::o;2377:258::-;2587:13;2623:5;2616:12;;2377:258;;;;;;;:::o;1500:166::-;1618:13;1654:5;1647:12;;1500:166;;;;:::o;3244:201::-;3386:28;3437:1;3430:8;;3244:201;;;;:::o", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\nimport \"../../TermsContract.sol\";\n\n\n/**\n * Contract created for testing purposes that will consistently reject\n * debt order fills that are mapped to it by returning `false` for\n * `registerTermStart`\n *\n * Author: Nadav Hollander Github: nadavhollander\n */\ncontract IncompatibleTermsContract is TermsContract {\n /// When called, the registerTermStart function registers the fact that\n /// the debt agreement has begun. Given that the SimpleInterestTermsContract\n /// doesn't rely on taking any sorts of actions when the loan term begins,\n /// we simply validate DebtKernel is the transaction sender, and return\n /// `true` if the debt agreement is associated with this terms contract.\n /// @param agreementId bytes32. The agreement id (issuance hash) of the debt agreement to which this pertains.\n /// @return _success bool. Acknowledgment of whether\n function registerTermStart(\n bytes32 agreementId,\n address debtor\n )\n public\n returns (bool _success)\n {\n return false;\n }\n\n /// When called, the registerRepayment function records the debtor's\n /// repayment, as well as any auxiliary metadata needed by the contract\n /// to determine ex post facto the value repaid (e.g. current USD\n /// exchange rate)\n /// @param agreementId bytes32. The agreement id (issuance hash) of the debt agreement to which this pertains.\n /// @param payer address. The address of the payer.\n /// @param beneficiary address. The address of the payment's beneficiary.\n /// @param unitsOfRepayment uint. The units-of-value repaid in the transaction.\n /// @param tokenAddress address. The address of the token with which the repayment transaction was executed.\n function registerRepayment(\n bytes32 agreementId,\n address payer,\n address beneficiary,\n uint256 unitsOfRepayment,\n address tokenAddress\n )\n public\n returns (bool _success)\n {\n return false;\n }\n\n /// Returns the cumulative units-of-value expected to be repaid given a block's timestamp.\n /// Note this is not a constant function -- this value can vary on basis of any number of\n /// conditions (e.g. interest rates can be renegotiated if repayments are delinquent).\n /// @param agreementId bytes32. The agreement id (issuance hash) of the debt agreement to which this pertains.\n /// @param timestamp uint. The timestamp for which repayment expectation is being queried.\n /// @return uint256 The cumulative units-of-value expected to be repaid given a block's timestamp.\n function getExpectedRepaymentValue(\n bytes32 agreementId,\n uint256 timestamp\n )\n public\n view\n returns (uint _expectedRepaymentValue)\n {\n return 0;\n }\n\n /// Returns the cumulative units-of-value repaid to date.\n /// @param agreementId bytes32. The agreement id (issuance hash) of the debt agreement to which this pertains.\n /// @return uint256 The cumulative units-of-value repaid by the specified block timestamp.\n function getValueRepaidToDate(bytes32 agreementId)\n public\n view\n returns (uint _valueRepaid)\n {\n return 0;\n }\n\n function getTermEndTimestamp(\n bytes32 _agreementId\n ) public view returns (uint)\n {\n return 0;\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/terms_contracts/IncompatibleTermsContract.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/terms_contracts/IncompatibleTermsContract.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/terms_contracts/IncompatibleTermsContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/terms_contracts/IncompatibleTermsContract.sol", "exportedSymbols": { "IncompatibleTermsContract": [ 12585 @@ -153,7 +153,7 @@ export const IncompatibleTermsContract = { "attributes": { "SourceUnit": 4758, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/TermsContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/TermsContract.sol", "file": "../../TermsContract.sol", "scope": 12586, "symbolAliases": [ @@ -988,7 +988,7 @@ export const IncompatibleTermsContract = "42": { "events": {}, "links": {}, - "address": "0x265f2abbf5a568df8ed31644204b011eac0c1886" + "address": "0xc8d55fd3717f8c3f8d31456504ab84b11b80520e" }, "70": { "events": {}, @@ -997,5 +997,5 @@ export const IncompatibleTermsContract = } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:13:36.849Z" + "updatedAt": "2018-10-09T17:50:25.365Z" } \ No newline at end of file diff --git a/artifacts/ts/KittiesERC721.ts b/artifacts/ts/KittiesERC721.ts index d87162e5..95ad3511 100644 --- a/artifacts/ts/KittiesERC721.ts +++ b/artifacts/ts/KittiesERC721.ts @@ -181,10 +181,10 @@ export const KittiesERC721 = "sourceMap": "", "deployedSourceMap": "", "source": "pragma solidity 0.4.18;\n\n/**\n The following contract code, titled KittyCore, was written by Cryptokitties and published\n and retrieved from https://etherscan.io/address/0x06012c8cf97bead5deae237070f9587f8e7a266d#code.\n\n It is included in the current project for test purposes, to ensure that our collateralizer can\n handle ERC721 tokens created by the KittyCore contract.\n*/\n\n/**\n * @title KittiesOwnable\n * @dev The KittiesOwnable contract has an owner address, and provides basic authorization control\n * functions, this simplifies the implementation of \"user permissions\".\n */\ncontract KittiesOwnable {\n address public owner;\n\n\n /**\n\t * @dev The KittiesOwnable constructor sets the original `owner` of the contract to the sender\n\t * account.\n\t */\n function KittiesOwnable() {\n owner = msg.sender;\n }\n\n\n /**\n\t * @dev Throws if called by any account other than the owner.\n\t */\n modifier onlyOwner() {\n require(msg.sender == owner);\n _;\n }\n\n\n /**\n\t * @dev Allows the current owner to transfer control of the contract to a newOwner.\n\t * @param newOwner The address to transfer ownership to.\n\t */\n function transferOwnership(address newOwner) onlyOwner {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n\n}\n\n\n\n/// @title Interface for contracts conforming to ERC-721: Non-Fungible Tokens\n/// @author Dieter Shirley (https://github.com/dete)\ncontract KittiesERC721 {\n // Required methods\n function totalSupply() public view returns (uint256 total);\n function balanceOf(address _owner) public view returns (uint256 balance);\n function ownerOf(uint256 _tokenId) external view returns (address owner);\n function approve(address _to, uint256 _tokenId) external;\n function transfer(address _to, uint256 _tokenId) external;\n function transferFrom(address _from, address _to, uint256 _tokenId) external;\n\n // Events\n event Transfer(address from, address to, uint256 tokenId);\n event Approval(address owner, address approved, uint256 tokenId);\n\n // Optional\n // function name() public view returns (string name);\n // function symbol() public view returns (string symbol);\n // function tokensOfOwner(address _owner) external view returns (uint256[] tokenIds);\n // function tokenMetadata(uint256 _tokenId, string _preferredTransport) public view returns (string infoUrl);\n\n // ERC-165 Compatibility (https://github.com/ethereum/EIPs/issues/165)\n function supportsInterface(bytes4 _interfaceID) external view returns (bool);\n}\n\n\n// // Auction wrapper functions\n\n\n// Auction wrapper functions\n\n\n\n\n\n\n\n/// @title SEKRETOOOO\ncontract GeneScienceInterface {\n /// @dev simply a boolean to indicate this is the contract we expect to be\n function isGeneScience() public pure returns (bool);\n\n /// @dev given genes of kitten 1 & 2, return a genetic combination - may have a random factor\n /// @param genes1 genes of mom\n /// @param genes2 genes of sire\n /// @return the genes that are supposed to be passed down the child\n function mixGenes(uint256 genes1, uint256 genes2, uint256 targetBlock) public returns (uint256);\n}\n\n\n\n\n\n\n\n/// @title A facet of KittyCore that manages special access privileges.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyAccessControl {\n // This facet controls access control for CryptoKitties. There are four roles managed here:\n //\n // - The CEO: The CEO can reassign other roles and change the addresses of our dependent smart\n // contracts. It is also the only role that can unpause the smart contract. It is initially\n // set to the address that created the smart contract in the KittyCore constructor.\n //\n // - The CFO: The CFO can withdraw funds from KittyCore and its auction contracts.\n //\n // - The COO: The COO can release gen0 kitties to auction, and mint promo cats.\n //\n // It should be noted that these roles are distinct without overlap in their access abilities, the\n // abilities listed for each role above are exhaustive. In particular, while the CEO can assign any\n // address to any role, the CEO address itself doesn't have the ability to act in those roles. This\n // restriction is intentional so that we aren't tempted to use the CEO address frequently out of\n // convenience. The less we use an address, the less likely it is that we somehow compromise the\n // account.\n\n /// @dev Emited when contract is upgraded - See README.md for updgrade plan\n event ContractUpgrade(address newContract);\n\n // The addresses of the accounts (or contracts) that can execute actions within each roles.\n address public ceoAddress;\n address public cfoAddress;\n address public cooAddress;\n\n // @dev Keeps track whether the contract is paused. When that is true, most actions are blocked\n bool public paused = false;\n\n /// @dev Access modifier for CEO-only functionality\n modifier onlyCEO() {\n require(msg.sender == ceoAddress);\n _;\n }\n\n /// @dev Access modifier for CFO-only functionality\n modifier onlyCFO() {\n require(msg.sender == cfoAddress);\n _;\n }\n\n /// @dev Access modifier for COO-only functionality\n modifier onlyCOO() {\n require(msg.sender == cooAddress);\n _;\n }\n\n modifier onlyCLevel() {\n require(\n msg.sender == cooAddress ||\n msg.sender == ceoAddress ||\n msg.sender == cfoAddress\n );\n _;\n }\n\n /// @dev Assigns a new address to act as the CEO. Only available to the current CEO.\n /// @param _newCEO The address of the new CEO\n function setCEO(address _newCEO) external onlyCEO {\n require(_newCEO != address(0));\n\n ceoAddress = _newCEO;\n }\n\n /// @dev Assigns a new address to act as the CFO. Only available to the current CEO.\n /// @param _newCFO The address of the new CFO\n function setCFO(address _newCFO) external onlyCEO {\n require(_newCFO != address(0));\n\n cfoAddress = _newCFO;\n }\n\n /// @dev Assigns a new address to act as the COO. Only available to the current CEO.\n /// @param _newCOO The address of the new COO\n function setCOO(address _newCOO) external onlyCEO {\n require(_newCOO != address(0));\n\n cooAddress = _newCOO;\n }\n\n /*** KittiesPausable functionality adapted from OpenZeppelin ***/\n\n /// @dev Modifier to allow actions only when the contract IS NOT paused\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /// @dev Modifier to allow actions only when the contract IS paused\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /// @dev Called by any \"C-level\" role to pause the contract. Used only when\n /// a bug or exploit is detected and we need to limit damage.\n function pause() external onlyCLevel whenNotPaused {\n paused = true;\n }\n\n /// @dev Unpauses the smart contract. Can only be called by the CEO, since\n /// one reason we may pause the contract is when CFO or COO accounts are\n /// compromised.\n /// @notice This is public rather than external so it can be called by\n /// derived contracts.\n function unpause() public onlyCEO whenPaused {\n // can't unpause if contract was upgraded\n paused = false;\n }\n}\n\n\n\n\n/// @title Base contract for CryptoKitties. Holds all common structs, events and base variables.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBase is KittyAccessControl {\n /*** EVENTS ***/\n\n /// @dev The Birth event is fired whenever a new kitten comes into existence. This obviously\n /// includes any time a cat is created through the giveBirth method, but it is also called\n /// when a new gen0 cat is created.\n event Birth(address owner, uint256 kittyId, uint256 matronId, uint256 sireId, uint256 genes);\n\n /// @dev Transfer event as defined in current draft of ERC721. Emitted every time a kitten\n /// ownership is assigned, including births.\n event Transfer(address from, address to, uint256 tokenId);\n\n /*** DATA TYPES ***/\n\n /// @dev The main Kitty struct. Every cat in CryptoKitties is represented by a copy\n /// of this structure, so great care was taken to ensure that it fits neatly into\n /// exactly two 256-bit words. Note that the order of the members in this structure\n /// is important because of the byte-packing rules used by Ethereum.\n /// Ref: http://solidity.readthedocs.io/en/develop/miscellaneous.html\n struct Kitty {\n // The Kitty's genetic code is packed into these 256-bits, the format is\n // sooper-sekret! A cat's genes never change.\n uint256 genes;\n\n // The timestamp from the block when this cat came into existence.\n uint64 birthTime;\n\n // The minimum timestamp after which this cat can engage in breeding\n // activities again. This same timestamp is used for the pregnancy\n // timer (for matrons) as well as the siring cooldown.\n uint64 cooldownEndBlock;\n\n // The ID of the parents of this kitty, set to 0 for gen0 cats.\n // Note that using 32-bit unsigned integers limits us to a \"mere\"\n // 4 billion cats. This number might seem small until you realize\n // that Ethereum currently has a limit of about 500 million\n // transactions per year! So, this definitely won't be a problem\n // for several years (even as Ethereum learns to scale).\n uint32 matronId;\n uint32 sireId;\n\n // Set to the ID of the sire cat for matrons that are pregnant,\n // zero otherwise. A non-zero value here is how we know a cat\n // is pregnant. Used to retrieve the genetic material for the new\n // kitten when the birth transpires.\n uint32 siringWithId;\n\n // Set to the index in the cooldown array (see below) that represents\n // the current cooldown duration for this Kitty. This starts at zero\n // for gen0 cats, and is initialized to floor(generation/2) for others.\n // Incremented by one for each successful breeding action, regardless\n // of whether this cat is acting as matron or sire.\n uint16 cooldownIndex;\n\n // The \"generation number\" of this cat. Cats minted by the CK contract\n // for sale are called \"gen0\" and have a generation number of 0. The\n // generation number of all other cats is the larger of the two generation\n // numbers of their parents, plus one.\n // (i.e. max(matron.generation, sire.generation) + 1)\n uint16 generation;\n }\n\n /*** CONSTANTS ***/\n\n /// @dev A lookup table indicating the cooldown duration after any successful\n /// breeding action, called \"pregnancy time\" for matrons and \"siring cooldown\"\n /// for sires. Designed such that the cooldown roughly doubles each time a cat\n /// is bred, encouraging owners not to just keep breeding the same cat over\n /// and over again. Caps out at one week (a cat can breed an unbounded number\n /// of times, and the maximum cooldown is always seven days).\n uint32[14] public cooldowns = [\n uint32(1 minutes),\n uint32(2 minutes),\n uint32(5 minutes),\n uint32(10 minutes),\n uint32(30 minutes),\n uint32(1 hours),\n uint32(2 hours),\n uint32(4 hours),\n uint32(8 hours),\n uint32(16 hours),\n uint32(1 days),\n uint32(2 days),\n uint32(4 days),\n uint32(7 days)\n ];\n\n // An approximation of currently how many seconds are in between blocks.\n uint256 public secondsPerBlock = 15;\n\n /*** STORAGE ***/\n\n /// @dev An array containing the Kitty struct for all Kitties in existence. The ID\n /// of each cat is actually an index into this array. Note that ID 0 is a negacat,\n /// the unKitty, the mythical beast that is the parent of all gen0 cats. A bizarre\n /// creature that is both matron and sire... to itself! Has an invalid genetic code.\n /// In other words, cat ID 0 is invalid... ;-)\n Kitty[] kitties;\n\n /// @dev A mapping from cat IDs to the address that owns them. All cats have\n /// some valid owner address, even gen0 cats are created with a non-zero owner.\n mapping (uint256 => address) public kittyIndexToOwner;\n\n // @dev A mapping from owner address to count of tokens that address owns.\n // Used internally inside balanceOf() to resolve ownership count.\n mapping (address => uint256) ownershipTokenCount;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to call\n /// transferFrom(). Each Kitty can only have one approved address for transfer\n /// at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public kittyIndexToApproved;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to use\n /// this Kitty for siring via breedWith(). Each Kitty can only have one approved\n /// address for siring at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public sireAllowedToAddress;\n\n /// @dev The address of the ClockAuction contract that handles sales of Kitties. This\n /// same contract handles both peer-to-peer sales as well as the gen0 sales which are\n /// initiated every 15 minutes.\n SaleClockAuction public saleAuction;\n\n /// @dev The address of a custom ClockAuction subclassed contract that handles siring\n /// auctions. Needs to be separate from saleAuction because the actions taken on success\n /// after a sales and siring auction are quite different.\n SiringClockAuction public siringAuction;\n\n /// @dev Assigns ownership of a specific Kitty to an address.\n function _transfer(address _from, address _to, uint256 _tokenId) internal {\n // Since the number of kittens is capped to 2^32 we can't overflow this\n ownershipTokenCount[_to]++;\n // transfer ownership\n kittyIndexToOwner[_tokenId] = _to;\n // When creating new kittens _from is 0x0, but we can't account that address.\n if (_from != address(0)) {\n ownershipTokenCount[_from]--;\n // once the kitten is transferred also clear sire allowances\n delete sireAllowedToAddress[_tokenId];\n // clear any previously approved ownership exchange\n delete kittyIndexToApproved[_tokenId];\n }\n // Emit the transfer event.\n Transfer(_from, _to, _tokenId);\n }\n\n /// @dev An internal method that creates a new kitty and stores it. This\n /// method doesn't do any checking and should only be called when the\n /// input data is known to be valid. Will generate both a Birth event\n /// and a Transfer event.\n /// @param _matronId The kitty ID of the matron of this cat (zero for gen0)\n /// @param _sireId The kitty ID of the sire of this cat (zero for gen0)\n /// @param _generation The generation number of this cat, must be computed by caller.\n /// @param _genes The kitty's genetic code.\n /// @param _owner The inital owner of this cat, must be non-zero (except for the unKitty, ID 0)\n function _createKitty(\n uint256 _matronId,\n uint256 _sireId,\n uint256 _generation,\n uint256 _genes,\n address _owner\n )\n internal\n returns (uint)\n {\n // These requires are not strictly necessary, our calling code should make\n // sure that these conditions are never broken. However! _createKitty() is already\n // an expensive call (for storage), and it doesn't hurt to be especially careful\n // to ensure our data structures are always valid.\n require(_matronId == uint256(uint32(_matronId)));\n require(_sireId == uint256(uint32(_sireId)));\n require(_generation == uint256(uint16(_generation)));\n\n // New kitty starts with the same cooldown as parent gen/2\n uint16 cooldownIndex = uint16(_generation / 2);\n if (cooldownIndex > 13) {\n cooldownIndex = 13;\n }\n\n Kitty memory _kitty = Kitty({\n genes: _genes,\n birthTime: uint64(now),\n cooldownEndBlock: 0,\n matronId: uint32(_matronId),\n sireId: uint32(_sireId),\n siringWithId: 0,\n cooldownIndex: cooldownIndex,\n generation: uint16(_generation)\n });\n uint256 newKittenId = kitties.push(_kitty) - 1;\n\n // It's probably never going to happen, 4 billion cats is A LOT, but\n // let's just be 100% sure we never let this happen.\n require(newKittenId == uint256(uint32(newKittenId)));\n\n // emit the birth event\n Birth(\n _owner,\n newKittenId,\n uint256(_kitty.matronId),\n uint256(_kitty.sireId),\n _kitty.genes\n );\n\n // This will assign ownership, and also emit the Transfer event as\n // per ERC721 draft\n _transfer(0, _owner, newKittenId);\n\n return newKittenId;\n }\n\n // Any C-level can fix how many seconds per blocks are currently observed.\n function setSecondsPerBlock(uint256 secs) external onlyCLevel {\n require(secs < cooldowns[0]);\n secondsPerBlock = secs;\n }\n}\n\n\n\n\n\n/// @title The external contract that is responsible for generating metadata for the kitties,\n/// it has one function that will return the data as bytes.\ncontract KittiesERC721Metadata {\n /// @dev Given a token Id, returns a byte array that is supposed to be converted into string.\n function getMetadata(uint256 _tokenId, string) public view returns (bytes32[4] buffer, uint256 count) {\n if (_tokenId == 1) {\n buffer[0] = \"Hello World! :D\";\n count = 15;\n } else if (_tokenId == 2) {\n buffer[0] = \"I would definitely choose a medi\";\n buffer[1] = \"um length string.\";\n count = 49;\n } else if (_tokenId == 3) {\n buffer[0] = \"Lorem ipsum dolor sit amet, mi e\";\n buffer[1] = \"st accumsan dapibus augue lorem,\";\n buffer[2] = \" tristique vestibulum id, libero\";\n buffer[3] = \" suscipit varius sapien aliquam.\";\n count = 128;\n }\n }\n}\n\n\n/// @title The facet of the CryptoKitties core contract that manages ownership, ERC-721 (draft) compliant.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev Ref: https://github.com/ethereum/EIPs/issues/721\n/// See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyOwnership is KittyBase, KittiesERC721 {\n\n /// @notice Name and symbol of the non fungible token, as defined in ERC721.\n string public constant name = \"CryptoKitties\";\n string public constant symbol = \"CK\";\n\n // The contract that will return kitty metadata\n KittiesERC721Metadata public erc721Metadata;\n\n bytes4 constant InterfaceSignature_ERC165 =\n bytes4(keccak256('supportsInterface(bytes4)'));\n\n bytes4 constant InterfaceSignature_ERC721 =\n bytes4(keccak256('name()')) ^\n bytes4(keccak256('symbol()')) ^\n bytes4(keccak256('totalSupply()')) ^\n bytes4(keccak256('balanceOf(address)')) ^\n bytes4(keccak256('ownerOf(uint256)')) ^\n bytes4(keccak256('approve(address,uint256)')) ^\n bytes4(keccak256('transfer(address,uint256)')) ^\n bytes4(keccak256('transferFrom(address,address,uint256)')) ^\n bytes4(keccak256('tokensOfOwner(address)')) ^\n bytes4(keccak256('tokenMetadata(uint256,string)'));\n\n /// @notice Introspection interface as per ERC-165 (https://github.com/ethereum/EIPs/issues/165).\n /// Returns true for any standardized interfaces implemented by this contract. We implement\n /// ERC-165 (obviously!) and ERC-721.\n function supportsInterface(bytes4 _interfaceID) external view returns (bool)\n {\n // DEBUG ONLY\n //require((InterfaceSignature_ERC165 == 0x01ffc9a7) && (InterfaceSignature_ERC721 == 0x9a20483d));\n\n return ((_interfaceID == InterfaceSignature_ERC165) || (_interfaceID == InterfaceSignature_ERC721));\n }\n\n /// @dev Set the address of the sibling contract that tracks metadata.\n /// CEO only.\n function setMetadataAddress(address _contractAddress) public onlyCEO {\n erc721Metadata = KittiesERC721Metadata(_contractAddress);\n }\n\n // Internal utility functions: These functions all assume that their input arguments\n // are valid. We leave it to public methods to sanitize their inputs and follow\n // the required logic.\n\n /// @dev Checks if a given address is the current owner of a particular Kitty.\n /// @param _claimant the address we are validating against.\n /// @param _tokenId kitten id, only valid when > 0\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToOwner[_tokenId] == _claimant;\n }\n\n /// @dev Checks if a given address currently has transferApproval for a particular Kitty.\n /// @param _claimant the address we are confirming kitten is approved for.\n /// @param _tokenId kitten id, only valid when > 0\n function _approvedFor(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToApproved[_tokenId] == _claimant;\n }\n\n /// @dev Marks an address as being approved for transferFrom(), overwriting any previous\n /// approval. Setting _approved to address(0) clears all transfer approval.\n /// NOTE: _approve() does NOT send the Approval event. This is intentional because\n /// _approve() and transferFrom() are used together for putting Kitties on auction, and\n /// there is no value in spamming the log with Approval events in that case.\n function _approve(uint256 _tokenId, address _approved) internal {\n kittyIndexToApproved[_tokenId] = _approved;\n }\n\n /// @notice Returns the number of Kitties owned by a specific address.\n /// @param _owner The owner address to check.\n /// @dev Required for ERC-721 compliance\n function balanceOf(address _owner) public view returns (uint256 count) {\n return ownershipTokenCount[_owner];\n }\n\n /// @notice Transfers a Kitty to another address. If transferring to a smart\n /// contract be VERY CAREFUL to ensure that it is aware of ERC-721 (or\n /// CryptoKitties specifically) or your Kitty may be lost forever. Seriously.\n /// @param _to The address of the recipient, can be a user or contract.\n /// @param _tokenId The ID of the Kitty to transfer.\n /// @dev Required for ERC-721 compliance.\n function transfer(\n address _to,\n uint256 _tokenId\n )\n external\n whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Disallow transfers to the auction contracts to prevent accidental\n // misuse. Auction contracts should only take ownership of kitties\n // through the allow + transferFrom flow.\n require(_to != address(saleAuction));\n require(_to != address(siringAuction));\n\n // You can only send your own cat.\n require(_owns(msg.sender, _tokenId));\n\n // Reassign ownership, clear pending approvals, emit Transfer event.\n _transfer(msg.sender, _to, _tokenId);\n }\n\n /// @notice Grant another address the right to transfer a specific Kitty via\n /// transferFrom(). This is the preferred flow for transfering NFTs to contracts.\n /// @param _to The address to be granted transfer approval. Pass address(0) to\n /// clear all approvals.\n /// @param _tokenId The ID of the Kitty that can be transferred if this call succeeds.\n /// @dev Required for ERC-721 compliance.\n function approve(\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Only an owner can grant transfer approval.\n require(_owns(msg.sender, _tokenId));\n\n // Register the approval (replacing any previous approval).\n _approve(_tokenId, _to);\n\n // Emit approval event.\n Approval(msg.sender, _to, _tokenId);\n }\n\n /// @notice Transfer a Kitty owned by another address, for which the calling address\n /// has previously been granted transfer approval by the owner.\n /// @param _from The address that owns the Kitty to be transfered.\n /// @param _to The address that should take ownership of the Kitty. Can be any address,\n /// including the caller.\n /// @param _tokenId The ID of the Kitty to be transferred.\n /// @dev Required for ERC-721 compliance.\n function transferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Check for approval and valid ownership\n require(_approvedFor(msg.sender, _tokenId));\n require(_owns(_from, _tokenId));\n\n // Reassign ownership (also clears pending approvals and emits Transfer event).\n _transfer(_from, _to, _tokenId);\n }\n\n /// @notice Returns the total number of Kitties currently in existence.\n /// @dev Required for ERC-721 compliance.\n function totalSupply() public view returns (uint) {\n return kitties.length - 1;\n }\n\n /// @notice Returns the address currently assigned ownership of a given Kitty.\n /// @dev Required for ERC-721 compliance.\n function ownerOf(uint256 _tokenId)\n external\n view\n returns (address owner)\n {\n owner = kittyIndexToOwner[_tokenId];\n\n require(owner != address(0));\n }\n\n /// @notice Returns a list of all Kitty IDs assigned to an address.\n /// @param _owner The owner whose Kitties we are interested in.\n /// @dev This method MUST NEVER be called by smart contract code. First, it's fairly\n /// expensive (it walks the entire Kitty array looking for cats belonging to owner),\n /// but it also returns a dynamic array, which is only supported for web3 calls, and\n /// not contract-to-contract calls.\n function tokensOfOwner(address _owner) external view returns(uint256[] ownerTokens) {\n uint256 tokenCount = balanceOf(_owner);\n\n if (tokenCount == 0) {\n // Return an empty array\n return new uint256[](0);\n } else {\n uint256[] memory result = new uint256[](tokenCount);\n uint256 totalCats = totalSupply();\n uint256 resultIndex = 0;\n\n // We count on the fact that all cats have IDs starting at 1 and increasing\n // sequentially up to the totalCat count.\n uint256 catId;\n\n for (catId = 1; catId <= totalCats; catId++) {\n if (kittyIndexToOwner[catId] == _owner) {\n result[resultIndex] = catId;\n resultIndex++;\n }\n }\n\n return result;\n }\n }\n\n /// @dev Adapted from memcpy() by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _memcpy(uint _dest, uint _src, uint _len) private view {\n // Copy word-length chunks while possible\n for(; _len >= 32; _len -= 32) {\n assembly {\n mstore(_dest, mload(_src))\n }\n _dest += 32;\n _src += 32;\n }\n\n // Copy remaining bytes\n uint256 mask = 256 ** (32 - _len) - 1;\n assembly {\n let srcpart := and(mload(_src), not(mask))\n let destpart := and(mload(_dest), mask)\n mstore(_dest, or(destpart, srcpart))\n }\n }\n\n /// @dev Adapted from toString(slice) by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _toString(bytes32[4] _rawBytes, uint256 _stringLength) private view returns (string) {\n var outputString = new string(_stringLength);\n uint256 outputPtr;\n uint256 bytesPtr;\n\n assembly {\n outputPtr := add(outputString, 32)\n bytesPtr := _rawBytes\n }\n\n _memcpy(outputPtr, bytesPtr, _stringLength);\n\n return outputString;\n }\n\n /// @notice Returns a URI pointing to a metadata package for this token conforming to\n /// ERC-721 (https://github.com/ethereum/EIPs/issues/721)\n /// @param _tokenId The ID number of the Kitty whose metadata should be returned.\n function tokenMetadata(uint256 _tokenId, string _preferredTransport) external view returns (string infoUrl) {\n require(erc721Metadata != address(0));\n bytes32[4] memory buffer;\n uint256 count;\n (buffer, count) = erc721Metadata.getMetadata(_tokenId, _preferredTransport);\n\n return _toString(buffer, count);\n }\n}\n\n\n\n/// @title A facet of KittyCore that manages Kitty siring, gestation, and birth.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBreeding is KittyOwnership {\n\n /// @dev The Pregnant event is fired when two cats successfully breed and the pregnancy\n /// timer begins for the matron.\n event Pregnant(address owner, uint256 matronId, uint256 sireId, uint256 cooldownEndBlock);\n\n /// @notice The minimum payment required to use breedWithAuto(). This fee goes towards\n /// the gas cost paid by whatever calls giveBirth(), and can be dynamically updated by\n /// the COO role as the gas price changes.\n uint256 public autoBirthFee = 2 finney;\n\n // Keeps track of number of pregnant kitties.\n uint256 public pregnantKitties;\n\n /// @dev The address of the sibling contract that is used to implement the sooper-sekret\n /// genetic combination algorithm.\n GeneScienceInterface public geneScience;\n\n /// @dev Update the address of the genetic contract, can only be called by the CEO.\n /// @param _address An address of a GeneScience contract instance to be used from this point forward.\n function setGeneScienceAddress(address _address) external onlyCEO {\n GeneScienceInterface candidateContract = GeneScienceInterface(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isGeneScience());\n\n // Set the new contract address\n geneScience = candidateContract;\n }\n\n /// @dev Checks that a given kitten is able to breed. Requires that the\n /// current cooldown is finished (for sires) and also checks that there is\n /// no pending pregnancy.\n function _isReadyToBreed(Kitty _kit) internal view returns (bool) {\n // In addition to checking the cooldownEndBlock, we also need to check to see if\n // the cat has a pending birth; there can be some period of time between the end\n // of the pregnacy timer and the birth event.\n return (_kit.siringWithId == 0) && (_kit.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @dev Check if a sire has authorized breeding with this matron. True if both sire\n /// and matron have the same owner, or if the sire has given siring permission to\n /// the matron's owner (via approveSiring()).\n function _isSiringPermitted(uint256 _sireId, uint256 _matronId) internal view returns (bool) {\n address matronOwner = kittyIndexToOwner[_matronId];\n address sireOwner = kittyIndexToOwner[_sireId];\n\n // Siring is okay if they have same owner, or if the matron's owner was given\n // permission to breed with this sire.\n return (matronOwner == sireOwner || sireAllowedToAddress[_sireId] == matronOwner);\n }\n\n /// @dev Set the cooldownEndTime for the given Kitty, based on its current cooldownIndex.\n /// Also increments the cooldownIndex (unless it has hit the cap).\n /// @param _kitten A reference to the Kitty in storage which needs its timer started.\n function _triggerCooldown(Kitty storage _kitten) internal {\n // Compute an estimation of the cooldown time in blocks (based on current cooldownIndex).\n _kitten.cooldownEndBlock = uint64((cooldowns[_kitten.cooldownIndex]/secondsPerBlock) + block.number);\n\n // Increment the breeding count, clamping it at 13, which is the length of the\n // cooldowns array. We could check the array size dynamically, but hard-coding\n // this as a constant saves gas. Yay, Solidity!\n if (_kitten.cooldownIndex < 13) {\n _kitten.cooldownIndex += 1;\n }\n }\n\n /// @notice Grants approval to another user to sire with one of your Kitties.\n /// @param _addr The address that will be able to sire with your Kitty. Set to\n /// address(0) to clear all siring approvals for this Kitty.\n /// @param _sireId A Kitty that you own that _addr will now be able to sire with.\n function approveSiring(address _addr, uint256 _sireId)\n external\n whenNotPaused\n {\n require(_owns(msg.sender, _sireId));\n sireAllowedToAddress[_sireId] = _addr;\n }\n\n /// @dev Updates the minimum payment required for calling giveBirthAuto(). Can only\n /// be called by the COO address. (This fee is used to offset the gas cost incurred\n /// by the autobirth daemon).\n function setAutoBirthFee(uint256 val) external onlyCOO {\n autoBirthFee = val;\n }\n\n /// @dev Checks to see if a given Kitty is pregnant and (if so) if the gestation\n /// period has passed.\n function _isReadyToGiveBirth(Kitty _matron) private view returns (bool) {\n return (_matron.siringWithId != 0) && (_matron.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @notice Checks that a given kitten is able to breed (i.e. it is not pregnant or\n /// in the middle of a siring cooldown).\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isReadyToBreed(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n Kitty storage kit = kitties[_kittyId];\n return _isReadyToBreed(kit);\n }\n\n /// @dev Checks whether a kitty is currently pregnant.\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isPregnant(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n // A kitty is pregnant if and only if this field is set\n return kitties[_kittyId].siringWithId != 0;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair. DOES NOT\n /// check ownership permissions (that is up to the caller).\n /// @param _matron A reference to the Kitty struct of the potential matron.\n /// @param _matronId The matron's ID.\n /// @param _sire A reference to the Kitty struct of the potential sire.\n /// @param _sireId The sire's ID\n function _isValidMatingPair(\n Kitty storage _matron,\n uint256 _matronId,\n Kitty storage _sire,\n uint256 _sireId\n )\n private\n view\n returns(bool)\n {\n // A Kitty can't breed with itself!\n if (_matronId == _sireId) {\n return false;\n }\n\n // Kitties can't breed with their parents.\n if (_matron.matronId == _sireId || _matron.sireId == _sireId) {\n return false;\n }\n if (_sire.matronId == _matronId || _sire.sireId == _matronId) {\n return false;\n }\n\n // We can short circuit the sibling check (below) if either cat is\n // gen zero (has a matron ID of zero).\n if (_sire.matronId == 0 || _matron.matronId == 0) {\n return true;\n }\n\n // Kitties can't breed with full or half siblings.\n if (_sire.matronId == _matron.matronId || _sire.matronId == _matron.sireId) {\n return false;\n }\n if (_sire.sireId == _matron.matronId || _sire.sireId == _matron.sireId) {\n return false;\n }\n\n // Everything seems cool! Let's get DTF.\n return true;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair for\n /// breeding via auction (i.e. skips ownership and siring approval checks).\n function _canBreedWithViaAuction(uint256 _matronId, uint256 _sireId)\n internal\n view\n returns (bool)\n {\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId);\n }\n\n /// @notice Checks to see if two cats can breed together, including checks for\n /// ownership and siring approvals. Does NOT check that both cats are ready for\n /// breeding (i.e. breedWith could still fail until the cooldowns are finished).\n /// TODO: Shouldn't this check pregnancy and cooldowns?!?\n /// @param _matronId The ID of the proposed matron.\n /// @param _sireId The ID of the proposed sire.\n function canBreedWith(uint256 _matronId, uint256 _sireId)\n external\n view\n returns(bool)\n {\n require(_matronId > 0);\n require(_sireId > 0);\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId) &&\n _isSiringPermitted(_sireId, _matronId);\n }\n\n /// @dev Internal utility function to initiate breeding, assumes that all breeding\n /// requirements have been checked.\n function _breedWith(uint256 _matronId, uint256 _sireId) internal {\n // Grab a reference to the Kitties from storage.\n Kitty storage sire = kitties[_sireId];\n Kitty storage matron = kitties[_matronId];\n\n // Mark the matron as pregnant, keeping track of who the sire is.\n matron.siringWithId = uint32(_sireId);\n\n // Trigger the cooldown for both parents.\n _triggerCooldown(sire);\n _triggerCooldown(matron);\n\n // Clear siring permission for both parents. This may not be strictly necessary\n // but it's likely to avoid confusion!\n delete sireAllowedToAddress[_matronId];\n delete sireAllowedToAddress[_sireId];\n\n // Every time a kitty gets pregnant, counter is incremented.\n pregnantKitties++;\n\n // Emit the pregnancy event.\n Pregnant(kittyIndexToOwner[_matronId], _matronId, _sireId, matron.cooldownEndBlock);\n }\n\n /// @notice Breed a Kitty you own (as matron) with a sire that you own, or for which you\n /// have previously been given Siring approval. Will either make your cat pregnant, or will\n /// fail entirely. Requires a pre-payment of the fee given out to the first caller of giveBirth()\n /// @param _matronId The ID of the Kitty acting as matron (will end up pregnant if successful)\n /// @param _sireId The ID of the Kitty acting as sire (will begin its siring cooldown if successful)\n function breedWithAuto(uint256 _matronId, uint256 _sireId)\n external\n payable\n whenNotPaused\n {\n // Checks for payment.\n require(msg.value >= autoBirthFee);\n\n // Caller must own the matron.\n require(_owns(msg.sender, _matronId));\n\n // Neither sire nor matron are allowed to be on auction during a normal\n // breeding operation, but we don't need to check that explicitly.\n // For matron: The caller of this function can't be the owner of the matron\n // because the owner of a Kitty on auction is the auction house, and the\n // auction house will never call breedWith().\n // For sire: Similarly, a sire on auction will be owned by the auction house\n // and the act of transferring ownership will have cleared any oustanding\n // siring approval.\n // Thus we don't need to spend gas explicitly checking to see if either cat\n // is on auction.\n\n // Check that matron and sire are both owned by caller, or that the sire\n // has given siring permission to caller (i.e. matron's owner).\n // Will fail for _sireId = 0\n require(_isSiringPermitted(_sireId, _matronId));\n\n // Grab a reference to the potential matron\n Kitty storage matron = kitties[_matronId];\n\n // Make sure matron isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(matron));\n\n // Grab a reference to the potential sire\n Kitty storage sire = kitties[_sireId];\n\n // Make sure sire isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(sire));\n\n // Test that these cats are a valid mating pair.\n require(_isValidMatingPair(\n matron,\n _matronId,\n sire,\n _sireId\n ));\n\n // All checks passed, kitty gets pregnant!\n _breedWith(_matronId, _sireId);\n }\n\n /// @notice Have a pregnant Kitty give birth!\n /// @param _matronId A Kitty ready to give birth.\n /// @return The Kitty ID of the new kitten.\n /// @dev Looks at a given Kitty and, if pregnant and if the gestation period has passed,\n /// combines the genes of the two parents to create a new kitten. The new Kitty is assigned\n /// to the current owner of the matron. Upon successful completion, both the matron and the\n /// new kitten will be ready to breed again. Note that anyone can call this function (if they\n /// are willing to pay the gas!), but the new kitten always goes to the mother's owner.\n function giveBirth(uint256 _matronId)\n external\n whenNotPaused\n returns(uint256)\n {\n // Grab a reference to the matron in storage.\n Kitty storage matron = kitties[_matronId];\n\n // Check that the matron is a valid cat.\n require(matron.birthTime != 0);\n\n // Check that the matron is pregnant, and that its time has come!\n require(_isReadyToGiveBirth(matron));\n\n // Grab a reference to the sire in storage.\n uint256 sireId = matron.siringWithId;\n Kitty storage sire = kitties[sireId];\n\n // Determine the higher generation number of the two parents\n uint16 parentGen = matron.generation;\n if (sire.generation > matron.generation) {\n parentGen = sire.generation;\n }\n\n // Call the sooper-sekret gene mixing operation.\n uint256 childGenes = geneScience.mixGenes(matron.genes, sire.genes, matron.cooldownEndBlock - 1);\n\n // Make the new kitten!\n address owner = kittyIndexToOwner[_matronId];\n uint256 kittenId = _createKitty(_matronId, matron.siringWithId, parentGen + 1, childGenes, owner);\n\n // Clear the reference to sire from the matron (REQUIRED! Having siringWithId\n // set is what marks a matron as being pregnant.)\n delete matron.siringWithId;\n\n // Every time a kitty gives birth counter is decremented.\n pregnantKitties--;\n\n // Send the balance fee to the person who made birth happen.\n msg.sender.send(autoBirthFee);\n\n // return the new kitten's ID\n return kittenId;\n }\n}\n\n\n\n\n\n\n\n\n\n\n/// @title Auction Core\n/// @dev Contains models, variables, and internal methods for the auction.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuctionBase {\n\n // Represents an auction on an NFT\n struct Auction {\n // Current owner of NFT\n address seller;\n // Price (in wei) at beginning of auction\n uint128 startingPrice;\n // Price (in wei) at end of auction\n uint128 endingPrice;\n // Duration (in seconds) of auction\n uint64 duration;\n // Time when auction started\n // NOTE: 0 if this auction has been concluded\n uint64 startedAt;\n }\n\n // Reference to contract tracking NFT ownership\n KittiesERC721 public nonFungibleContract;\n\n // Cut owner takes on each auction, measured in basis points (1/100 of a percent).\n // Values 0-10,000 map to 0%-100%\n uint256 public ownerCut;\n\n // Map from token ID to their corresponding auction.\n mapping (uint256 => Auction) tokenIdToAuction;\n\n event AuctionCreated(uint256 tokenId, uint256 startingPrice, uint256 endingPrice, uint256 duration);\n event AuctionSuccessful(uint256 tokenId, uint256 totalPrice, address winner);\n event AuctionCancelled(uint256 tokenId);\n\n /// @dev Returns true if the claimant owns the token.\n /// @param _claimant - Address claiming to own the token.\n /// @param _tokenId - ID of token whose ownership to verify.\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return (nonFungibleContract.ownerOf(_tokenId) == _claimant);\n }\n\n /// @dev Escrows the NFT, assigning ownership to this contract.\n /// Throws if the escrow fails.\n /// @param _owner - Current owner address of token to escrow.\n /// @param _tokenId - ID of token whose approval to verify.\n function _escrow(address _owner, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transferFrom(_owner, this, _tokenId);\n }\n\n /// @dev Transfers an NFT owned by this contract to another address.\n /// Returns true if the transfer succeeds.\n /// @param _receiver - Address to transfer NFT to.\n /// @param _tokenId - ID of token to transfer.\n function _transfer(address _receiver, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transfer(_receiver, _tokenId);\n }\n\n /// @dev Adds an auction to the list of open auctions. Also fires the\n /// AuctionCreated event.\n /// @param _tokenId The ID of the token to be put on auction.\n /// @param _auction Auction to add.\n function _addAuction(uint256 _tokenId, Auction _auction) internal {\n // Require that all auctions have a duration of\n // at least one minute. (Keeps our math from getting hairy!)\n require(_auction.duration >= 1 minutes);\n\n tokenIdToAuction[_tokenId] = _auction;\n\n AuctionCreated(\n uint256(_tokenId),\n uint256(_auction.startingPrice),\n uint256(_auction.endingPrice),\n uint256(_auction.duration)\n );\n }\n\n /// @dev Cancels an auction unconditionally.\n function _cancelAuction(uint256 _tokenId, address _seller) internal {\n _removeAuction(_tokenId);\n _transfer(_seller, _tokenId);\n AuctionCancelled(_tokenId);\n }\n\n /// @dev Computes the price and transfers winnings.\n /// Does NOT transfer ownership of token.\n function _bid(uint256 _tokenId, uint256 _bidAmount)\n internal\n returns (uint256)\n {\n // Get a reference to the auction struct\n Auction storage auction = tokenIdToAuction[_tokenId];\n\n // Explicitly check that this auction is currently live.\n // (Because of how Ethereum mappings work, we can't just count\n // on the lookup above failing. An invalid _tokenId will just\n // return an auction object that is all zeros.)\n require(_isOnAuction(auction));\n\n // Check that the bid is greater than or equal to the current price\n uint256 price = _currentPrice(auction);\n require(_bidAmount >= price);\n\n // Grab a reference to the seller before the auction struct\n // gets deleted.\n address seller = auction.seller;\n\n // The bid is good! Remove the auction before sending the fees\n // to the sender so we can't have a reentrancy attack.\n _removeAuction(_tokenId);\n\n // Transfer proceeds to seller (if there are any!)\n if (price > 0) {\n // Calculate the auctioneer's cut.\n // (NOTE: _computeCut() is guaranteed to return a\n // value <= price, so this subtraction can't go negative.)\n uint256 auctioneerCut = _computeCut(price);\n uint256 sellerProceeds = price - auctioneerCut;\n\n // NOTE: Doing a transfer() in the middle of a complex\n // method like this is generally discouraged because of\n // reentrancy attacks and DoS attacks if the seller is\n // a contract with an invalid fallback function. We explicitly\n // guard against reentrancy attacks by removing the auction\n // before calling transfer(), and the only thing the seller\n // can DoS is the sale of their own asset! (And if it's an\n // accident, they can call cancelAuction(). )\n seller.transfer(sellerProceeds);\n }\n\n // Calculate any excess funds included with the bid. If the excess\n // is anything worth worrying about, transfer it back to bidder.\n // NOTE: We checked above that the bid amount is greater than or\n // equal to the price so this cannot underflow.\n uint256 bidExcess = _bidAmount - price;\n\n // Return the funds. Similar to the previous transfer, this is\n // not susceptible to a re-entry attack because the auction is\n // removed before any transfers occur.\n msg.sender.transfer(bidExcess);\n\n // Tell the world!\n AuctionSuccessful(_tokenId, price, msg.sender);\n\n return price;\n }\n\n /// @dev Removes an auction from the list of open auctions.\n /// @param _tokenId - ID of NFT on auction.\n function _removeAuction(uint256 _tokenId) internal {\n delete tokenIdToAuction[_tokenId];\n }\n\n /// @dev Returns true if the NFT is on auction.\n /// @param _auction - Auction to check.\n function _isOnAuction(Auction storage _auction) internal view returns (bool) {\n return (_auction.startedAt > 0);\n }\n\n /// @dev Returns current price of an NFT on auction. Broken into two\n /// functions (this one, that computes the duration from the auction\n /// structure, and the other that does the price computation) so we\n /// can easily test that the price computation works correctly.\n function _currentPrice(Auction storage _auction)\n internal\n view\n returns (uint256)\n {\n uint256 secondsPassed = 0;\n\n // A bit of insurance against negative values (or wraparound).\n // Probably not necessary (since Ethereum guarnatees that the\n // now variable doesn't ever go backwards).\n if (now > _auction.startedAt) {\n secondsPassed = now - _auction.startedAt;\n }\n\n return _computeCurrentPrice(\n _auction.startingPrice,\n _auction.endingPrice,\n _auction.duration,\n secondsPassed\n );\n }\n\n /// @dev Computes the current price of an auction. Factored out\n /// from _currentPrice so we can run extensive unit tests.\n /// When testing, make this function public and turn on\n /// `Current price computation` test suite.\n function _computeCurrentPrice(\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n uint256 _secondsPassed\n )\n internal\n pure\n returns (uint256)\n {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our public functions carefully cap the maximum values for\n // time (at 64-bits) and currency (at 128-bits). _duration is\n // also known to be non-zero (see the require() statement in\n // _addAuction())\n if (_secondsPassed >= _duration) {\n // We've reached the end of the dynamic pricing portion\n // of the auction, just return the end price.\n return _endingPrice;\n } else {\n // Starting price can be higher than ending price (and often is!), so\n // this delta can be negative.\n int256 totalPriceChange = int256(_endingPrice) - int256(_startingPrice);\n\n // This multiplication can't overflow, _secondsPassed will easily fit within\n // 64-bits, and totalPriceChange will easily fit within 128-bits, their product\n // will always fit within 256-bits.\n int256 currentPriceChange = totalPriceChange * int256(_secondsPassed) / int256(_duration);\n\n // currentPriceChange can be negative, but if so, will have a magnitude\n // less that _startingPrice. Thus, this result will always end up positive.\n int256 currentPrice = int256(_startingPrice) + currentPriceChange;\n\n return uint256(currentPrice);\n }\n }\n\n /// @dev Computes owner's cut of a sale.\n /// @param _price - Sale price of NFT.\n function _computeCut(uint256 _price) internal view returns (uint256) {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our entry functions carefully cap the maximum values for\n // currency (at 128-bits), and ownerCut <= 10000 (see the require()\n // statement in the ClockAuction constructor). The result of this\n // function is always guaranteed to be <= _price.\n return _price * ownerCut / 10000;\n }\n\n}\n\n\n\n\n\n\n\n/**\n * @title KittiesPausable\n * @dev Base contract which allows children to implement an emergency stop mechanism.\n */\ncontract KittiesPausable is KittiesOwnable {\n event Pause();\n event Unpause();\n\n bool public paused = false;\n\n\n /**\n\t * @dev modifier to allow actions only when the contract IS paused\n\t */\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /**\n\t * @dev modifier to allow actions only when the contract IS NOT paused\n\t */\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /**\n\t * @dev called by the owner to pause, triggers stopped state\n\t */\n function pause() onlyOwner whenNotPaused returns (bool) {\n paused = true;\n Pause();\n return true;\n }\n\n /**\n\t * @dev called by the owner to unpause, returns to normal state\n\t */\n function unpause() onlyOwner whenPaused returns (bool) {\n paused = false;\n Unpause();\n return true;\n }\n}\n\n\n/// @title Clock auction for non-fungible tokens.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuction is KittiesPausable, ClockAuctionBase {\n\n /// @dev The ERC-165 interface signature for ERC-721.\n /// Ref: https://github.com/ethereum/EIPs/issues/165\n /// Ref: https://github.com/ethereum/EIPs/issues/721\n bytes4 constant InterfaceSignature_ERC721 = bytes4(0x9a20483d);\n\n /// @dev Constructor creates a reference to the NFT ownership contract\n /// and verifies the owner cut is in the valid range.\n /// @param _nftAddress - address of a deployed contract implementing\n /// the Nonfungible Interface.\n /// @param _cut - percent cut the owner takes on each auction, must be\n /// between 0-10,000.\n function ClockAuction(address _nftAddress, uint256 _cut) public {\n require(_cut <= 10000);\n ownerCut = _cut;\n\n KittiesERC721 candidateContract = KittiesERC721(_nftAddress);\n require(candidateContract.supportsInterface(InterfaceSignature_ERC721));\n nonFungibleContract = candidateContract;\n }\n\n /// @dev Remove all Ether from the contract, which is the owner's cuts\n /// as well as any Ether sent directly to the contract address.\n /// Always transfers to the NFT contract, but can be called either by\n /// the owner or the NFT contract.\n function withdrawBalance() external {\n address nftAddress = address(nonFungibleContract);\n\n require(\n msg.sender == owner ||\n msg.sender == nftAddress\n );\n // We are using this boolean method to make sure that even if one fails it will still work\n bool res = nftAddress.send(this.balance);\n }\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of time to move between starting\n /// price and ending price (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n whenNotPaused\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(_owns(msg.sender, _tokenId));\n _escrow(msg.sender, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Bids on an open auction, completing the auction and transferring\n /// ownership of the NFT if enough Ether is supplied.\n /// @param _tokenId - ID of token to bid on.\n function bid(uint256 _tokenId)\n external\n payable\n whenNotPaused\n {\n // _bid will throw if the bid or funds transfer fails\n _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n }\n\n /// @dev Cancels an auction that hasn't been won yet.\n /// Returns the NFT to original owner.\n /// @notice This is a state-modifying function that can\n /// be called while the contract is paused.\n /// @param _tokenId - ID of token on auction\n function cancelAuction(uint256 _tokenId)\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n address seller = auction.seller;\n require(msg.sender == seller);\n _cancelAuction(_tokenId, seller);\n }\n\n /// @dev Cancels an auction when the contract is paused.\n /// Only the owner may do this, and NFTs are returned to\n /// the seller. This should only be used in emergencies.\n /// @param _tokenId - ID of the NFT on auction to cancel.\n function cancelAuctionWhenPaused(uint256 _tokenId)\n whenPaused\n onlyOwner\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n _cancelAuction(_tokenId, auction.seller);\n }\n\n /// @dev Returns auction info for an NFT on auction.\n /// @param _tokenId - ID of NFT on auction.\n function getAuction(uint256 _tokenId)\n external\n view\n returns\n (\n address seller,\n uint256 startingPrice,\n uint256 endingPrice,\n uint256 duration,\n uint256 startedAt\n ) {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return (\n auction.seller,\n auction.startingPrice,\n auction.endingPrice,\n auction.duration,\n auction.startedAt\n );\n }\n\n /// @dev Returns the current price of an auction.\n /// @param _tokenId - ID of the token price we are checking.\n function getCurrentPrice(uint256 _tokenId)\n external\n view\n returns (uint256)\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return _currentPrice(auction);\n }\n\n}\n\n\n/// @title Reverse auction modified for siring\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SiringClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSiringAuctionAddress() call.\n bool public isSiringClockAuction = true;\n\n // Delegate constructor\n function SiringClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction. Since this function is wrapped,\n /// require sender to be KittyCore contract.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Places a bid for siring. Requires the sender\n /// is the KittyCore contract because all bid methods\n /// should be wrapped. Also returns the kitty to the\n /// seller rather than the winner.\n function bid(uint256 _tokenId)\n external\n payable\n {\n require(msg.sender == address(nonFungibleContract));\n address seller = tokenIdToAuction[_tokenId].seller;\n // _bid checks that token ID is valid and will throw if bid fails\n _bid(_tokenId, msg.value);\n // We transfer the kitty back to the seller, the winner will get\n // the offspring\n _transfer(seller, _tokenId);\n }\n\n}\n\n\n\n\n\n/// @title Clock auction modified for sale of kitties\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SaleClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSaleAuctionAddress() call.\n bool public isSaleClockAuction = true;\n\n // Tracks last 5 sale price of gen0 kitty sales\n uint256 public gen0SaleCount;\n uint256[5] public lastGen0SalePrices;\n\n // Delegate constructor\n function SaleClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Updates lastSalePrice if seller is the nft contract\n /// Otherwise, works the same as default bid method.\n function bid(uint256 _tokenId)\n external\n payable\n {\n // _bid verifies token ID size\n address seller = tokenIdToAuction[_tokenId].seller;\n uint256 price = _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n\n // If not a gen0 auction, exit\n if (seller == address(nonFungibleContract)) {\n // Track gen0 sale prices\n lastGen0SalePrices[gen0SaleCount % 5] = price;\n gen0SaleCount++;\n }\n }\n\n function averageGen0SalePrice() external view returns (uint256) {\n uint256 sum = 0;\n for (uint256 i = 0; i < 5; i++) {\n sum += lastGen0SalePrices[i];\n }\n return sum / 5;\n }\n\n}\n\n\n/// @title Handles creating auctions for sale and siring of kitties.\n/// This wrapper of ReverseAuction exists only so that users can create\n/// auctions with only one transaction.\ncontract KittyAuction is KittyBreeding {\n\n // @notice The auction contract variables are defined in KittyBase to allow\n // us to refer to them in KittyOwnership to prevent accidental transfers.\n // `saleAuction` refers to the auction for gen0 and p2p sale of kitties.\n // `siringAuction` refers to the auction for siring rights of kitties.\n\n /// @dev Sets the reference to the sale auction.\n /// @param _address - Address of sale contract.\n function setSaleAuctionAddress(address _address) external onlyCEO {\n SaleClockAuction candidateContract = SaleClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSaleClockAuction());\n\n // Set the new contract address\n saleAuction = candidateContract;\n }\n\n /// @dev Sets the reference to the siring auction.\n /// @param _address - Address of siring contract.\n function setSiringAuctionAddress(address _address) external onlyCEO {\n SiringClockAuction candidateContract = SiringClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSiringClockAuction());\n\n // Set the new contract address\n siringAuction = candidateContract;\n }\n\n /// @dev Put a kitty up for auction.\n /// Does some ownership trickery to create auctions in one tx.\n function createSaleAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n // Ensure the kitty is not pregnant to prevent the auction\n // contract accidentally receiving ownership of the child.\n // NOTE: the kitty IS allowed to be in a cooldown.\n require(!isPregnant(_kittyId));\n _approve(_kittyId, saleAuction);\n // Sale auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n saleAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Put a kitty up for auction to be sire.\n /// Performs checks to ensure the kitty can be sired, then\n /// delegates to reverse auction.\n function createSiringAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n require(isReadyToBreed(_kittyId));\n _approve(_kittyId, siringAuction);\n // Siring auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n siringAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Completes a siring auction by bidding.\n /// Immediately breeds the winning matron with the sire on auction.\n /// @param _sireId - ID of the sire on auction.\n /// @param _matronId - ID of the matron owned by the bidder.\n function bidOnSiringAuction(\n uint256 _sireId,\n uint256 _matronId\n )\n external\n payable\n whenNotPaused\n {\n // Auction contract checks input sizes\n require(_owns(msg.sender, _matronId));\n require(isReadyToBreed(_matronId));\n require(_canBreedWithViaAuction(_matronId, _sireId));\n\n // Define the current price of the auction.\n uint256 currentPrice = siringAuction.getCurrentPrice(_sireId);\n require(msg.value >= currentPrice + autoBirthFee);\n\n // Siring auction will throw if the bid fails.\n siringAuction.bid.value(msg.value - autoBirthFee)(_sireId);\n _breedWith(uint32(_matronId), uint32(_sireId));\n }\n\n /// @dev Transfers the balance of the sale auction contract\n /// to the KittyCore contract. We use two-step withdrawal to\n /// prevent two transfer calls in the auction bid function.\n function withdrawAuctionBalances() external onlyCLevel {\n saleAuction.withdrawBalance();\n siringAuction.withdrawBalance();\n }\n}\n\n\n/// @title all functions related to creating kittens\ncontract KittyMinting is KittyAuction {\n\n // Limits the number of cats the contract owner can ever create.\n uint256 public constant PROMO_CREATION_LIMIT = 5000;\n uint256 public constant GEN0_CREATION_LIMIT = 45000;\n\n // Constants for gen0 auctions.\n uint256 public constant GEN0_STARTING_PRICE = 10 finney;\n uint256 public constant GEN0_AUCTION_DURATION = 1 days;\n\n // Counts the number of cats the contract owner has created.\n uint256 public promoCreatedCount;\n uint256 public gen0CreatedCount;\n\n /// @dev we can create promo kittens, up to a limit. Only callable by COO\n /// @param _genes the encoded genes of the kitten to be created, any value is accepted\n /// @param _owner the future owner of the created kittens. Default to contract COO\n function createPromoKitty(uint256 _genes, address _owner) external onlyCOO {\n address kittyOwner = _owner;\n if (kittyOwner == address(0)) {\n kittyOwner = cooAddress;\n }\n require(promoCreatedCount < PROMO_CREATION_LIMIT);\n\n promoCreatedCount++;\n _createKitty(0, 0, 0, _genes, kittyOwner);\n }\n\n /// @dev Creates a new gen0 kitty with the given genes and\n /// creates an auction for it.\n function createGen0Auction(uint256 _genes) external onlyCOO {\n require(gen0CreatedCount < GEN0_CREATION_LIMIT);\n\n uint256 kittyId = _createKitty(0, 0, 0, _genes, address(this));\n _approve(kittyId, saleAuction);\n\n saleAuction.createAuction(\n kittyId,\n _computeNextGen0Price(),\n 0,\n GEN0_AUCTION_DURATION,\n address(this)\n );\n\n gen0CreatedCount++;\n }\n\n /// @dev Computes the next gen0 auction starting price, given\n /// the average of the past 5 prices + 50%.\n function _computeNextGen0Price() internal view returns (uint256) {\n uint256 avePrice = saleAuction.averageGen0SalePrice();\n\n // Sanity check to ensure we don't overflow arithmetic\n require(avePrice == uint256(uint128(avePrice)));\n\n uint256 nextPrice = avePrice + (avePrice / 2);\n\n // We never auction for less than starting price\n if (nextPrice < GEN0_STARTING_PRICE) {\n nextPrice = GEN0_STARTING_PRICE;\n }\n\n return nextPrice;\n }\n}\n\n\n/// @title CryptoKitties: Collectible, breedable, and oh-so-adorable cats on the Ethereum blockchain.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev The main CryptoKitties contract, keeps track of kittens so they don't wander around and get lost.\ncontract KittyCore is KittyMinting {\n\n // This is the main CryptoKitties contract. In order to keep our code seperated into logical sections,\n // we've broken it up in two ways. First, we have several seperately-instantiated sibling contracts\n // that handle auctions and our super-top-secret genetic combination algorithm. The auctions are\n // seperate since their logic is somewhat complex and there's always a risk of subtle bugs. By keeping\n // them in their own contracts, we can upgrade them without disrupting the main contract that tracks\n // kitty ownership. The genetic combination algorithm is kept seperate so we can open-source all of\n // the rest of our code without making it _too_ easy for folks to figure out how the genetics work.\n // Don't worry, I'm sure someone will reverse engineer it soon enough!\n //\n // Secondly, we break the core contract into multiple files using inheritence, one for each major\n // facet of functionality of CK. This allows us to keep related code bundled together while still\n // avoiding a single giant file with everything in it. The breakdown is as follows:\n //\n // - KittyBase: This is where we define the most fundamental code shared throughout the core\n // functionality. This includes our main data storage, constants and data types, plus\n // internal functions for managing these items.\n //\n // - KittyAccessControl: This contract manages the various addresses and constraints for operations\n // that can be executed only by specific roles. Namely CEO, CFO and COO.\n //\n // - KittyOwnership: This provides the methods required for basic non-fungible token\n // transactions, following the draft ERC-721 spec (https://github.com/ethereum/EIPs/issues/721).\n //\n // - KittyBreeding: This file contains the methods necessary to breed cats together, including\n // keeping track of siring offers, and relies on an external genetic combination contract.\n //\n // - KittyAuctions: Here we have the public methods for auctioning or bidding on cats or siring\n // services. The actual auction functionality is handled in two sibling contracts (one\n // for sales and one for siring), while auction creation and bidding is mostly mediated\n // through this facet of the core contract.\n //\n // - KittyMinting: This final facet contains the functionality we use for creating new gen0 cats.\n // We can make up to 5000 \"promo\" cats that can be given away (especially important when\n // the community is new), and all others can only be created and then immediately put up\n // for auction via an algorithmically determined starting price. Regardless of how they\n // are created, there is a hard limit of 50k gen0 cats. After that, it's all up to the\n // community to breed, breed, breed!\n\n // Set in case the core contract is broken and an upgrade is required\n address public newContractAddress;\n\n /// @notice Creates the main CryptoKitties smart contract instance.\n function KittyCore() public {\n // Starts paused.\n paused = true;\n\n // the creator of the contract is the initial CEO\n ceoAddress = msg.sender;\n\n // the creator of the contract is also the initial COO\n cooAddress = msg.sender;\n\n // start with the mythical kitten 0 - so we don't have generation-0 parent issues\n _createKitty(0, 0, 0, uint256(-1), address(0));\n }\n\n /// @dev Used to mark the smart contract as upgraded, in case there is a serious\n /// breaking bug. This method does nothing but keep track of the new contract and\n /// emit a message indicating that the new address is set. It's up to clients of this\n /// contract to update to the new contract address in that case. (This contract will\n /// be paused indefinitely if such an upgrade takes place.)\n /// @param _v2Address new address\n function setNewAddress(address _v2Address) external onlyCEO whenPaused {\n // See README.md for updgrade plan\n newContractAddress = _v2Address;\n ContractUpgrade(_v2Address);\n }\n\n /// @notice No tipping!\n /// @dev Reject all Ether from being sent here, unless it's from one of the\n /// two auction contracts. (Hopefully, we can prevent user accidents.)\n function() external payable {\n require(\n msg.sender == address(saleAuction) ||\n msg.sender == address(siringAuction)\n );\n }\n\n /// @notice Returns all the relevant information about a specific kitty.\n /// @param _id The ID of the kitty of interest.\n function getKitty(uint256 _id)\n external\n view\n returns (\n bool isGestating,\n bool isReady,\n uint256 cooldownIndex,\n uint256 nextActionAt,\n uint256 siringWithId,\n uint256 birthTime,\n uint256 matronId,\n uint256 sireId,\n uint256 generation,\n uint256 genes\n ) {\n Kitty storage kit = kitties[_id];\n\n // if this variable is 0 then it's not gestating\n isGestating = (kit.siringWithId != 0);\n isReady = (kit.cooldownEndBlock <= block.number);\n cooldownIndex = uint256(kit.cooldownIndex);\n nextActionAt = uint256(kit.cooldownEndBlock);\n siringWithId = uint256(kit.siringWithId);\n birthTime = uint256(kit.birthTime);\n matronId = uint256(kit.matronId);\n sireId = uint256(kit.sireId);\n generation = uint256(kit.generation);\n genes = kit.genes;\n }\n\n /// @dev Override unpause so it requires all external contract addresses\n /// to be set before contract can be unpaused. Also, we can't have\n /// newContractAddress set either, because then the contract was upgraded.\n /// @notice This is public rather than external so we can call super.unpause\n /// without using an expensive CALL.\n function unpause() public onlyCEO whenPaused {\n require(saleAuction != address(0));\n require(siringAuction != address(0));\n require(geneScience != address(0));\n require(newContractAddress == address(0));\n\n // Actually unpause the contract.\n super.unpause();\n }\n\n // @dev Allows the CFO to capture the balance available to the contract.\n function withdrawBalance() external onlyCFO {\n uint256 balance = this.balance;\n // Subtract all the currently pregnant kittens we have, plus 1 of margin.\n uint256 subtractFees = (pregnantKitties + 1) * autoBirthFee;\n\n if (balance > subtractFees) {\n cfoAddress.send(balance - subtractFees);\n }\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "exportedSymbols": { "ClockAuction": [ 8872 @@ -51816,5 +51816,5 @@ export const KittiesERC721 = }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:47.673Z" + "updatedAt": "2018-10-09T17:45:35.810Z" } \ No newline at end of file diff --git a/artifacts/ts/KittiesERC721Metadata.ts b/artifacts/ts/KittiesERC721Metadata.ts index b5a43ace..d03e644f 100644 --- a/artifacts/ts/KittiesERC721Metadata.ts +++ b/artifacts/ts/KittiesERC721Metadata.ts @@ -30,15 +30,15 @@ export const KittiesERC721Metadata = "type": "function" } ], - "bytecode": "0x6060604052341561000f57600080fd5b6103608061001e6000396000f300606060405260043610610041576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063cb4799f214610046575b600080fd5b341561005157600080fd5b6100aa600480803590602001909190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506100ef565b6040518083600460200280838360005b838110156100d55780820151818401526020810190506100ba565b505050509050018281526020019250505060405180910390f35b6100f7610309565b6000600184141561014e577f48656c6c6f20576f726c6421203a44000000000000000000000000000000000082600060048110151561013257fe5b60200201906000191690816000191681525050600f9050610302565b60028414156101e6577f4920776f756c6420646566696e6974656c792063686f6f73652061206d65646982600060048110151561018757fe5b602002019060001916908160001916815250507f756d206c656e67746820737472696e672e0000000000000000000000000000008260016004811015156101ca57fe5b6020020190600019169081600019168152505060319050610301565b6003841415610300577f4c6f72656d20697073756d20646f6c6f722073697420616d65742c206d69206582600060048110151561021f57fe5b602002019060001916908160001916815250507f737420616363756d73616e2064617069627573206175677565206c6f72656d2c82600160048110151561026257fe5b602002019060001916908160001916815250507f2074726973746971756520766573746962756c756d2069642c206c696265726f8260026004811015156102a557fe5b602002019060001916908160001916815250507f207375736369706974207661726975732073617069656e20616c697175616d2e8260036004811015156102e857fe5b60200201906000191690816000191681525050608090505b5b5b9250929050565b6080604051908101604052806004905b600080191681526020019060019003908161031957905050905600a165627a7a72305820dddf8ed6fe53e11ab9b2c72f45dbd93d34908d1647b58cc50edbe79c0ea621b40029", - "deployedBytecode": "0x606060405260043610610041576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063cb4799f214610046575b600080fd5b341561005157600080fd5b6100aa600480803590602001909190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506100ef565b6040518083600460200280838360005b838110156100d55780820151818401526020810190506100ba565b505050509050018281526020019250505060405180910390f35b6100f7610309565b6000600184141561014e577f48656c6c6f20576f726c6421203a44000000000000000000000000000000000082600060048110151561013257fe5b60200201906000191690816000191681525050600f9050610302565b60028414156101e6577f4920776f756c6420646566696e6974656c792063686f6f73652061206d65646982600060048110151561018757fe5b602002019060001916908160001916815250507f756d206c656e67746820737472696e672e0000000000000000000000000000008260016004811015156101ca57fe5b6020020190600019169081600019168152505060319050610301565b6003841415610300577f4c6f72656d20697073756d20646f6c6f722073697420616d65742c206d69206582600060048110151561021f57fe5b602002019060001916908160001916815250507f737420616363756d73616e2064617069627573206175677565206c6f72656d2c82600160048110151561026257fe5b602002019060001916908160001916815250507f2074726973746971756520766573746962756c756d2069642c206c696265726f8260026004811015156102a557fe5b602002019060001916908160001916815250507f207375736369706974207661726975732073617069656e20616c697175616d2e8260036004811015156102e857fe5b60200201906000191690816000191681525050608090505b5b5b9250929050565b6080604051908101604052806004905b600080191681526020019060019003908161031957905050905600a165627a7a72305820dddf8ed6fe53e11ab9b2c72f45dbd93d34908d1647b58cc50edbe79c0ea621b40029", + "bytecode": "0x6060604052341561000f57600080fd5b6103608061001e6000396000f300606060405260043610610041576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063cb4799f214610046575b600080fd5b341561005157600080fd5b6100aa600480803590602001909190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506100ef565b6040518083600460200280838360005b838110156100d55780820151818401526020810190506100ba565b505050509050018281526020019250505060405180910390f35b6100f7610309565b6000600184141561014e577f48656c6c6f20576f726c6421203a44000000000000000000000000000000000082600060048110151561013257fe5b60200201906000191690816000191681525050600f9050610302565b60028414156101e6577f4920776f756c6420646566696e6974656c792063686f6f73652061206d65646982600060048110151561018757fe5b602002019060001916908160001916815250507f756d206c656e67746820737472696e672e0000000000000000000000000000008260016004811015156101ca57fe5b6020020190600019169081600019168152505060319050610301565b6003841415610300577f4c6f72656d20697073756d20646f6c6f722073697420616d65742c206d69206582600060048110151561021f57fe5b602002019060001916908160001916815250507f737420616363756d73616e2064617069627573206175677565206c6f72656d2c82600160048110151561026257fe5b602002019060001916908160001916815250507f2074726973746971756520766573746962756c756d2069642c206c696265726f8260026004811015156102a557fe5b602002019060001916908160001916815250507f207375736369706974207661726975732073617069656e20616c697175616d2e8260036004811015156102e857fe5b60200201906000191690816000191681525050608090505b5b5b9250929050565b6080604051908101604052806004905b600080191681526020019060019003908161031957905050905600a165627a7a72305820bc59ec36d20a6658ad00ee23b5f774dfb934ac90ad57218913d64600cd332b480029", + "deployedBytecode": "0x606060405260043610610041576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063cb4799f214610046575b600080fd5b341561005157600080fd5b6100aa600480803590602001909190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506100ef565b6040518083600460200280838360005b838110156100d55780820151818401526020810190506100ba565b505050509050018281526020019250505060405180910390f35b6100f7610309565b6000600184141561014e577f48656c6c6f20576f726c6421203a44000000000000000000000000000000000082600060048110151561013257fe5b60200201906000191690816000191681525050600f9050610302565b60028414156101e6577f4920776f756c6420646566696e6974656c792063686f6f73652061206d65646982600060048110151561018757fe5b602002019060001916908160001916815250507f756d206c656e67746820737472696e672e0000000000000000000000000000008260016004811015156101ca57fe5b6020020190600019169081600019168152505060319050610301565b6003841415610300577f4c6f72656d20697073756d20646f6c6f722073697420616d65742c206d69206582600060048110151561021f57fe5b602002019060001916908160001916815250507f737420616363756d73616e2064617069627573206175677565206c6f72656d2c82600160048110151561026257fe5b602002019060001916908160001916815250507f2074726973746971756520766573746962756c756d2069642c206c696265726f8260026004811015156102a557fe5b602002019060001916908160001916815250507f207375736369706974207661726975732073617069656e20616c697175616d2e8260036004811015156102e857fe5b60200201906000191690816000191681525050608090505b5b5b9250929050565b6080604051908101604052806004905b600080191681526020019060019003908161031957905050905600a165627a7a72305820bc59ec36d20a6658ad00ee23b5f774dfb934ac90ad57218913d64600cd332b480029", "sourceMap": "17644:818:18:-;;;;;;;;;;;;;;;;;", "deployedSourceMap": "17644:818:18:-;;;;;;;;;;;;;;;;;;;;;;;;17779:681;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;17779:681:18;17847:17;;:::i;:::-;17866:13;17907:1;17895:8;:13;17891:563;;;17924:29;:6;17931:1;17924:9;;;;;;;;;;;;:29;;;;;;;;;;;;;17975:2;17967:10;;17891:563;;;18010:1;17998:8;:13;17994:460;;;18027:46;:6;18034:1;18027:9;;;;;;;;;;;;:46;;;;;;;;;;;;;18087:31;:6;18094:1;18087:9;;;;;;;;;;;;:31;;;;;;;;;;;;;18140:2;18132:10;;17994:460;;;18175:1;18163:8;:13;18159:295;;;18192:46;:6;18199:1;18192:9;;;;;;;;;;;;:46;;;;;;;;;;;;;18252;:6;18259:1;18252:9;;;;;;;;;;;;:46;;;;;;;;;;;;;18312;:6;18319:1;18312:9;;;;;;;;;;;;:46;;;;;;;;;;;;;18372;:6;18379:1;18372:9;;;;;;;;;;;;:46;;;;;;;;;;;;;18440:3;18432:11;;18159:295;17994:460;17891:563;17779:681;;;;;:::o;17644:818::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", "source": "pragma solidity 0.4.18;\n\n/**\n The following contract code, titled KittyCore, was written by Cryptokitties and published\n and retrieved from https://etherscan.io/address/0x06012c8cf97bead5deae237070f9587f8e7a266d#code.\n\n It is included in the current project for test purposes, to ensure that our collateralizer can\n handle ERC721 tokens created by the KittyCore contract.\n*/\n\n/**\n * @title KittiesOwnable\n * @dev The KittiesOwnable contract has an owner address, and provides basic authorization control\n * functions, this simplifies the implementation of \"user permissions\".\n */\ncontract KittiesOwnable {\n address public owner;\n\n\n /**\n\t * @dev The KittiesOwnable constructor sets the original `owner` of the contract to the sender\n\t * account.\n\t */\n function KittiesOwnable() {\n owner = msg.sender;\n }\n\n\n /**\n\t * @dev Throws if called by any account other than the owner.\n\t */\n modifier onlyOwner() {\n require(msg.sender == owner);\n _;\n }\n\n\n /**\n\t * @dev Allows the current owner to transfer control of the contract to a newOwner.\n\t * @param newOwner The address to transfer ownership to.\n\t */\n function transferOwnership(address newOwner) onlyOwner {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n\n}\n\n\n\n/// @title Interface for contracts conforming to ERC-721: Non-Fungible Tokens\n/// @author Dieter Shirley (https://github.com/dete)\ncontract KittiesERC721 {\n // Required methods\n function totalSupply() public view returns (uint256 total);\n function balanceOf(address _owner) public view returns (uint256 balance);\n function ownerOf(uint256 _tokenId) external view returns (address owner);\n function approve(address _to, uint256 _tokenId) external;\n function transfer(address _to, uint256 _tokenId) external;\n function transferFrom(address _from, address _to, uint256 _tokenId) external;\n\n // Events\n event Transfer(address from, address to, uint256 tokenId);\n event Approval(address owner, address approved, uint256 tokenId);\n\n // Optional\n // function name() public view returns (string name);\n // function symbol() public view returns (string symbol);\n // function tokensOfOwner(address _owner) external view returns (uint256[] tokenIds);\n // function tokenMetadata(uint256 _tokenId, string _preferredTransport) public view returns (string infoUrl);\n\n // ERC-165 Compatibility (https://github.com/ethereum/EIPs/issues/165)\n function supportsInterface(bytes4 _interfaceID) external view returns (bool);\n}\n\n\n// // Auction wrapper functions\n\n\n// Auction wrapper functions\n\n\n\n\n\n\n\n/// @title SEKRETOOOO\ncontract GeneScienceInterface {\n /// @dev simply a boolean to indicate this is the contract we expect to be\n function isGeneScience() public pure returns (bool);\n\n /// @dev given genes of kitten 1 & 2, return a genetic combination - may have a random factor\n /// @param genes1 genes of mom\n /// @param genes2 genes of sire\n /// @return the genes that are supposed to be passed down the child\n function mixGenes(uint256 genes1, uint256 genes2, uint256 targetBlock) public returns (uint256);\n}\n\n\n\n\n\n\n\n/// @title A facet of KittyCore that manages special access privileges.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyAccessControl {\n // This facet controls access control for CryptoKitties. There are four roles managed here:\n //\n // - The CEO: The CEO can reassign other roles and change the addresses of our dependent smart\n // contracts. It is also the only role that can unpause the smart contract. It is initially\n // set to the address that created the smart contract in the KittyCore constructor.\n //\n // - The CFO: The CFO can withdraw funds from KittyCore and its auction contracts.\n //\n // - The COO: The COO can release gen0 kitties to auction, and mint promo cats.\n //\n // It should be noted that these roles are distinct without overlap in their access abilities, the\n // abilities listed for each role above are exhaustive. In particular, while the CEO can assign any\n // address to any role, the CEO address itself doesn't have the ability to act in those roles. This\n // restriction is intentional so that we aren't tempted to use the CEO address frequently out of\n // convenience. The less we use an address, the less likely it is that we somehow compromise the\n // account.\n\n /// @dev Emited when contract is upgraded - See README.md for updgrade plan\n event ContractUpgrade(address newContract);\n\n // The addresses of the accounts (or contracts) that can execute actions within each roles.\n address public ceoAddress;\n address public cfoAddress;\n address public cooAddress;\n\n // @dev Keeps track whether the contract is paused. When that is true, most actions are blocked\n bool public paused = false;\n\n /// @dev Access modifier for CEO-only functionality\n modifier onlyCEO() {\n require(msg.sender == ceoAddress);\n _;\n }\n\n /// @dev Access modifier for CFO-only functionality\n modifier onlyCFO() {\n require(msg.sender == cfoAddress);\n _;\n }\n\n /// @dev Access modifier for COO-only functionality\n modifier onlyCOO() {\n require(msg.sender == cooAddress);\n _;\n }\n\n modifier onlyCLevel() {\n require(\n msg.sender == cooAddress ||\n msg.sender == ceoAddress ||\n msg.sender == cfoAddress\n );\n _;\n }\n\n /// @dev Assigns a new address to act as the CEO. Only available to the current CEO.\n /// @param _newCEO The address of the new CEO\n function setCEO(address _newCEO) external onlyCEO {\n require(_newCEO != address(0));\n\n ceoAddress = _newCEO;\n }\n\n /// @dev Assigns a new address to act as the CFO. Only available to the current CEO.\n /// @param _newCFO The address of the new CFO\n function setCFO(address _newCFO) external onlyCEO {\n require(_newCFO != address(0));\n\n cfoAddress = _newCFO;\n }\n\n /// @dev Assigns a new address to act as the COO. Only available to the current CEO.\n /// @param _newCOO The address of the new COO\n function setCOO(address _newCOO) external onlyCEO {\n require(_newCOO != address(0));\n\n cooAddress = _newCOO;\n }\n\n /*** KittiesPausable functionality adapted from OpenZeppelin ***/\n\n /// @dev Modifier to allow actions only when the contract IS NOT paused\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /// @dev Modifier to allow actions only when the contract IS paused\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /// @dev Called by any \"C-level\" role to pause the contract. Used only when\n /// a bug or exploit is detected and we need to limit damage.\n function pause() external onlyCLevel whenNotPaused {\n paused = true;\n }\n\n /// @dev Unpauses the smart contract. Can only be called by the CEO, since\n /// one reason we may pause the contract is when CFO or COO accounts are\n /// compromised.\n /// @notice This is public rather than external so it can be called by\n /// derived contracts.\n function unpause() public onlyCEO whenPaused {\n // can't unpause if contract was upgraded\n paused = false;\n }\n}\n\n\n\n\n/// @title Base contract for CryptoKitties. Holds all common structs, events and base variables.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBase is KittyAccessControl {\n /*** EVENTS ***/\n\n /// @dev The Birth event is fired whenever a new kitten comes into existence. This obviously\n /// includes any time a cat is created through the giveBirth method, but it is also called\n /// when a new gen0 cat is created.\n event Birth(address owner, uint256 kittyId, uint256 matronId, uint256 sireId, uint256 genes);\n\n /// @dev Transfer event as defined in current draft of ERC721. Emitted every time a kitten\n /// ownership is assigned, including births.\n event Transfer(address from, address to, uint256 tokenId);\n\n /*** DATA TYPES ***/\n\n /// @dev The main Kitty struct. Every cat in CryptoKitties is represented by a copy\n /// of this structure, so great care was taken to ensure that it fits neatly into\n /// exactly two 256-bit words. Note that the order of the members in this structure\n /// is important because of the byte-packing rules used by Ethereum.\n /// Ref: http://solidity.readthedocs.io/en/develop/miscellaneous.html\n struct Kitty {\n // The Kitty's genetic code is packed into these 256-bits, the format is\n // sooper-sekret! A cat's genes never change.\n uint256 genes;\n\n // The timestamp from the block when this cat came into existence.\n uint64 birthTime;\n\n // The minimum timestamp after which this cat can engage in breeding\n // activities again. This same timestamp is used for the pregnancy\n // timer (for matrons) as well as the siring cooldown.\n uint64 cooldownEndBlock;\n\n // The ID of the parents of this kitty, set to 0 for gen0 cats.\n // Note that using 32-bit unsigned integers limits us to a \"mere\"\n // 4 billion cats. This number might seem small until you realize\n // that Ethereum currently has a limit of about 500 million\n // transactions per year! So, this definitely won't be a problem\n // for several years (even as Ethereum learns to scale).\n uint32 matronId;\n uint32 sireId;\n\n // Set to the ID of the sire cat for matrons that are pregnant,\n // zero otherwise. A non-zero value here is how we know a cat\n // is pregnant. Used to retrieve the genetic material for the new\n // kitten when the birth transpires.\n uint32 siringWithId;\n\n // Set to the index in the cooldown array (see below) that represents\n // the current cooldown duration for this Kitty. This starts at zero\n // for gen0 cats, and is initialized to floor(generation/2) for others.\n // Incremented by one for each successful breeding action, regardless\n // of whether this cat is acting as matron or sire.\n uint16 cooldownIndex;\n\n // The \"generation number\" of this cat. Cats minted by the CK contract\n // for sale are called \"gen0\" and have a generation number of 0. The\n // generation number of all other cats is the larger of the two generation\n // numbers of their parents, plus one.\n // (i.e. max(matron.generation, sire.generation) + 1)\n uint16 generation;\n }\n\n /*** CONSTANTS ***/\n\n /// @dev A lookup table indicating the cooldown duration after any successful\n /// breeding action, called \"pregnancy time\" for matrons and \"siring cooldown\"\n /// for sires. Designed such that the cooldown roughly doubles each time a cat\n /// is bred, encouraging owners not to just keep breeding the same cat over\n /// and over again. Caps out at one week (a cat can breed an unbounded number\n /// of times, and the maximum cooldown is always seven days).\n uint32[14] public cooldowns = [\n uint32(1 minutes),\n uint32(2 minutes),\n uint32(5 minutes),\n uint32(10 minutes),\n uint32(30 minutes),\n uint32(1 hours),\n uint32(2 hours),\n uint32(4 hours),\n uint32(8 hours),\n uint32(16 hours),\n uint32(1 days),\n uint32(2 days),\n uint32(4 days),\n uint32(7 days)\n ];\n\n // An approximation of currently how many seconds are in between blocks.\n uint256 public secondsPerBlock = 15;\n\n /*** STORAGE ***/\n\n /// @dev An array containing the Kitty struct for all Kitties in existence. The ID\n /// of each cat is actually an index into this array. Note that ID 0 is a negacat,\n /// the unKitty, the mythical beast that is the parent of all gen0 cats. A bizarre\n /// creature that is both matron and sire... to itself! Has an invalid genetic code.\n /// In other words, cat ID 0 is invalid... ;-)\n Kitty[] kitties;\n\n /// @dev A mapping from cat IDs to the address that owns them. All cats have\n /// some valid owner address, even gen0 cats are created with a non-zero owner.\n mapping (uint256 => address) public kittyIndexToOwner;\n\n // @dev A mapping from owner address to count of tokens that address owns.\n // Used internally inside balanceOf() to resolve ownership count.\n mapping (address => uint256) ownershipTokenCount;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to call\n /// transferFrom(). Each Kitty can only have one approved address for transfer\n /// at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public kittyIndexToApproved;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to use\n /// this Kitty for siring via breedWith(). Each Kitty can only have one approved\n /// address for siring at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public sireAllowedToAddress;\n\n /// @dev The address of the ClockAuction contract that handles sales of Kitties. This\n /// same contract handles both peer-to-peer sales as well as the gen0 sales which are\n /// initiated every 15 minutes.\n SaleClockAuction public saleAuction;\n\n /// @dev The address of a custom ClockAuction subclassed contract that handles siring\n /// auctions. Needs to be separate from saleAuction because the actions taken on success\n /// after a sales and siring auction are quite different.\n SiringClockAuction public siringAuction;\n\n /// @dev Assigns ownership of a specific Kitty to an address.\n function _transfer(address _from, address _to, uint256 _tokenId) internal {\n // Since the number of kittens is capped to 2^32 we can't overflow this\n ownershipTokenCount[_to]++;\n // transfer ownership\n kittyIndexToOwner[_tokenId] = _to;\n // When creating new kittens _from is 0x0, but we can't account that address.\n if (_from != address(0)) {\n ownershipTokenCount[_from]--;\n // once the kitten is transferred also clear sire allowances\n delete sireAllowedToAddress[_tokenId];\n // clear any previously approved ownership exchange\n delete kittyIndexToApproved[_tokenId];\n }\n // Emit the transfer event.\n Transfer(_from, _to, _tokenId);\n }\n\n /// @dev An internal method that creates a new kitty and stores it. This\n /// method doesn't do any checking and should only be called when the\n /// input data is known to be valid. Will generate both a Birth event\n /// and a Transfer event.\n /// @param _matronId The kitty ID of the matron of this cat (zero for gen0)\n /// @param _sireId The kitty ID of the sire of this cat (zero for gen0)\n /// @param _generation The generation number of this cat, must be computed by caller.\n /// @param _genes The kitty's genetic code.\n /// @param _owner The inital owner of this cat, must be non-zero (except for the unKitty, ID 0)\n function _createKitty(\n uint256 _matronId,\n uint256 _sireId,\n uint256 _generation,\n uint256 _genes,\n address _owner\n )\n internal\n returns (uint)\n {\n // These requires are not strictly necessary, our calling code should make\n // sure that these conditions are never broken. However! _createKitty() is already\n // an expensive call (for storage), and it doesn't hurt to be especially careful\n // to ensure our data structures are always valid.\n require(_matronId == uint256(uint32(_matronId)));\n require(_sireId == uint256(uint32(_sireId)));\n require(_generation == uint256(uint16(_generation)));\n\n // New kitty starts with the same cooldown as parent gen/2\n uint16 cooldownIndex = uint16(_generation / 2);\n if (cooldownIndex > 13) {\n cooldownIndex = 13;\n }\n\n Kitty memory _kitty = Kitty({\n genes: _genes,\n birthTime: uint64(now),\n cooldownEndBlock: 0,\n matronId: uint32(_matronId),\n sireId: uint32(_sireId),\n siringWithId: 0,\n cooldownIndex: cooldownIndex,\n generation: uint16(_generation)\n });\n uint256 newKittenId = kitties.push(_kitty) - 1;\n\n // It's probably never going to happen, 4 billion cats is A LOT, but\n // let's just be 100% sure we never let this happen.\n require(newKittenId == uint256(uint32(newKittenId)));\n\n // emit the birth event\n Birth(\n _owner,\n newKittenId,\n uint256(_kitty.matronId),\n uint256(_kitty.sireId),\n _kitty.genes\n );\n\n // This will assign ownership, and also emit the Transfer event as\n // per ERC721 draft\n _transfer(0, _owner, newKittenId);\n\n return newKittenId;\n }\n\n // Any C-level can fix how many seconds per blocks are currently observed.\n function setSecondsPerBlock(uint256 secs) external onlyCLevel {\n require(secs < cooldowns[0]);\n secondsPerBlock = secs;\n }\n}\n\n\n\n\n\n/// @title The external contract that is responsible for generating metadata for the kitties,\n/// it has one function that will return the data as bytes.\ncontract KittiesERC721Metadata {\n /// @dev Given a token Id, returns a byte array that is supposed to be converted into string.\n function getMetadata(uint256 _tokenId, string) public view returns (bytes32[4] buffer, uint256 count) {\n if (_tokenId == 1) {\n buffer[0] = \"Hello World! :D\";\n count = 15;\n } else if (_tokenId == 2) {\n buffer[0] = \"I would definitely choose a medi\";\n buffer[1] = \"um length string.\";\n count = 49;\n } else if (_tokenId == 3) {\n buffer[0] = \"Lorem ipsum dolor sit amet, mi e\";\n buffer[1] = \"st accumsan dapibus augue lorem,\";\n buffer[2] = \" tristique vestibulum id, libero\";\n buffer[3] = \" suscipit varius sapien aliquam.\";\n count = 128;\n }\n }\n}\n\n\n/// @title The facet of the CryptoKitties core contract that manages ownership, ERC-721 (draft) compliant.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev Ref: https://github.com/ethereum/EIPs/issues/721\n/// See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyOwnership is KittyBase, KittiesERC721 {\n\n /// @notice Name and symbol of the non fungible token, as defined in ERC721.\n string public constant name = \"CryptoKitties\";\n string public constant symbol = \"CK\";\n\n // The contract that will return kitty metadata\n KittiesERC721Metadata public erc721Metadata;\n\n bytes4 constant InterfaceSignature_ERC165 =\n bytes4(keccak256('supportsInterface(bytes4)'));\n\n bytes4 constant InterfaceSignature_ERC721 =\n bytes4(keccak256('name()')) ^\n bytes4(keccak256('symbol()')) ^\n bytes4(keccak256('totalSupply()')) ^\n bytes4(keccak256('balanceOf(address)')) ^\n bytes4(keccak256('ownerOf(uint256)')) ^\n bytes4(keccak256('approve(address,uint256)')) ^\n bytes4(keccak256('transfer(address,uint256)')) ^\n bytes4(keccak256('transferFrom(address,address,uint256)')) ^\n bytes4(keccak256('tokensOfOwner(address)')) ^\n bytes4(keccak256('tokenMetadata(uint256,string)'));\n\n /// @notice Introspection interface as per ERC-165 (https://github.com/ethereum/EIPs/issues/165).\n /// Returns true for any standardized interfaces implemented by this contract. We implement\n /// ERC-165 (obviously!) and ERC-721.\n function supportsInterface(bytes4 _interfaceID) external view returns (bool)\n {\n // DEBUG ONLY\n //require((InterfaceSignature_ERC165 == 0x01ffc9a7) && (InterfaceSignature_ERC721 == 0x9a20483d));\n\n return ((_interfaceID == InterfaceSignature_ERC165) || (_interfaceID == InterfaceSignature_ERC721));\n }\n\n /// @dev Set the address of the sibling contract that tracks metadata.\n /// CEO only.\n function setMetadataAddress(address _contractAddress) public onlyCEO {\n erc721Metadata = KittiesERC721Metadata(_contractAddress);\n }\n\n // Internal utility functions: These functions all assume that their input arguments\n // are valid. We leave it to public methods to sanitize their inputs and follow\n // the required logic.\n\n /// @dev Checks if a given address is the current owner of a particular Kitty.\n /// @param _claimant the address we are validating against.\n /// @param _tokenId kitten id, only valid when > 0\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToOwner[_tokenId] == _claimant;\n }\n\n /// @dev Checks if a given address currently has transferApproval for a particular Kitty.\n /// @param _claimant the address we are confirming kitten is approved for.\n /// @param _tokenId kitten id, only valid when > 0\n function _approvedFor(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToApproved[_tokenId] == _claimant;\n }\n\n /// @dev Marks an address as being approved for transferFrom(), overwriting any previous\n /// approval. Setting _approved to address(0) clears all transfer approval.\n /// NOTE: _approve() does NOT send the Approval event. This is intentional because\n /// _approve() and transferFrom() are used together for putting Kitties on auction, and\n /// there is no value in spamming the log with Approval events in that case.\n function _approve(uint256 _tokenId, address _approved) internal {\n kittyIndexToApproved[_tokenId] = _approved;\n }\n\n /// @notice Returns the number of Kitties owned by a specific address.\n /// @param _owner The owner address to check.\n /// @dev Required for ERC-721 compliance\n function balanceOf(address _owner) public view returns (uint256 count) {\n return ownershipTokenCount[_owner];\n }\n\n /// @notice Transfers a Kitty to another address. If transferring to a smart\n /// contract be VERY CAREFUL to ensure that it is aware of ERC-721 (or\n /// CryptoKitties specifically) or your Kitty may be lost forever. Seriously.\n /// @param _to The address of the recipient, can be a user or contract.\n /// @param _tokenId The ID of the Kitty to transfer.\n /// @dev Required for ERC-721 compliance.\n function transfer(\n address _to,\n uint256 _tokenId\n )\n external\n whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Disallow transfers to the auction contracts to prevent accidental\n // misuse. Auction contracts should only take ownership of kitties\n // through the allow + transferFrom flow.\n require(_to != address(saleAuction));\n require(_to != address(siringAuction));\n\n // You can only send your own cat.\n require(_owns(msg.sender, _tokenId));\n\n // Reassign ownership, clear pending approvals, emit Transfer event.\n _transfer(msg.sender, _to, _tokenId);\n }\n\n /// @notice Grant another address the right to transfer a specific Kitty via\n /// transferFrom(). This is the preferred flow for transfering NFTs to contracts.\n /// @param _to The address to be granted transfer approval. Pass address(0) to\n /// clear all approvals.\n /// @param _tokenId The ID of the Kitty that can be transferred if this call succeeds.\n /// @dev Required for ERC-721 compliance.\n function approve(\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Only an owner can grant transfer approval.\n require(_owns(msg.sender, _tokenId));\n\n // Register the approval (replacing any previous approval).\n _approve(_tokenId, _to);\n\n // Emit approval event.\n Approval(msg.sender, _to, _tokenId);\n }\n\n /// @notice Transfer a Kitty owned by another address, for which the calling address\n /// has previously been granted transfer approval by the owner.\n /// @param _from The address that owns the Kitty to be transfered.\n /// @param _to The address that should take ownership of the Kitty. Can be any address,\n /// including the caller.\n /// @param _tokenId The ID of the Kitty to be transferred.\n /// @dev Required for ERC-721 compliance.\n function transferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Check for approval and valid ownership\n require(_approvedFor(msg.sender, _tokenId));\n require(_owns(_from, _tokenId));\n\n // Reassign ownership (also clears pending approvals and emits Transfer event).\n _transfer(_from, _to, _tokenId);\n }\n\n /// @notice Returns the total number of Kitties currently in existence.\n /// @dev Required for ERC-721 compliance.\n function totalSupply() public view returns (uint) {\n return kitties.length - 1;\n }\n\n /// @notice Returns the address currently assigned ownership of a given Kitty.\n /// @dev Required for ERC-721 compliance.\n function ownerOf(uint256 _tokenId)\n external\n view\n returns (address owner)\n {\n owner = kittyIndexToOwner[_tokenId];\n\n require(owner != address(0));\n }\n\n /// @notice Returns a list of all Kitty IDs assigned to an address.\n /// @param _owner The owner whose Kitties we are interested in.\n /// @dev This method MUST NEVER be called by smart contract code. First, it's fairly\n /// expensive (it walks the entire Kitty array looking for cats belonging to owner),\n /// but it also returns a dynamic array, which is only supported for web3 calls, and\n /// not contract-to-contract calls.\n function tokensOfOwner(address _owner) external view returns(uint256[] ownerTokens) {\n uint256 tokenCount = balanceOf(_owner);\n\n if (tokenCount == 0) {\n // Return an empty array\n return new uint256[](0);\n } else {\n uint256[] memory result = new uint256[](tokenCount);\n uint256 totalCats = totalSupply();\n uint256 resultIndex = 0;\n\n // We count on the fact that all cats have IDs starting at 1 and increasing\n // sequentially up to the totalCat count.\n uint256 catId;\n\n for (catId = 1; catId <= totalCats; catId++) {\n if (kittyIndexToOwner[catId] == _owner) {\n result[resultIndex] = catId;\n resultIndex++;\n }\n }\n\n return result;\n }\n }\n\n /// @dev Adapted from memcpy() by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _memcpy(uint _dest, uint _src, uint _len) private view {\n // Copy word-length chunks while possible\n for(; _len >= 32; _len -= 32) {\n assembly {\n mstore(_dest, mload(_src))\n }\n _dest += 32;\n _src += 32;\n }\n\n // Copy remaining bytes\n uint256 mask = 256 ** (32 - _len) - 1;\n assembly {\n let srcpart := and(mload(_src), not(mask))\n let destpart := and(mload(_dest), mask)\n mstore(_dest, or(destpart, srcpart))\n }\n }\n\n /// @dev Adapted from toString(slice) by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _toString(bytes32[4] _rawBytes, uint256 _stringLength) private view returns (string) {\n var outputString = new string(_stringLength);\n uint256 outputPtr;\n uint256 bytesPtr;\n\n assembly {\n outputPtr := add(outputString, 32)\n bytesPtr := _rawBytes\n }\n\n _memcpy(outputPtr, bytesPtr, _stringLength);\n\n return outputString;\n }\n\n /// @notice Returns a URI pointing to a metadata package for this token conforming to\n /// ERC-721 (https://github.com/ethereum/EIPs/issues/721)\n /// @param _tokenId The ID number of the Kitty whose metadata should be returned.\n function tokenMetadata(uint256 _tokenId, string _preferredTransport) external view returns (string infoUrl) {\n require(erc721Metadata != address(0));\n bytes32[4] memory buffer;\n uint256 count;\n (buffer, count) = erc721Metadata.getMetadata(_tokenId, _preferredTransport);\n\n return _toString(buffer, count);\n }\n}\n\n\n\n/// @title A facet of KittyCore that manages Kitty siring, gestation, and birth.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBreeding is KittyOwnership {\n\n /// @dev The Pregnant event is fired when two cats successfully breed and the pregnancy\n /// timer begins for the matron.\n event Pregnant(address owner, uint256 matronId, uint256 sireId, uint256 cooldownEndBlock);\n\n /// @notice The minimum payment required to use breedWithAuto(). This fee goes towards\n /// the gas cost paid by whatever calls giveBirth(), and can be dynamically updated by\n /// the COO role as the gas price changes.\n uint256 public autoBirthFee = 2 finney;\n\n // Keeps track of number of pregnant kitties.\n uint256 public pregnantKitties;\n\n /// @dev The address of the sibling contract that is used to implement the sooper-sekret\n /// genetic combination algorithm.\n GeneScienceInterface public geneScience;\n\n /// @dev Update the address of the genetic contract, can only be called by the CEO.\n /// @param _address An address of a GeneScience contract instance to be used from this point forward.\n function setGeneScienceAddress(address _address) external onlyCEO {\n GeneScienceInterface candidateContract = GeneScienceInterface(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isGeneScience());\n\n // Set the new contract address\n geneScience = candidateContract;\n }\n\n /// @dev Checks that a given kitten is able to breed. Requires that the\n /// current cooldown is finished (for sires) and also checks that there is\n /// no pending pregnancy.\n function _isReadyToBreed(Kitty _kit) internal view returns (bool) {\n // In addition to checking the cooldownEndBlock, we also need to check to see if\n // the cat has a pending birth; there can be some period of time between the end\n // of the pregnacy timer and the birth event.\n return (_kit.siringWithId == 0) && (_kit.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @dev Check if a sire has authorized breeding with this matron. True if both sire\n /// and matron have the same owner, or if the sire has given siring permission to\n /// the matron's owner (via approveSiring()).\n function _isSiringPermitted(uint256 _sireId, uint256 _matronId) internal view returns (bool) {\n address matronOwner = kittyIndexToOwner[_matronId];\n address sireOwner = kittyIndexToOwner[_sireId];\n\n // Siring is okay if they have same owner, or if the matron's owner was given\n // permission to breed with this sire.\n return (matronOwner == sireOwner || sireAllowedToAddress[_sireId] == matronOwner);\n }\n\n /// @dev Set the cooldownEndTime for the given Kitty, based on its current cooldownIndex.\n /// Also increments the cooldownIndex (unless it has hit the cap).\n /// @param _kitten A reference to the Kitty in storage which needs its timer started.\n function _triggerCooldown(Kitty storage _kitten) internal {\n // Compute an estimation of the cooldown time in blocks (based on current cooldownIndex).\n _kitten.cooldownEndBlock = uint64((cooldowns[_kitten.cooldownIndex]/secondsPerBlock) + block.number);\n\n // Increment the breeding count, clamping it at 13, which is the length of the\n // cooldowns array. We could check the array size dynamically, but hard-coding\n // this as a constant saves gas. Yay, Solidity!\n if (_kitten.cooldownIndex < 13) {\n _kitten.cooldownIndex += 1;\n }\n }\n\n /// @notice Grants approval to another user to sire with one of your Kitties.\n /// @param _addr The address that will be able to sire with your Kitty. Set to\n /// address(0) to clear all siring approvals for this Kitty.\n /// @param _sireId A Kitty that you own that _addr will now be able to sire with.\n function approveSiring(address _addr, uint256 _sireId)\n external\n whenNotPaused\n {\n require(_owns(msg.sender, _sireId));\n sireAllowedToAddress[_sireId] = _addr;\n }\n\n /// @dev Updates the minimum payment required for calling giveBirthAuto(). Can only\n /// be called by the COO address. (This fee is used to offset the gas cost incurred\n /// by the autobirth daemon).\n function setAutoBirthFee(uint256 val) external onlyCOO {\n autoBirthFee = val;\n }\n\n /// @dev Checks to see if a given Kitty is pregnant and (if so) if the gestation\n /// period has passed.\n function _isReadyToGiveBirth(Kitty _matron) private view returns (bool) {\n return (_matron.siringWithId != 0) && (_matron.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @notice Checks that a given kitten is able to breed (i.e. it is not pregnant or\n /// in the middle of a siring cooldown).\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isReadyToBreed(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n Kitty storage kit = kitties[_kittyId];\n return _isReadyToBreed(kit);\n }\n\n /// @dev Checks whether a kitty is currently pregnant.\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isPregnant(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n // A kitty is pregnant if and only if this field is set\n return kitties[_kittyId].siringWithId != 0;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair. DOES NOT\n /// check ownership permissions (that is up to the caller).\n /// @param _matron A reference to the Kitty struct of the potential matron.\n /// @param _matronId The matron's ID.\n /// @param _sire A reference to the Kitty struct of the potential sire.\n /// @param _sireId The sire's ID\n function _isValidMatingPair(\n Kitty storage _matron,\n uint256 _matronId,\n Kitty storage _sire,\n uint256 _sireId\n )\n private\n view\n returns(bool)\n {\n // A Kitty can't breed with itself!\n if (_matronId == _sireId) {\n return false;\n }\n\n // Kitties can't breed with their parents.\n if (_matron.matronId == _sireId || _matron.sireId == _sireId) {\n return false;\n }\n if (_sire.matronId == _matronId || _sire.sireId == _matronId) {\n return false;\n }\n\n // We can short circuit the sibling check (below) if either cat is\n // gen zero (has a matron ID of zero).\n if (_sire.matronId == 0 || _matron.matronId == 0) {\n return true;\n }\n\n // Kitties can't breed with full or half siblings.\n if (_sire.matronId == _matron.matronId || _sire.matronId == _matron.sireId) {\n return false;\n }\n if (_sire.sireId == _matron.matronId || _sire.sireId == _matron.sireId) {\n return false;\n }\n\n // Everything seems cool! Let's get DTF.\n return true;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair for\n /// breeding via auction (i.e. skips ownership and siring approval checks).\n function _canBreedWithViaAuction(uint256 _matronId, uint256 _sireId)\n internal\n view\n returns (bool)\n {\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId);\n }\n\n /// @notice Checks to see if two cats can breed together, including checks for\n /// ownership and siring approvals. Does NOT check that both cats are ready for\n /// breeding (i.e. breedWith could still fail until the cooldowns are finished).\n /// TODO: Shouldn't this check pregnancy and cooldowns?!?\n /// @param _matronId The ID of the proposed matron.\n /// @param _sireId The ID of the proposed sire.\n function canBreedWith(uint256 _matronId, uint256 _sireId)\n external\n view\n returns(bool)\n {\n require(_matronId > 0);\n require(_sireId > 0);\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId) &&\n _isSiringPermitted(_sireId, _matronId);\n }\n\n /// @dev Internal utility function to initiate breeding, assumes that all breeding\n /// requirements have been checked.\n function _breedWith(uint256 _matronId, uint256 _sireId) internal {\n // Grab a reference to the Kitties from storage.\n Kitty storage sire = kitties[_sireId];\n Kitty storage matron = kitties[_matronId];\n\n // Mark the matron as pregnant, keeping track of who the sire is.\n matron.siringWithId = uint32(_sireId);\n\n // Trigger the cooldown for both parents.\n _triggerCooldown(sire);\n _triggerCooldown(matron);\n\n // Clear siring permission for both parents. This may not be strictly necessary\n // but it's likely to avoid confusion!\n delete sireAllowedToAddress[_matronId];\n delete sireAllowedToAddress[_sireId];\n\n // Every time a kitty gets pregnant, counter is incremented.\n pregnantKitties++;\n\n // Emit the pregnancy event.\n Pregnant(kittyIndexToOwner[_matronId], _matronId, _sireId, matron.cooldownEndBlock);\n }\n\n /// @notice Breed a Kitty you own (as matron) with a sire that you own, or for which you\n /// have previously been given Siring approval. Will either make your cat pregnant, or will\n /// fail entirely. Requires a pre-payment of the fee given out to the first caller of giveBirth()\n /// @param _matronId The ID of the Kitty acting as matron (will end up pregnant if successful)\n /// @param _sireId The ID of the Kitty acting as sire (will begin its siring cooldown if successful)\n function breedWithAuto(uint256 _matronId, uint256 _sireId)\n external\n payable\n whenNotPaused\n {\n // Checks for payment.\n require(msg.value >= autoBirthFee);\n\n // Caller must own the matron.\n require(_owns(msg.sender, _matronId));\n\n // Neither sire nor matron are allowed to be on auction during a normal\n // breeding operation, but we don't need to check that explicitly.\n // For matron: The caller of this function can't be the owner of the matron\n // because the owner of a Kitty on auction is the auction house, and the\n // auction house will never call breedWith().\n // For sire: Similarly, a sire on auction will be owned by the auction house\n // and the act of transferring ownership will have cleared any oustanding\n // siring approval.\n // Thus we don't need to spend gas explicitly checking to see if either cat\n // is on auction.\n\n // Check that matron and sire are both owned by caller, or that the sire\n // has given siring permission to caller (i.e. matron's owner).\n // Will fail for _sireId = 0\n require(_isSiringPermitted(_sireId, _matronId));\n\n // Grab a reference to the potential matron\n Kitty storage matron = kitties[_matronId];\n\n // Make sure matron isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(matron));\n\n // Grab a reference to the potential sire\n Kitty storage sire = kitties[_sireId];\n\n // Make sure sire isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(sire));\n\n // Test that these cats are a valid mating pair.\n require(_isValidMatingPair(\n matron,\n _matronId,\n sire,\n _sireId\n ));\n\n // All checks passed, kitty gets pregnant!\n _breedWith(_matronId, _sireId);\n }\n\n /// @notice Have a pregnant Kitty give birth!\n /// @param _matronId A Kitty ready to give birth.\n /// @return The Kitty ID of the new kitten.\n /// @dev Looks at a given Kitty and, if pregnant and if the gestation period has passed,\n /// combines the genes of the two parents to create a new kitten. The new Kitty is assigned\n /// to the current owner of the matron. Upon successful completion, both the matron and the\n /// new kitten will be ready to breed again. Note that anyone can call this function (if they\n /// are willing to pay the gas!), but the new kitten always goes to the mother's owner.\n function giveBirth(uint256 _matronId)\n external\n whenNotPaused\n returns(uint256)\n {\n // Grab a reference to the matron in storage.\n Kitty storage matron = kitties[_matronId];\n\n // Check that the matron is a valid cat.\n require(matron.birthTime != 0);\n\n // Check that the matron is pregnant, and that its time has come!\n require(_isReadyToGiveBirth(matron));\n\n // Grab a reference to the sire in storage.\n uint256 sireId = matron.siringWithId;\n Kitty storage sire = kitties[sireId];\n\n // Determine the higher generation number of the two parents\n uint16 parentGen = matron.generation;\n if (sire.generation > matron.generation) {\n parentGen = sire.generation;\n }\n\n // Call the sooper-sekret gene mixing operation.\n uint256 childGenes = geneScience.mixGenes(matron.genes, sire.genes, matron.cooldownEndBlock - 1);\n\n // Make the new kitten!\n address owner = kittyIndexToOwner[_matronId];\n uint256 kittenId = _createKitty(_matronId, matron.siringWithId, parentGen + 1, childGenes, owner);\n\n // Clear the reference to sire from the matron (REQUIRED! Having siringWithId\n // set is what marks a matron as being pregnant.)\n delete matron.siringWithId;\n\n // Every time a kitty gives birth counter is decremented.\n pregnantKitties--;\n\n // Send the balance fee to the person who made birth happen.\n msg.sender.send(autoBirthFee);\n\n // return the new kitten's ID\n return kittenId;\n }\n}\n\n\n\n\n\n\n\n\n\n\n/// @title Auction Core\n/// @dev Contains models, variables, and internal methods for the auction.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuctionBase {\n\n // Represents an auction on an NFT\n struct Auction {\n // Current owner of NFT\n address seller;\n // Price (in wei) at beginning of auction\n uint128 startingPrice;\n // Price (in wei) at end of auction\n uint128 endingPrice;\n // Duration (in seconds) of auction\n uint64 duration;\n // Time when auction started\n // NOTE: 0 if this auction has been concluded\n uint64 startedAt;\n }\n\n // Reference to contract tracking NFT ownership\n KittiesERC721 public nonFungibleContract;\n\n // Cut owner takes on each auction, measured in basis points (1/100 of a percent).\n // Values 0-10,000 map to 0%-100%\n uint256 public ownerCut;\n\n // Map from token ID to their corresponding auction.\n mapping (uint256 => Auction) tokenIdToAuction;\n\n event AuctionCreated(uint256 tokenId, uint256 startingPrice, uint256 endingPrice, uint256 duration);\n event AuctionSuccessful(uint256 tokenId, uint256 totalPrice, address winner);\n event AuctionCancelled(uint256 tokenId);\n\n /// @dev Returns true if the claimant owns the token.\n /// @param _claimant - Address claiming to own the token.\n /// @param _tokenId - ID of token whose ownership to verify.\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return (nonFungibleContract.ownerOf(_tokenId) == _claimant);\n }\n\n /// @dev Escrows the NFT, assigning ownership to this contract.\n /// Throws if the escrow fails.\n /// @param _owner - Current owner address of token to escrow.\n /// @param _tokenId - ID of token whose approval to verify.\n function _escrow(address _owner, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transferFrom(_owner, this, _tokenId);\n }\n\n /// @dev Transfers an NFT owned by this contract to another address.\n /// Returns true if the transfer succeeds.\n /// @param _receiver - Address to transfer NFT to.\n /// @param _tokenId - ID of token to transfer.\n function _transfer(address _receiver, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transfer(_receiver, _tokenId);\n }\n\n /// @dev Adds an auction to the list of open auctions. Also fires the\n /// AuctionCreated event.\n /// @param _tokenId The ID of the token to be put on auction.\n /// @param _auction Auction to add.\n function _addAuction(uint256 _tokenId, Auction _auction) internal {\n // Require that all auctions have a duration of\n // at least one minute. (Keeps our math from getting hairy!)\n require(_auction.duration >= 1 minutes);\n\n tokenIdToAuction[_tokenId] = _auction;\n\n AuctionCreated(\n uint256(_tokenId),\n uint256(_auction.startingPrice),\n uint256(_auction.endingPrice),\n uint256(_auction.duration)\n );\n }\n\n /// @dev Cancels an auction unconditionally.\n function _cancelAuction(uint256 _tokenId, address _seller) internal {\n _removeAuction(_tokenId);\n _transfer(_seller, _tokenId);\n AuctionCancelled(_tokenId);\n }\n\n /// @dev Computes the price and transfers winnings.\n /// Does NOT transfer ownership of token.\n function _bid(uint256 _tokenId, uint256 _bidAmount)\n internal\n returns (uint256)\n {\n // Get a reference to the auction struct\n Auction storage auction = tokenIdToAuction[_tokenId];\n\n // Explicitly check that this auction is currently live.\n // (Because of how Ethereum mappings work, we can't just count\n // on the lookup above failing. An invalid _tokenId will just\n // return an auction object that is all zeros.)\n require(_isOnAuction(auction));\n\n // Check that the bid is greater than or equal to the current price\n uint256 price = _currentPrice(auction);\n require(_bidAmount >= price);\n\n // Grab a reference to the seller before the auction struct\n // gets deleted.\n address seller = auction.seller;\n\n // The bid is good! Remove the auction before sending the fees\n // to the sender so we can't have a reentrancy attack.\n _removeAuction(_tokenId);\n\n // Transfer proceeds to seller (if there are any!)\n if (price > 0) {\n // Calculate the auctioneer's cut.\n // (NOTE: _computeCut() is guaranteed to return a\n // value <= price, so this subtraction can't go negative.)\n uint256 auctioneerCut = _computeCut(price);\n uint256 sellerProceeds = price - auctioneerCut;\n\n // NOTE: Doing a transfer() in the middle of a complex\n // method like this is generally discouraged because of\n // reentrancy attacks and DoS attacks if the seller is\n // a contract with an invalid fallback function. We explicitly\n // guard against reentrancy attacks by removing the auction\n // before calling transfer(), and the only thing the seller\n // can DoS is the sale of their own asset! (And if it's an\n // accident, they can call cancelAuction(). )\n seller.transfer(sellerProceeds);\n }\n\n // Calculate any excess funds included with the bid. If the excess\n // is anything worth worrying about, transfer it back to bidder.\n // NOTE: We checked above that the bid amount is greater than or\n // equal to the price so this cannot underflow.\n uint256 bidExcess = _bidAmount - price;\n\n // Return the funds. Similar to the previous transfer, this is\n // not susceptible to a re-entry attack because the auction is\n // removed before any transfers occur.\n msg.sender.transfer(bidExcess);\n\n // Tell the world!\n AuctionSuccessful(_tokenId, price, msg.sender);\n\n return price;\n }\n\n /// @dev Removes an auction from the list of open auctions.\n /// @param _tokenId - ID of NFT on auction.\n function _removeAuction(uint256 _tokenId) internal {\n delete tokenIdToAuction[_tokenId];\n }\n\n /// @dev Returns true if the NFT is on auction.\n /// @param _auction - Auction to check.\n function _isOnAuction(Auction storage _auction) internal view returns (bool) {\n return (_auction.startedAt > 0);\n }\n\n /// @dev Returns current price of an NFT on auction. Broken into two\n /// functions (this one, that computes the duration from the auction\n /// structure, and the other that does the price computation) so we\n /// can easily test that the price computation works correctly.\n function _currentPrice(Auction storage _auction)\n internal\n view\n returns (uint256)\n {\n uint256 secondsPassed = 0;\n\n // A bit of insurance against negative values (or wraparound).\n // Probably not necessary (since Ethereum guarnatees that the\n // now variable doesn't ever go backwards).\n if (now > _auction.startedAt) {\n secondsPassed = now - _auction.startedAt;\n }\n\n return _computeCurrentPrice(\n _auction.startingPrice,\n _auction.endingPrice,\n _auction.duration,\n secondsPassed\n );\n }\n\n /// @dev Computes the current price of an auction. Factored out\n /// from _currentPrice so we can run extensive unit tests.\n /// When testing, make this function public and turn on\n /// `Current price computation` test suite.\n function _computeCurrentPrice(\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n uint256 _secondsPassed\n )\n internal\n pure\n returns (uint256)\n {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our public functions carefully cap the maximum values for\n // time (at 64-bits) and currency (at 128-bits). _duration is\n // also known to be non-zero (see the require() statement in\n // _addAuction())\n if (_secondsPassed >= _duration) {\n // We've reached the end of the dynamic pricing portion\n // of the auction, just return the end price.\n return _endingPrice;\n } else {\n // Starting price can be higher than ending price (and often is!), so\n // this delta can be negative.\n int256 totalPriceChange = int256(_endingPrice) - int256(_startingPrice);\n\n // This multiplication can't overflow, _secondsPassed will easily fit within\n // 64-bits, and totalPriceChange will easily fit within 128-bits, their product\n // will always fit within 256-bits.\n int256 currentPriceChange = totalPriceChange * int256(_secondsPassed) / int256(_duration);\n\n // currentPriceChange can be negative, but if so, will have a magnitude\n // less that _startingPrice. Thus, this result will always end up positive.\n int256 currentPrice = int256(_startingPrice) + currentPriceChange;\n\n return uint256(currentPrice);\n }\n }\n\n /// @dev Computes owner's cut of a sale.\n /// @param _price - Sale price of NFT.\n function _computeCut(uint256 _price) internal view returns (uint256) {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our entry functions carefully cap the maximum values for\n // currency (at 128-bits), and ownerCut <= 10000 (see the require()\n // statement in the ClockAuction constructor). The result of this\n // function is always guaranteed to be <= _price.\n return _price * ownerCut / 10000;\n }\n\n}\n\n\n\n\n\n\n\n/**\n * @title KittiesPausable\n * @dev Base contract which allows children to implement an emergency stop mechanism.\n */\ncontract KittiesPausable is KittiesOwnable {\n event Pause();\n event Unpause();\n\n bool public paused = false;\n\n\n /**\n\t * @dev modifier to allow actions only when the contract IS paused\n\t */\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /**\n\t * @dev modifier to allow actions only when the contract IS NOT paused\n\t */\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /**\n\t * @dev called by the owner to pause, triggers stopped state\n\t */\n function pause() onlyOwner whenNotPaused returns (bool) {\n paused = true;\n Pause();\n return true;\n }\n\n /**\n\t * @dev called by the owner to unpause, returns to normal state\n\t */\n function unpause() onlyOwner whenPaused returns (bool) {\n paused = false;\n Unpause();\n return true;\n }\n}\n\n\n/// @title Clock auction for non-fungible tokens.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuction is KittiesPausable, ClockAuctionBase {\n\n /// @dev The ERC-165 interface signature for ERC-721.\n /// Ref: https://github.com/ethereum/EIPs/issues/165\n /// Ref: https://github.com/ethereum/EIPs/issues/721\n bytes4 constant InterfaceSignature_ERC721 = bytes4(0x9a20483d);\n\n /// @dev Constructor creates a reference to the NFT ownership contract\n /// and verifies the owner cut is in the valid range.\n /// @param _nftAddress - address of a deployed contract implementing\n /// the Nonfungible Interface.\n /// @param _cut - percent cut the owner takes on each auction, must be\n /// between 0-10,000.\n function ClockAuction(address _nftAddress, uint256 _cut) public {\n require(_cut <= 10000);\n ownerCut = _cut;\n\n KittiesERC721 candidateContract = KittiesERC721(_nftAddress);\n require(candidateContract.supportsInterface(InterfaceSignature_ERC721));\n nonFungibleContract = candidateContract;\n }\n\n /// @dev Remove all Ether from the contract, which is the owner's cuts\n /// as well as any Ether sent directly to the contract address.\n /// Always transfers to the NFT contract, but can be called either by\n /// the owner or the NFT contract.\n function withdrawBalance() external {\n address nftAddress = address(nonFungibleContract);\n\n require(\n msg.sender == owner ||\n msg.sender == nftAddress\n );\n // We are using this boolean method to make sure that even if one fails it will still work\n bool res = nftAddress.send(this.balance);\n }\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of time to move between starting\n /// price and ending price (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n whenNotPaused\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(_owns(msg.sender, _tokenId));\n _escrow(msg.sender, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Bids on an open auction, completing the auction and transferring\n /// ownership of the NFT if enough Ether is supplied.\n /// @param _tokenId - ID of token to bid on.\n function bid(uint256 _tokenId)\n external\n payable\n whenNotPaused\n {\n // _bid will throw if the bid or funds transfer fails\n _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n }\n\n /// @dev Cancels an auction that hasn't been won yet.\n /// Returns the NFT to original owner.\n /// @notice This is a state-modifying function that can\n /// be called while the contract is paused.\n /// @param _tokenId - ID of token on auction\n function cancelAuction(uint256 _tokenId)\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n address seller = auction.seller;\n require(msg.sender == seller);\n _cancelAuction(_tokenId, seller);\n }\n\n /// @dev Cancels an auction when the contract is paused.\n /// Only the owner may do this, and NFTs are returned to\n /// the seller. This should only be used in emergencies.\n /// @param _tokenId - ID of the NFT on auction to cancel.\n function cancelAuctionWhenPaused(uint256 _tokenId)\n whenPaused\n onlyOwner\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n _cancelAuction(_tokenId, auction.seller);\n }\n\n /// @dev Returns auction info for an NFT on auction.\n /// @param _tokenId - ID of NFT on auction.\n function getAuction(uint256 _tokenId)\n external\n view\n returns\n (\n address seller,\n uint256 startingPrice,\n uint256 endingPrice,\n uint256 duration,\n uint256 startedAt\n ) {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return (\n auction.seller,\n auction.startingPrice,\n auction.endingPrice,\n auction.duration,\n auction.startedAt\n );\n }\n\n /// @dev Returns the current price of an auction.\n /// @param _tokenId - ID of the token price we are checking.\n function getCurrentPrice(uint256 _tokenId)\n external\n view\n returns (uint256)\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return _currentPrice(auction);\n }\n\n}\n\n\n/// @title Reverse auction modified for siring\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SiringClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSiringAuctionAddress() call.\n bool public isSiringClockAuction = true;\n\n // Delegate constructor\n function SiringClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction. Since this function is wrapped,\n /// require sender to be KittyCore contract.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Places a bid for siring. Requires the sender\n /// is the KittyCore contract because all bid methods\n /// should be wrapped. Also returns the kitty to the\n /// seller rather than the winner.\n function bid(uint256 _tokenId)\n external\n payable\n {\n require(msg.sender == address(nonFungibleContract));\n address seller = tokenIdToAuction[_tokenId].seller;\n // _bid checks that token ID is valid and will throw if bid fails\n _bid(_tokenId, msg.value);\n // We transfer the kitty back to the seller, the winner will get\n // the offspring\n _transfer(seller, _tokenId);\n }\n\n}\n\n\n\n\n\n/// @title Clock auction modified for sale of kitties\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SaleClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSaleAuctionAddress() call.\n bool public isSaleClockAuction = true;\n\n // Tracks last 5 sale price of gen0 kitty sales\n uint256 public gen0SaleCount;\n uint256[5] public lastGen0SalePrices;\n\n // Delegate constructor\n function SaleClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Updates lastSalePrice if seller is the nft contract\n /// Otherwise, works the same as default bid method.\n function bid(uint256 _tokenId)\n external\n payable\n {\n // _bid verifies token ID size\n address seller = tokenIdToAuction[_tokenId].seller;\n uint256 price = _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n\n // If not a gen0 auction, exit\n if (seller == address(nonFungibleContract)) {\n // Track gen0 sale prices\n lastGen0SalePrices[gen0SaleCount % 5] = price;\n gen0SaleCount++;\n }\n }\n\n function averageGen0SalePrice() external view returns (uint256) {\n uint256 sum = 0;\n for (uint256 i = 0; i < 5; i++) {\n sum += lastGen0SalePrices[i];\n }\n return sum / 5;\n }\n\n}\n\n\n/// @title Handles creating auctions for sale and siring of kitties.\n/// This wrapper of ReverseAuction exists only so that users can create\n/// auctions with only one transaction.\ncontract KittyAuction is KittyBreeding {\n\n // @notice The auction contract variables are defined in KittyBase to allow\n // us to refer to them in KittyOwnership to prevent accidental transfers.\n // `saleAuction` refers to the auction for gen0 and p2p sale of kitties.\n // `siringAuction` refers to the auction for siring rights of kitties.\n\n /// @dev Sets the reference to the sale auction.\n /// @param _address - Address of sale contract.\n function setSaleAuctionAddress(address _address) external onlyCEO {\n SaleClockAuction candidateContract = SaleClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSaleClockAuction());\n\n // Set the new contract address\n saleAuction = candidateContract;\n }\n\n /// @dev Sets the reference to the siring auction.\n /// @param _address - Address of siring contract.\n function setSiringAuctionAddress(address _address) external onlyCEO {\n SiringClockAuction candidateContract = SiringClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSiringClockAuction());\n\n // Set the new contract address\n siringAuction = candidateContract;\n }\n\n /// @dev Put a kitty up for auction.\n /// Does some ownership trickery to create auctions in one tx.\n function createSaleAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n // Ensure the kitty is not pregnant to prevent the auction\n // contract accidentally receiving ownership of the child.\n // NOTE: the kitty IS allowed to be in a cooldown.\n require(!isPregnant(_kittyId));\n _approve(_kittyId, saleAuction);\n // Sale auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n saleAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Put a kitty up for auction to be sire.\n /// Performs checks to ensure the kitty can be sired, then\n /// delegates to reverse auction.\n function createSiringAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n require(isReadyToBreed(_kittyId));\n _approve(_kittyId, siringAuction);\n // Siring auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n siringAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Completes a siring auction by bidding.\n /// Immediately breeds the winning matron with the sire on auction.\n /// @param _sireId - ID of the sire on auction.\n /// @param _matronId - ID of the matron owned by the bidder.\n function bidOnSiringAuction(\n uint256 _sireId,\n uint256 _matronId\n )\n external\n payable\n whenNotPaused\n {\n // Auction contract checks input sizes\n require(_owns(msg.sender, _matronId));\n require(isReadyToBreed(_matronId));\n require(_canBreedWithViaAuction(_matronId, _sireId));\n\n // Define the current price of the auction.\n uint256 currentPrice = siringAuction.getCurrentPrice(_sireId);\n require(msg.value >= currentPrice + autoBirthFee);\n\n // Siring auction will throw if the bid fails.\n siringAuction.bid.value(msg.value - autoBirthFee)(_sireId);\n _breedWith(uint32(_matronId), uint32(_sireId));\n }\n\n /// @dev Transfers the balance of the sale auction contract\n /// to the KittyCore contract. We use two-step withdrawal to\n /// prevent two transfer calls in the auction bid function.\n function withdrawAuctionBalances() external onlyCLevel {\n saleAuction.withdrawBalance();\n siringAuction.withdrawBalance();\n }\n}\n\n\n/// @title all functions related to creating kittens\ncontract KittyMinting is KittyAuction {\n\n // Limits the number of cats the contract owner can ever create.\n uint256 public constant PROMO_CREATION_LIMIT = 5000;\n uint256 public constant GEN0_CREATION_LIMIT = 45000;\n\n // Constants for gen0 auctions.\n uint256 public constant GEN0_STARTING_PRICE = 10 finney;\n uint256 public constant GEN0_AUCTION_DURATION = 1 days;\n\n // Counts the number of cats the contract owner has created.\n uint256 public promoCreatedCount;\n uint256 public gen0CreatedCount;\n\n /// @dev we can create promo kittens, up to a limit. Only callable by COO\n /// @param _genes the encoded genes of the kitten to be created, any value is accepted\n /// @param _owner the future owner of the created kittens. Default to contract COO\n function createPromoKitty(uint256 _genes, address _owner) external onlyCOO {\n address kittyOwner = _owner;\n if (kittyOwner == address(0)) {\n kittyOwner = cooAddress;\n }\n require(promoCreatedCount < PROMO_CREATION_LIMIT);\n\n promoCreatedCount++;\n _createKitty(0, 0, 0, _genes, kittyOwner);\n }\n\n /// @dev Creates a new gen0 kitty with the given genes and\n /// creates an auction for it.\n function createGen0Auction(uint256 _genes) external onlyCOO {\n require(gen0CreatedCount < GEN0_CREATION_LIMIT);\n\n uint256 kittyId = _createKitty(0, 0, 0, _genes, address(this));\n _approve(kittyId, saleAuction);\n\n saleAuction.createAuction(\n kittyId,\n _computeNextGen0Price(),\n 0,\n GEN0_AUCTION_DURATION,\n address(this)\n );\n\n gen0CreatedCount++;\n }\n\n /// @dev Computes the next gen0 auction starting price, given\n /// the average of the past 5 prices + 50%.\n function _computeNextGen0Price() internal view returns (uint256) {\n uint256 avePrice = saleAuction.averageGen0SalePrice();\n\n // Sanity check to ensure we don't overflow arithmetic\n require(avePrice == uint256(uint128(avePrice)));\n\n uint256 nextPrice = avePrice + (avePrice / 2);\n\n // We never auction for less than starting price\n if (nextPrice < GEN0_STARTING_PRICE) {\n nextPrice = GEN0_STARTING_PRICE;\n }\n\n return nextPrice;\n }\n}\n\n\n/// @title CryptoKitties: Collectible, breedable, and oh-so-adorable cats on the Ethereum blockchain.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev The main CryptoKitties contract, keeps track of kittens so they don't wander around and get lost.\ncontract KittyCore is KittyMinting {\n\n // This is the main CryptoKitties contract. In order to keep our code seperated into logical sections,\n // we've broken it up in two ways. First, we have several seperately-instantiated sibling contracts\n // that handle auctions and our super-top-secret genetic combination algorithm. The auctions are\n // seperate since their logic is somewhat complex and there's always a risk of subtle bugs. By keeping\n // them in their own contracts, we can upgrade them without disrupting the main contract that tracks\n // kitty ownership. The genetic combination algorithm is kept seperate so we can open-source all of\n // the rest of our code without making it _too_ easy for folks to figure out how the genetics work.\n // Don't worry, I'm sure someone will reverse engineer it soon enough!\n //\n // Secondly, we break the core contract into multiple files using inheritence, one for each major\n // facet of functionality of CK. This allows us to keep related code bundled together while still\n // avoiding a single giant file with everything in it. The breakdown is as follows:\n //\n // - KittyBase: This is where we define the most fundamental code shared throughout the core\n // functionality. This includes our main data storage, constants and data types, plus\n // internal functions for managing these items.\n //\n // - KittyAccessControl: This contract manages the various addresses and constraints for operations\n // that can be executed only by specific roles. Namely CEO, CFO and COO.\n //\n // - KittyOwnership: This provides the methods required for basic non-fungible token\n // transactions, following the draft ERC-721 spec (https://github.com/ethereum/EIPs/issues/721).\n //\n // - KittyBreeding: This file contains the methods necessary to breed cats together, including\n // keeping track of siring offers, and relies on an external genetic combination contract.\n //\n // - KittyAuctions: Here we have the public methods for auctioning or bidding on cats or siring\n // services. The actual auction functionality is handled in two sibling contracts (one\n // for sales and one for siring), while auction creation and bidding is mostly mediated\n // through this facet of the core contract.\n //\n // - KittyMinting: This final facet contains the functionality we use for creating new gen0 cats.\n // We can make up to 5000 \"promo\" cats that can be given away (especially important when\n // the community is new), and all others can only be created and then immediately put up\n // for auction via an algorithmically determined starting price. Regardless of how they\n // are created, there is a hard limit of 50k gen0 cats. After that, it's all up to the\n // community to breed, breed, breed!\n\n // Set in case the core contract is broken and an upgrade is required\n address public newContractAddress;\n\n /// @notice Creates the main CryptoKitties smart contract instance.\n function KittyCore() public {\n // Starts paused.\n paused = true;\n\n // the creator of the contract is the initial CEO\n ceoAddress = msg.sender;\n\n // the creator of the contract is also the initial COO\n cooAddress = msg.sender;\n\n // start with the mythical kitten 0 - so we don't have generation-0 parent issues\n _createKitty(0, 0, 0, uint256(-1), address(0));\n }\n\n /// @dev Used to mark the smart contract as upgraded, in case there is a serious\n /// breaking bug. This method does nothing but keep track of the new contract and\n /// emit a message indicating that the new address is set. It's up to clients of this\n /// contract to update to the new contract address in that case. (This contract will\n /// be paused indefinitely if such an upgrade takes place.)\n /// @param _v2Address new address\n function setNewAddress(address _v2Address) external onlyCEO whenPaused {\n // See README.md for updgrade plan\n newContractAddress = _v2Address;\n ContractUpgrade(_v2Address);\n }\n\n /// @notice No tipping!\n /// @dev Reject all Ether from being sent here, unless it's from one of the\n /// two auction contracts. (Hopefully, we can prevent user accidents.)\n function() external payable {\n require(\n msg.sender == address(saleAuction) ||\n msg.sender == address(siringAuction)\n );\n }\n\n /// @notice Returns all the relevant information about a specific kitty.\n /// @param _id The ID of the kitty of interest.\n function getKitty(uint256 _id)\n external\n view\n returns (\n bool isGestating,\n bool isReady,\n uint256 cooldownIndex,\n uint256 nextActionAt,\n uint256 siringWithId,\n uint256 birthTime,\n uint256 matronId,\n uint256 sireId,\n uint256 generation,\n uint256 genes\n ) {\n Kitty storage kit = kitties[_id];\n\n // if this variable is 0 then it's not gestating\n isGestating = (kit.siringWithId != 0);\n isReady = (kit.cooldownEndBlock <= block.number);\n cooldownIndex = uint256(kit.cooldownIndex);\n nextActionAt = uint256(kit.cooldownEndBlock);\n siringWithId = uint256(kit.siringWithId);\n birthTime = uint256(kit.birthTime);\n matronId = uint256(kit.matronId);\n sireId = uint256(kit.sireId);\n generation = uint256(kit.generation);\n genes = kit.genes;\n }\n\n /// @dev Override unpause so it requires all external contract addresses\n /// to be set before contract can be unpaused. Also, we can't have\n /// newContractAddress set either, because then the contract was upgraded.\n /// @notice This is public rather than external so we can call super.unpause\n /// without using an expensive CALL.\n function unpause() public onlyCEO whenPaused {\n require(saleAuction != address(0));\n require(siringAuction != address(0));\n require(geneScience != address(0));\n require(newContractAddress == address(0));\n\n // Actually unpause the contract.\n super.unpause();\n }\n\n // @dev Allows the CFO to capture the balance available to the contract.\n function withdrawBalance() external onlyCFO {\n uint256 balance = this.balance;\n // Subtract all the currently pregnant kittens we have, plus 1 of margin.\n uint256 subtractFees = (pregnantKitties + 1) * autoBirthFee;\n\n if (balance > subtractFees) {\n cfoAddress.send(balance - subtractFees);\n }\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "exportedSymbols": { "ClockAuction": [ 8872 @@ -51670,5 +51670,5 @@ export const KittiesERC721Metadata = }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:47.695Z" + "updatedAt": "2018-10-09T17:45:35.886Z" } \ No newline at end of file diff --git a/artifacts/ts/KittiesOwnable.ts b/artifacts/ts/KittiesOwnable.ts index 401baa93..a7c0fb7a 100644 --- a/artifacts/ts/KittiesOwnable.ts +++ b/artifacts/ts/KittiesOwnable.ts @@ -37,15 +37,15 @@ export const KittiesOwnable = "type": "constructor" } ], - "bytecode": "0x6060604052341561000f57600080fd5b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506102058061005e6000396000f30060606040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680638da5cb5b14610051578063f2fde38b146100a6575b600080fd5b341561005c57600080fd5b6100646100df565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156100b157600080fd5b6100dd600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610104565b005b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561015f57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415156101d657806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b505600a165627a7a72305820b7aaec9b7148933242d27d2fc9438b2318201185fa79b1b64cd154ffac1a99a60029", - "deployedBytecode": "0x60606040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680638da5cb5b14610051578063f2fde38b146100a6575b600080fd5b341561005c57600080fd5b6100646100df565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156100b157600080fd5b6100dd600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610104565b005b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561015f57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415156101d657806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b505600a165627a7a72305820b7aaec9b7148933242d27d2fc9438b2318201185fa79b1b64cd154ffac1a99a60029", + "bytecode": "0x6060604052341561000f57600080fd5b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506102058061005e6000396000f30060606040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680638da5cb5b14610051578063f2fde38b146100a6575b600080fd5b341561005c57600080fd5b6100646100df565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156100b157600080fd5b6100dd600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610104565b005b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561015f57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415156101d657806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b505600a165627a7a723058205364a5ab5f9a71a281afb6f4128bfab57ef25dbb0ddad4bea69f35d10e6dc2d40029", + "deployedBytecode": "0x60606040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680638da5cb5b14610051578063f2fde38b146100a6575b600080fd5b341561005c57600080fd5b6100646100df565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156100b157600080fd5b6100dd600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610104565b005b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561015f57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415156101d657806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b505600a165627a7a723058205364a5ab5f9a71a281afb6f4128bfab57ef25dbb0ddad4bea69f35d10e6dc2d40029", "sourceMap": "592:707:18:-;;;772:61;;;;;;;;816:10;808:5;;:18;;;;;;;;;;;;;;;;;;592:707;;;;;;", "deployedSourceMap": "592:707:18:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;622:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1156:140;;;;;;;;;;;;;;;;;;;;;;;;;;;;622:20;;;;;;;;;;;;;:::o;1156:140::-;969:5;;;;;;;;;;;955:19;;:10;:19;;;947:28;;;;;;;;1245:1;1225:22;;:8;:22;;;;1221:69;;;1271:8;1263:5;;:16;;;;;;;;;;;;;;;;;;1221:69;1156:140;:::o", "source": "pragma solidity 0.4.18;\n\n/**\n The following contract code, titled KittyCore, was written by Cryptokitties and published\n and retrieved from https://etherscan.io/address/0x06012c8cf97bead5deae237070f9587f8e7a266d#code.\n\n It is included in the current project for test purposes, to ensure that our collateralizer can\n handle ERC721 tokens created by the KittyCore contract.\n*/\n\n/**\n * @title KittiesOwnable\n * @dev The KittiesOwnable contract has an owner address, and provides basic authorization control\n * functions, this simplifies the implementation of \"user permissions\".\n */\ncontract KittiesOwnable {\n address public owner;\n\n\n /**\n\t * @dev The KittiesOwnable constructor sets the original `owner` of the contract to the sender\n\t * account.\n\t */\n function KittiesOwnable() {\n owner = msg.sender;\n }\n\n\n /**\n\t * @dev Throws if called by any account other than the owner.\n\t */\n modifier onlyOwner() {\n require(msg.sender == owner);\n _;\n }\n\n\n /**\n\t * @dev Allows the current owner to transfer control of the contract to a newOwner.\n\t * @param newOwner The address to transfer ownership to.\n\t */\n function transferOwnership(address newOwner) onlyOwner {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n\n}\n\n\n\n/// @title Interface for contracts conforming to ERC-721: Non-Fungible Tokens\n/// @author Dieter Shirley (https://github.com/dete)\ncontract KittiesERC721 {\n // Required methods\n function totalSupply() public view returns (uint256 total);\n function balanceOf(address _owner) public view returns (uint256 balance);\n function ownerOf(uint256 _tokenId) external view returns (address owner);\n function approve(address _to, uint256 _tokenId) external;\n function transfer(address _to, uint256 _tokenId) external;\n function transferFrom(address _from, address _to, uint256 _tokenId) external;\n\n // Events\n event Transfer(address from, address to, uint256 tokenId);\n event Approval(address owner, address approved, uint256 tokenId);\n\n // Optional\n // function name() public view returns (string name);\n // function symbol() public view returns (string symbol);\n // function tokensOfOwner(address _owner) external view returns (uint256[] tokenIds);\n // function tokenMetadata(uint256 _tokenId, string _preferredTransport) public view returns (string infoUrl);\n\n // ERC-165 Compatibility (https://github.com/ethereum/EIPs/issues/165)\n function supportsInterface(bytes4 _interfaceID) external view returns (bool);\n}\n\n\n// // Auction wrapper functions\n\n\n// Auction wrapper functions\n\n\n\n\n\n\n\n/// @title SEKRETOOOO\ncontract GeneScienceInterface {\n /// @dev simply a boolean to indicate this is the contract we expect to be\n function isGeneScience() public pure returns (bool);\n\n /// @dev given genes of kitten 1 & 2, return a genetic combination - may have a random factor\n /// @param genes1 genes of mom\n /// @param genes2 genes of sire\n /// @return the genes that are supposed to be passed down the child\n function mixGenes(uint256 genes1, uint256 genes2, uint256 targetBlock) public returns (uint256);\n}\n\n\n\n\n\n\n\n/// @title A facet of KittyCore that manages special access privileges.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyAccessControl {\n // This facet controls access control for CryptoKitties. There are four roles managed here:\n //\n // - The CEO: The CEO can reassign other roles and change the addresses of our dependent smart\n // contracts. It is also the only role that can unpause the smart contract. It is initially\n // set to the address that created the smart contract in the KittyCore constructor.\n //\n // - The CFO: The CFO can withdraw funds from KittyCore and its auction contracts.\n //\n // - The COO: The COO can release gen0 kitties to auction, and mint promo cats.\n //\n // It should be noted that these roles are distinct without overlap in their access abilities, the\n // abilities listed for each role above are exhaustive. In particular, while the CEO can assign any\n // address to any role, the CEO address itself doesn't have the ability to act in those roles. This\n // restriction is intentional so that we aren't tempted to use the CEO address frequently out of\n // convenience. The less we use an address, the less likely it is that we somehow compromise the\n // account.\n\n /// @dev Emited when contract is upgraded - See README.md for updgrade plan\n event ContractUpgrade(address newContract);\n\n // The addresses of the accounts (or contracts) that can execute actions within each roles.\n address public ceoAddress;\n address public cfoAddress;\n address public cooAddress;\n\n // @dev Keeps track whether the contract is paused. When that is true, most actions are blocked\n bool public paused = false;\n\n /// @dev Access modifier for CEO-only functionality\n modifier onlyCEO() {\n require(msg.sender == ceoAddress);\n _;\n }\n\n /// @dev Access modifier for CFO-only functionality\n modifier onlyCFO() {\n require(msg.sender == cfoAddress);\n _;\n }\n\n /// @dev Access modifier for COO-only functionality\n modifier onlyCOO() {\n require(msg.sender == cooAddress);\n _;\n }\n\n modifier onlyCLevel() {\n require(\n msg.sender == cooAddress ||\n msg.sender == ceoAddress ||\n msg.sender == cfoAddress\n );\n _;\n }\n\n /// @dev Assigns a new address to act as the CEO. Only available to the current CEO.\n /// @param _newCEO The address of the new CEO\n function setCEO(address _newCEO) external onlyCEO {\n require(_newCEO != address(0));\n\n ceoAddress = _newCEO;\n }\n\n /// @dev Assigns a new address to act as the CFO. Only available to the current CEO.\n /// @param _newCFO The address of the new CFO\n function setCFO(address _newCFO) external onlyCEO {\n require(_newCFO != address(0));\n\n cfoAddress = _newCFO;\n }\n\n /// @dev Assigns a new address to act as the COO. Only available to the current CEO.\n /// @param _newCOO The address of the new COO\n function setCOO(address _newCOO) external onlyCEO {\n require(_newCOO != address(0));\n\n cooAddress = _newCOO;\n }\n\n /*** KittiesPausable functionality adapted from OpenZeppelin ***/\n\n /// @dev Modifier to allow actions only when the contract IS NOT paused\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /// @dev Modifier to allow actions only when the contract IS paused\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /// @dev Called by any \"C-level\" role to pause the contract. Used only when\n /// a bug or exploit is detected and we need to limit damage.\n function pause() external onlyCLevel whenNotPaused {\n paused = true;\n }\n\n /// @dev Unpauses the smart contract. Can only be called by the CEO, since\n /// one reason we may pause the contract is when CFO or COO accounts are\n /// compromised.\n /// @notice This is public rather than external so it can be called by\n /// derived contracts.\n function unpause() public onlyCEO whenPaused {\n // can't unpause if contract was upgraded\n paused = false;\n }\n}\n\n\n\n\n/// @title Base contract for CryptoKitties. Holds all common structs, events and base variables.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBase is KittyAccessControl {\n /*** EVENTS ***/\n\n /// @dev The Birth event is fired whenever a new kitten comes into existence. This obviously\n /// includes any time a cat is created through the giveBirth method, but it is also called\n /// when a new gen0 cat is created.\n event Birth(address owner, uint256 kittyId, uint256 matronId, uint256 sireId, uint256 genes);\n\n /// @dev Transfer event as defined in current draft of ERC721. Emitted every time a kitten\n /// ownership is assigned, including births.\n event Transfer(address from, address to, uint256 tokenId);\n\n /*** DATA TYPES ***/\n\n /// @dev The main Kitty struct. Every cat in CryptoKitties is represented by a copy\n /// of this structure, so great care was taken to ensure that it fits neatly into\n /// exactly two 256-bit words. Note that the order of the members in this structure\n /// is important because of the byte-packing rules used by Ethereum.\n /// Ref: http://solidity.readthedocs.io/en/develop/miscellaneous.html\n struct Kitty {\n // The Kitty's genetic code is packed into these 256-bits, the format is\n // sooper-sekret! A cat's genes never change.\n uint256 genes;\n\n // The timestamp from the block when this cat came into existence.\n uint64 birthTime;\n\n // The minimum timestamp after which this cat can engage in breeding\n // activities again. This same timestamp is used for the pregnancy\n // timer (for matrons) as well as the siring cooldown.\n uint64 cooldownEndBlock;\n\n // The ID of the parents of this kitty, set to 0 for gen0 cats.\n // Note that using 32-bit unsigned integers limits us to a \"mere\"\n // 4 billion cats. This number might seem small until you realize\n // that Ethereum currently has a limit of about 500 million\n // transactions per year! So, this definitely won't be a problem\n // for several years (even as Ethereum learns to scale).\n uint32 matronId;\n uint32 sireId;\n\n // Set to the ID of the sire cat for matrons that are pregnant,\n // zero otherwise. A non-zero value here is how we know a cat\n // is pregnant. Used to retrieve the genetic material for the new\n // kitten when the birth transpires.\n uint32 siringWithId;\n\n // Set to the index in the cooldown array (see below) that represents\n // the current cooldown duration for this Kitty. This starts at zero\n // for gen0 cats, and is initialized to floor(generation/2) for others.\n // Incremented by one for each successful breeding action, regardless\n // of whether this cat is acting as matron or sire.\n uint16 cooldownIndex;\n\n // The \"generation number\" of this cat. Cats minted by the CK contract\n // for sale are called \"gen0\" and have a generation number of 0. The\n // generation number of all other cats is the larger of the two generation\n // numbers of their parents, plus one.\n // (i.e. max(matron.generation, sire.generation) + 1)\n uint16 generation;\n }\n\n /*** CONSTANTS ***/\n\n /// @dev A lookup table indicating the cooldown duration after any successful\n /// breeding action, called \"pregnancy time\" for matrons and \"siring cooldown\"\n /// for sires. Designed such that the cooldown roughly doubles each time a cat\n /// is bred, encouraging owners not to just keep breeding the same cat over\n /// and over again. Caps out at one week (a cat can breed an unbounded number\n /// of times, and the maximum cooldown is always seven days).\n uint32[14] public cooldowns = [\n uint32(1 minutes),\n uint32(2 minutes),\n uint32(5 minutes),\n uint32(10 minutes),\n uint32(30 minutes),\n uint32(1 hours),\n uint32(2 hours),\n uint32(4 hours),\n uint32(8 hours),\n uint32(16 hours),\n uint32(1 days),\n uint32(2 days),\n uint32(4 days),\n uint32(7 days)\n ];\n\n // An approximation of currently how many seconds are in between blocks.\n uint256 public secondsPerBlock = 15;\n\n /*** STORAGE ***/\n\n /// @dev An array containing the Kitty struct for all Kitties in existence. The ID\n /// of each cat is actually an index into this array. Note that ID 0 is a negacat,\n /// the unKitty, the mythical beast that is the parent of all gen0 cats. A bizarre\n /// creature that is both matron and sire... to itself! Has an invalid genetic code.\n /// In other words, cat ID 0 is invalid... ;-)\n Kitty[] kitties;\n\n /// @dev A mapping from cat IDs to the address that owns them. All cats have\n /// some valid owner address, even gen0 cats are created with a non-zero owner.\n mapping (uint256 => address) public kittyIndexToOwner;\n\n // @dev A mapping from owner address to count of tokens that address owns.\n // Used internally inside balanceOf() to resolve ownership count.\n mapping (address => uint256) ownershipTokenCount;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to call\n /// transferFrom(). Each Kitty can only have one approved address for transfer\n /// at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public kittyIndexToApproved;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to use\n /// this Kitty for siring via breedWith(). Each Kitty can only have one approved\n /// address for siring at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public sireAllowedToAddress;\n\n /// @dev The address of the ClockAuction contract that handles sales of Kitties. This\n /// same contract handles both peer-to-peer sales as well as the gen0 sales which are\n /// initiated every 15 minutes.\n SaleClockAuction public saleAuction;\n\n /// @dev The address of a custom ClockAuction subclassed contract that handles siring\n /// auctions. Needs to be separate from saleAuction because the actions taken on success\n /// after a sales and siring auction are quite different.\n SiringClockAuction public siringAuction;\n\n /// @dev Assigns ownership of a specific Kitty to an address.\n function _transfer(address _from, address _to, uint256 _tokenId) internal {\n // Since the number of kittens is capped to 2^32 we can't overflow this\n ownershipTokenCount[_to]++;\n // transfer ownership\n kittyIndexToOwner[_tokenId] = _to;\n // When creating new kittens _from is 0x0, but we can't account that address.\n if (_from != address(0)) {\n ownershipTokenCount[_from]--;\n // once the kitten is transferred also clear sire allowances\n delete sireAllowedToAddress[_tokenId];\n // clear any previously approved ownership exchange\n delete kittyIndexToApproved[_tokenId];\n }\n // Emit the transfer event.\n Transfer(_from, _to, _tokenId);\n }\n\n /// @dev An internal method that creates a new kitty and stores it. This\n /// method doesn't do any checking and should only be called when the\n /// input data is known to be valid. Will generate both a Birth event\n /// and a Transfer event.\n /// @param _matronId The kitty ID of the matron of this cat (zero for gen0)\n /// @param _sireId The kitty ID of the sire of this cat (zero for gen0)\n /// @param _generation The generation number of this cat, must be computed by caller.\n /// @param _genes The kitty's genetic code.\n /// @param _owner The inital owner of this cat, must be non-zero (except for the unKitty, ID 0)\n function _createKitty(\n uint256 _matronId,\n uint256 _sireId,\n uint256 _generation,\n uint256 _genes,\n address _owner\n )\n internal\n returns (uint)\n {\n // These requires are not strictly necessary, our calling code should make\n // sure that these conditions are never broken. However! _createKitty() is already\n // an expensive call (for storage), and it doesn't hurt to be especially careful\n // to ensure our data structures are always valid.\n require(_matronId == uint256(uint32(_matronId)));\n require(_sireId == uint256(uint32(_sireId)));\n require(_generation == uint256(uint16(_generation)));\n\n // New kitty starts with the same cooldown as parent gen/2\n uint16 cooldownIndex = uint16(_generation / 2);\n if (cooldownIndex > 13) {\n cooldownIndex = 13;\n }\n\n Kitty memory _kitty = Kitty({\n genes: _genes,\n birthTime: uint64(now),\n cooldownEndBlock: 0,\n matronId: uint32(_matronId),\n sireId: uint32(_sireId),\n siringWithId: 0,\n cooldownIndex: cooldownIndex,\n generation: uint16(_generation)\n });\n uint256 newKittenId = kitties.push(_kitty) - 1;\n\n // It's probably never going to happen, 4 billion cats is A LOT, but\n // let's just be 100% sure we never let this happen.\n require(newKittenId == uint256(uint32(newKittenId)));\n\n // emit the birth event\n Birth(\n _owner,\n newKittenId,\n uint256(_kitty.matronId),\n uint256(_kitty.sireId),\n _kitty.genes\n );\n\n // This will assign ownership, and also emit the Transfer event as\n // per ERC721 draft\n _transfer(0, _owner, newKittenId);\n\n return newKittenId;\n }\n\n // Any C-level can fix how many seconds per blocks are currently observed.\n function setSecondsPerBlock(uint256 secs) external onlyCLevel {\n require(secs < cooldowns[0]);\n secondsPerBlock = secs;\n }\n}\n\n\n\n\n\n/// @title The external contract that is responsible for generating metadata for the kitties,\n/// it has one function that will return the data as bytes.\ncontract KittiesERC721Metadata {\n /// @dev Given a token Id, returns a byte array that is supposed to be converted into string.\n function getMetadata(uint256 _tokenId, string) public view returns (bytes32[4] buffer, uint256 count) {\n if (_tokenId == 1) {\n buffer[0] = \"Hello World! :D\";\n count = 15;\n } else if (_tokenId == 2) {\n buffer[0] = \"I would definitely choose a medi\";\n buffer[1] = \"um length string.\";\n count = 49;\n } else if (_tokenId == 3) {\n buffer[0] = \"Lorem ipsum dolor sit amet, mi e\";\n buffer[1] = \"st accumsan dapibus augue lorem,\";\n buffer[2] = \" tristique vestibulum id, libero\";\n buffer[3] = \" suscipit varius sapien aliquam.\";\n count = 128;\n }\n }\n}\n\n\n/// @title The facet of the CryptoKitties core contract that manages ownership, ERC-721 (draft) compliant.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev Ref: https://github.com/ethereum/EIPs/issues/721\n/// See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyOwnership is KittyBase, KittiesERC721 {\n\n /// @notice Name and symbol of the non fungible token, as defined in ERC721.\n string public constant name = \"CryptoKitties\";\n string public constant symbol = \"CK\";\n\n // The contract that will return kitty metadata\n KittiesERC721Metadata public erc721Metadata;\n\n bytes4 constant InterfaceSignature_ERC165 =\n bytes4(keccak256('supportsInterface(bytes4)'));\n\n bytes4 constant InterfaceSignature_ERC721 =\n bytes4(keccak256('name()')) ^\n bytes4(keccak256('symbol()')) ^\n bytes4(keccak256('totalSupply()')) ^\n bytes4(keccak256('balanceOf(address)')) ^\n bytes4(keccak256('ownerOf(uint256)')) ^\n bytes4(keccak256('approve(address,uint256)')) ^\n bytes4(keccak256('transfer(address,uint256)')) ^\n bytes4(keccak256('transferFrom(address,address,uint256)')) ^\n bytes4(keccak256('tokensOfOwner(address)')) ^\n bytes4(keccak256('tokenMetadata(uint256,string)'));\n\n /// @notice Introspection interface as per ERC-165 (https://github.com/ethereum/EIPs/issues/165).\n /// Returns true for any standardized interfaces implemented by this contract. We implement\n /// ERC-165 (obviously!) and ERC-721.\n function supportsInterface(bytes4 _interfaceID) external view returns (bool)\n {\n // DEBUG ONLY\n //require((InterfaceSignature_ERC165 == 0x01ffc9a7) && (InterfaceSignature_ERC721 == 0x9a20483d));\n\n return ((_interfaceID == InterfaceSignature_ERC165) || (_interfaceID == InterfaceSignature_ERC721));\n }\n\n /// @dev Set the address of the sibling contract that tracks metadata.\n /// CEO only.\n function setMetadataAddress(address _contractAddress) public onlyCEO {\n erc721Metadata = KittiesERC721Metadata(_contractAddress);\n }\n\n // Internal utility functions: These functions all assume that their input arguments\n // are valid. We leave it to public methods to sanitize their inputs and follow\n // the required logic.\n\n /// @dev Checks if a given address is the current owner of a particular Kitty.\n /// @param _claimant the address we are validating against.\n /// @param _tokenId kitten id, only valid when > 0\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToOwner[_tokenId] == _claimant;\n }\n\n /// @dev Checks if a given address currently has transferApproval for a particular Kitty.\n /// @param _claimant the address we are confirming kitten is approved for.\n /// @param _tokenId kitten id, only valid when > 0\n function _approvedFor(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToApproved[_tokenId] == _claimant;\n }\n\n /// @dev Marks an address as being approved for transferFrom(), overwriting any previous\n /// approval. Setting _approved to address(0) clears all transfer approval.\n /// NOTE: _approve() does NOT send the Approval event. This is intentional because\n /// _approve() and transferFrom() are used together for putting Kitties on auction, and\n /// there is no value in spamming the log with Approval events in that case.\n function _approve(uint256 _tokenId, address _approved) internal {\n kittyIndexToApproved[_tokenId] = _approved;\n }\n\n /// @notice Returns the number of Kitties owned by a specific address.\n /// @param _owner The owner address to check.\n /// @dev Required for ERC-721 compliance\n function balanceOf(address _owner) public view returns (uint256 count) {\n return ownershipTokenCount[_owner];\n }\n\n /// @notice Transfers a Kitty to another address. If transferring to a smart\n /// contract be VERY CAREFUL to ensure that it is aware of ERC-721 (or\n /// CryptoKitties specifically) or your Kitty may be lost forever. Seriously.\n /// @param _to The address of the recipient, can be a user or contract.\n /// @param _tokenId The ID of the Kitty to transfer.\n /// @dev Required for ERC-721 compliance.\n function transfer(\n address _to,\n uint256 _tokenId\n )\n external\n whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Disallow transfers to the auction contracts to prevent accidental\n // misuse. Auction contracts should only take ownership of kitties\n // through the allow + transferFrom flow.\n require(_to != address(saleAuction));\n require(_to != address(siringAuction));\n\n // You can only send your own cat.\n require(_owns(msg.sender, _tokenId));\n\n // Reassign ownership, clear pending approvals, emit Transfer event.\n _transfer(msg.sender, _to, _tokenId);\n }\n\n /// @notice Grant another address the right to transfer a specific Kitty via\n /// transferFrom(). This is the preferred flow for transfering NFTs to contracts.\n /// @param _to The address to be granted transfer approval. Pass address(0) to\n /// clear all approvals.\n /// @param _tokenId The ID of the Kitty that can be transferred if this call succeeds.\n /// @dev Required for ERC-721 compliance.\n function approve(\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Only an owner can grant transfer approval.\n require(_owns(msg.sender, _tokenId));\n\n // Register the approval (replacing any previous approval).\n _approve(_tokenId, _to);\n\n // Emit approval event.\n Approval(msg.sender, _to, _tokenId);\n }\n\n /// @notice Transfer a Kitty owned by another address, for which the calling address\n /// has previously been granted transfer approval by the owner.\n /// @param _from The address that owns the Kitty to be transfered.\n /// @param _to The address that should take ownership of the Kitty. Can be any address,\n /// including the caller.\n /// @param _tokenId The ID of the Kitty to be transferred.\n /// @dev Required for ERC-721 compliance.\n function transferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Check for approval and valid ownership\n require(_approvedFor(msg.sender, _tokenId));\n require(_owns(_from, _tokenId));\n\n // Reassign ownership (also clears pending approvals and emits Transfer event).\n _transfer(_from, _to, _tokenId);\n }\n\n /// @notice Returns the total number of Kitties currently in existence.\n /// @dev Required for ERC-721 compliance.\n function totalSupply() public view returns (uint) {\n return kitties.length - 1;\n }\n\n /// @notice Returns the address currently assigned ownership of a given Kitty.\n /// @dev Required for ERC-721 compliance.\n function ownerOf(uint256 _tokenId)\n external\n view\n returns (address owner)\n {\n owner = kittyIndexToOwner[_tokenId];\n\n require(owner != address(0));\n }\n\n /// @notice Returns a list of all Kitty IDs assigned to an address.\n /// @param _owner The owner whose Kitties we are interested in.\n /// @dev This method MUST NEVER be called by smart contract code. First, it's fairly\n /// expensive (it walks the entire Kitty array looking for cats belonging to owner),\n /// but it also returns a dynamic array, which is only supported for web3 calls, and\n /// not contract-to-contract calls.\n function tokensOfOwner(address _owner) external view returns(uint256[] ownerTokens) {\n uint256 tokenCount = balanceOf(_owner);\n\n if (tokenCount == 0) {\n // Return an empty array\n return new uint256[](0);\n } else {\n uint256[] memory result = new uint256[](tokenCount);\n uint256 totalCats = totalSupply();\n uint256 resultIndex = 0;\n\n // We count on the fact that all cats have IDs starting at 1 and increasing\n // sequentially up to the totalCat count.\n uint256 catId;\n\n for (catId = 1; catId <= totalCats; catId++) {\n if (kittyIndexToOwner[catId] == _owner) {\n result[resultIndex] = catId;\n resultIndex++;\n }\n }\n\n return result;\n }\n }\n\n /// @dev Adapted from memcpy() by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _memcpy(uint _dest, uint _src, uint _len) private view {\n // Copy word-length chunks while possible\n for(; _len >= 32; _len -= 32) {\n assembly {\n mstore(_dest, mload(_src))\n }\n _dest += 32;\n _src += 32;\n }\n\n // Copy remaining bytes\n uint256 mask = 256 ** (32 - _len) - 1;\n assembly {\n let srcpart := and(mload(_src), not(mask))\n let destpart := and(mload(_dest), mask)\n mstore(_dest, or(destpart, srcpart))\n }\n }\n\n /// @dev Adapted from toString(slice) by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _toString(bytes32[4] _rawBytes, uint256 _stringLength) private view returns (string) {\n var outputString = new string(_stringLength);\n uint256 outputPtr;\n uint256 bytesPtr;\n\n assembly {\n outputPtr := add(outputString, 32)\n bytesPtr := _rawBytes\n }\n\n _memcpy(outputPtr, bytesPtr, _stringLength);\n\n return outputString;\n }\n\n /// @notice Returns a URI pointing to a metadata package for this token conforming to\n /// ERC-721 (https://github.com/ethereum/EIPs/issues/721)\n /// @param _tokenId The ID number of the Kitty whose metadata should be returned.\n function tokenMetadata(uint256 _tokenId, string _preferredTransport) external view returns (string infoUrl) {\n require(erc721Metadata != address(0));\n bytes32[4] memory buffer;\n uint256 count;\n (buffer, count) = erc721Metadata.getMetadata(_tokenId, _preferredTransport);\n\n return _toString(buffer, count);\n }\n}\n\n\n\n/// @title A facet of KittyCore that manages Kitty siring, gestation, and birth.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBreeding is KittyOwnership {\n\n /// @dev The Pregnant event is fired when two cats successfully breed and the pregnancy\n /// timer begins for the matron.\n event Pregnant(address owner, uint256 matronId, uint256 sireId, uint256 cooldownEndBlock);\n\n /// @notice The minimum payment required to use breedWithAuto(). This fee goes towards\n /// the gas cost paid by whatever calls giveBirth(), and can be dynamically updated by\n /// the COO role as the gas price changes.\n uint256 public autoBirthFee = 2 finney;\n\n // Keeps track of number of pregnant kitties.\n uint256 public pregnantKitties;\n\n /// @dev The address of the sibling contract that is used to implement the sooper-sekret\n /// genetic combination algorithm.\n GeneScienceInterface public geneScience;\n\n /// @dev Update the address of the genetic contract, can only be called by the CEO.\n /// @param _address An address of a GeneScience contract instance to be used from this point forward.\n function setGeneScienceAddress(address _address) external onlyCEO {\n GeneScienceInterface candidateContract = GeneScienceInterface(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isGeneScience());\n\n // Set the new contract address\n geneScience = candidateContract;\n }\n\n /// @dev Checks that a given kitten is able to breed. Requires that the\n /// current cooldown is finished (for sires) and also checks that there is\n /// no pending pregnancy.\n function _isReadyToBreed(Kitty _kit) internal view returns (bool) {\n // In addition to checking the cooldownEndBlock, we also need to check to see if\n // the cat has a pending birth; there can be some period of time between the end\n // of the pregnacy timer and the birth event.\n return (_kit.siringWithId == 0) && (_kit.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @dev Check if a sire has authorized breeding with this matron. True if both sire\n /// and matron have the same owner, or if the sire has given siring permission to\n /// the matron's owner (via approveSiring()).\n function _isSiringPermitted(uint256 _sireId, uint256 _matronId) internal view returns (bool) {\n address matronOwner = kittyIndexToOwner[_matronId];\n address sireOwner = kittyIndexToOwner[_sireId];\n\n // Siring is okay if they have same owner, or if the matron's owner was given\n // permission to breed with this sire.\n return (matronOwner == sireOwner || sireAllowedToAddress[_sireId] == matronOwner);\n }\n\n /// @dev Set the cooldownEndTime for the given Kitty, based on its current cooldownIndex.\n /// Also increments the cooldownIndex (unless it has hit the cap).\n /// @param _kitten A reference to the Kitty in storage which needs its timer started.\n function _triggerCooldown(Kitty storage _kitten) internal {\n // Compute an estimation of the cooldown time in blocks (based on current cooldownIndex).\n _kitten.cooldownEndBlock = uint64((cooldowns[_kitten.cooldownIndex]/secondsPerBlock) + block.number);\n\n // Increment the breeding count, clamping it at 13, which is the length of the\n // cooldowns array. We could check the array size dynamically, but hard-coding\n // this as a constant saves gas. Yay, Solidity!\n if (_kitten.cooldownIndex < 13) {\n _kitten.cooldownIndex += 1;\n }\n }\n\n /// @notice Grants approval to another user to sire with one of your Kitties.\n /// @param _addr The address that will be able to sire with your Kitty. Set to\n /// address(0) to clear all siring approvals for this Kitty.\n /// @param _sireId A Kitty that you own that _addr will now be able to sire with.\n function approveSiring(address _addr, uint256 _sireId)\n external\n whenNotPaused\n {\n require(_owns(msg.sender, _sireId));\n sireAllowedToAddress[_sireId] = _addr;\n }\n\n /// @dev Updates the minimum payment required for calling giveBirthAuto(). Can only\n /// be called by the COO address. (This fee is used to offset the gas cost incurred\n /// by the autobirth daemon).\n function setAutoBirthFee(uint256 val) external onlyCOO {\n autoBirthFee = val;\n }\n\n /// @dev Checks to see if a given Kitty is pregnant and (if so) if the gestation\n /// period has passed.\n function _isReadyToGiveBirth(Kitty _matron) private view returns (bool) {\n return (_matron.siringWithId != 0) && (_matron.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @notice Checks that a given kitten is able to breed (i.e. it is not pregnant or\n /// in the middle of a siring cooldown).\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isReadyToBreed(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n Kitty storage kit = kitties[_kittyId];\n return _isReadyToBreed(kit);\n }\n\n /// @dev Checks whether a kitty is currently pregnant.\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isPregnant(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n // A kitty is pregnant if and only if this field is set\n return kitties[_kittyId].siringWithId != 0;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair. DOES NOT\n /// check ownership permissions (that is up to the caller).\n /// @param _matron A reference to the Kitty struct of the potential matron.\n /// @param _matronId The matron's ID.\n /// @param _sire A reference to the Kitty struct of the potential sire.\n /// @param _sireId The sire's ID\n function _isValidMatingPair(\n Kitty storage _matron,\n uint256 _matronId,\n Kitty storage _sire,\n uint256 _sireId\n )\n private\n view\n returns(bool)\n {\n // A Kitty can't breed with itself!\n if (_matronId == _sireId) {\n return false;\n }\n\n // Kitties can't breed with their parents.\n if (_matron.matronId == _sireId || _matron.sireId == _sireId) {\n return false;\n }\n if (_sire.matronId == _matronId || _sire.sireId == _matronId) {\n return false;\n }\n\n // We can short circuit the sibling check (below) if either cat is\n // gen zero (has a matron ID of zero).\n if (_sire.matronId == 0 || _matron.matronId == 0) {\n return true;\n }\n\n // Kitties can't breed with full or half siblings.\n if (_sire.matronId == _matron.matronId || _sire.matronId == _matron.sireId) {\n return false;\n }\n if (_sire.sireId == _matron.matronId || _sire.sireId == _matron.sireId) {\n return false;\n }\n\n // Everything seems cool! Let's get DTF.\n return true;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair for\n /// breeding via auction (i.e. skips ownership and siring approval checks).\n function _canBreedWithViaAuction(uint256 _matronId, uint256 _sireId)\n internal\n view\n returns (bool)\n {\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId);\n }\n\n /// @notice Checks to see if two cats can breed together, including checks for\n /// ownership and siring approvals. Does NOT check that both cats are ready for\n /// breeding (i.e. breedWith could still fail until the cooldowns are finished).\n /// TODO: Shouldn't this check pregnancy and cooldowns?!?\n /// @param _matronId The ID of the proposed matron.\n /// @param _sireId The ID of the proposed sire.\n function canBreedWith(uint256 _matronId, uint256 _sireId)\n external\n view\n returns(bool)\n {\n require(_matronId > 0);\n require(_sireId > 0);\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId) &&\n _isSiringPermitted(_sireId, _matronId);\n }\n\n /// @dev Internal utility function to initiate breeding, assumes that all breeding\n /// requirements have been checked.\n function _breedWith(uint256 _matronId, uint256 _sireId) internal {\n // Grab a reference to the Kitties from storage.\n Kitty storage sire = kitties[_sireId];\n Kitty storage matron = kitties[_matronId];\n\n // Mark the matron as pregnant, keeping track of who the sire is.\n matron.siringWithId = uint32(_sireId);\n\n // Trigger the cooldown for both parents.\n _triggerCooldown(sire);\n _triggerCooldown(matron);\n\n // Clear siring permission for both parents. This may not be strictly necessary\n // but it's likely to avoid confusion!\n delete sireAllowedToAddress[_matronId];\n delete sireAllowedToAddress[_sireId];\n\n // Every time a kitty gets pregnant, counter is incremented.\n pregnantKitties++;\n\n // Emit the pregnancy event.\n Pregnant(kittyIndexToOwner[_matronId], _matronId, _sireId, matron.cooldownEndBlock);\n }\n\n /// @notice Breed a Kitty you own (as matron) with a sire that you own, or for which you\n /// have previously been given Siring approval. Will either make your cat pregnant, or will\n /// fail entirely. Requires a pre-payment of the fee given out to the first caller of giveBirth()\n /// @param _matronId The ID of the Kitty acting as matron (will end up pregnant if successful)\n /// @param _sireId The ID of the Kitty acting as sire (will begin its siring cooldown if successful)\n function breedWithAuto(uint256 _matronId, uint256 _sireId)\n external\n payable\n whenNotPaused\n {\n // Checks for payment.\n require(msg.value >= autoBirthFee);\n\n // Caller must own the matron.\n require(_owns(msg.sender, _matronId));\n\n // Neither sire nor matron are allowed to be on auction during a normal\n // breeding operation, but we don't need to check that explicitly.\n // For matron: The caller of this function can't be the owner of the matron\n // because the owner of a Kitty on auction is the auction house, and the\n // auction house will never call breedWith().\n // For sire: Similarly, a sire on auction will be owned by the auction house\n // and the act of transferring ownership will have cleared any oustanding\n // siring approval.\n // Thus we don't need to spend gas explicitly checking to see if either cat\n // is on auction.\n\n // Check that matron and sire are both owned by caller, or that the sire\n // has given siring permission to caller (i.e. matron's owner).\n // Will fail for _sireId = 0\n require(_isSiringPermitted(_sireId, _matronId));\n\n // Grab a reference to the potential matron\n Kitty storage matron = kitties[_matronId];\n\n // Make sure matron isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(matron));\n\n // Grab a reference to the potential sire\n Kitty storage sire = kitties[_sireId];\n\n // Make sure sire isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(sire));\n\n // Test that these cats are a valid mating pair.\n require(_isValidMatingPair(\n matron,\n _matronId,\n sire,\n _sireId\n ));\n\n // All checks passed, kitty gets pregnant!\n _breedWith(_matronId, _sireId);\n }\n\n /// @notice Have a pregnant Kitty give birth!\n /// @param _matronId A Kitty ready to give birth.\n /// @return The Kitty ID of the new kitten.\n /// @dev Looks at a given Kitty and, if pregnant and if the gestation period has passed,\n /// combines the genes of the two parents to create a new kitten. The new Kitty is assigned\n /// to the current owner of the matron. Upon successful completion, both the matron and the\n /// new kitten will be ready to breed again. Note that anyone can call this function (if they\n /// are willing to pay the gas!), but the new kitten always goes to the mother's owner.\n function giveBirth(uint256 _matronId)\n external\n whenNotPaused\n returns(uint256)\n {\n // Grab a reference to the matron in storage.\n Kitty storage matron = kitties[_matronId];\n\n // Check that the matron is a valid cat.\n require(matron.birthTime != 0);\n\n // Check that the matron is pregnant, and that its time has come!\n require(_isReadyToGiveBirth(matron));\n\n // Grab a reference to the sire in storage.\n uint256 sireId = matron.siringWithId;\n Kitty storage sire = kitties[sireId];\n\n // Determine the higher generation number of the two parents\n uint16 parentGen = matron.generation;\n if (sire.generation > matron.generation) {\n parentGen = sire.generation;\n }\n\n // Call the sooper-sekret gene mixing operation.\n uint256 childGenes = geneScience.mixGenes(matron.genes, sire.genes, matron.cooldownEndBlock - 1);\n\n // Make the new kitten!\n address owner = kittyIndexToOwner[_matronId];\n uint256 kittenId = _createKitty(_matronId, matron.siringWithId, parentGen + 1, childGenes, owner);\n\n // Clear the reference to sire from the matron (REQUIRED! Having siringWithId\n // set is what marks a matron as being pregnant.)\n delete matron.siringWithId;\n\n // Every time a kitty gives birth counter is decremented.\n pregnantKitties--;\n\n // Send the balance fee to the person who made birth happen.\n msg.sender.send(autoBirthFee);\n\n // return the new kitten's ID\n return kittenId;\n }\n}\n\n\n\n\n\n\n\n\n\n\n/// @title Auction Core\n/// @dev Contains models, variables, and internal methods for the auction.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuctionBase {\n\n // Represents an auction on an NFT\n struct Auction {\n // Current owner of NFT\n address seller;\n // Price (in wei) at beginning of auction\n uint128 startingPrice;\n // Price (in wei) at end of auction\n uint128 endingPrice;\n // Duration (in seconds) of auction\n uint64 duration;\n // Time when auction started\n // NOTE: 0 if this auction has been concluded\n uint64 startedAt;\n }\n\n // Reference to contract tracking NFT ownership\n KittiesERC721 public nonFungibleContract;\n\n // Cut owner takes on each auction, measured in basis points (1/100 of a percent).\n // Values 0-10,000 map to 0%-100%\n uint256 public ownerCut;\n\n // Map from token ID to their corresponding auction.\n mapping (uint256 => Auction) tokenIdToAuction;\n\n event AuctionCreated(uint256 tokenId, uint256 startingPrice, uint256 endingPrice, uint256 duration);\n event AuctionSuccessful(uint256 tokenId, uint256 totalPrice, address winner);\n event AuctionCancelled(uint256 tokenId);\n\n /// @dev Returns true if the claimant owns the token.\n /// @param _claimant - Address claiming to own the token.\n /// @param _tokenId - ID of token whose ownership to verify.\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return (nonFungibleContract.ownerOf(_tokenId) == _claimant);\n }\n\n /// @dev Escrows the NFT, assigning ownership to this contract.\n /// Throws if the escrow fails.\n /// @param _owner - Current owner address of token to escrow.\n /// @param _tokenId - ID of token whose approval to verify.\n function _escrow(address _owner, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transferFrom(_owner, this, _tokenId);\n }\n\n /// @dev Transfers an NFT owned by this contract to another address.\n /// Returns true if the transfer succeeds.\n /// @param _receiver - Address to transfer NFT to.\n /// @param _tokenId - ID of token to transfer.\n function _transfer(address _receiver, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transfer(_receiver, _tokenId);\n }\n\n /// @dev Adds an auction to the list of open auctions. Also fires the\n /// AuctionCreated event.\n /// @param _tokenId The ID of the token to be put on auction.\n /// @param _auction Auction to add.\n function _addAuction(uint256 _tokenId, Auction _auction) internal {\n // Require that all auctions have a duration of\n // at least one minute. (Keeps our math from getting hairy!)\n require(_auction.duration >= 1 minutes);\n\n tokenIdToAuction[_tokenId] = _auction;\n\n AuctionCreated(\n uint256(_tokenId),\n uint256(_auction.startingPrice),\n uint256(_auction.endingPrice),\n uint256(_auction.duration)\n );\n }\n\n /// @dev Cancels an auction unconditionally.\n function _cancelAuction(uint256 _tokenId, address _seller) internal {\n _removeAuction(_tokenId);\n _transfer(_seller, _tokenId);\n AuctionCancelled(_tokenId);\n }\n\n /// @dev Computes the price and transfers winnings.\n /// Does NOT transfer ownership of token.\n function _bid(uint256 _tokenId, uint256 _bidAmount)\n internal\n returns (uint256)\n {\n // Get a reference to the auction struct\n Auction storage auction = tokenIdToAuction[_tokenId];\n\n // Explicitly check that this auction is currently live.\n // (Because of how Ethereum mappings work, we can't just count\n // on the lookup above failing. An invalid _tokenId will just\n // return an auction object that is all zeros.)\n require(_isOnAuction(auction));\n\n // Check that the bid is greater than or equal to the current price\n uint256 price = _currentPrice(auction);\n require(_bidAmount >= price);\n\n // Grab a reference to the seller before the auction struct\n // gets deleted.\n address seller = auction.seller;\n\n // The bid is good! Remove the auction before sending the fees\n // to the sender so we can't have a reentrancy attack.\n _removeAuction(_tokenId);\n\n // Transfer proceeds to seller (if there are any!)\n if (price > 0) {\n // Calculate the auctioneer's cut.\n // (NOTE: _computeCut() is guaranteed to return a\n // value <= price, so this subtraction can't go negative.)\n uint256 auctioneerCut = _computeCut(price);\n uint256 sellerProceeds = price - auctioneerCut;\n\n // NOTE: Doing a transfer() in the middle of a complex\n // method like this is generally discouraged because of\n // reentrancy attacks and DoS attacks if the seller is\n // a contract with an invalid fallback function. We explicitly\n // guard against reentrancy attacks by removing the auction\n // before calling transfer(), and the only thing the seller\n // can DoS is the sale of their own asset! (And if it's an\n // accident, they can call cancelAuction(). )\n seller.transfer(sellerProceeds);\n }\n\n // Calculate any excess funds included with the bid. If the excess\n // is anything worth worrying about, transfer it back to bidder.\n // NOTE: We checked above that the bid amount is greater than or\n // equal to the price so this cannot underflow.\n uint256 bidExcess = _bidAmount - price;\n\n // Return the funds. Similar to the previous transfer, this is\n // not susceptible to a re-entry attack because the auction is\n // removed before any transfers occur.\n msg.sender.transfer(bidExcess);\n\n // Tell the world!\n AuctionSuccessful(_tokenId, price, msg.sender);\n\n return price;\n }\n\n /// @dev Removes an auction from the list of open auctions.\n /// @param _tokenId - ID of NFT on auction.\n function _removeAuction(uint256 _tokenId) internal {\n delete tokenIdToAuction[_tokenId];\n }\n\n /// @dev Returns true if the NFT is on auction.\n /// @param _auction - Auction to check.\n function _isOnAuction(Auction storage _auction) internal view returns (bool) {\n return (_auction.startedAt > 0);\n }\n\n /// @dev Returns current price of an NFT on auction. Broken into two\n /// functions (this one, that computes the duration from the auction\n /// structure, and the other that does the price computation) so we\n /// can easily test that the price computation works correctly.\n function _currentPrice(Auction storage _auction)\n internal\n view\n returns (uint256)\n {\n uint256 secondsPassed = 0;\n\n // A bit of insurance against negative values (or wraparound).\n // Probably not necessary (since Ethereum guarnatees that the\n // now variable doesn't ever go backwards).\n if (now > _auction.startedAt) {\n secondsPassed = now - _auction.startedAt;\n }\n\n return _computeCurrentPrice(\n _auction.startingPrice,\n _auction.endingPrice,\n _auction.duration,\n secondsPassed\n );\n }\n\n /// @dev Computes the current price of an auction. Factored out\n /// from _currentPrice so we can run extensive unit tests.\n /// When testing, make this function public and turn on\n /// `Current price computation` test suite.\n function _computeCurrentPrice(\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n uint256 _secondsPassed\n )\n internal\n pure\n returns (uint256)\n {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our public functions carefully cap the maximum values for\n // time (at 64-bits) and currency (at 128-bits). _duration is\n // also known to be non-zero (see the require() statement in\n // _addAuction())\n if (_secondsPassed >= _duration) {\n // We've reached the end of the dynamic pricing portion\n // of the auction, just return the end price.\n return _endingPrice;\n } else {\n // Starting price can be higher than ending price (and often is!), so\n // this delta can be negative.\n int256 totalPriceChange = int256(_endingPrice) - int256(_startingPrice);\n\n // This multiplication can't overflow, _secondsPassed will easily fit within\n // 64-bits, and totalPriceChange will easily fit within 128-bits, their product\n // will always fit within 256-bits.\n int256 currentPriceChange = totalPriceChange * int256(_secondsPassed) / int256(_duration);\n\n // currentPriceChange can be negative, but if so, will have a magnitude\n // less that _startingPrice. Thus, this result will always end up positive.\n int256 currentPrice = int256(_startingPrice) + currentPriceChange;\n\n return uint256(currentPrice);\n }\n }\n\n /// @dev Computes owner's cut of a sale.\n /// @param _price - Sale price of NFT.\n function _computeCut(uint256 _price) internal view returns (uint256) {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our entry functions carefully cap the maximum values for\n // currency (at 128-bits), and ownerCut <= 10000 (see the require()\n // statement in the ClockAuction constructor). The result of this\n // function is always guaranteed to be <= _price.\n return _price * ownerCut / 10000;\n }\n\n}\n\n\n\n\n\n\n\n/**\n * @title KittiesPausable\n * @dev Base contract which allows children to implement an emergency stop mechanism.\n */\ncontract KittiesPausable is KittiesOwnable {\n event Pause();\n event Unpause();\n\n bool public paused = false;\n\n\n /**\n\t * @dev modifier to allow actions only when the contract IS paused\n\t */\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /**\n\t * @dev modifier to allow actions only when the contract IS NOT paused\n\t */\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /**\n\t * @dev called by the owner to pause, triggers stopped state\n\t */\n function pause() onlyOwner whenNotPaused returns (bool) {\n paused = true;\n Pause();\n return true;\n }\n\n /**\n\t * @dev called by the owner to unpause, returns to normal state\n\t */\n function unpause() onlyOwner whenPaused returns (bool) {\n paused = false;\n Unpause();\n return true;\n }\n}\n\n\n/// @title Clock auction for non-fungible tokens.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuction is KittiesPausable, ClockAuctionBase {\n\n /// @dev The ERC-165 interface signature for ERC-721.\n /// Ref: https://github.com/ethereum/EIPs/issues/165\n /// Ref: https://github.com/ethereum/EIPs/issues/721\n bytes4 constant InterfaceSignature_ERC721 = bytes4(0x9a20483d);\n\n /// @dev Constructor creates a reference to the NFT ownership contract\n /// and verifies the owner cut is in the valid range.\n /// @param _nftAddress - address of a deployed contract implementing\n /// the Nonfungible Interface.\n /// @param _cut - percent cut the owner takes on each auction, must be\n /// between 0-10,000.\n function ClockAuction(address _nftAddress, uint256 _cut) public {\n require(_cut <= 10000);\n ownerCut = _cut;\n\n KittiesERC721 candidateContract = KittiesERC721(_nftAddress);\n require(candidateContract.supportsInterface(InterfaceSignature_ERC721));\n nonFungibleContract = candidateContract;\n }\n\n /// @dev Remove all Ether from the contract, which is the owner's cuts\n /// as well as any Ether sent directly to the contract address.\n /// Always transfers to the NFT contract, but can be called either by\n /// the owner or the NFT contract.\n function withdrawBalance() external {\n address nftAddress = address(nonFungibleContract);\n\n require(\n msg.sender == owner ||\n msg.sender == nftAddress\n );\n // We are using this boolean method to make sure that even if one fails it will still work\n bool res = nftAddress.send(this.balance);\n }\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of time to move between starting\n /// price and ending price (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n whenNotPaused\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(_owns(msg.sender, _tokenId));\n _escrow(msg.sender, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Bids on an open auction, completing the auction and transferring\n /// ownership of the NFT if enough Ether is supplied.\n /// @param _tokenId - ID of token to bid on.\n function bid(uint256 _tokenId)\n external\n payable\n whenNotPaused\n {\n // _bid will throw if the bid or funds transfer fails\n _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n }\n\n /// @dev Cancels an auction that hasn't been won yet.\n /// Returns the NFT to original owner.\n /// @notice This is a state-modifying function that can\n /// be called while the contract is paused.\n /// @param _tokenId - ID of token on auction\n function cancelAuction(uint256 _tokenId)\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n address seller = auction.seller;\n require(msg.sender == seller);\n _cancelAuction(_tokenId, seller);\n }\n\n /// @dev Cancels an auction when the contract is paused.\n /// Only the owner may do this, and NFTs are returned to\n /// the seller. This should only be used in emergencies.\n /// @param _tokenId - ID of the NFT on auction to cancel.\n function cancelAuctionWhenPaused(uint256 _tokenId)\n whenPaused\n onlyOwner\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n _cancelAuction(_tokenId, auction.seller);\n }\n\n /// @dev Returns auction info for an NFT on auction.\n /// @param _tokenId - ID of NFT on auction.\n function getAuction(uint256 _tokenId)\n external\n view\n returns\n (\n address seller,\n uint256 startingPrice,\n uint256 endingPrice,\n uint256 duration,\n uint256 startedAt\n ) {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return (\n auction.seller,\n auction.startingPrice,\n auction.endingPrice,\n auction.duration,\n auction.startedAt\n );\n }\n\n /// @dev Returns the current price of an auction.\n /// @param _tokenId - ID of the token price we are checking.\n function getCurrentPrice(uint256 _tokenId)\n external\n view\n returns (uint256)\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return _currentPrice(auction);\n }\n\n}\n\n\n/// @title Reverse auction modified for siring\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SiringClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSiringAuctionAddress() call.\n bool public isSiringClockAuction = true;\n\n // Delegate constructor\n function SiringClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction. Since this function is wrapped,\n /// require sender to be KittyCore contract.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Places a bid for siring. Requires the sender\n /// is the KittyCore contract because all bid methods\n /// should be wrapped. Also returns the kitty to the\n /// seller rather than the winner.\n function bid(uint256 _tokenId)\n external\n payable\n {\n require(msg.sender == address(nonFungibleContract));\n address seller = tokenIdToAuction[_tokenId].seller;\n // _bid checks that token ID is valid and will throw if bid fails\n _bid(_tokenId, msg.value);\n // We transfer the kitty back to the seller, the winner will get\n // the offspring\n _transfer(seller, _tokenId);\n }\n\n}\n\n\n\n\n\n/// @title Clock auction modified for sale of kitties\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SaleClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSaleAuctionAddress() call.\n bool public isSaleClockAuction = true;\n\n // Tracks last 5 sale price of gen0 kitty sales\n uint256 public gen0SaleCount;\n uint256[5] public lastGen0SalePrices;\n\n // Delegate constructor\n function SaleClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Updates lastSalePrice if seller is the nft contract\n /// Otherwise, works the same as default bid method.\n function bid(uint256 _tokenId)\n external\n payable\n {\n // _bid verifies token ID size\n address seller = tokenIdToAuction[_tokenId].seller;\n uint256 price = _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n\n // If not a gen0 auction, exit\n if (seller == address(nonFungibleContract)) {\n // Track gen0 sale prices\n lastGen0SalePrices[gen0SaleCount % 5] = price;\n gen0SaleCount++;\n }\n }\n\n function averageGen0SalePrice() external view returns (uint256) {\n uint256 sum = 0;\n for (uint256 i = 0; i < 5; i++) {\n sum += lastGen0SalePrices[i];\n }\n return sum / 5;\n }\n\n}\n\n\n/// @title Handles creating auctions for sale and siring of kitties.\n/// This wrapper of ReverseAuction exists only so that users can create\n/// auctions with only one transaction.\ncontract KittyAuction is KittyBreeding {\n\n // @notice The auction contract variables are defined in KittyBase to allow\n // us to refer to them in KittyOwnership to prevent accidental transfers.\n // `saleAuction` refers to the auction for gen0 and p2p sale of kitties.\n // `siringAuction` refers to the auction for siring rights of kitties.\n\n /// @dev Sets the reference to the sale auction.\n /// @param _address - Address of sale contract.\n function setSaleAuctionAddress(address _address) external onlyCEO {\n SaleClockAuction candidateContract = SaleClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSaleClockAuction());\n\n // Set the new contract address\n saleAuction = candidateContract;\n }\n\n /// @dev Sets the reference to the siring auction.\n /// @param _address - Address of siring contract.\n function setSiringAuctionAddress(address _address) external onlyCEO {\n SiringClockAuction candidateContract = SiringClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSiringClockAuction());\n\n // Set the new contract address\n siringAuction = candidateContract;\n }\n\n /// @dev Put a kitty up for auction.\n /// Does some ownership trickery to create auctions in one tx.\n function createSaleAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n // Ensure the kitty is not pregnant to prevent the auction\n // contract accidentally receiving ownership of the child.\n // NOTE: the kitty IS allowed to be in a cooldown.\n require(!isPregnant(_kittyId));\n _approve(_kittyId, saleAuction);\n // Sale auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n saleAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Put a kitty up for auction to be sire.\n /// Performs checks to ensure the kitty can be sired, then\n /// delegates to reverse auction.\n function createSiringAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n require(isReadyToBreed(_kittyId));\n _approve(_kittyId, siringAuction);\n // Siring auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n siringAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Completes a siring auction by bidding.\n /// Immediately breeds the winning matron with the sire on auction.\n /// @param _sireId - ID of the sire on auction.\n /// @param _matronId - ID of the matron owned by the bidder.\n function bidOnSiringAuction(\n uint256 _sireId,\n uint256 _matronId\n )\n external\n payable\n whenNotPaused\n {\n // Auction contract checks input sizes\n require(_owns(msg.sender, _matronId));\n require(isReadyToBreed(_matronId));\n require(_canBreedWithViaAuction(_matronId, _sireId));\n\n // Define the current price of the auction.\n uint256 currentPrice = siringAuction.getCurrentPrice(_sireId);\n require(msg.value >= currentPrice + autoBirthFee);\n\n // Siring auction will throw if the bid fails.\n siringAuction.bid.value(msg.value - autoBirthFee)(_sireId);\n _breedWith(uint32(_matronId), uint32(_sireId));\n }\n\n /// @dev Transfers the balance of the sale auction contract\n /// to the KittyCore contract. We use two-step withdrawal to\n /// prevent two transfer calls in the auction bid function.\n function withdrawAuctionBalances() external onlyCLevel {\n saleAuction.withdrawBalance();\n siringAuction.withdrawBalance();\n }\n}\n\n\n/// @title all functions related to creating kittens\ncontract KittyMinting is KittyAuction {\n\n // Limits the number of cats the contract owner can ever create.\n uint256 public constant PROMO_CREATION_LIMIT = 5000;\n uint256 public constant GEN0_CREATION_LIMIT = 45000;\n\n // Constants for gen0 auctions.\n uint256 public constant GEN0_STARTING_PRICE = 10 finney;\n uint256 public constant GEN0_AUCTION_DURATION = 1 days;\n\n // Counts the number of cats the contract owner has created.\n uint256 public promoCreatedCount;\n uint256 public gen0CreatedCount;\n\n /// @dev we can create promo kittens, up to a limit. Only callable by COO\n /// @param _genes the encoded genes of the kitten to be created, any value is accepted\n /// @param _owner the future owner of the created kittens. Default to contract COO\n function createPromoKitty(uint256 _genes, address _owner) external onlyCOO {\n address kittyOwner = _owner;\n if (kittyOwner == address(0)) {\n kittyOwner = cooAddress;\n }\n require(promoCreatedCount < PROMO_CREATION_LIMIT);\n\n promoCreatedCount++;\n _createKitty(0, 0, 0, _genes, kittyOwner);\n }\n\n /// @dev Creates a new gen0 kitty with the given genes and\n /// creates an auction for it.\n function createGen0Auction(uint256 _genes) external onlyCOO {\n require(gen0CreatedCount < GEN0_CREATION_LIMIT);\n\n uint256 kittyId = _createKitty(0, 0, 0, _genes, address(this));\n _approve(kittyId, saleAuction);\n\n saleAuction.createAuction(\n kittyId,\n _computeNextGen0Price(),\n 0,\n GEN0_AUCTION_DURATION,\n address(this)\n );\n\n gen0CreatedCount++;\n }\n\n /// @dev Computes the next gen0 auction starting price, given\n /// the average of the past 5 prices + 50%.\n function _computeNextGen0Price() internal view returns (uint256) {\n uint256 avePrice = saleAuction.averageGen0SalePrice();\n\n // Sanity check to ensure we don't overflow arithmetic\n require(avePrice == uint256(uint128(avePrice)));\n\n uint256 nextPrice = avePrice + (avePrice / 2);\n\n // We never auction for less than starting price\n if (nextPrice < GEN0_STARTING_PRICE) {\n nextPrice = GEN0_STARTING_PRICE;\n }\n\n return nextPrice;\n }\n}\n\n\n/// @title CryptoKitties: Collectible, breedable, and oh-so-adorable cats on the Ethereum blockchain.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev The main CryptoKitties contract, keeps track of kittens so they don't wander around and get lost.\ncontract KittyCore is KittyMinting {\n\n // This is the main CryptoKitties contract. In order to keep our code seperated into logical sections,\n // we've broken it up in two ways. First, we have several seperately-instantiated sibling contracts\n // that handle auctions and our super-top-secret genetic combination algorithm. The auctions are\n // seperate since their logic is somewhat complex and there's always a risk of subtle bugs. By keeping\n // them in their own contracts, we can upgrade them without disrupting the main contract that tracks\n // kitty ownership. The genetic combination algorithm is kept seperate so we can open-source all of\n // the rest of our code without making it _too_ easy for folks to figure out how the genetics work.\n // Don't worry, I'm sure someone will reverse engineer it soon enough!\n //\n // Secondly, we break the core contract into multiple files using inheritence, one for each major\n // facet of functionality of CK. This allows us to keep related code bundled together while still\n // avoiding a single giant file with everything in it. The breakdown is as follows:\n //\n // - KittyBase: This is where we define the most fundamental code shared throughout the core\n // functionality. This includes our main data storage, constants and data types, plus\n // internal functions for managing these items.\n //\n // - KittyAccessControl: This contract manages the various addresses and constraints for operations\n // that can be executed only by specific roles. Namely CEO, CFO and COO.\n //\n // - KittyOwnership: This provides the methods required for basic non-fungible token\n // transactions, following the draft ERC-721 spec (https://github.com/ethereum/EIPs/issues/721).\n //\n // - KittyBreeding: This file contains the methods necessary to breed cats together, including\n // keeping track of siring offers, and relies on an external genetic combination contract.\n //\n // - KittyAuctions: Here we have the public methods for auctioning or bidding on cats or siring\n // services. The actual auction functionality is handled in two sibling contracts (one\n // for sales and one for siring), while auction creation and bidding is mostly mediated\n // through this facet of the core contract.\n //\n // - KittyMinting: This final facet contains the functionality we use for creating new gen0 cats.\n // We can make up to 5000 \"promo\" cats that can be given away (especially important when\n // the community is new), and all others can only be created and then immediately put up\n // for auction via an algorithmically determined starting price. Regardless of how they\n // are created, there is a hard limit of 50k gen0 cats. After that, it's all up to the\n // community to breed, breed, breed!\n\n // Set in case the core contract is broken and an upgrade is required\n address public newContractAddress;\n\n /// @notice Creates the main CryptoKitties smart contract instance.\n function KittyCore() public {\n // Starts paused.\n paused = true;\n\n // the creator of the contract is the initial CEO\n ceoAddress = msg.sender;\n\n // the creator of the contract is also the initial COO\n cooAddress = msg.sender;\n\n // start with the mythical kitten 0 - so we don't have generation-0 parent issues\n _createKitty(0, 0, 0, uint256(-1), address(0));\n }\n\n /// @dev Used to mark the smart contract as upgraded, in case there is a serious\n /// breaking bug. This method does nothing but keep track of the new contract and\n /// emit a message indicating that the new address is set. It's up to clients of this\n /// contract to update to the new contract address in that case. (This contract will\n /// be paused indefinitely if such an upgrade takes place.)\n /// @param _v2Address new address\n function setNewAddress(address _v2Address) external onlyCEO whenPaused {\n // See README.md for updgrade plan\n newContractAddress = _v2Address;\n ContractUpgrade(_v2Address);\n }\n\n /// @notice No tipping!\n /// @dev Reject all Ether from being sent here, unless it's from one of the\n /// two auction contracts. (Hopefully, we can prevent user accidents.)\n function() external payable {\n require(\n msg.sender == address(saleAuction) ||\n msg.sender == address(siringAuction)\n );\n }\n\n /// @notice Returns all the relevant information about a specific kitty.\n /// @param _id The ID of the kitty of interest.\n function getKitty(uint256 _id)\n external\n view\n returns (\n bool isGestating,\n bool isReady,\n uint256 cooldownIndex,\n uint256 nextActionAt,\n uint256 siringWithId,\n uint256 birthTime,\n uint256 matronId,\n uint256 sireId,\n uint256 generation,\n uint256 genes\n ) {\n Kitty storage kit = kitties[_id];\n\n // if this variable is 0 then it's not gestating\n isGestating = (kit.siringWithId != 0);\n isReady = (kit.cooldownEndBlock <= block.number);\n cooldownIndex = uint256(kit.cooldownIndex);\n nextActionAt = uint256(kit.cooldownEndBlock);\n siringWithId = uint256(kit.siringWithId);\n birthTime = uint256(kit.birthTime);\n matronId = uint256(kit.matronId);\n sireId = uint256(kit.sireId);\n generation = uint256(kit.generation);\n genes = kit.genes;\n }\n\n /// @dev Override unpause so it requires all external contract addresses\n /// to be set before contract can be unpaused. Also, we can't have\n /// newContractAddress set either, because then the contract was upgraded.\n /// @notice This is public rather than external so we can call super.unpause\n /// without using an expensive CALL.\n function unpause() public onlyCEO whenPaused {\n require(saleAuction != address(0));\n require(siringAuction != address(0));\n require(geneScience != address(0));\n require(newContractAddress == address(0));\n\n // Actually unpause the contract.\n super.unpause();\n }\n\n // @dev Allows the CFO to capture the balance available to the contract.\n function withdrawBalance() external onlyCFO {\n uint256 balance = this.balance;\n // Subtract all the currently pregnant kittens we have, plus 1 of margin.\n uint256 subtractFees = (pregnantKitties + 1) * autoBirthFee;\n\n if (balance > subtractFees) {\n cfoAddress.send(balance - subtractFees);\n }\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "exportedSymbols": { "ClockAuction": [ 8872 @@ -51677,5 +51677,5 @@ export const KittiesOwnable = }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:47.713Z" + "updatedAt": "2018-10-09T17:45:35.914Z" } \ No newline at end of file diff --git a/artifacts/ts/KittiesPausable.ts b/artifacts/ts/KittiesPausable.ts index 345ecff6..5da32ebf 100644 --- a/artifacts/ts/KittiesPausable.ts +++ b/artifacts/ts/KittiesPausable.ts @@ -85,15 +85,15 @@ export const KittiesPausable = "type": "event" } ], - "bytecode": "0x606060405260008060146101000a81548160ff021916908315150217905550336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061044c8061006d6000396000f30060606040526004361061006d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633f4ba83a146100725780635c975abb1461009f5780638456cb59146100cc5780638da5cb5b146100f9578063f2fde38b1461014e575b600080fd5b341561007d57600080fd5b610085610187565b604051808215151515815260200191505060405180910390f35b34156100aa57600080fd5b6100b261024c565b604051808215151515815260200191505060405180910390f35b34156100d757600080fd5b6100df61025f565b604051808215151515815260200191505060405180910390f35b341561010457600080fd5b61010c610326565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015957600080fd5b610185600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061034b565b005b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156101e457600080fd5b600060149054906101000a900460ff1615156101ff57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a16001905090565b600060149054906101000a900460ff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156102bc57600080fd5b600060149054906101000a900460ff161515156102d857600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a16001905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156103a657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151561041d57806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b505600a165627a7a7230582046ab6fc7e5b9e3f407d7d5b604857b777ba6b904b5b0f26a81e15fa9ae3eb1f30029", - "deployedBytecode": "0x60606040526004361061006d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633f4ba83a146100725780635c975abb1461009f5780638456cb59146100cc5780638da5cb5b146100f9578063f2fde38b1461014e575b600080fd5b341561007d57600080fd5b610085610187565b604051808215151515815260200191505060405180910390f35b34156100aa57600080fd5b6100b261024c565b604051808215151515815260200191505060405180910390f35b34156100d757600080fd5b6100df61025f565b604051808215151515815260200191505060405180910390f35b341561010457600080fd5b61010c610326565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015957600080fd5b610185600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061034b565b005b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156101e457600080fd5b600060149054906101000a900460ff1615156101ff57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a16001905090565b600060149054906101000a900460ff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156102bc57600080fd5b600060149054906101000a900460ff161515156102d857600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a16001905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156103a657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151561041d57806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b505600a165627a7a7230582046ab6fc7e5b9e3f407d7d5b604857b777ba6b904b5b0f26a81e15fa9ae3eb1f30029", + "bytecode": "0x606060405260008060146101000a81548160ff021916908315150217905550336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061044c8061006d6000396000f30060606040526004361061006d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633f4ba83a146100725780635c975abb1461009f5780638456cb59146100cc5780638da5cb5b146100f9578063f2fde38b1461014e575b600080fd5b341561007d57600080fd5b610085610187565b604051808215151515815260200191505060405180910390f35b34156100aa57600080fd5b6100b261024c565b604051808215151515815260200191505060405180910390f35b34156100d757600080fd5b6100df61025f565b604051808215151515815260200191505060405180910390f35b341561010457600080fd5b61010c610326565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015957600080fd5b610185600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061034b565b005b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156101e457600080fd5b600060149054906101000a900460ff1615156101ff57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a16001905090565b600060149054906101000a900460ff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156102bc57600080fd5b600060149054906101000a900460ff161515156102d857600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a16001905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156103a657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151561041d57806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b505600a165627a7a72305820f4c030f7379f25b99c5ecbd6253876097b12a003055fcdb0ff6b56687c12baaf0029", + "deployedBytecode": "0x60606040526004361061006d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633f4ba83a146100725780635c975abb1461009f5780638456cb59146100cc5780638da5cb5b146100f9578063f2fde38b1461014e575b600080fd5b341561007d57600080fd5b610085610187565b604051808215151515815260200191505060405180910390f35b34156100aa57600080fd5b6100b261024c565b604051808215151515815260200191505060405180910390f35b34156100d757600080fd5b6100df61025f565b604051808215151515815260200191505060405180910390f35b341561010457600080fd5b61010c610326565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015957600080fd5b610185600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061034b565b005b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156101e457600080fd5b600060149054906101000a900460ff1615156101ff57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a16001905090565b600060149054906101000a900460ff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156102bc57600080fd5b600060149054906101000a900460ff161515156102d857600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a16001905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156103a657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151561041d57806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b505600a165627a7a72305820f4c030f7379f25b99c5ecbd6253876097b12a003055fcdb0ff6b56687c12baaf0029", "sourceMap": "54226:845:18:-;;;54337:5;54316:26;;;;;;;;;;;;;;;;;;;;816:10;808:5;;:18;;;;;;;;;;;;;;;;;;54226:845;;;;;;", "deployedSourceMap": "54226:845:18:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54943:126;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54316:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54735:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;622:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1156:140;;;;;;;;;;;;;;;;;;;;;;;;;;;;54943:126;54992:4;969:5;;;;;;;;;;;955:19;;:10;:19;;;947:28;;;;;;;;54629:6;;;;;;;;;;;54621:15;;;;;;;;55017:5;55008:6;;:14;;;;;;;;;;;;;;;;;;55032:9;;;;;;;;;;55058:4;55051:11;;54943:126;:::o;54316:26::-;;;;;;;;;;;;;:::o;54735:124::-;54785:4;969:5;;;;;;;;;;;955:19;;:10;:19;;;947:28;;;;;;;;54475:6;;;;;;;;;;;54474:7;54466:16;;;;;;;;54810:4;54801:6;;:13;;;;;;;;;;;;;;;;;;54824:7;;;;;;;;;;54848:4;54841:11;;54735:124;:::o;622:20::-;;;;;;;;;;;;;:::o;1156:140::-;969:5;;;;;;;;;;;955:19;;:10;:19;;;947:28;;;;;;;;1245:1;1225:22;;:8;:22;;;;1221:69;;;1271:8;1263:5;;:16;;;;;;;;;;;;;;;;;;1221:69;1156:140;:::o", "source": "pragma solidity 0.4.18;\n\n/**\n The following contract code, titled KittyCore, was written by Cryptokitties and published\n and retrieved from https://etherscan.io/address/0x06012c8cf97bead5deae237070f9587f8e7a266d#code.\n\n It is included in the current project for test purposes, to ensure that our collateralizer can\n handle ERC721 tokens created by the KittyCore contract.\n*/\n\n/**\n * @title KittiesOwnable\n * @dev The KittiesOwnable contract has an owner address, and provides basic authorization control\n * functions, this simplifies the implementation of \"user permissions\".\n */\ncontract KittiesOwnable {\n address public owner;\n\n\n /**\n\t * @dev The KittiesOwnable constructor sets the original `owner` of the contract to the sender\n\t * account.\n\t */\n function KittiesOwnable() {\n owner = msg.sender;\n }\n\n\n /**\n\t * @dev Throws if called by any account other than the owner.\n\t */\n modifier onlyOwner() {\n require(msg.sender == owner);\n _;\n }\n\n\n /**\n\t * @dev Allows the current owner to transfer control of the contract to a newOwner.\n\t * @param newOwner The address to transfer ownership to.\n\t */\n function transferOwnership(address newOwner) onlyOwner {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n\n}\n\n\n\n/// @title Interface for contracts conforming to ERC-721: Non-Fungible Tokens\n/// @author Dieter Shirley (https://github.com/dete)\ncontract KittiesERC721 {\n // Required methods\n function totalSupply() public view returns (uint256 total);\n function balanceOf(address _owner) public view returns (uint256 balance);\n function ownerOf(uint256 _tokenId) external view returns (address owner);\n function approve(address _to, uint256 _tokenId) external;\n function transfer(address _to, uint256 _tokenId) external;\n function transferFrom(address _from, address _to, uint256 _tokenId) external;\n\n // Events\n event Transfer(address from, address to, uint256 tokenId);\n event Approval(address owner, address approved, uint256 tokenId);\n\n // Optional\n // function name() public view returns (string name);\n // function symbol() public view returns (string symbol);\n // function tokensOfOwner(address _owner) external view returns (uint256[] tokenIds);\n // function tokenMetadata(uint256 _tokenId, string _preferredTransport) public view returns (string infoUrl);\n\n // ERC-165 Compatibility (https://github.com/ethereum/EIPs/issues/165)\n function supportsInterface(bytes4 _interfaceID) external view returns (bool);\n}\n\n\n// // Auction wrapper functions\n\n\n// Auction wrapper functions\n\n\n\n\n\n\n\n/// @title SEKRETOOOO\ncontract GeneScienceInterface {\n /// @dev simply a boolean to indicate this is the contract we expect to be\n function isGeneScience() public pure returns (bool);\n\n /// @dev given genes of kitten 1 & 2, return a genetic combination - may have a random factor\n /// @param genes1 genes of mom\n /// @param genes2 genes of sire\n /// @return the genes that are supposed to be passed down the child\n function mixGenes(uint256 genes1, uint256 genes2, uint256 targetBlock) public returns (uint256);\n}\n\n\n\n\n\n\n\n/// @title A facet of KittyCore that manages special access privileges.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyAccessControl {\n // This facet controls access control for CryptoKitties. There are four roles managed here:\n //\n // - The CEO: The CEO can reassign other roles and change the addresses of our dependent smart\n // contracts. It is also the only role that can unpause the smart contract. It is initially\n // set to the address that created the smart contract in the KittyCore constructor.\n //\n // - The CFO: The CFO can withdraw funds from KittyCore and its auction contracts.\n //\n // - The COO: The COO can release gen0 kitties to auction, and mint promo cats.\n //\n // It should be noted that these roles are distinct without overlap in their access abilities, the\n // abilities listed for each role above are exhaustive. In particular, while the CEO can assign any\n // address to any role, the CEO address itself doesn't have the ability to act in those roles. This\n // restriction is intentional so that we aren't tempted to use the CEO address frequently out of\n // convenience. The less we use an address, the less likely it is that we somehow compromise the\n // account.\n\n /// @dev Emited when contract is upgraded - See README.md for updgrade plan\n event ContractUpgrade(address newContract);\n\n // The addresses of the accounts (or contracts) that can execute actions within each roles.\n address public ceoAddress;\n address public cfoAddress;\n address public cooAddress;\n\n // @dev Keeps track whether the contract is paused. When that is true, most actions are blocked\n bool public paused = false;\n\n /// @dev Access modifier for CEO-only functionality\n modifier onlyCEO() {\n require(msg.sender == ceoAddress);\n _;\n }\n\n /// @dev Access modifier for CFO-only functionality\n modifier onlyCFO() {\n require(msg.sender == cfoAddress);\n _;\n }\n\n /// @dev Access modifier for COO-only functionality\n modifier onlyCOO() {\n require(msg.sender == cooAddress);\n _;\n }\n\n modifier onlyCLevel() {\n require(\n msg.sender == cooAddress ||\n msg.sender == ceoAddress ||\n msg.sender == cfoAddress\n );\n _;\n }\n\n /// @dev Assigns a new address to act as the CEO. Only available to the current CEO.\n /// @param _newCEO The address of the new CEO\n function setCEO(address _newCEO) external onlyCEO {\n require(_newCEO != address(0));\n\n ceoAddress = _newCEO;\n }\n\n /// @dev Assigns a new address to act as the CFO. Only available to the current CEO.\n /// @param _newCFO The address of the new CFO\n function setCFO(address _newCFO) external onlyCEO {\n require(_newCFO != address(0));\n\n cfoAddress = _newCFO;\n }\n\n /// @dev Assigns a new address to act as the COO. Only available to the current CEO.\n /// @param _newCOO The address of the new COO\n function setCOO(address _newCOO) external onlyCEO {\n require(_newCOO != address(0));\n\n cooAddress = _newCOO;\n }\n\n /*** KittiesPausable functionality adapted from OpenZeppelin ***/\n\n /// @dev Modifier to allow actions only when the contract IS NOT paused\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /// @dev Modifier to allow actions only when the contract IS paused\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /// @dev Called by any \"C-level\" role to pause the contract. Used only when\n /// a bug or exploit is detected and we need to limit damage.\n function pause() external onlyCLevel whenNotPaused {\n paused = true;\n }\n\n /// @dev Unpauses the smart contract. Can only be called by the CEO, since\n /// one reason we may pause the contract is when CFO or COO accounts are\n /// compromised.\n /// @notice This is public rather than external so it can be called by\n /// derived contracts.\n function unpause() public onlyCEO whenPaused {\n // can't unpause if contract was upgraded\n paused = false;\n }\n}\n\n\n\n\n/// @title Base contract for CryptoKitties. Holds all common structs, events and base variables.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBase is KittyAccessControl {\n /*** EVENTS ***/\n\n /// @dev The Birth event is fired whenever a new kitten comes into existence. This obviously\n /// includes any time a cat is created through the giveBirth method, but it is also called\n /// when a new gen0 cat is created.\n event Birth(address owner, uint256 kittyId, uint256 matronId, uint256 sireId, uint256 genes);\n\n /// @dev Transfer event as defined in current draft of ERC721. Emitted every time a kitten\n /// ownership is assigned, including births.\n event Transfer(address from, address to, uint256 tokenId);\n\n /*** DATA TYPES ***/\n\n /// @dev The main Kitty struct. Every cat in CryptoKitties is represented by a copy\n /// of this structure, so great care was taken to ensure that it fits neatly into\n /// exactly two 256-bit words. Note that the order of the members in this structure\n /// is important because of the byte-packing rules used by Ethereum.\n /// Ref: http://solidity.readthedocs.io/en/develop/miscellaneous.html\n struct Kitty {\n // The Kitty's genetic code is packed into these 256-bits, the format is\n // sooper-sekret! A cat's genes never change.\n uint256 genes;\n\n // The timestamp from the block when this cat came into existence.\n uint64 birthTime;\n\n // The minimum timestamp after which this cat can engage in breeding\n // activities again. This same timestamp is used for the pregnancy\n // timer (for matrons) as well as the siring cooldown.\n uint64 cooldownEndBlock;\n\n // The ID of the parents of this kitty, set to 0 for gen0 cats.\n // Note that using 32-bit unsigned integers limits us to a \"mere\"\n // 4 billion cats. This number might seem small until you realize\n // that Ethereum currently has a limit of about 500 million\n // transactions per year! So, this definitely won't be a problem\n // for several years (even as Ethereum learns to scale).\n uint32 matronId;\n uint32 sireId;\n\n // Set to the ID of the sire cat for matrons that are pregnant,\n // zero otherwise. A non-zero value here is how we know a cat\n // is pregnant. Used to retrieve the genetic material for the new\n // kitten when the birth transpires.\n uint32 siringWithId;\n\n // Set to the index in the cooldown array (see below) that represents\n // the current cooldown duration for this Kitty. This starts at zero\n // for gen0 cats, and is initialized to floor(generation/2) for others.\n // Incremented by one for each successful breeding action, regardless\n // of whether this cat is acting as matron or sire.\n uint16 cooldownIndex;\n\n // The \"generation number\" of this cat. Cats minted by the CK contract\n // for sale are called \"gen0\" and have a generation number of 0. The\n // generation number of all other cats is the larger of the two generation\n // numbers of their parents, plus one.\n // (i.e. max(matron.generation, sire.generation) + 1)\n uint16 generation;\n }\n\n /*** CONSTANTS ***/\n\n /// @dev A lookup table indicating the cooldown duration after any successful\n /// breeding action, called \"pregnancy time\" for matrons and \"siring cooldown\"\n /// for sires. Designed such that the cooldown roughly doubles each time a cat\n /// is bred, encouraging owners not to just keep breeding the same cat over\n /// and over again. Caps out at one week (a cat can breed an unbounded number\n /// of times, and the maximum cooldown is always seven days).\n uint32[14] public cooldowns = [\n uint32(1 minutes),\n uint32(2 minutes),\n uint32(5 minutes),\n uint32(10 minutes),\n uint32(30 minutes),\n uint32(1 hours),\n uint32(2 hours),\n uint32(4 hours),\n uint32(8 hours),\n uint32(16 hours),\n uint32(1 days),\n uint32(2 days),\n uint32(4 days),\n uint32(7 days)\n ];\n\n // An approximation of currently how many seconds are in between blocks.\n uint256 public secondsPerBlock = 15;\n\n /*** STORAGE ***/\n\n /// @dev An array containing the Kitty struct for all Kitties in existence. The ID\n /// of each cat is actually an index into this array. Note that ID 0 is a negacat,\n /// the unKitty, the mythical beast that is the parent of all gen0 cats. A bizarre\n /// creature that is both matron and sire... to itself! Has an invalid genetic code.\n /// In other words, cat ID 0 is invalid... ;-)\n Kitty[] kitties;\n\n /// @dev A mapping from cat IDs to the address that owns them. All cats have\n /// some valid owner address, even gen0 cats are created with a non-zero owner.\n mapping (uint256 => address) public kittyIndexToOwner;\n\n // @dev A mapping from owner address to count of tokens that address owns.\n // Used internally inside balanceOf() to resolve ownership count.\n mapping (address => uint256) ownershipTokenCount;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to call\n /// transferFrom(). Each Kitty can only have one approved address for transfer\n /// at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public kittyIndexToApproved;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to use\n /// this Kitty for siring via breedWith(). Each Kitty can only have one approved\n /// address for siring at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public sireAllowedToAddress;\n\n /// @dev The address of the ClockAuction contract that handles sales of Kitties. This\n /// same contract handles both peer-to-peer sales as well as the gen0 sales which are\n /// initiated every 15 minutes.\n SaleClockAuction public saleAuction;\n\n /// @dev The address of a custom ClockAuction subclassed contract that handles siring\n /// auctions. Needs to be separate from saleAuction because the actions taken on success\n /// after a sales and siring auction are quite different.\n SiringClockAuction public siringAuction;\n\n /// @dev Assigns ownership of a specific Kitty to an address.\n function _transfer(address _from, address _to, uint256 _tokenId) internal {\n // Since the number of kittens is capped to 2^32 we can't overflow this\n ownershipTokenCount[_to]++;\n // transfer ownership\n kittyIndexToOwner[_tokenId] = _to;\n // When creating new kittens _from is 0x0, but we can't account that address.\n if (_from != address(0)) {\n ownershipTokenCount[_from]--;\n // once the kitten is transferred also clear sire allowances\n delete sireAllowedToAddress[_tokenId];\n // clear any previously approved ownership exchange\n delete kittyIndexToApproved[_tokenId];\n }\n // Emit the transfer event.\n Transfer(_from, _to, _tokenId);\n }\n\n /// @dev An internal method that creates a new kitty and stores it. This\n /// method doesn't do any checking and should only be called when the\n /// input data is known to be valid. Will generate both a Birth event\n /// and a Transfer event.\n /// @param _matronId The kitty ID of the matron of this cat (zero for gen0)\n /// @param _sireId The kitty ID of the sire of this cat (zero for gen0)\n /// @param _generation The generation number of this cat, must be computed by caller.\n /// @param _genes The kitty's genetic code.\n /// @param _owner The inital owner of this cat, must be non-zero (except for the unKitty, ID 0)\n function _createKitty(\n uint256 _matronId,\n uint256 _sireId,\n uint256 _generation,\n uint256 _genes,\n address _owner\n )\n internal\n returns (uint)\n {\n // These requires are not strictly necessary, our calling code should make\n // sure that these conditions are never broken. However! _createKitty() is already\n // an expensive call (for storage), and it doesn't hurt to be especially careful\n // to ensure our data structures are always valid.\n require(_matronId == uint256(uint32(_matronId)));\n require(_sireId == uint256(uint32(_sireId)));\n require(_generation == uint256(uint16(_generation)));\n\n // New kitty starts with the same cooldown as parent gen/2\n uint16 cooldownIndex = uint16(_generation / 2);\n if (cooldownIndex > 13) {\n cooldownIndex = 13;\n }\n\n Kitty memory _kitty = Kitty({\n genes: _genes,\n birthTime: uint64(now),\n cooldownEndBlock: 0,\n matronId: uint32(_matronId),\n sireId: uint32(_sireId),\n siringWithId: 0,\n cooldownIndex: cooldownIndex,\n generation: uint16(_generation)\n });\n uint256 newKittenId = kitties.push(_kitty) - 1;\n\n // It's probably never going to happen, 4 billion cats is A LOT, but\n // let's just be 100% sure we never let this happen.\n require(newKittenId == uint256(uint32(newKittenId)));\n\n // emit the birth event\n Birth(\n _owner,\n newKittenId,\n uint256(_kitty.matronId),\n uint256(_kitty.sireId),\n _kitty.genes\n );\n\n // This will assign ownership, and also emit the Transfer event as\n // per ERC721 draft\n _transfer(0, _owner, newKittenId);\n\n return newKittenId;\n }\n\n // Any C-level can fix how many seconds per blocks are currently observed.\n function setSecondsPerBlock(uint256 secs) external onlyCLevel {\n require(secs < cooldowns[0]);\n secondsPerBlock = secs;\n }\n}\n\n\n\n\n\n/// @title The external contract that is responsible for generating metadata for the kitties,\n/// it has one function that will return the data as bytes.\ncontract KittiesERC721Metadata {\n /// @dev Given a token Id, returns a byte array that is supposed to be converted into string.\n function getMetadata(uint256 _tokenId, string) public view returns (bytes32[4] buffer, uint256 count) {\n if (_tokenId == 1) {\n buffer[0] = \"Hello World! :D\";\n count = 15;\n } else if (_tokenId == 2) {\n buffer[0] = \"I would definitely choose a medi\";\n buffer[1] = \"um length string.\";\n count = 49;\n } else if (_tokenId == 3) {\n buffer[0] = \"Lorem ipsum dolor sit amet, mi e\";\n buffer[1] = \"st accumsan dapibus augue lorem,\";\n buffer[2] = \" tristique vestibulum id, libero\";\n buffer[3] = \" suscipit varius sapien aliquam.\";\n count = 128;\n }\n }\n}\n\n\n/// @title The facet of the CryptoKitties core contract that manages ownership, ERC-721 (draft) compliant.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev Ref: https://github.com/ethereum/EIPs/issues/721\n/// See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyOwnership is KittyBase, KittiesERC721 {\n\n /// @notice Name and symbol of the non fungible token, as defined in ERC721.\n string public constant name = \"CryptoKitties\";\n string public constant symbol = \"CK\";\n\n // The contract that will return kitty metadata\n KittiesERC721Metadata public erc721Metadata;\n\n bytes4 constant InterfaceSignature_ERC165 =\n bytes4(keccak256('supportsInterface(bytes4)'));\n\n bytes4 constant InterfaceSignature_ERC721 =\n bytes4(keccak256('name()')) ^\n bytes4(keccak256('symbol()')) ^\n bytes4(keccak256('totalSupply()')) ^\n bytes4(keccak256('balanceOf(address)')) ^\n bytes4(keccak256('ownerOf(uint256)')) ^\n bytes4(keccak256('approve(address,uint256)')) ^\n bytes4(keccak256('transfer(address,uint256)')) ^\n bytes4(keccak256('transferFrom(address,address,uint256)')) ^\n bytes4(keccak256('tokensOfOwner(address)')) ^\n bytes4(keccak256('tokenMetadata(uint256,string)'));\n\n /// @notice Introspection interface as per ERC-165 (https://github.com/ethereum/EIPs/issues/165).\n /// Returns true for any standardized interfaces implemented by this contract. We implement\n /// ERC-165 (obviously!) and ERC-721.\n function supportsInterface(bytes4 _interfaceID) external view returns (bool)\n {\n // DEBUG ONLY\n //require((InterfaceSignature_ERC165 == 0x01ffc9a7) && (InterfaceSignature_ERC721 == 0x9a20483d));\n\n return ((_interfaceID == InterfaceSignature_ERC165) || (_interfaceID == InterfaceSignature_ERC721));\n }\n\n /// @dev Set the address of the sibling contract that tracks metadata.\n /// CEO only.\n function setMetadataAddress(address _contractAddress) public onlyCEO {\n erc721Metadata = KittiesERC721Metadata(_contractAddress);\n }\n\n // Internal utility functions: These functions all assume that their input arguments\n // are valid. We leave it to public methods to sanitize their inputs and follow\n // the required logic.\n\n /// @dev Checks if a given address is the current owner of a particular Kitty.\n /// @param _claimant the address we are validating against.\n /// @param _tokenId kitten id, only valid when > 0\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToOwner[_tokenId] == _claimant;\n }\n\n /// @dev Checks if a given address currently has transferApproval for a particular Kitty.\n /// @param _claimant the address we are confirming kitten is approved for.\n /// @param _tokenId kitten id, only valid when > 0\n function _approvedFor(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToApproved[_tokenId] == _claimant;\n }\n\n /// @dev Marks an address as being approved for transferFrom(), overwriting any previous\n /// approval. Setting _approved to address(0) clears all transfer approval.\n /// NOTE: _approve() does NOT send the Approval event. This is intentional because\n /// _approve() and transferFrom() are used together for putting Kitties on auction, and\n /// there is no value in spamming the log with Approval events in that case.\n function _approve(uint256 _tokenId, address _approved) internal {\n kittyIndexToApproved[_tokenId] = _approved;\n }\n\n /// @notice Returns the number of Kitties owned by a specific address.\n /// @param _owner The owner address to check.\n /// @dev Required for ERC-721 compliance\n function balanceOf(address _owner) public view returns (uint256 count) {\n return ownershipTokenCount[_owner];\n }\n\n /// @notice Transfers a Kitty to another address. If transferring to a smart\n /// contract be VERY CAREFUL to ensure that it is aware of ERC-721 (or\n /// CryptoKitties specifically) or your Kitty may be lost forever. Seriously.\n /// @param _to The address of the recipient, can be a user or contract.\n /// @param _tokenId The ID of the Kitty to transfer.\n /// @dev Required for ERC-721 compliance.\n function transfer(\n address _to,\n uint256 _tokenId\n )\n external\n whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Disallow transfers to the auction contracts to prevent accidental\n // misuse. Auction contracts should only take ownership of kitties\n // through the allow + transferFrom flow.\n require(_to != address(saleAuction));\n require(_to != address(siringAuction));\n\n // You can only send your own cat.\n require(_owns(msg.sender, _tokenId));\n\n // Reassign ownership, clear pending approvals, emit Transfer event.\n _transfer(msg.sender, _to, _tokenId);\n }\n\n /// @notice Grant another address the right to transfer a specific Kitty via\n /// transferFrom(). This is the preferred flow for transfering NFTs to contracts.\n /// @param _to The address to be granted transfer approval. Pass address(0) to\n /// clear all approvals.\n /// @param _tokenId The ID of the Kitty that can be transferred if this call succeeds.\n /// @dev Required for ERC-721 compliance.\n function approve(\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Only an owner can grant transfer approval.\n require(_owns(msg.sender, _tokenId));\n\n // Register the approval (replacing any previous approval).\n _approve(_tokenId, _to);\n\n // Emit approval event.\n Approval(msg.sender, _to, _tokenId);\n }\n\n /// @notice Transfer a Kitty owned by another address, for which the calling address\n /// has previously been granted transfer approval by the owner.\n /// @param _from The address that owns the Kitty to be transfered.\n /// @param _to The address that should take ownership of the Kitty. Can be any address,\n /// including the caller.\n /// @param _tokenId The ID of the Kitty to be transferred.\n /// @dev Required for ERC-721 compliance.\n function transferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Check for approval and valid ownership\n require(_approvedFor(msg.sender, _tokenId));\n require(_owns(_from, _tokenId));\n\n // Reassign ownership (also clears pending approvals and emits Transfer event).\n _transfer(_from, _to, _tokenId);\n }\n\n /// @notice Returns the total number of Kitties currently in existence.\n /// @dev Required for ERC-721 compliance.\n function totalSupply() public view returns (uint) {\n return kitties.length - 1;\n }\n\n /// @notice Returns the address currently assigned ownership of a given Kitty.\n /// @dev Required for ERC-721 compliance.\n function ownerOf(uint256 _tokenId)\n external\n view\n returns (address owner)\n {\n owner = kittyIndexToOwner[_tokenId];\n\n require(owner != address(0));\n }\n\n /// @notice Returns a list of all Kitty IDs assigned to an address.\n /// @param _owner The owner whose Kitties we are interested in.\n /// @dev This method MUST NEVER be called by smart contract code. First, it's fairly\n /// expensive (it walks the entire Kitty array looking for cats belonging to owner),\n /// but it also returns a dynamic array, which is only supported for web3 calls, and\n /// not contract-to-contract calls.\n function tokensOfOwner(address _owner) external view returns(uint256[] ownerTokens) {\n uint256 tokenCount = balanceOf(_owner);\n\n if (tokenCount == 0) {\n // Return an empty array\n return new uint256[](0);\n } else {\n uint256[] memory result = new uint256[](tokenCount);\n uint256 totalCats = totalSupply();\n uint256 resultIndex = 0;\n\n // We count on the fact that all cats have IDs starting at 1 and increasing\n // sequentially up to the totalCat count.\n uint256 catId;\n\n for (catId = 1; catId <= totalCats; catId++) {\n if (kittyIndexToOwner[catId] == _owner) {\n result[resultIndex] = catId;\n resultIndex++;\n }\n }\n\n return result;\n }\n }\n\n /// @dev Adapted from memcpy() by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _memcpy(uint _dest, uint _src, uint _len) private view {\n // Copy word-length chunks while possible\n for(; _len >= 32; _len -= 32) {\n assembly {\n mstore(_dest, mload(_src))\n }\n _dest += 32;\n _src += 32;\n }\n\n // Copy remaining bytes\n uint256 mask = 256 ** (32 - _len) - 1;\n assembly {\n let srcpart := and(mload(_src), not(mask))\n let destpart := and(mload(_dest), mask)\n mstore(_dest, or(destpart, srcpart))\n }\n }\n\n /// @dev Adapted from toString(slice) by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _toString(bytes32[4] _rawBytes, uint256 _stringLength) private view returns (string) {\n var outputString = new string(_stringLength);\n uint256 outputPtr;\n uint256 bytesPtr;\n\n assembly {\n outputPtr := add(outputString, 32)\n bytesPtr := _rawBytes\n }\n\n _memcpy(outputPtr, bytesPtr, _stringLength);\n\n return outputString;\n }\n\n /// @notice Returns a URI pointing to a metadata package for this token conforming to\n /// ERC-721 (https://github.com/ethereum/EIPs/issues/721)\n /// @param _tokenId The ID number of the Kitty whose metadata should be returned.\n function tokenMetadata(uint256 _tokenId, string _preferredTransport) external view returns (string infoUrl) {\n require(erc721Metadata != address(0));\n bytes32[4] memory buffer;\n uint256 count;\n (buffer, count) = erc721Metadata.getMetadata(_tokenId, _preferredTransport);\n\n return _toString(buffer, count);\n }\n}\n\n\n\n/// @title A facet of KittyCore that manages Kitty siring, gestation, and birth.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBreeding is KittyOwnership {\n\n /// @dev The Pregnant event is fired when two cats successfully breed and the pregnancy\n /// timer begins for the matron.\n event Pregnant(address owner, uint256 matronId, uint256 sireId, uint256 cooldownEndBlock);\n\n /// @notice The minimum payment required to use breedWithAuto(). This fee goes towards\n /// the gas cost paid by whatever calls giveBirth(), and can be dynamically updated by\n /// the COO role as the gas price changes.\n uint256 public autoBirthFee = 2 finney;\n\n // Keeps track of number of pregnant kitties.\n uint256 public pregnantKitties;\n\n /// @dev The address of the sibling contract that is used to implement the sooper-sekret\n /// genetic combination algorithm.\n GeneScienceInterface public geneScience;\n\n /// @dev Update the address of the genetic contract, can only be called by the CEO.\n /// @param _address An address of a GeneScience contract instance to be used from this point forward.\n function setGeneScienceAddress(address _address) external onlyCEO {\n GeneScienceInterface candidateContract = GeneScienceInterface(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isGeneScience());\n\n // Set the new contract address\n geneScience = candidateContract;\n }\n\n /// @dev Checks that a given kitten is able to breed. Requires that the\n /// current cooldown is finished (for sires) and also checks that there is\n /// no pending pregnancy.\n function _isReadyToBreed(Kitty _kit) internal view returns (bool) {\n // In addition to checking the cooldownEndBlock, we also need to check to see if\n // the cat has a pending birth; there can be some period of time between the end\n // of the pregnacy timer and the birth event.\n return (_kit.siringWithId == 0) && (_kit.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @dev Check if a sire has authorized breeding with this matron. True if both sire\n /// and matron have the same owner, or if the sire has given siring permission to\n /// the matron's owner (via approveSiring()).\n function _isSiringPermitted(uint256 _sireId, uint256 _matronId) internal view returns (bool) {\n address matronOwner = kittyIndexToOwner[_matronId];\n address sireOwner = kittyIndexToOwner[_sireId];\n\n // Siring is okay if they have same owner, or if the matron's owner was given\n // permission to breed with this sire.\n return (matronOwner == sireOwner || sireAllowedToAddress[_sireId] == matronOwner);\n }\n\n /// @dev Set the cooldownEndTime for the given Kitty, based on its current cooldownIndex.\n /// Also increments the cooldownIndex (unless it has hit the cap).\n /// @param _kitten A reference to the Kitty in storage which needs its timer started.\n function _triggerCooldown(Kitty storage _kitten) internal {\n // Compute an estimation of the cooldown time in blocks (based on current cooldownIndex).\n _kitten.cooldownEndBlock = uint64((cooldowns[_kitten.cooldownIndex]/secondsPerBlock) + block.number);\n\n // Increment the breeding count, clamping it at 13, which is the length of the\n // cooldowns array. We could check the array size dynamically, but hard-coding\n // this as a constant saves gas. Yay, Solidity!\n if (_kitten.cooldownIndex < 13) {\n _kitten.cooldownIndex += 1;\n }\n }\n\n /// @notice Grants approval to another user to sire with one of your Kitties.\n /// @param _addr The address that will be able to sire with your Kitty. Set to\n /// address(0) to clear all siring approvals for this Kitty.\n /// @param _sireId A Kitty that you own that _addr will now be able to sire with.\n function approveSiring(address _addr, uint256 _sireId)\n external\n whenNotPaused\n {\n require(_owns(msg.sender, _sireId));\n sireAllowedToAddress[_sireId] = _addr;\n }\n\n /// @dev Updates the minimum payment required for calling giveBirthAuto(). Can only\n /// be called by the COO address. (This fee is used to offset the gas cost incurred\n /// by the autobirth daemon).\n function setAutoBirthFee(uint256 val) external onlyCOO {\n autoBirthFee = val;\n }\n\n /// @dev Checks to see if a given Kitty is pregnant and (if so) if the gestation\n /// period has passed.\n function _isReadyToGiveBirth(Kitty _matron) private view returns (bool) {\n return (_matron.siringWithId != 0) && (_matron.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @notice Checks that a given kitten is able to breed (i.e. it is not pregnant or\n /// in the middle of a siring cooldown).\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isReadyToBreed(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n Kitty storage kit = kitties[_kittyId];\n return _isReadyToBreed(kit);\n }\n\n /// @dev Checks whether a kitty is currently pregnant.\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isPregnant(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n // A kitty is pregnant if and only if this field is set\n return kitties[_kittyId].siringWithId != 0;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair. DOES NOT\n /// check ownership permissions (that is up to the caller).\n /// @param _matron A reference to the Kitty struct of the potential matron.\n /// @param _matronId The matron's ID.\n /// @param _sire A reference to the Kitty struct of the potential sire.\n /// @param _sireId The sire's ID\n function _isValidMatingPair(\n Kitty storage _matron,\n uint256 _matronId,\n Kitty storage _sire,\n uint256 _sireId\n )\n private\n view\n returns(bool)\n {\n // A Kitty can't breed with itself!\n if (_matronId == _sireId) {\n return false;\n }\n\n // Kitties can't breed with their parents.\n if (_matron.matronId == _sireId || _matron.sireId == _sireId) {\n return false;\n }\n if (_sire.matronId == _matronId || _sire.sireId == _matronId) {\n return false;\n }\n\n // We can short circuit the sibling check (below) if either cat is\n // gen zero (has a matron ID of zero).\n if (_sire.matronId == 0 || _matron.matronId == 0) {\n return true;\n }\n\n // Kitties can't breed with full or half siblings.\n if (_sire.matronId == _matron.matronId || _sire.matronId == _matron.sireId) {\n return false;\n }\n if (_sire.sireId == _matron.matronId || _sire.sireId == _matron.sireId) {\n return false;\n }\n\n // Everything seems cool! Let's get DTF.\n return true;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair for\n /// breeding via auction (i.e. skips ownership and siring approval checks).\n function _canBreedWithViaAuction(uint256 _matronId, uint256 _sireId)\n internal\n view\n returns (bool)\n {\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId);\n }\n\n /// @notice Checks to see if two cats can breed together, including checks for\n /// ownership and siring approvals. Does NOT check that both cats are ready for\n /// breeding (i.e. breedWith could still fail until the cooldowns are finished).\n /// TODO: Shouldn't this check pregnancy and cooldowns?!?\n /// @param _matronId The ID of the proposed matron.\n /// @param _sireId The ID of the proposed sire.\n function canBreedWith(uint256 _matronId, uint256 _sireId)\n external\n view\n returns(bool)\n {\n require(_matronId > 0);\n require(_sireId > 0);\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId) &&\n _isSiringPermitted(_sireId, _matronId);\n }\n\n /// @dev Internal utility function to initiate breeding, assumes that all breeding\n /// requirements have been checked.\n function _breedWith(uint256 _matronId, uint256 _sireId) internal {\n // Grab a reference to the Kitties from storage.\n Kitty storage sire = kitties[_sireId];\n Kitty storage matron = kitties[_matronId];\n\n // Mark the matron as pregnant, keeping track of who the sire is.\n matron.siringWithId = uint32(_sireId);\n\n // Trigger the cooldown for both parents.\n _triggerCooldown(sire);\n _triggerCooldown(matron);\n\n // Clear siring permission for both parents. This may not be strictly necessary\n // but it's likely to avoid confusion!\n delete sireAllowedToAddress[_matronId];\n delete sireAllowedToAddress[_sireId];\n\n // Every time a kitty gets pregnant, counter is incremented.\n pregnantKitties++;\n\n // Emit the pregnancy event.\n Pregnant(kittyIndexToOwner[_matronId], _matronId, _sireId, matron.cooldownEndBlock);\n }\n\n /// @notice Breed a Kitty you own (as matron) with a sire that you own, or for which you\n /// have previously been given Siring approval. Will either make your cat pregnant, or will\n /// fail entirely. Requires a pre-payment of the fee given out to the first caller of giveBirth()\n /// @param _matronId The ID of the Kitty acting as matron (will end up pregnant if successful)\n /// @param _sireId The ID of the Kitty acting as sire (will begin its siring cooldown if successful)\n function breedWithAuto(uint256 _matronId, uint256 _sireId)\n external\n payable\n whenNotPaused\n {\n // Checks for payment.\n require(msg.value >= autoBirthFee);\n\n // Caller must own the matron.\n require(_owns(msg.sender, _matronId));\n\n // Neither sire nor matron are allowed to be on auction during a normal\n // breeding operation, but we don't need to check that explicitly.\n // For matron: The caller of this function can't be the owner of the matron\n // because the owner of a Kitty on auction is the auction house, and the\n // auction house will never call breedWith().\n // For sire: Similarly, a sire on auction will be owned by the auction house\n // and the act of transferring ownership will have cleared any oustanding\n // siring approval.\n // Thus we don't need to spend gas explicitly checking to see if either cat\n // is on auction.\n\n // Check that matron and sire are both owned by caller, or that the sire\n // has given siring permission to caller (i.e. matron's owner).\n // Will fail for _sireId = 0\n require(_isSiringPermitted(_sireId, _matronId));\n\n // Grab a reference to the potential matron\n Kitty storage matron = kitties[_matronId];\n\n // Make sure matron isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(matron));\n\n // Grab a reference to the potential sire\n Kitty storage sire = kitties[_sireId];\n\n // Make sure sire isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(sire));\n\n // Test that these cats are a valid mating pair.\n require(_isValidMatingPair(\n matron,\n _matronId,\n sire,\n _sireId\n ));\n\n // All checks passed, kitty gets pregnant!\n _breedWith(_matronId, _sireId);\n }\n\n /// @notice Have a pregnant Kitty give birth!\n /// @param _matronId A Kitty ready to give birth.\n /// @return The Kitty ID of the new kitten.\n /// @dev Looks at a given Kitty and, if pregnant and if the gestation period has passed,\n /// combines the genes of the two parents to create a new kitten. The new Kitty is assigned\n /// to the current owner of the matron. Upon successful completion, both the matron and the\n /// new kitten will be ready to breed again. Note that anyone can call this function (if they\n /// are willing to pay the gas!), but the new kitten always goes to the mother's owner.\n function giveBirth(uint256 _matronId)\n external\n whenNotPaused\n returns(uint256)\n {\n // Grab a reference to the matron in storage.\n Kitty storage matron = kitties[_matronId];\n\n // Check that the matron is a valid cat.\n require(matron.birthTime != 0);\n\n // Check that the matron is pregnant, and that its time has come!\n require(_isReadyToGiveBirth(matron));\n\n // Grab a reference to the sire in storage.\n uint256 sireId = matron.siringWithId;\n Kitty storage sire = kitties[sireId];\n\n // Determine the higher generation number of the two parents\n uint16 parentGen = matron.generation;\n if (sire.generation > matron.generation) {\n parentGen = sire.generation;\n }\n\n // Call the sooper-sekret gene mixing operation.\n uint256 childGenes = geneScience.mixGenes(matron.genes, sire.genes, matron.cooldownEndBlock - 1);\n\n // Make the new kitten!\n address owner = kittyIndexToOwner[_matronId];\n uint256 kittenId = _createKitty(_matronId, matron.siringWithId, parentGen + 1, childGenes, owner);\n\n // Clear the reference to sire from the matron (REQUIRED! Having siringWithId\n // set is what marks a matron as being pregnant.)\n delete matron.siringWithId;\n\n // Every time a kitty gives birth counter is decremented.\n pregnantKitties--;\n\n // Send the balance fee to the person who made birth happen.\n msg.sender.send(autoBirthFee);\n\n // return the new kitten's ID\n return kittenId;\n }\n}\n\n\n\n\n\n\n\n\n\n\n/// @title Auction Core\n/// @dev Contains models, variables, and internal methods for the auction.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuctionBase {\n\n // Represents an auction on an NFT\n struct Auction {\n // Current owner of NFT\n address seller;\n // Price (in wei) at beginning of auction\n uint128 startingPrice;\n // Price (in wei) at end of auction\n uint128 endingPrice;\n // Duration (in seconds) of auction\n uint64 duration;\n // Time when auction started\n // NOTE: 0 if this auction has been concluded\n uint64 startedAt;\n }\n\n // Reference to contract tracking NFT ownership\n KittiesERC721 public nonFungibleContract;\n\n // Cut owner takes on each auction, measured in basis points (1/100 of a percent).\n // Values 0-10,000 map to 0%-100%\n uint256 public ownerCut;\n\n // Map from token ID to their corresponding auction.\n mapping (uint256 => Auction) tokenIdToAuction;\n\n event AuctionCreated(uint256 tokenId, uint256 startingPrice, uint256 endingPrice, uint256 duration);\n event AuctionSuccessful(uint256 tokenId, uint256 totalPrice, address winner);\n event AuctionCancelled(uint256 tokenId);\n\n /// @dev Returns true if the claimant owns the token.\n /// @param _claimant - Address claiming to own the token.\n /// @param _tokenId - ID of token whose ownership to verify.\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return (nonFungibleContract.ownerOf(_tokenId) == _claimant);\n }\n\n /// @dev Escrows the NFT, assigning ownership to this contract.\n /// Throws if the escrow fails.\n /// @param _owner - Current owner address of token to escrow.\n /// @param _tokenId - ID of token whose approval to verify.\n function _escrow(address _owner, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transferFrom(_owner, this, _tokenId);\n }\n\n /// @dev Transfers an NFT owned by this contract to another address.\n /// Returns true if the transfer succeeds.\n /// @param _receiver - Address to transfer NFT to.\n /// @param _tokenId - ID of token to transfer.\n function _transfer(address _receiver, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transfer(_receiver, _tokenId);\n }\n\n /// @dev Adds an auction to the list of open auctions. Also fires the\n /// AuctionCreated event.\n /// @param _tokenId The ID of the token to be put on auction.\n /// @param _auction Auction to add.\n function _addAuction(uint256 _tokenId, Auction _auction) internal {\n // Require that all auctions have a duration of\n // at least one minute. (Keeps our math from getting hairy!)\n require(_auction.duration >= 1 minutes);\n\n tokenIdToAuction[_tokenId] = _auction;\n\n AuctionCreated(\n uint256(_tokenId),\n uint256(_auction.startingPrice),\n uint256(_auction.endingPrice),\n uint256(_auction.duration)\n );\n }\n\n /// @dev Cancels an auction unconditionally.\n function _cancelAuction(uint256 _tokenId, address _seller) internal {\n _removeAuction(_tokenId);\n _transfer(_seller, _tokenId);\n AuctionCancelled(_tokenId);\n }\n\n /// @dev Computes the price and transfers winnings.\n /// Does NOT transfer ownership of token.\n function _bid(uint256 _tokenId, uint256 _bidAmount)\n internal\n returns (uint256)\n {\n // Get a reference to the auction struct\n Auction storage auction = tokenIdToAuction[_tokenId];\n\n // Explicitly check that this auction is currently live.\n // (Because of how Ethereum mappings work, we can't just count\n // on the lookup above failing. An invalid _tokenId will just\n // return an auction object that is all zeros.)\n require(_isOnAuction(auction));\n\n // Check that the bid is greater than or equal to the current price\n uint256 price = _currentPrice(auction);\n require(_bidAmount >= price);\n\n // Grab a reference to the seller before the auction struct\n // gets deleted.\n address seller = auction.seller;\n\n // The bid is good! Remove the auction before sending the fees\n // to the sender so we can't have a reentrancy attack.\n _removeAuction(_tokenId);\n\n // Transfer proceeds to seller (if there are any!)\n if (price > 0) {\n // Calculate the auctioneer's cut.\n // (NOTE: _computeCut() is guaranteed to return a\n // value <= price, so this subtraction can't go negative.)\n uint256 auctioneerCut = _computeCut(price);\n uint256 sellerProceeds = price - auctioneerCut;\n\n // NOTE: Doing a transfer() in the middle of a complex\n // method like this is generally discouraged because of\n // reentrancy attacks and DoS attacks if the seller is\n // a contract with an invalid fallback function. We explicitly\n // guard against reentrancy attacks by removing the auction\n // before calling transfer(), and the only thing the seller\n // can DoS is the sale of their own asset! (And if it's an\n // accident, they can call cancelAuction(). )\n seller.transfer(sellerProceeds);\n }\n\n // Calculate any excess funds included with the bid. If the excess\n // is anything worth worrying about, transfer it back to bidder.\n // NOTE: We checked above that the bid amount is greater than or\n // equal to the price so this cannot underflow.\n uint256 bidExcess = _bidAmount - price;\n\n // Return the funds. Similar to the previous transfer, this is\n // not susceptible to a re-entry attack because the auction is\n // removed before any transfers occur.\n msg.sender.transfer(bidExcess);\n\n // Tell the world!\n AuctionSuccessful(_tokenId, price, msg.sender);\n\n return price;\n }\n\n /// @dev Removes an auction from the list of open auctions.\n /// @param _tokenId - ID of NFT on auction.\n function _removeAuction(uint256 _tokenId) internal {\n delete tokenIdToAuction[_tokenId];\n }\n\n /// @dev Returns true if the NFT is on auction.\n /// @param _auction - Auction to check.\n function _isOnAuction(Auction storage _auction) internal view returns (bool) {\n return (_auction.startedAt > 0);\n }\n\n /// @dev Returns current price of an NFT on auction. Broken into two\n /// functions (this one, that computes the duration from the auction\n /// structure, and the other that does the price computation) so we\n /// can easily test that the price computation works correctly.\n function _currentPrice(Auction storage _auction)\n internal\n view\n returns (uint256)\n {\n uint256 secondsPassed = 0;\n\n // A bit of insurance against negative values (or wraparound).\n // Probably not necessary (since Ethereum guarnatees that the\n // now variable doesn't ever go backwards).\n if (now > _auction.startedAt) {\n secondsPassed = now - _auction.startedAt;\n }\n\n return _computeCurrentPrice(\n _auction.startingPrice,\n _auction.endingPrice,\n _auction.duration,\n secondsPassed\n );\n }\n\n /// @dev Computes the current price of an auction. Factored out\n /// from _currentPrice so we can run extensive unit tests.\n /// When testing, make this function public and turn on\n /// `Current price computation` test suite.\n function _computeCurrentPrice(\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n uint256 _secondsPassed\n )\n internal\n pure\n returns (uint256)\n {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our public functions carefully cap the maximum values for\n // time (at 64-bits) and currency (at 128-bits). _duration is\n // also known to be non-zero (see the require() statement in\n // _addAuction())\n if (_secondsPassed >= _duration) {\n // We've reached the end of the dynamic pricing portion\n // of the auction, just return the end price.\n return _endingPrice;\n } else {\n // Starting price can be higher than ending price (and often is!), so\n // this delta can be negative.\n int256 totalPriceChange = int256(_endingPrice) - int256(_startingPrice);\n\n // This multiplication can't overflow, _secondsPassed will easily fit within\n // 64-bits, and totalPriceChange will easily fit within 128-bits, their product\n // will always fit within 256-bits.\n int256 currentPriceChange = totalPriceChange * int256(_secondsPassed) / int256(_duration);\n\n // currentPriceChange can be negative, but if so, will have a magnitude\n // less that _startingPrice. Thus, this result will always end up positive.\n int256 currentPrice = int256(_startingPrice) + currentPriceChange;\n\n return uint256(currentPrice);\n }\n }\n\n /// @dev Computes owner's cut of a sale.\n /// @param _price - Sale price of NFT.\n function _computeCut(uint256 _price) internal view returns (uint256) {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our entry functions carefully cap the maximum values for\n // currency (at 128-bits), and ownerCut <= 10000 (see the require()\n // statement in the ClockAuction constructor). The result of this\n // function is always guaranteed to be <= _price.\n return _price * ownerCut / 10000;\n }\n\n}\n\n\n\n\n\n\n\n/**\n * @title KittiesPausable\n * @dev Base contract which allows children to implement an emergency stop mechanism.\n */\ncontract KittiesPausable is KittiesOwnable {\n event Pause();\n event Unpause();\n\n bool public paused = false;\n\n\n /**\n\t * @dev modifier to allow actions only when the contract IS paused\n\t */\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /**\n\t * @dev modifier to allow actions only when the contract IS NOT paused\n\t */\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /**\n\t * @dev called by the owner to pause, triggers stopped state\n\t */\n function pause() onlyOwner whenNotPaused returns (bool) {\n paused = true;\n Pause();\n return true;\n }\n\n /**\n\t * @dev called by the owner to unpause, returns to normal state\n\t */\n function unpause() onlyOwner whenPaused returns (bool) {\n paused = false;\n Unpause();\n return true;\n }\n}\n\n\n/// @title Clock auction for non-fungible tokens.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuction is KittiesPausable, ClockAuctionBase {\n\n /// @dev The ERC-165 interface signature for ERC-721.\n /// Ref: https://github.com/ethereum/EIPs/issues/165\n /// Ref: https://github.com/ethereum/EIPs/issues/721\n bytes4 constant InterfaceSignature_ERC721 = bytes4(0x9a20483d);\n\n /// @dev Constructor creates a reference to the NFT ownership contract\n /// and verifies the owner cut is in the valid range.\n /// @param _nftAddress - address of a deployed contract implementing\n /// the Nonfungible Interface.\n /// @param _cut - percent cut the owner takes on each auction, must be\n /// between 0-10,000.\n function ClockAuction(address _nftAddress, uint256 _cut) public {\n require(_cut <= 10000);\n ownerCut = _cut;\n\n KittiesERC721 candidateContract = KittiesERC721(_nftAddress);\n require(candidateContract.supportsInterface(InterfaceSignature_ERC721));\n nonFungibleContract = candidateContract;\n }\n\n /// @dev Remove all Ether from the contract, which is the owner's cuts\n /// as well as any Ether sent directly to the contract address.\n /// Always transfers to the NFT contract, but can be called either by\n /// the owner or the NFT contract.\n function withdrawBalance() external {\n address nftAddress = address(nonFungibleContract);\n\n require(\n msg.sender == owner ||\n msg.sender == nftAddress\n );\n // We are using this boolean method to make sure that even if one fails it will still work\n bool res = nftAddress.send(this.balance);\n }\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of time to move between starting\n /// price and ending price (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n whenNotPaused\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(_owns(msg.sender, _tokenId));\n _escrow(msg.sender, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Bids on an open auction, completing the auction and transferring\n /// ownership of the NFT if enough Ether is supplied.\n /// @param _tokenId - ID of token to bid on.\n function bid(uint256 _tokenId)\n external\n payable\n whenNotPaused\n {\n // _bid will throw if the bid or funds transfer fails\n _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n }\n\n /// @dev Cancels an auction that hasn't been won yet.\n /// Returns the NFT to original owner.\n /// @notice This is a state-modifying function that can\n /// be called while the contract is paused.\n /// @param _tokenId - ID of token on auction\n function cancelAuction(uint256 _tokenId)\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n address seller = auction.seller;\n require(msg.sender == seller);\n _cancelAuction(_tokenId, seller);\n }\n\n /// @dev Cancels an auction when the contract is paused.\n /// Only the owner may do this, and NFTs are returned to\n /// the seller. This should only be used in emergencies.\n /// @param _tokenId - ID of the NFT on auction to cancel.\n function cancelAuctionWhenPaused(uint256 _tokenId)\n whenPaused\n onlyOwner\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n _cancelAuction(_tokenId, auction.seller);\n }\n\n /// @dev Returns auction info for an NFT on auction.\n /// @param _tokenId - ID of NFT on auction.\n function getAuction(uint256 _tokenId)\n external\n view\n returns\n (\n address seller,\n uint256 startingPrice,\n uint256 endingPrice,\n uint256 duration,\n uint256 startedAt\n ) {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return (\n auction.seller,\n auction.startingPrice,\n auction.endingPrice,\n auction.duration,\n auction.startedAt\n );\n }\n\n /// @dev Returns the current price of an auction.\n /// @param _tokenId - ID of the token price we are checking.\n function getCurrentPrice(uint256 _tokenId)\n external\n view\n returns (uint256)\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return _currentPrice(auction);\n }\n\n}\n\n\n/// @title Reverse auction modified for siring\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SiringClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSiringAuctionAddress() call.\n bool public isSiringClockAuction = true;\n\n // Delegate constructor\n function SiringClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction. Since this function is wrapped,\n /// require sender to be KittyCore contract.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Places a bid for siring. Requires the sender\n /// is the KittyCore contract because all bid methods\n /// should be wrapped. Also returns the kitty to the\n /// seller rather than the winner.\n function bid(uint256 _tokenId)\n external\n payable\n {\n require(msg.sender == address(nonFungibleContract));\n address seller = tokenIdToAuction[_tokenId].seller;\n // _bid checks that token ID is valid and will throw if bid fails\n _bid(_tokenId, msg.value);\n // We transfer the kitty back to the seller, the winner will get\n // the offspring\n _transfer(seller, _tokenId);\n }\n\n}\n\n\n\n\n\n/// @title Clock auction modified for sale of kitties\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SaleClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSaleAuctionAddress() call.\n bool public isSaleClockAuction = true;\n\n // Tracks last 5 sale price of gen0 kitty sales\n uint256 public gen0SaleCount;\n uint256[5] public lastGen0SalePrices;\n\n // Delegate constructor\n function SaleClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Updates lastSalePrice if seller is the nft contract\n /// Otherwise, works the same as default bid method.\n function bid(uint256 _tokenId)\n external\n payable\n {\n // _bid verifies token ID size\n address seller = tokenIdToAuction[_tokenId].seller;\n uint256 price = _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n\n // If not a gen0 auction, exit\n if (seller == address(nonFungibleContract)) {\n // Track gen0 sale prices\n lastGen0SalePrices[gen0SaleCount % 5] = price;\n gen0SaleCount++;\n }\n }\n\n function averageGen0SalePrice() external view returns (uint256) {\n uint256 sum = 0;\n for (uint256 i = 0; i < 5; i++) {\n sum += lastGen0SalePrices[i];\n }\n return sum / 5;\n }\n\n}\n\n\n/// @title Handles creating auctions for sale and siring of kitties.\n/// This wrapper of ReverseAuction exists only so that users can create\n/// auctions with only one transaction.\ncontract KittyAuction is KittyBreeding {\n\n // @notice The auction contract variables are defined in KittyBase to allow\n // us to refer to them in KittyOwnership to prevent accidental transfers.\n // `saleAuction` refers to the auction for gen0 and p2p sale of kitties.\n // `siringAuction` refers to the auction for siring rights of kitties.\n\n /// @dev Sets the reference to the sale auction.\n /// @param _address - Address of sale contract.\n function setSaleAuctionAddress(address _address) external onlyCEO {\n SaleClockAuction candidateContract = SaleClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSaleClockAuction());\n\n // Set the new contract address\n saleAuction = candidateContract;\n }\n\n /// @dev Sets the reference to the siring auction.\n /// @param _address - Address of siring contract.\n function setSiringAuctionAddress(address _address) external onlyCEO {\n SiringClockAuction candidateContract = SiringClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSiringClockAuction());\n\n // Set the new contract address\n siringAuction = candidateContract;\n }\n\n /// @dev Put a kitty up for auction.\n /// Does some ownership trickery to create auctions in one tx.\n function createSaleAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n // Ensure the kitty is not pregnant to prevent the auction\n // contract accidentally receiving ownership of the child.\n // NOTE: the kitty IS allowed to be in a cooldown.\n require(!isPregnant(_kittyId));\n _approve(_kittyId, saleAuction);\n // Sale auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n saleAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Put a kitty up for auction to be sire.\n /// Performs checks to ensure the kitty can be sired, then\n /// delegates to reverse auction.\n function createSiringAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n require(isReadyToBreed(_kittyId));\n _approve(_kittyId, siringAuction);\n // Siring auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n siringAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Completes a siring auction by bidding.\n /// Immediately breeds the winning matron with the sire on auction.\n /// @param _sireId - ID of the sire on auction.\n /// @param _matronId - ID of the matron owned by the bidder.\n function bidOnSiringAuction(\n uint256 _sireId,\n uint256 _matronId\n )\n external\n payable\n whenNotPaused\n {\n // Auction contract checks input sizes\n require(_owns(msg.sender, _matronId));\n require(isReadyToBreed(_matronId));\n require(_canBreedWithViaAuction(_matronId, _sireId));\n\n // Define the current price of the auction.\n uint256 currentPrice = siringAuction.getCurrentPrice(_sireId);\n require(msg.value >= currentPrice + autoBirthFee);\n\n // Siring auction will throw if the bid fails.\n siringAuction.bid.value(msg.value - autoBirthFee)(_sireId);\n _breedWith(uint32(_matronId), uint32(_sireId));\n }\n\n /// @dev Transfers the balance of the sale auction contract\n /// to the KittyCore contract. We use two-step withdrawal to\n /// prevent two transfer calls in the auction bid function.\n function withdrawAuctionBalances() external onlyCLevel {\n saleAuction.withdrawBalance();\n siringAuction.withdrawBalance();\n }\n}\n\n\n/// @title all functions related to creating kittens\ncontract KittyMinting is KittyAuction {\n\n // Limits the number of cats the contract owner can ever create.\n uint256 public constant PROMO_CREATION_LIMIT = 5000;\n uint256 public constant GEN0_CREATION_LIMIT = 45000;\n\n // Constants for gen0 auctions.\n uint256 public constant GEN0_STARTING_PRICE = 10 finney;\n uint256 public constant GEN0_AUCTION_DURATION = 1 days;\n\n // Counts the number of cats the contract owner has created.\n uint256 public promoCreatedCount;\n uint256 public gen0CreatedCount;\n\n /// @dev we can create promo kittens, up to a limit. Only callable by COO\n /// @param _genes the encoded genes of the kitten to be created, any value is accepted\n /// @param _owner the future owner of the created kittens. Default to contract COO\n function createPromoKitty(uint256 _genes, address _owner) external onlyCOO {\n address kittyOwner = _owner;\n if (kittyOwner == address(0)) {\n kittyOwner = cooAddress;\n }\n require(promoCreatedCount < PROMO_CREATION_LIMIT);\n\n promoCreatedCount++;\n _createKitty(0, 0, 0, _genes, kittyOwner);\n }\n\n /// @dev Creates a new gen0 kitty with the given genes and\n /// creates an auction for it.\n function createGen0Auction(uint256 _genes) external onlyCOO {\n require(gen0CreatedCount < GEN0_CREATION_LIMIT);\n\n uint256 kittyId = _createKitty(0, 0, 0, _genes, address(this));\n _approve(kittyId, saleAuction);\n\n saleAuction.createAuction(\n kittyId,\n _computeNextGen0Price(),\n 0,\n GEN0_AUCTION_DURATION,\n address(this)\n );\n\n gen0CreatedCount++;\n }\n\n /// @dev Computes the next gen0 auction starting price, given\n /// the average of the past 5 prices + 50%.\n function _computeNextGen0Price() internal view returns (uint256) {\n uint256 avePrice = saleAuction.averageGen0SalePrice();\n\n // Sanity check to ensure we don't overflow arithmetic\n require(avePrice == uint256(uint128(avePrice)));\n\n uint256 nextPrice = avePrice + (avePrice / 2);\n\n // We never auction for less than starting price\n if (nextPrice < GEN0_STARTING_PRICE) {\n nextPrice = GEN0_STARTING_PRICE;\n }\n\n return nextPrice;\n }\n}\n\n\n/// @title CryptoKitties: Collectible, breedable, and oh-so-adorable cats on the Ethereum blockchain.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev The main CryptoKitties contract, keeps track of kittens so they don't wander around and get lost.\ncontract KittyCore is KittyMinting {\n\n // This is the main CryptoKitties contract. In order to keep our code seperated into logical sections,\n // we've broken it up in two ways. First, we have several seperately-instantiated sibling contracts\n // that handle auctions and our super-top-secret genetic combination algorithm. The auctions are\n // seperate since their logic is somewhat complex and there's always a risk of subtle bugs. By keeping\n // them in their own contracts, we can upgrade them without disrupting the main contract that tracks\n // kitty ownership. The genetic combination algorithm is kept seperate so we can open-source all of\n // the rest of our code without making it _too_ easy for folks to figure out how the genetics work.\n // Don't worry, I'm sure someone will reverse engineer it soon enough!\n //\n // Secondly, we break the core contract into multiple files using inheritence, one for each major\n // facet of functionality of CK. This allows us to keep related code bundled together while still\n // avoiding a single giant file with everything in it. The breakdown is as follows:\n //\n // - KittyBase: This is where we define the most fundamental code shared throughout the core\n // functionality. This includes our main data storage, constants and data types, plus\n // internal functions for managing these items.\n //\n // - KittyAccessControl: This contract manages the various addresses and constraints for operations\n // that can be executed only by specific roles. Namely CEO, CFO and COO.\n //\n // - KittyOwnership: This provides the methods required for basic non-fungible token\n // transactions, following the draft ERC-721 spec (https://github.com/ethereum/EIPs/issues/721).\n //\n // - KittyBreeding: This file contains the methods necessary to breed cats together, including\n // keeping track of siring offers, and relies on an external genetic combination contract.\n //\n // - KittyAuctions: Here we have the public methods for auctioning or bidding on cats or siring\n // services. The actual auction functionality is handled in two sibling contracts (one\n // for sales and one for siring), while auction creation and bidding is mostly mediated\n // through this facet of the core contract.\n //\n // - KittyMinting: This final facet contains the functionality we use for creating new gen0 cats.\n // We can make up to 5000 \"promo\" cats that can be given away (especially important when\n // the community is new), and all others can only be created and then immediately put up\n // for auction via an algorithmically determined starting price. Regardless of how they\n // are created, there is a hard limit of 50k gen0 cats. After that, it's all up to the\n // community to breed, breed, breed!\n\n // Set in case the core contract is broken and an upgrade is required\n address public newContractAddress;\n\n /// @notice Creates the main CryptoKitties smart contract instance.\n function KittyCore() public {\n // Starts paused.\n paused = true;\n\n // the creator of the contract is the initial CEO\n ceoAddress = msg.sender;\n\n // the creator of the contract is also the initial COO\n cooAddress = msg.sender;\n\n // start with the mythical kitten 0 - so we don't have generation-0 parent issues\n _createKitty(0, 0, 0, uint256(-1), address(0));\n }\n\n /// @dev Used to mark the smart contract as upgraded, in case there is a serious\n /// breaking bug. This method does nothing but keep track of the new contract and\n /// emit a message indicating that the new address is set. It's up to clients of this\n /// contract to update to the new contract address in that case. (This contract will\n /// be paused indefinitely if such an upgrade takes place.)\n /// @param _v2Address new address\n function setNewAddress(address _v2Address) external onlyCEO whenPaused {\n // See README.md for updgrade plan\n newContractAddress = _v2Address;\n ContractUpgrade(_v2Address);\n }\n\n /// @notice No tipping!\n /// @dev Reject all Ether from being sent here, unless it's from one of the\n /// two auction contracts. (Hopefully, we can prevent user accidents.)\n function() external payable {\n require(\n msg.sender == address(saleAuction) ||\n msg.sender == address(siringAuction)\n );\n }\n\n /// @notice Returns all the relevant information about a specific kitty.\n /// @param _id The ID of the kitty of interest.\n function getKitty(uint256 _id)\n external\n view\n returns (\n bool isGestating,\n bool isReady,\n uint256 cooldownIndex,\n uint256 nextActionAt,\n uint256 siringWithId,\n uint256 birthTime,\n uint256 matronId,\n uint256 sireId,\n uint256 generation,\n uint256 genes\n ) {\n Kitty storage kit = kitties[_id];\n\n // if this variable is 0 then it's not gestating\n isGestating = (kit.siringWithId != 0);\n isReady = (kit.cooldownEndBlock <= block.number);\n cooldownIndex = uint256(kit.cooldownIndex);\n nextActionAt = uint256(kit.cooldownEndBlock);\n siringWithId = uint256(kit.siringWithId);\n birthTime = uint256(kit.birthTime);\n matronId = uint256(kit.matronId);\n sireId = uint256(kit.sireId);\n generation = uint256(kit.generation);\n genes = kit.genes;\n }\n\n /// @dev Override unpause so it requires all external contract addresses\n /// to be set before contract can be unpaused. Also, we can't have\n /// newContractAddress set either, because then the contract was upgraded.\n /// @notice This is public rather than external so we can call super.unpause\n /// without using an expensive CALL.\n function unpause() public onlyCEO whenPaused {\n require(saleAuction != address(0));\n require(siringAuction != address(0));\n require(geneScience != address(0));\n require(newContractAddress == address(0));\n\n // Actually unpause the contract.\n super.unpause();\n }\n\n // @dev Allows the CFO to capture the balance available to the contract.\n function withdrawBalance() external onlyCFO {\n uint256 balance = this.balance;\n // Subtract all the currently pregnant kittens we have, plus 1 of margin.\n uint256 subtractFees = (pregnantKitties + 1) * autoBirthFee;\n\n if (balance > subtractFees) {\n cfoAddress.send(balance - subtractFees);\n }\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "exportedSymbols": { "ClockAuction": [ 8872 @@ -51725,5 +51725,5 @@ export const KittiesPausable = }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:47.731Z" + "updatedAt": "2018-10-09T17:45:35.995Z" } \ No newline at end of file diff --git a/artifacts/ts/KittyAccessControl.ts b/artifacts/ts/KittyAccessControl.ts index 91c2c52f..7446404d 100644 --- a/artifacts/ts/KittyAccessControl.ts +++ b/artifacts/ts/KittyAccessControl.ts @@ -131,15 +131,15 @@ export const KittyAccessControl = "type": "event" } ], - "bytecode": "0x60606040526000600260146101000a81548160ff021916908315150217905550341561002a57600080fd5b6107b6806100396000396000f300606060405260043610610099576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630519ce791461009e5780630a0f8168146100f357806327d7874c146101485780632ba73c15146101815780633f4ba83a146101ba5780634e0a3379146101cf5780635c975abb146102085780638456cb5914610235578063b047fb501461024a575b600080fd5b34156100a957600080fd5b6100b161029f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156100fe57600080fd5b6101066102c5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015357600080fd5b61017f600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506102ea565b005b341561018c57600080fd5b6101b8600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506103c4565b005b34156101c557600080fd5b6101cd61049f565b005b34156101da57600080fd5b610206600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610532565b005b341561021357600080fd5b61021b61060d565b604051808215151515815260200191505060405180910390f35b341561024057600080fd5b610248610620565b005b341561025557600080fd5b61025d610764565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561034557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561038157600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561041f57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561045b57600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156104fa57600080fd5b600260149054906101000a900460ff16151561051557600080fd5b6000600260146101000a81548160ff021916908315150217905550565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561058d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156105c957600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260149054906101000a900460ff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806106c857506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806107205750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561072b57600080fd5b600260149054906101000a900460ff1615151561074757600080fd5b6001600260146101000a81548160ff021916908315150217905550565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16815600a165627a7a72305820cd4133fc2e0889f8acb53d4100ca4f2479c52e9d83148866e1ffd448d30010210029", - "deployedBytecode": "0x606060405260043610610099576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630519ce791461009e5780630a0f8168146100f357806327d7874c146101485780632ba73c15146101815780633f4ba83a146101ba5780634e0a3379146101cf5780635c975abb146102085780638456cb5914610235578063b047fb501461024a575b600080fd5b34156100a957600080fd5b6100b161029f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156100fe57600080fd5b6101066102c5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015357600080fd5b61017f600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506102ea565b005b341561018c57600080fd5b6101b8600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506103c4565b005b34156101c557600080fd5b6101cd61049f565b005b34156101da57600080fd5b610206600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610532565b005b341561021357600080fd5b61021b61060d565b604051808215151515815260200191505060405180910390f35b341561024057600080fd5b610248610620565b005b341561025557600080fd5b61025d610764565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561034557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561038157600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561041f57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561045b57600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156104fa57600080fd5b600260149054906101000a900460ff16151561051557600080fd5b6000600260146101000a81548160ff021916908315150217905550565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561058d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156105c957600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260149054906101000a900460ff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806106c857506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806107205750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561072b57600080fd5b600260149054906101000a900460ff1615151561074757600080fd5b6001600260146101000a81548160ff021916908315150217905550565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16815600a165627a7a72305820cd4133fc2e0889f8acb53d4100ca4f2479c52e9d83148866e1ffd448d30010210029", + "bytecode": "0x60606040526000600260146101000a81548160ff021916908315150217905550341561002a57600080fd5b6107b6806100396000396000f300606060405260043610610099576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630519ce791461009e5780630a0f8168146100f357806327d7874c146101485780632ba73c15146101815780633f4ba83a146101ba5780634e0a3379146101cf5780635c975abb146102085780638456cb5914610235578063b047fb501461024a575b600080fd5b34156100a957600080fd5b6100b161029f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156100fe57600080fd5b6101066102c5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015357600080fd5b61017f600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506102ea565b005b341561018c57600080fd5b6101b8600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506103c4565b005b34156101c557600080fd5b6101cd61049f565b005b34156101da57600080fd5b610206600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610532565b005b341561021357600080fd5b61021b61060d565b604051808215151515815260200191505060405180910390f35b341561024057600080fd5b610248610620565b005b341561025557600080fd5b61025d610764565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561034557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561038157600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561041f57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561045b57600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156104fa57600080fd5b600260149054906101000a900460ff16151561051557600080fd5b6000600260146101000a81548160ff021916908315150217905550565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561058d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156105c957600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260149054906101000a900460ff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806106c857506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806107205750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561072b57600080fd5b600260149054906101000a900460ff1615151561074757600080fd5b6001600260146101000a81548160ff021916908315150217905550565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16815600a165627a7a72305820a078f20abeb0a31e679849f8b744548ecc45258ebe780cb120ef7af5de7874610029", + "deployedBytecode": "0x606060405260043610610099576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630519ce791461009e5780630a0f8168146100f357806327d7874c146101485780632ba73c15146101815780633f4ba83a146101ba5780634e0a3379146101cf5780635c975abb146102085780638456cb5914610235578063b047fb501461024a575b600080fd5b34156100a957600080fd5b6100b161029f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156100fe57600080fd5b6101066102c5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015357600080fd5b61017f600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506102ea565b005b341561018c57600080fd5b6101b8600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506103c4565b005b34156101c557600080fd5b6101cd61049f565b005b34156101da57600080fd5b610206600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610532565b005b341561021357600080fd5b61021b61060d565b604051808215151515815260200191505060405180910390f35b341561024057600080fd5b610248610620565b005b341561025557600080fd5b61025d610764565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561034557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561038157600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561041f57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561045b57600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156104fa57600080fd5b600260149054906101000a900460ff16151561051557600080fd5b6000600260146101000a81548160ff021916908315150217905550565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561058d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156105c957600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260149054906101000a900460ff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806106c857506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806107205750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561072b57600080fd5b600260149054906101000a900460ff1615151561074757600080fd5b6001600260146101000a81548160ff021916908315150217905550565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16815600a165627a7a72305820a078f20abeb0a31e679849f8b744548ecc45258ebe780cb120ef7af5de7874610029", "sourceMap": "3422:4065:18:-;;;5032:5;5011:26;;;;;;;;;;;;;;;;;;;;3422:4065;;;;;;;;;;;;;;", "deployedSourceMap": "3422:4065:18:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4848:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4817;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5800:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;6346;;;;;;;;;;;;;;;;;;;;;;;;;;;;7359:126;;;;;;;;;;;;;;6073:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;5011:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6990:81;;;;;;;;;;;;;;4879:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4848;;;;;;;;;;;;;:::o;4817:::-;;;;;;;;;;;;;:::o;5800:128::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;5887:1;5868:21;;:7;:21;;;;5860:30;;;;;;;;5914:7;5901:10;;:20;;;;;;;;;;;;;;;;;;5800:128;:::o;6346:::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;6433:1;6414:21;;:7;:21;;;;6406:30;;;;;;;;6460:7;6447:10;;:20;;;;;;;;;;;;;;;;;;6346:128;:::o;7359:126::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;6812:6;;;;;;;;;;;6804:15;;;;;;;;7473:5;7464:6;;:14;;;;;;;;;;;;;;;;;;7359:126::o;6073:128::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;6160:1;6141:21;;:7;:21;;;;6133:30;;;;;;;;6187:7;6174:10;;:20;;;;;;;;;;;;;;;;;;6073:128;:::o;5011:26::-;;;;;;;;;;;;;:::o;6990:81::-;5537:10;;;;;;;;;;;5523:24;;:10;:24;;;:64;;;;5577:10;;;;;;;;;;;5563:24;;:10;:24;;;5523:64;:104;;;;5617:10;;;;;;;;;;;5603:24;;:10;:24;;;5523:104;5502:135;;;;;;;;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;7060:4;7051:6;;:13;;;;;;;;;;;;;;;;;;6990:81::o;4879:25::-;;;;;;;;;;;;;:::o", "source": "pragma solidity 0.4.18;\n\n/**\n The following contract code, titled KittyCore, was written by Cryptokitties and published\n and retrieved from https://etherscan.io/address/0x06012c8cf97bead5deae237070f9587f8e7a266d#code.\n\n It is included in the current project for test purposes, to ensure that our collateralizer can\n handle ERC721 tokens created by the KittyCore contract.\n*/\n\n/**\n * @title KittiesOwnable\n * @dev The KittiesOwnable contract has an owner address, and provides basic authorization control\n * functions, this simplifies the implementation of \"user permissions\".\n */\ncontract KittiesOwnable {\n address public owner;\n\n\n /**\n\t * @dev The KittiesOwnable constructor sets the original `owner` of the contract to the sender\n\t * account.\n\t */\n function KittiesOwnable() {\n owner = msg.sender;\n }\n\n\n /**\n\t * @dev Throws if called by any account other than the owner.\n\t */\n modifier onlyOwner() {\n require(msg.sender == owner);\n _;\n }\n\n\n /**\n\t * @dev Allows the current owner to transfer control of the contract to a newOwner.\n\t * @param newOwner The address to transfer ownership to.\n\t */\n function transferOwnership(address newOwner) onlyOwner {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n\n}\n\n\n\n/// @title Interface for contracts conforming to ERC-721: Non-Fungible Tokens\n/// @author Dieter Shirley (https://github.com/dete)\ncontract KittiesERC721 {\n // Required methods\n function totalSupply() public view returns (uint256 total);\n function balanceOf(address _owner) public view returns (uint256 balance);\n function ownerOf(uint256 _tokenId) external view returns (address owner);\n function approve(address _to, uint256 _tokenId) external;\n function transfer(address _to, uint256 _tokenId) external;\n function transferFrom(address _from, address _to, uint256 _tokenId) external;\n\n // Events\n event Transfer(address from, address to, uint256 tokenId);\n event Approval(address owner, address approved, uint256 tokenId);\n\n // Optional\n // function name() public view returns (string name);\n // function symbol() public view returns (string symbol);\n // function tokensOfOwner(address _owner) external view returns (uint256[] tokenIds);\n // function tokenMetadata(uint256 _tokenId, string _preferredTransport) public view returns (string infoUrl);\n\n // ERC-165 Compatibility (https://github.com/ethereum/EIPs/issues/165)\n function supportsInterface(bytes4 _interfaceID) external view returns (bool);\n}\n\n\n// // Auction wrapper functions\n\n\n// Auction wrapper functions\n\n\n\n\n\n\n\n/// @title SEKRETOOOO\ncontract GeneScienceInterface {\n /// @dev simply a boolean to indicate this is the contract we expect to be\n function isGeneScience() public pure returns (bool);\n\n /// @dev given genes of kitten 1 & 2, return a genetic combination - may have a random factor\n /// @param genes1 genes of mom\n /// @param genes2 genes of sire\n /// @return the genes that are supposed to be passed down the child\n function mixGenes(uint256 genes1, uint256 genes2, uint256 targetBlock) public returns (uint256);\n}\n\n\n\n\n\n\n\n/// @title A facet of KittyCore that manages special access privileges.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyAccessControl {\n // This facet controls access control for CryptoKitties. There are four roles managed here:\n //\n // - The CEO: The CEO can reassign other roles and change the addresses of our dependent smart\n // contracts. It is also the only role that can unpause the smart contract. It is initially\n // set to the address that created the smart contract in the KittyCore constructor.\n //\n // - The CFO: The CFO can withdraw funds from KittyCore and its auction contracts.\n //\n // - The COO: The COO can release gen0 kitties to auction, and mint promo cats.\n //\n // It should be noted that these roles are distinct without overlap in their access abilities, the\n // abilities listed for each role above are exhaustive. In particular, while the CEO can assign any\n // address to any role, the CEO address itself doesn't have the ability to act in those roles. This\n // restriction is intentional so that we aren't tempted to use the CEO address frequently out of\n // convenience. The less we use an address, the less likely it is that we somehow compromise the\n // account.\n\n /// @dev Emited when contract is upgraded - See README.md for updgrade plan\n event ContractUpgrade(address newContract);\n\n // The addresses of the accounts (or contracts) that can execute actions within each roles.\n address public ceoAddress;\n address public cfoAddress;\n address public cooAddress;\n\n // @dev Keeps track whether the contract is paused. When that is true, most actions are blocked\n bool public paused = false;\n\n /// @dev Access modifier for CEO-only functionality\n modifier onlyCEO() {\n require(msg.sender == ceoAddress);\n _;\n }\n\n /// @dev Access modifier for CFO-only functionality\n modifier onlyCFO() {\n require(msg.sender == cfoAddress);\n _;\n }\n\n /// @dev Access modifier for COO-only functionality\n modifier onlyCOO() {\n require(msg.sender == cooAddress);\n _;\n }\n\n modifier onlyCLevel() {\n require(\n msg.sender == cooAddress ||\n msg.sender == ceoAddress ||\n msg.sender == cfoAddress\n );\n _;\n }\n\n /// @dev Assigns a new address to act as the CEO. Only available to the current CEO.\n /// @param _newCEO The address of the new CEO\n function setCEO(address _newCEO) external onlyCEO {\n require(_newCEO != address(0));\n\n ceoAddress = _newCEO;\n }\n\n /// @dev Assigns a new address to act as the CFO. Only available to the current CEO.\n /// @param _newCFO The address of the new CFO\n function setCFO(address _newCFO) external onlyCEO {\n require(_newCFO != address(0));\n\n cfoAddress = _newCFO;\n }\n\n /// @dev Assigns a new address to act as the COO. Only available to the current CEO.\n /// @param _newCOO The address of the new COO\n function setCOO(address _newCOO) external onlyCEO {\n require(_newCOO != address(0));\n\n cooAddress = _newCOO;\n }\n\n /*** KittiesPausable functionality adapted from OpenZeppelin ***/\n\n /// @dev Modifier to allow actions only when the contract IS NOT paused\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /// @dev Modifier to allow actions only when the contract IS paused\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /// @dev Called by any \"C-level\" role to pause the contract. Used only when\n /// a bug or exploit is detected and we need to limit damage.\n function pause() external onlyCLevel whenNotPaused {\n paused = true;\n }\n\n /// @dev Unpauses the smart contract. Can only be called by the CEO, since\n /// one reason we may pause the contract is when CFO or COO accounts are\n /// compromised.\n /// @notice This is public rather than external so it can be called by\n /// derived contracts.\n function unpause() public onlyCEO whenPaused {\n // can't unpause if contract was upgraded\n paused = false;\n }\n}\n\n\n\n\n/// @title Base contract for CryptoKitties. Holds all common structs, events and base variables.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBase is KittyAccessControl {\n /*** EVENTS ***/\n\n /// @dev The Birth event is fired whenever a new kitten comes into existence. This obviously\n /// includes any time a cat is created through the giveBirth method, but it is also called\n /// when a new gen0 cat is created.\n event Birth(address owner, uint256 kittyId, uint256 matronId, uint256 sireId, uint256 genes);\n\n /// @dev Transfer event as defined in current draft of ERC721. Emitted every time a kitten\n /// ownership is assigned, including births.\n event Transfer(address from, address to, uint256 tokenId);\n\n /*** DATA TYPES ***/\n\n /// @dev The main Kitty struct. Every cat in CryptoKitties is represented by a copy\n /// of this structure, so great care was taken to ensure that it fits neatly into\n /// exactly two 256-bit words. Note that the order of the members in this structure\n /// is important because of the byte-packing rules used by Ethereum.\n /// Ref: http://solidity.readthedocs.io/en/develop/miscellaneous.html\n struct Kitty {\n // The Kitty's genetic code is packed into these 256-bits, the format is\n // sooper-sekret! A cat's genes never change.\n uint256 genes;\n\n // The timestamp from the block when this cat came into existence.\n uint64 birthTime;\n\n // The minimum timestamp after which this cat can engage in breeding\n // activities again. This same timestamp is used for the pregnancy\n // timer (for matrons) as well as the siring cooldown.\n uint64 cooldownEndBlock;\n\n // The ID of the parents of this kitty, set to 0 for gen0 cats.\n // Note that using 32-bit unsigned integers limits us to a \"mere\"\n // 4 billion cats. This number might seem small until you realize\n // that Ethereum currently has a limit of about 500 million\n // transactions per year! So, this definitely won't be a problem\n // for several years (even as Ethereum learns to scale).\n uint32 matronId;\n uint32 sireId;\n\n // Set to the ID of the sire cat for matrons that are pregnant,\n // zero otherwise. A non-zero value here is how we know a cat\n // is pregnant. Used to retrieve the genetic material for the new\n // kitten when the birth transpires.\n uint32 siringWithId;\n\n // Set to the index in the cooldown array (see below) that represents\n // the current cooldown duration for this Kitty. This starts at zero\n // for gen0 cats, and is initialized to floor(generation/2) for others.\n // Incremented by one for each successful breeding action, regardless\n // of whether this cat is acting as matron or sire.\n uint16 cooldownIndex;\n\n // The \"generation number\" of this cat. Cats minted by the CK contract\n // for sale are called \"gen0\" and have a generation number of 0. The\n // generation number of all other cats is the larger of the two generation\n // numbers of their parents, plus one.\n // (i.e. max(matron.generation, sire.generation) + 1)\n uint16 generation;\n }\n\n /*** CONSTANTS ***/\n\n /// @dev A lookup table indicating the cooldown duration after any successful\n /// breeding action, called \"pregnancy time\" for matrons and \"siring cooldown\"\n /// for sires. Designed such that the cooldown roughly doubles each time a cat\n /// is bred, encouraging owners not to just keep breeding the same cat over\n /// and over again. Caps out at one week (a cat can breed an unbounded number\n /// of times, and the maximum cooldown is always seven days).\n uint32[14] public cooldowns = [\n uint32(1 minutes),\n uint32(2 minutes),\n uint32(5 minutes),\n uint32(10 minutes),\n uint32(30 minutes),\n uint32(1 hours),\n uint32(2 hours),\n uint32(4 hours),\n uint32(8 hours),\n uint32(16 hours),\n uint32(1 days),\n uint32(2 days),\n uint32(4 days),\n uint32(7 days)\n ];\n\n // An approximation of currently how many seconds are in between blocks.\n uint256 public secondsPerBlock = 15;\n\n /*** STORAGE ***/\n\n /// @dev An array containing the Kitty struct for all Kitties in existence. The ID\n /// of each cat is actually an index into this array. Note that ID 0 is a negacat,\n /// the unKitty, the mythical beast that is the parent of all gen0 cats. A bizarre\n /// creature that is both matron and sire... to itself! Has an invalid genetic code.\n /// In other words, cat ID 0 is invalid... ;-)\n Kitty[] kitties;\n\n /// @dev A mapping from cat IDs to the address that owns them. All cats have\n /// some valid owner address, even gen0 cats are created with a non-zero owner.\n mapping (uint256 => address) public kittyIndexToOwner;\n\n // @dev A mapping from owner address to count of tokens that address owns.\n // Used internally inside balanceOf() to resolve ownership count.\n mapping (address => uint256) ownershipTokenCount;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to call\n /// transferFrom(). Each Kitty can only have one approved address for transfer\n /// at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public kittyIndexToApproved;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to use\n /// this Kitty for siring via breedWith(). Each Kitty can only have one approved\n /// address for siring at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public sireAllowedToAddress;\n\n /// @dev The address of the ClockAuction contract that handles sales of Kitties. This\n /// same contract handles both peer-to-peer sales as well as the gen0 sales which are\n /// initiated every 15 minutes.\n SaleClockAuction public saleAuction;\n\n /// @dev The address of a custom ClockAuction subclassed contract that handles siring\n /// auctions. Needs to be separate from saleAuction because the actions taken on success\n /// after a sales and siring auction are quite different.\n SiringClockAuction public siringAuction;\n\n /// @dev Assigns ownership of a specific Kitty to an address.\n function _transfer(address _from, address _to, uint256 _tokenId) internal {\n // Since the number of kittens is capped to 2^32 we can't overflow this\n ownershipTokenCount[_to]++;\n // transfer ownership\n kittyIndexToOwner[_tokenId] = _to;\n // When creating new kittens _from is 0x0, but we can't account that address.\n if (_from != address(0)) {\n ownershipTokenCount[_from]--;\n // once the kitten is transferred also clear sire allowances\n delete sireAllowedToAddress[_tokenId];\n // clear any previously approved ownership exchange\n delete kittyIndexToApproved[_tokenId];\n }\n // Emit the transfer event.\n Transfer(_from, _to, _tokenId);\n }\n\n /// @dev An internal method that creates a new kitty and stores it. This\n /// method doesn't do any checking and should only be called when the\n /// input data is known to be valid. Will generate both a Birth event\n /// and a Transfer event.\n /// @param _matronId The kitty ID of the matron of this cat (zero for gen0)\n /// @param _sireId The kitty ID of the sire of this cat (zero for gen0)\n /// @param _generation The generation number of this cat, must be computed by caller.\n /// @param _genes The kitty's genetic code.\n /// @param _owner The inital owner of this cat, must be non-zero (except for the unKitty, ID 0)\n function _createKitty(\n uint256 _matronId,\n uint256 _sireId,\n uint256 _generation,\n uint256 _genes,\n address _owner\n )\n internal\n returns (uint)\n {\n // These requires are not strictly necessary, our calling code should make\n // sure that these conditions are never broken. However! _createKitty() is already\n // an expensive call (for storage), and it doesn't hurt to be especially careful\n // to ensure our data structures are always valid.\n require(_matronId == uint256(uint32(_matronId)));\n require(_sireId == uint256(uint32(_sireId)));\n require(_generation == uint256(uint16(_generation)));\n\n // New kitty starts with the same cooldown as parent gen/2\n uint16 cooldownIndex = uint16(_generation / 2);\n if (cooldownIndex > 13) {\n cooldownIndex = 13;\n }\n\n Kitty memory _kitty = Kitty({\n genes: _genes,\n birthTime: uint64(now),\n cooldownEndBlock: 0,\n matronId: uint32(_matronId),\n sireId: uint32(_sireId),\n siringWithId: 0,\n cooldownIndex: cooldownIndex,\n generation: uint16(_generation)\n });\n uint256 newKittenId = kitties.push(_kitty) - 1;\n\n // It's probably never going to happen, 4 billion cats is A LOT, but\n // let's just be 100% sure we never let this happen.\n require(newKittenId == uint256(uint32(newKittenId)));\n\n // emit the birth event\n Birth(\n _owner,\n newKittenId,\n uint256(_kitty.matronId),\n uint256(_kitty.sireId),\n _kitty.genes\n );\n\n // This will assign ownership, and also emit the Transfer event as\n // per ERC721 draft\n _transfer(0, _owner, newKittenId);\n\n return newKittenId;\n }\n\n // Any C-level can fix how many seconds per blocks are currently observed.\n function setSecondsPerBlock(uint256 secs) external onlyCLevel {\n require(secs < cooldowns[0]);\n secondsPerBlock = secs;\n }\n}\n\n\n\n\n\n/// @title The external contract that is responsible for generating metadata for the kitties,\n/// it has one function that will return the data as bytes.\ncontract KittiesERC721Metadata {\n /// @dev Given a token Id, returns a byte array that is supposed to be converted into string.\n function getMetadata(uint256 _tokenId, string) public view returns (bytes32[4] buffer, uint256 count) {\n if (_tokenId == 1) {\n buffer[0] = \"Hello World! :D\";\n count = 15;\n } else if (_tokenId == 2) {\n buffer[0] = \"I would definitely choose a medi\";\n buffer[1] = \"um length string.\";\n count = 49;\n } else if (_tokenId == 3) {\n buffer[0] = \"Lorem ipsum dolor sit amet, mi e\";\n buffer[1] = \"st accumsan dapibus augue lorem,\";\n buffer[2] = \" tristique vestibulum id, libero\";\n buffer[3] = \" suscipit varius sapien aliquam.\";\n count = 128;\n }\n }\n}\n\n\n/// @title The facet of the CryptoKitties core contract that manages ownership, ERC-721 (draft) compliant.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev Ref: https://github.com/ethereum/EIPs/issues/721\n/// See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyOwnership is KittyBase, KittiesERC721 {\n\n /// @notice Name and symbol of the non fungible token, as defined in ERC721.\n string public constant name = \"CryptoKitties\";\n string public constant symbol = \"CK\";\n\n // The contract that will return kitty metadata\n KittiesERC721Metadata public erc721Metadata;\n\n bytes4 constant InterfaceSignature_ERC165 =\n bytes4(keccak256('supportsInterface(bytes4)'));\n\n bytes4 constant InterfaceSignature_ERC721 =\n bytes4(keccak256('name()')) ^\n bytes4(keccak256('symbol()')) ^\n bytes4(keccak256('totalSupply()')) ^\n bytes4(keccak256('balanceOf(address)')) ^\n bytes4(keccak256('ownerOf(uint256)')) ^\n bytes4(keccak256('approve(address,uint256)')) ^\n bytes4(keccak256('transfer(address,uint256)')) ^\n bytes4(keccak256('transferFrom(address,address,uint256)')) ^\n bytes4(keccak256('tokensOfOwner(address)')) ^\n bytes4(keccak256('tokenMetadata(uint256,string)'));\n\n /// @notice Introspection interface as per ERC-165 (https://github.com/ethereum/EIPs/issues/165).\n /// Returns true for any standardized interfaces implemented by this contract. We implement\n /// ERC-165 (obviously!) and ERC-721.\n function supportsInterface(bytes4 _interfaceID) external view returns (bool)\n {\n // DEBUG ONLY\n //require((InterfaceSignature_ERC165 == 0x01ffc9a7) && (InterfaceSignature_ERC721 == 0x9a20483d));\n\n return ((_interfaceID == InterfaceSignature_ERC165) || (_interfaceID == InterfaceSignature_ERC721));\n }\n\n /// @dev Set the address of the sibling contract that tracks metadata.\n /// CEO only.\n function setMetadataAddress(address _contractAddress) public onlyCEO {\n erc721Metadata = KittiesERC721Metadata(_contractAddress);\n }\n\n // Internal utility functions: These functions all assume that their input arguments\n // are valid. We leave it to public methods to sanitize their inputs and follow\n // the required logic.\n\n /// @dev Checks if a given address is the current owner of a particular Kitty.\n /// @param _claimant the address we are validating against.\n /// @param _tokenId kitten id, only valid when > 0\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToOwner[_tokenId] == _claimant;\n }\n\n /// @dev Checks if a given address currently has transferApproval for a particular Kitty.\n /// @param _claimant the address we are confirming kitten is approved for.\n /// @param _tokenId kitten id, only valid when > 0\n function _approvedFor(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToApproved[_tokenId] == _claimant;\n }\n\n /// @dev Marks an address as being approved for transferFrom(), overwriting any previous\n /// approval. Setting _approved to address(0) clears all transfer approval.\n /// NOTE: _approve() does NOT send the Approval event. This is intentional because\n /// _approve() and transferFrom() are used together for putting Kitties on auction, and\n /// there is no value in spamming the log with Approval events in that case.\n function _approve(uint256 _tokenId, address _approved) internal {\n kittyIndexToApproved[_tokenId] = _approved;\n }\n\n /// @notice Returns the number of Kitties owned by a specific address.\n /// @param _owner The owner address to check.\n /// @dev Required for ERC-721 compliance\n function balanceOf(address _owner) public view returns (uint256 count) {\n return ownershipTokenCount[_owner];\n }\n\n /// @notice Transfers a Kitty to another address. If transferring to a smart\n /// contract be VERY CAREFUL to ensure that it is aware of ERC-721 (or\n /// CryptoKitties specifically) or your Kitty may be lost forever. Seriously.\n /// @param _to The address of the recipient, can be a user or contract.\n /// @param _tokenId The ID of the Kitty to transfer.\n /// @dev Required for ERC-721 compliance.\n function transfer(\n address _to,\n uint256 _tokenId\n )\n external\n whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Disallow transfers to the auction contracts to prevent accidental\n // misuse. Auction contracts should only take ownership of kitties\n // through the allow + transferFrom flow.\n require(_to != address(saleAuction));\n require(_to != address(siringAuction));\n\n // You can only send your own cat.\n require(_owns(msg.sender, _tokenId));\n\n // Reassign ownership, clear pending approvals, emit Transfer event.\n _transfer(msg.sender, _to, _tokenId);\n }\n\n /// @notice Grant another address the right to transfer a specific Kitty via\n /// transferFrom(). This is the preferred flow for transfering NFTs to contracts.\n /// @param _to The address to be granted transfer approval. Pass address(0) to\n /// clear all approvals.\n /// @param _tokenId The ID of the Kitty that can be transferred if this call succeeds.\n /// @dev Required for ERC-721 compliance.\n function approve(\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Only an owner can grant transfer approval.\n require(_owns(msg.sender, _tokenId));\n\n // Register the approval (replacing any previous approval).\n _approve(_tokenId, _to);\n\n // Emit approval event.\n Approval(msg.sender, _to, _tokenId);\n }\n\n /// @notice Transfer a Kitty owned by another address, for which the calling address\n /// has previously been granted transfer approval by the owner.\n /// @param _from The address that owns the Kitty to be transfered.\n /// @param _to The address that should take ownership of the Kitty. Can be any address,\n /// including the caller.\n /// @param _tokenId The ID of the Kitty to be transferred.\n /// @dev Required for ERC-721 compliance.\n function transferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Check for approval and valid ownership\n require(_approvedFor(msg.sender, _tokenId));\n require(_owns(_from, _tokenId));\n\n // Reassign ownership (also clears pending approvals and emits Transfer event).\n _transfer(_from, _to, _tokenId);\n }\n\n /// @notice Returns the total number of Kitties currently in existence.\n /// @dev Required for ERC-721 compliance.\n function totalSupply() public view returns (uint) {\n return kitties.length - 1;\n }\n\n /// @notice Returns the address currently assigned ownership of a given Kitty.\n /// @dev Required for ERC-721 compliance.\n function ownerOf(uint256 _tokenId)\n external\n view\n returns (address owner)\n {\n owner = kittyIndexToOwner[_tokenId];\n\n require(owner != address(0));\n }\n\n /// @notice Returns a list of all Kitty IDs assigned to an address.\n /// @param _owner The owner whose Kitties we are interested in.\n /// @dev This method MUST NEVER be called by smart contract code. First, it's fairly\n /// expensive (it walks the entire Kitty array looking for cats belonging to owner),\n /// but it also returns a dynamic array, which is only supported for web3 calls, and\n /// not contract-to-contract calls.\n function tokensOfOwner(address _owner) external view returns(uint256[] ownerTokens) {\n uint256 tokenCount = balanceOf(_owner);\n\n if (tokenCount == 0) {\n // Return an empty array\n return new uint256[](0);\n } else {\n uint256[] memory result = new uint256[](tokenCount);\n uint256 totalCats = totalSupply();\n uint256 resultIndex = 0;\n\n // We count on the fact that all cats have IDs starting at 1 and increasing\n // sequentially up to the totalCat count.\n uint256 catId;\n\n for (catId = 1; catId <= totalCats; catId++) {\n if (kittyIndexToOwner[catId] == _owner) {\n result[resultIndex] = catId;\n resultIndex++;\n }\n }\n\n return result;\n }\n }\n\n /// @dev Adapted from memcpy() by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _memcpy(uint _dest, uint _src, uint _len) private view {\n // Copy word-length chunks while possible\n for(; _len >= 32; _len -= 32) {\n assembly {\n mstore(_dest, mload(_src))\n }\n _dest += 32;\n _src += 32;\n }\n\n // Copy remaining bytes\n uint256 mask = 256 ** (32 - _len) - 1;\n assembly {\n let srcpart := and(mload(_src), not(mask))\n let destpart := and(mload(_dest), mask)\n mstore(_dest, or(destpart, srcpart))\n }\n }\n\n /// @dev Adapted from toString(slice) by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _toString(bytes32[4] _rawBytes, uint256 _stringLength) private view returns (string) {\n var outputString = new string(_stringLength);\n uint256 outputPtr;\n uint256 bytesPtr;\n\n assembly {\n outputPtr := add(outputString, 32)\n bytesPtr := _rawBytes\n }\n\n _memcpy(outputPtr, bytesPtr, _stringLength);\n\n return outputString;\n }\n\n /// @notice Returns a URI pointing to a metadata package for this token conforming to\n /// ERC-721 (https://github.com/ethereum/EIPs/issues/721)\n /// @param _tokenId The ID number of the Kitty whose metadata should be returned.\n function tokenMetadata(uint256 _tokenId, string _preferredTransport) external view returns (string infoUrl) {\n require(erc721Metadata != address(0));\n bytes32[4] memory buffer;\n uint256 count;\n (buffer, count) = erc721Metadata.getMetadata(_tokenId, _preferredTransport);\n\n return _toString(buffer, count);\n }\n}\n\n\n\n/// @title A facet of KittyCore that manages Kitty siring, gestation, and birth.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBreeding is KittyOwnership {\n\n /// @dev The Pregnant event is fired when two cats successfully breed and the pregnancy\n /// timer begins for the matron.\n event Pregnant(address owner, uint256 matronId, uint256 sireId, uint256 cooldownEndBlock);\n\n /// @notice The minimum payment required to use breedWithAuto(). This fee goes towards\n /// the gas cost paid by whatever calls giveBirth(), and can be dynamically updated by\n /// the COO role as the gas price changes.\n uint256 public autoBirthFee = 2 finney;\n\n // Keeps track of number of pregnant kitties.\n uint256 public pregnantKitties;\n\n /// @dev The address of the sibling contract that is used to implement the sooper-sekret\n /// genetic combination algorithm.\n GeneScienceInterface public geneScience;\n\n /// @dev Update the address of the genetic contract, can only be called by the CEO.\n /// @param _address An address of a GeneScience contract instance to be used from this point forward.\n function setGeneScienceAddress(address _address) external onlyCEO {\n GeneScienceInterface candidateContract = GeneScienceInterface(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isGeneScience());\n\n // Set the new contract address\n geneScience = candidateContract;\n }\n\n /// @dev Checks that a given kitten is able to breed. Requires that the\n /// current cooldown is finished (for sires) and also checks that there is\n /// no pending pregnancy.\n function _isReadyToBreed(Kitty _kit) internal view returns (bool) {\n // In addition to checking the cooldownEndBlock, we also need to check to see if\n // the cat has a pending birth; there can be some period of time between the end\n // of the pregnacy timer and the birth event.\n return (_kit.siringWithId == 0) && (_kit.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @dev Check if a sire has authorized breeding with this matron. True if both sire\n /// and matron have the same owner, or if the sire has given siring permission to\n /// the matron's owner (via approveSiring()).\n function _isSiringPermitted(uint256 _sireId, uint256 _matronId) internal view returns (bool) {\n address matronOwner = kittyIndexToOwner[_matronId];\n address sireOwner = kittyIndexToOwner[_sireId];\n\n // Siring is okay if they have same owner, or if the matron's owner was given\n // permission to breed with this sire.\n return (matronOwner == sireOwner || sireAllowedToAddress[_sireId] == matronOwner);\n }\n\n /// @dev Set the cooldownEndTime for the given Kitty, based on its current cooldownIndex.\n /// Also increments the cooldownIndex (unless it has hit the cap).\n /// @param _kitten A reference to the Kitty in storage which needs its timer started.\n function _triggerCooldown(Kitty storage _kitten) internal {\n // Compute an estimation of the cooldown time in blocks (based on current cooldownIndex).\n _kitten.cooldownEndBlock = uint64((cooldowns[_kitten.cooldownIndex]/secondsPerBlock) + block.number);\n\n // Increment the breeding count, clamping it at 13, which is the length of the\n // cooldowns array. We could check the array size dynamically, but hard-coding\n // this as a constant saves gas. Yay, Solidity!\n if (_kitten.cooldownIndex < 13) {\n _kitten.cooldownIndex += 1;\n }\n }\n\n /// @notice Grants approval to another user to sire with one of your Kitties.\n /// @param _addr The address that will be able to sire with your Kitty. Set to\n /// address(0) to clear all siring approvals for this Kitty.\n /// @param _sireId A Kitty that you own that _addr will now be able to sire with.\n function approveSiring(address _addr, uint256 _sireId)\n external\n whenNotPaused\n {\n require(_owns(msg.sender, _sireId));\n sireAllowedToAddress[_sireId] = _addr;\n }\n\n /// @dev Updates the minimum payment required for calling giveBirthAuto(). Can only\n /// be called by the COO address. (This fee is used to offset the gas cost incurred\n /// by the autobirth daemon).\n function setAutoBirthFee(uint256 val) external onlyCOO {\n autoBirthFee = val;\n }\n\n /// @dev Checks to see if a given Kitty is pregnant and (if so) if the gestation\n /// period has passed.\n function _isReadyToGiveBirth(Kitty _matron) private view returns (bool) {\n return (_matron.siringWithId != 0) && (_matron.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @notice Checks that a given kitten is able to breed (i.e. it is not pregnant or\n /// in the middle of a siring cooldown).\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isReadyToBreed(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n Kitty storage kit = kitties[_kittyId];\n return _isReadyToBreed(kit);\n }\n\n /// @dev Checks whether a kitty is currently pregnant.\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isPregnant(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n // A kitty is pregnant if and only if this field is set\n return kitties[_kittyId].siringWithId != 0;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair. DOES NOT\n /// check ownership permissions (that is up to the caller).\n /// @param _matron A reference to the Kitty struct of the potential matron.\n /// @param _matronId The matron's ID.\n /// @param _sire A reference to the Kitty struct of the potential sire.\n /// @param _sireId The sire's ID\n function _isValidMatingPair(\n Kitty storage _matron,\n uint256 _matronId,\n Kitty storage _sire,\n uint256 _sireId\n )\n private\n view\n returns(bool)\n {\n // A Kitty can't breed with itself!\n if (_matronId == _sireId) {\n return false;\n }\n\n // Kitties can't breed with their parents.\n if (_matron.matronId == _sireId || _matron.sireId == _sireId) {\n return false;\n }\n if (_sire.matronId == _matronId || _sire.sireId == _matronId) {\n return false;\n }\n\n // We can short circuit the sibling check (below) if either cat is\n // gen zero (has a matron ID of zero).\n if (_sire.matronId == 0 || _matron.matronId == 0) {\n return true;\n }\n\n // Kitties can't breed with full or half siblings.\n if (_sire.matronId == _matron.matronId || _sire.matronId == _matron.sireId) {\n return false;\n }\n if (_sire.sireId == _matron.matronId || _sire.sireId == _matron.sireId) {\n return false;\n }\n\n // Everything seems cool! Let's get DTF.\n return true;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair for\n /// breeding via auction (i.e. skips ownership and siring approval checks).\n function _canBreedWithViaAuction(uint256 _matronId, uint256 _sireId)\n internal\n view\n returns (bool)\n {\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId);\n }\n\n /// @notice Checks to see if two cats can breed together, including checks for\n /// ownership and siring approvals. Does NOT check that both cats are ready for\n /// breeding (i.e. breedWith could still fail until the cooldowns are finished).\n /// TODO: Shouldn't this check pregnancy and cooldowns?!?\n /// @param _matronId The ID of the proposed matron.\n /// @param _sireId The ID of the proposed sire.\n function canBreedWith(uint256 _matronId, uint256 _sireId)\n external\n view\n returns(bool)\n {\n require(_matronId > 0);\n require(_sireId > 0);\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId) &&\n _isSiringPermitted(_sireId, _matronId);\n }\n\n /// @dev Internal utility function to initiate breeding, assumes that all breeding\n /// requirements have been checked.\n function _breedWith(uint256 _matronId, uint256 _sireId) internal {\n // Grab a reference to the Kitties from storage.\n Kitty storage sire = kitties[_sireId];\n Kitty storage matron = kitties[_matronId];\n\n // Mark the matron as pregnant, keeping track of who the sire is.\n matron.siringWithId = uint32(_sireId);\n\n // Trigger the cooldown for both parents.\n _triggerCooldown(sire);\n _triggerCooldown(matron);\n\n // Clear siring permission for both parents. This may not be strictly necessary\n // but it's likely to avoid confusion!\n delete sireAllowedToAddress[_matronId];\n delete sireAllowedToAddress[_sireId];\n\n // Every time a kitty gets pregnant, counter is incremented.\n pregnantKitties++;\n\n // Emit the pregnancy event.\n Pregnant(kittyIndexToOwner[_matronId], _matronId, _sireId, matron.cooldownEndBlock);\n }\n\n /// @notice Breed a Kitty you own (as matron) with a sire that you own, or for which you\n /// have previously been given Siring approval. Will either make your cat pregnant, or will\n /// fail entirely. Requires a pre-payment of the fee given out to the first caller of giveBirth()\n /// @param _matronId The ID of the Kitty acting as matron (will end up pregnant if successful)\n /// @param _sireId The ID of the Kitty acting as sire (will begin its siring cooldown if successful)\n function breedWithAuto(uint256 _matronId, uint256 _sireId)\n external\n payable\n whenNotPaused\n {\n // Checks for payment.\n require(msg.value >= autoBirthFee);\n\n // Caller must own the matron.\n require(_owns(msg.sender, _matronId));\n\n // Neither sire nor matron are allowed to be on auction during a normal\n // breeding operation, but we don't need to check that explicitly.\n // For matron: The caller of this function can't be the owner of the matron\n // because the owner of a Kitty on auction is the auction house, and the\n // auction house will never call breedWith().\n // For sire: Similarly, a sire on auction will be owned by the auction house\n // and the act of transferring ownership will have cleared any oustanding\n // siring approval.\n // Thus we don't need to spend gas explicitly checking to see if either cat\n // is on auction.\n\n // Check that matron and sire are both owned by caller, or that the sire\n // has given siring permission to caller (i.e. matron's owner).\n // Will fail for _sireId = 0\n require(_isSiringPermitted(_sireId, _matronId));\n\n // Grab a reference to the potential matron\n Kitty storage matron = kitties[_matronId];\n\n // Make sure matron isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(matron));\n\n // Grab a reference to the potential sire\n Kitty storage sire = kitties[_sireId];\n\n // Make sure sire isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(sire));\n\n // Test that these cats are a valid mating pair.\n require(_isValidMatingPair(\n matron,\n _matronId,\n sire,\n _sireId\n ));\n\n // All checks passed, kitty gets pregnant!\n _breedWith(_matronId, _sireId);\n }\n\n /// @notice Have a pregnant Kitty give birth!\n /// @param _matronId A Kitty ready to give birth.\n /// @return The Kitty ID of the new kitten.\n /// @dev Looks at a given Kitty and, if pregnant and if the gestation period has passed,\n /// combines the genes of the two parents to create a new kitten. The new Kitty is assigned\n /// to the current owner of the matron. Upon successful completion, both the matron and the\n /// new kitten will be ready to breed again. Note that anyone can call this function (if they\n /// are willing to pay the gas!), but the new kitten always goes to the mother's owner.\n function giveBirth(uint256 _matronId)\n external\n whenNotPaused\n returns(uint256)\n {\n // Grab a reference to the matron in storage.\n Kitty storage matron = kitties[_matronId];\n\n // Check that the matron is a valid cat.\n require(matron.birthTime != 0);\n\n // Check that the matron is pregnant, and that its time has come!\n require(_isReadyToGiveBirth(matron));\n\n // Grab a reference to the sire in storage.\n uint256 sireId = matron.siringWithId;\n Kitty storage sire = kitties[sireId];\n\n // Determine the higher generation number of the two parents\n uint16 parentGen = matron.generation;\n if (sire.generation > matron.generation) {\n parentGen = sire.generation;\n }\n\n // Call the sooper-sekret gene mixing operation.\n uint256 childGenes = geneScience.mixGenes(matron.genes, sire.genes, matron.cooldownEndBlock - 1);\n\n // Make the new kitten!\n address owner = kittyIndexToOwner[_matronId];\n uint256 kittenId = _createKitty(_matronId, matron.siringWithId, parentGen + 1, childGenes, owner);\n\n // Clear the reference to sire from the matron (REQUIRED! Having siringWithId\n // set is what marks a matron as being pregnant.)\n delete matron.siringWithId;\n\n // Every time a kitty gives birth counter is decremented.\n pregnantKitties--;\n\n // Send the balance fee to the person who made birth happen.\n msg.sender.send(autoBirthFee);\n\n // return the new kitten's ID\n return kittenId;\n }\n}\n\n\n\n\n\n\n\n\n\n\n/// @title Auction Core\n/// @dev Contains models, variables, and internal methods for the auction.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuctionBase {\n\n // Represents an auction on an NFT\n struct Auction {\n // Current owner of NFT\n address seller;\n // Price (in wei) at beginning of auction\n uint128 startingPrice;\n // Price (in wei) at end of auction\n uint128 endingPrice;\n // Duration (in seconds) of auction\n uint64 duration;\n // Time when auction started\n // NOTE: 0 if this auction has been concluded\n uint64 startedAt;\n }\n\n // Reference to contract tracking NFT ownership\n KittiesERC721 public nonFungibleContract;\n\n // Cut owner takes on each auction, measured in basis points (1/100 of a percent).\n // Values 0-10,000 map to 0%-100%\n uint256 public ownerCut;\n\n // Map from token ID to their corresponding auction.\n mapping (uint256 => Auction) tokenIdToAuction;\n\n event AuctionCreated(uint256 tokenId, uint256 startingPrice, uint256 endingPrice, uint256 duration);\n event AuctionSuccessful(uint256 tokenId, uint256 totalPrice, address winner);\n event AuctionCancelled(uint256 tokenId);\n\n /// @dev Returns true if the claimant owns the token.\n /// @param _claimant - Address claiming to own the token.\n /// @param _tokenId - ID of token whose ownership to verify.\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return (nonFungibleContract.ownerOf(_tokenId) == _claimant);\n }\n\n /// @dev Escrows the NFT, assigning ownership to this contract.\n /// Throws if the escrow fails.\n /// @param _owner - Current owner address of token to escrow.\n /// @param _tokenId - ID of token whose approval to verify.\n function _escrow(address _owner, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transferFrom(_owner, this, _tokenId);\n }\n\n /// @dev Transfers an NFT owned by this contract to another address.\n /// Returns true if the transfer succeeds.\n /// @param _receiver - Address to transfer NFT to.\n /// @param _tokenId - ID of token to transfer.\n function _transfer(address _receiver, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transfer(_receiver, _tokenId);\n }\n\n /// @dev Adds an auction to the list of open auctions. Also fires the\n /// AuctionCreated event.\n /// @param _tokenId The ID of the token to be put on auction.\n /// @param _auction Auction to add.\n function _addAuction(uint256 _tokenId, Auction _auction) internal {\n // Require that all auctions have a duration of\n // at least one minute. (Keeps our math from getting hairy!)\n require(_auction.duration >= 1 minutes);\n\n tokenIdToAuction[_tokenId] = _auction;\n\n AuctionCreated(\n uint256(_tokenId),\n uint256(_auction.startingPrice),\n uint256(_auction.endingPrice),\n uint256(_auction.duration)\n );\n }\n\n /// @dev Cancels an auction unconditionally.\n function _cancelAuction(uint256 _tokenId, address _seller) internal {\n _removeAuction(_tokenId);\n _transfer(_seller, _tokenId);\n AuctionCancelled(_tokenId);\n }\n\n /// @dev Computes the price and transfers winnings.\n /// Does NOT transfer ownership of token.\n function _bid(uint256 _tokenId, uint256 _bidAmount)\n internal\n returns (uint256)\n {\n // Get a reference to the auction struct\n Auction storage auction = tokenIdToAuction[_tokenId];\n\n // Explicitly check that this auction is currently live.\n // (Because of how Ethereum mappings work, we can't just count\n // on the lookup above failing. An invalid _tokenId will just\n // return an auction object that is all zeros.)\n require(_isOnAuction(auction));\n\n // Check that the bid is greater than or equal to the current price\n uint256 price = _currentPrice(auction);\n require(_bidAmount >= price);\n\n // Grab a reference to the seller before the auction struct\n // gets deleted.\n address seller = auction.seller;\n\n // The bid is good! Remove the auction before sending the fees\n // to the sender so we can't have a reentrancy attack.\n _removeAuction(_tokenId);\n\n // Transfer proceeds to seller (if there are any!)\n if (price > 0) {\n // Calculate the auctioneer's cut.\n // (NOTE: _computeCut() is guaranteed to return a\n // value <= price, so this subtraction can't go negative.)\n uint256 auctioneerCut = _computeCut(price);\n uint256 sellerProceeds = price - auctioneerCut;\n\n // NOTE: Doing a transfer() in the middle of a complex\n // method like this is generally discouraged because of\n // reentrancy attacks and DoS attacks if the seller is\n // a contract with an invalid fallback function. We explicitly\n // guard against reentrancy attacks by removing the auction\n // before calling transfer(), and the only thing the seller\n // can DoS is the sale of their own asset! (And if it's an\n // accident, they can call cancelAuction(). )\n seller.transfer(sellerProceeds);\n }\n\n // Calculate any excess funds included with the bid. If the excess\n // is anything worth worrying about, transfer it back to bidder.\n // NOTE: We checked above that the bid amount is greater than or\n // equal to the price so this cannot underflow.\n uint256 bidExcess = _bidAmount - price;\n\n // Return the funds. Similar to the previous transfer, this is\n // not susceptible to a re-entry attack because the auction is\n // removed before any transfers occur.\n msg.sender.transfer(bidExcess);\n\n // Tell the world!\n AuctionSuccessful(_tokenId, price, msg.sender);\n\n return price;\n }\n\n /// @dev Removes an auction from the list of open auctions.\n /// @param _tokenId - ID of NFT on auction.\n function _removeAuction(uint256 _tokenId) internal {\n delete tokenIdToAuction[_tokenId];\n }\n\n /// @dev Returns true if the NFT is on auction.\n /// @param _auction - Auction to check.\n function _isOnAuction(Auction storage _auction) internal view returns (bool) {\n return (_auction.startedAt > 0);\n }\n\n /// @dev Returns current price of an NFT on auction. Broken into two\n /// functions (this one, that computes the duration from the auction\n /// structure, and the other that does the price computation) so we\n /// can easily test that the price computation works correctly.\n function _currentPrice(Auction storage _auction)\n internal\n view\n returns (uint256)\n {\n uint256 secondsPassed = 0;\n\n // A bit of insurance against negative values (or wraparound).\n // Probably not necessary (since Ethereum guarnatees that the\n // now variable doesn't ever go backwards).\n if (now > _auction.startedAt) {\n secondsPassed = now - _auction.startedAt;\n }\n\n return _computeCurrentPrice(\n _auction.startingPrice,\n _auction.endingPrice,\n _auction.duration,\n secondsPassed\n );\n }\n\n /// @dev Computes the current price of an auction. Factored out\n /// from _currentPrice so we can run extensive unit tests.\n /// When testing, make this function public and turn on\n /// `Current price computation` test suite.\n function _computeCurrentPrice(\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n uint256 _secondsPassed\n )\n internal\n pure\n returns (uint256)\n {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our public functions carefully cap the maximum values for\n // time (at 64-bits) and currency (at 128-bits). _duration is\n // also known to be non-zero (see the require() statement in\n // _addAuction())\n if (_secondsPassed >= _duration) {\n // We've reached the end of the dynamic pricing portion\n // of the auction, just return the end price.\n return _endingPrice;\n } else {\n // Starting price can be higher than ending price (and often is!), so\n // this delta can be negative.\n int256 totalPriceChange = int256(_endingPrice) - int256(_startingPrice);\n\n // This multiplication can't overflow, _secondsPassed will easily fit within\n // 64-bits, and totalPriceChange will easily fit within 128-bits, their product\n // will always fit within 256-bits.\n int256 currentPriceChange = totalPriceChange * int256(_secondsPassed) / int256(_duration);\n\n // currentPriceChange can be negative, but if so, will have a magnitude\n // less that _startingPrice. Thus, this result will always end up positive.\n int256 currentPrice = int256(_startingPrice) + currentPriceChange;\n\n return uint256(currentPrice);\n }\n }\n\n /// @dev Computes owner's cut of a sale.\n /// @param _price - Sale price of NFT.\n function _computeCut(uint256 _price) internal view returns (uint256) {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our entry functions carefully cap the maximum values for\n // currency (at 128-bits), and ownerCut <= 10000 (see the require()\n // statement in the ClockAuction constructor). The result of this\n // function is always guaranteed to be <= _price.\n return _price * ownerCut / 10000;\n }\n\n}\n\n\n\n\n\n\n\n/**\n * @title KittiesPausable\n * @dev Base contract which allows children to implement an emergency stop mechanism.\n */\ncontract KittiesPausable is KittiesOwnable {\n event Pause();\n event Unpause();\n\n bool public paused = false;\n\n\n /**\n\t * @dev modifier to allow actions only when the contract IS paused\n\t */\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /**\n\t * @dev modifier to allow actions only when the contract IS NOT paused\n\t */\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /**\n\t * @dev called by the owner to pause, triggers stopped state\n\t */\n function pause() onlyOwner whenNotPaused returns (bool) {\n paused = true;\n Pause();\n return true;\n }\n\n /**\n\t * @dev called by the owner to unpause, returns to normal state\n\t */\n function unpause() onlyOwner whenPaused returns (bool) {\n paused = false;\n Unpause();\n return true;\n }\n}\n\n\n/// @title Clock auction for non-fungible tokens.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuction is KittiesPausable, ClockAuctionBase {\n\n /// @dev The ERC-165 interface signature for ERC-721.\n /// Ref: https://github.com/ethereum/EIPs/issues/165\n /// Ref: https://github.com/ethereum/EIPs/issues/721\n bytes4 constant InterfaceSignature_ERC721 = bytes4(0x9a20483d);\n\n /// @dev Constructor creates a reference to the NFT ownership contract\n /// and verifies the owner cut is in the valid range.\n /// @param _nftAddress - address of a deployed contract implementing\n /// the Nonfungible Interface.\n /// @param _cut - percent cut the owner takes on each auction, must be\n /// between 0-10,000.\n function ClockAuction(address _nftAddress, uint256 _cut) public {\n require(_cut <= 10000);\n ownerCut = _cut;\n\n KittiesERC721 candidateContract = KittiesERC721(_nftAddress);\n require(candidateContract.supportsInterface(InterfaceSignature_ERC721));\n nonFungibleContract = candidateContract;\n }\n\n /// @dev Remove all Ether from the contract, which is the owner's cuts\n /// as well as any Ether sent directly to the contract address.\n /// Always transfers to the NFT contract, but can be called either by\n /// the owner or the NFT contract.\n function withdrawBalance() external {\n address nftAddress = address(nonFungibleContract);\n\n require(\n msg.sender == owner ||\n msg.sender == nftAddress\n );\n // We are using this boolean method to make sure that even if one fails it will still work\n bool res = nftAddress.send(this.balance);\n }\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of time to move between starting\n /// price and ending price (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n whenNotPaused\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(_owns(msg.sender, _tokenId));\n _escrow(msg.sender, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Bids on an open auction, completing the auction and transferring\n /// ownership of the NFT if enough Ether is supplied.\n /// @param _tokenId - ID of token to bid on.\n function bid(uint256 _tokenId)\n external\n payable\n whenNotPaused\n {\n // _bid will throw if the bid or funds transfer fails\n _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n }\n\n /// @dev Cancels an auction that hasn't been won yet.\n /// Returns the NFT to original owner.\n /// @notice This is a state-modifying function that can\n /// be called while the contract is paused.\n /// @param _tokenId - ID of token on auction\n function cancelAuction(uint256 _tokenId)\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n address seller = auction.seller;\n require(msg.sender == seller);\n _cancelAuction(_tokenId, seller);\n }\n\n /// @dev Cancels an auction when the contract is paused.\n /// Only the owner may do this, and NFTs are returned to\n /// the seller. This should only be used in emergencies.\n /// @param _tokenId - ID of the NFT on auction to cancel.\n function cancelAuctionWhenPaused(uint256 _tokenId)\n whenPaused\n onlyOwner\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n _cancelAuction(_tokenId, auction.seller);\n }\n\n /// @dev Returns auction info for an NFT on auction.\n /// @param _tokenId - ID of NFT on auction.\n function getAuction(uint256 _tokenId)\n external\n view\n returns\n (\n address seller,\n uint256 startingPrice,\n uint256 endingPrice,\n uint256 duration,\n uint256 startedAt\n ) {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return (\n auction.seller,\n auction.startingPrice,\n auction.endingPrice,\n auction.duration,\n auction.startedAt\n );\n }\n\n /// @dev Returns the current price of an auction.\n /// @param _tokenId - ID of the token price we are checking.\n function getCurrentPrice(uint256 _tokenId)\n external\n view\n returns (uint256)\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return _currentPrice(auction);\n }\n\n}\n\n\n/// @title Reverse auction modified for siring\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SiringClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSiringAuctionAddress() call.\n bool public isSiringClockAuction = true;\n\n // Delegate constructor\n function SiringClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction. Since this function is wrapped,\n /// require sender to be KittyCore contract.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Places a bid for siring. Requires the sender\n /// is the KittyCore contract because all bid methods\n /// should be wrapped. Also returns the kitty to the\n /// seller rather than the winner.\n function bid(uint256 _tokenId)\n external\n payable\n {\n require(msg.sender == address(nonFungibleContract));\n address seller = tokenIdToAuction[_tokenId].seller;\n // _bid checks that token ID is valid and will throw if bid fails\n _bid(_tokenId, msg.value);\n // We transfer the kitty back to the seller, the winner will get\n // the offspring\n _transfer(seller, _tokenId);\n }\n\n}\n\n\n\n\n\n/// @title Clock auction modified for sale of kitties\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SaleClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSaleAuctionAddress() call.\n bool public isSaleClockAuction = true;\n\n // Tracks last 5 sale price of gen0 kitty sales\n uint256 public gen0SaleCount;\n uint256[5] public lastGen0SalePrices;\n\n // Delegate constructor\n function SaleClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Updates lastSalePrice if seller is the nft contract\n /// Otherwise, works the same as default bid method.\n function bid(uint256 _tokenId)\n external\n payable\n {\n // _bid verifies token ID size\n address seller = tokenIdToAuction[_tokenId].seller;\n uint256 price = _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n\n // If not a gen0 auction, exit\n if (seller == address(nonFungibleContract)) {\n // Track gen0 sale prices\n lastGen0SalePrices[gen0SaleCount % 5] = price;\n gen0SaleCount++;\n }\n }\n\n function averageGen0SalePrice() external view returns (uint256) {\n uint256 sum = 0;\n for (uint256 i = 0; i < 5; i++) {\n sum += lastGen0SalePrices[i];\n }\n return sum / 5;\n }\n\n}\n\n\n/// @title Handles creating auctions for sale and siring of kitties.\n/// This wrapper of ReverseAuction exists only so that users can create\n/// auctions with only one transaction.\ncontract KittyAuction is KittyBreeding {\n\n // @notice The auction contract variables are defined in KittyBase to allow\n // us to refer to them in KittyOwnership to prevent accidental transfers.\n // `saleAuction` refers to the auction for gen0 and p2p sale of kitties.\n // `siringAuction` refers to the auction for siring rights of kitties.\n\n /// @dev Sets the reference to the sale auction.\n /// @param _address - Address of sale contract.\n function setSaleAuctionAddress(address _address) external onlyCEO {\n SaleClockAuction candidateContract = SaleClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSaleClockAuction());\n\n // Set the new contract address\n saleAuction = candidateContract;\n }\n\n /// @dev Sets the reference to the siring auction.\n /// @param _address - Address of siring contract.\n function setSiringAuctionAddress(address _address) external onlyCEO {\n SiringClockAuction candidateContract = SiringClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSiringClockAuction());\n\n // Set the new contract address\n siringAuction = candidateContract;\n }\n\n /// @dev Put a kitty up for auction.\n /// Does some ownership trickery to create auctions in one tx.\n function createSaleAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n // Ensure the kitty is not pregnant to prevent the auction\n // contract accidentally receiving ownership of the child.\n // NOTE: the kitty IS allowed to be in a cooldown.\n require(!isPregnant(_kittyId));\n _approve(_kittyId, saleAuction);\n // Sale auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n saleAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Put a kitty up for auction to be sire.\n /// Performs checks to ensure the kitty can be sired, then\n /// delegates to reverse auction.\n function createSiringAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n require(isReadyToBreed(_kittyId));\n _approve(_kittyId, siringAuction);\n // Siring auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n siringAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Completes a siring auction by bidding.\n /// Immediately breeds the winning matron with the sire on auction.\n /// @param _sireId - ID of the sire on auction.\n /// @param _matronId - ID of the matron owned by the bidder.\n function bidOnSiringAuction(\n uint256 _sireId,\n uint256 _matronId\n )\n external\n payable\n whenNotPaused\n {\n // Auction contract checks input sizes\n require(_owns(msg.sender, _matronId));\n require(isReadyToBreed(_matronId));\n require(_canBreedWithViaAuction(_matronId, _sireId));\n\n // Define the current price of the auction.\n uint256 currentPrice = siringAuction.getCurrentPrice(_sireId);\n require(msg.value >= currentPrice + autoBirthFee);\n\n // Siring auction will throw if the bid fails.\n siringAuction.bid.value(msg.value - autoBirthFee)(_sireId);\n _breedWith(uint32(_matronId), uint32(_sireId));\n }\n\n /// @dev Transfers the balance of the sale auction contract\n /// to the KittyCore contract. We use two-step withdrawal to\n /// prevent two transfer calls in the auction bid function.\n function withdrawAuctionBalances() external onlyCLevel {\n saleAuction.withdrawBalance();\n siringAuction.withdrawBalance();\n }\n}\n\n\n/// @title all functions related to creating kittens\ncontract KittyMinting is KittyAuction {\n\n // Limits the number of cats the contract owner can ever create.\n uint256 public constant PROMO_CREATION_LIMIT = 5000;\n uint256 public constant GEN0_CREATION_LIMIT = 45000;\n\n // Constants for gen0 auctions.\n uint256 public constant GEN0_STARTING_PRICE = 10 finney;\n uint256 public constant GEN0_AUCTION_DURATION = 1 days;\n\n // Counts the number of cats the contract owner has created.\n uint256 public promoCreatedCount;\n uint256 public gen0CreatedCount;\n\n /// @dev we can create promo kittens, up to a limit. Only callable by COO\n /// @param _genes the encoded genes of the kitten to be created, any value is accepted\n /// @param _owner the future owner of the created kittens. Default to contract COO\n function createPromoKitty(uint256 _genes, address _owner) external onlyCOO {\n address kittyOwner = _owner;\n if (kittyOwner == address(0)) {\n kittyOwner = cooAddress;\n }\n require(promoCreatedCount < PROMO_CREATION_LIMIT);\n\n promoCreatedCount++;\n _createKitty(0, 0, 0, _genes, kittyOwner);\n }\n\n /// @dev Creates a new gen0 kitty with the given genes and\n /// creates an auction for it.\n function createGen0Auction(uint256 _genes) external onlyCOO {\n require(gen0CreatedCount < GEN0_CREATION_LIMIT);\n\n uint256 kittyId = _createKitty(0, 0, 0, _genes, address(this));\n _approve(kittyId, saleAuction);\n\n saleAuction.createAuction(\n kittyId,\n _computeNextGen0Price(),\n 0,\n GEN0_AUCTION_DURATION,\n address(this)\n );\n\n gen0CreatedCount++;\n }\n\n /// @dev Computes the next gen0 auction starting price, given\n /// the average of the past 5 prices + 50%.\n function _computeNextGen0Price() internal view returns (uint256) {\n uint256 avePrice = saleAuction.averageGen0SalePrice();\n\n // Sanity check to ensure we don't overflow arithmetic\n require(avePrice == uint256(uint128(avePrice)));\n\n uint256 nextPrice = avePrice + (avePrice / 2);\n\n // We never auction for less than starting price\n if (nextPrice < GEN0_STARTING_PRICE) {\n nextPrice = GEN0_STARTING_PRICE;\n }\n\n return nextPrice;\n }\n}\n\n\n/// @title CryptoKitties: Collectible, breedable, and oh-so-adorable cats on the Ethereum blockchain.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev The main CryptoKitties contract, keeps track of kittens so they don't wander around and get lost.\ncontract KittyCore is KittyMinting {\n\n // This is the main CryptoKitties contract. In order to keep our code seperated into logical sections,\n // we've broken it up in two ways. First, we have several seperately-instantiated sibling contracts\n // that handle auctions and our super-top-secret genetic combination algorithm. The auctions are\n // seperate since their logic is somewhat complex and there's always a risk of subtle bugs. By keeping\n // them in their own contracts, we can upgrade them without disrupting the main contract that tracks\n // kitty ownership. The genetic combination algorithm is kept seperate so we can open-source all of\n // the rest of our code without making it _too_ easy for folks to figure out how the genetics work.\n // Don't worry, I'm sure someone will reverse engineer it soon enough!\n //\n // Secondly, we break the core contract into multiple files using inheritence, one for each major\n // facet of functionality of CK. This allows us to keep related code bundled together while still\n // avoiding a single giant file with everything in it. The breakdown is as follows:\n //\n // - KittyBase: This is where we define the most fundamental code shared throughout the core\n // functionality. This includes our main data storage, constants and data types, plus\n // internal functions for managing these items.\n //\n // - KittyAccessControl: This contract manages the various addresses and constraints for operations\n // that can be executed only by specific roles. Namely CEO, CFO and COO.\n //\n // - KittyOwnership: This provides the methods required for basic non-fungible token\n // transactions, following the draft ERC-721 spec (https://github.com/ethereum/EIPs/issues/721).\n //\n // - KittyBreeding: This file contains the methods necessary to breed cats together, including\n // keeping track of siring offers, and relies on an external genetic combination contract.\n //\n // - KittyAuctions: Here we have the public methods for auctioning or bidding on cats or siring\n // services. The actual auction functionality is handled in two sibling contracts (one\n // for sales and one for siring), while auction creation and bidding is mostly mediated\n // through this facet of the core contract.\n //\n // - KittyMinting: This final facet contains the functionality we use for creating new gen0 cats.\n // We can make up to 5000 \"promo\" cats that can be given away (especially important when\n // the community is new), and all others can only be created and then immediately put up\n // for auction via an algorithmically determined starting price. Regardless of how they\n // are created, there is a hard limit of 50k gen0 cats. After that, it's all up to the\n // community to breed, breed, breed!\n\n // Set in case the core contract is broken and an upgrade is required\n address public newContractAddress;\n\n /// @notice Creates the main CryptoKitties smart contract instance.\n function KittyCore() public {\n // Starts paused.\n paused = true;\n\n // the creator of the contract is the initial CEO\n ceoAddress = msg.sender;\n\n // the creator of the contract is also the initial COO\n cooAddress = msg.sender;\n\n // start with the mythical kitten 0 - so we don't have generation-0 parent issues\n _createKitty(0, 0, 0, uint256(-1), address(0));\n }\n\n /// @dev Used to mark the smart contract as upgraded, in case there is a serious\n /// breaking bug. This method does nothing but keep track of the new contract and\n /// emit a message indicating that the new address is set. It's up to clients of this\n /// contract to update to the new contract address in that case. (This contract will\n /// be paused indefinitely if such an upgrade takes place.)\n /// @param _v2Address new address\n function setNewAddress(address _v2Address) external onlyCEO whenPaused {\n // See README.md for updgrade plan\n newContractAddress = _v2Address;\n ContractUpgrade(_v2Address);\n }\n\n /// @notice No tipping!\n /// @dev Reject all Ether from being sent here, unless it's from one of the\n /// two auction contracts. (Hopefully, we can prevent user accidents.)\n function() external payable {\n require(\n msg.sender == address(saleAuction) ||\n msg.sender == address(siringAuction)\n );\n }\n\n /// @notice Returns all the relevant information about a specific kitty.\n /// @param _id The ID of the kitty of interest.\n function getKitty(uint256 _id)\n external\n view\n returns (\n bool isGestating,\n bool isReady,\n uint256 cooldownIndex,\n uint256 nextActionAt,\n uint256 siringWithId,\n uint256 birthTime,\n uint256 matronId,\n uint256 sireId,\n uint256 generation,\n uint256 genes\n ) {\n Kitty storage kit = kitties[_id];\n\n // if this variable is 0 then it's not gestating\n isGestating = (kit.siringWithId != 0);\n isReady = (kit.cooldownEndBlock <= block.number);\n cooldownIndex = uint256(kit.cooldownIndex);\n nextActionAt = uint256(kit.cooldownEndBlock);\n siringWithId = uint256(kit.siringWithId);\n birthTime = uint256(kit.birthTime);\n matronId = uint256(kit.matronId);\n sireId = uint256(kit.sireId);\n generation = uint256(kit.generation);\n genes = kit.genes;\n }\n\n /// @dev Override unpause so it requires all external contract addresses\n /// to be set before contract can be unpaused. Also, we can't have\n /// newContractAddress set either, because then the contract was upgraded.\n /// @notice This is public rather than external so we can call super.unpause\n /// without using an expensive CALL.\n function unpause() public onlyCEO whenPaused {\n require(saleAuction != address(0));\n require(siringAuction != address(0));\n require(geneScience != address(0));\n require(newContractAddress == address(0));\n\n // Actually unpause the contract.\n super.unpause();\n }\n\n // @dev Allows the CFO to capture the balance available to the contract.\n function withdrawBalance() external onlyCFO {\n uint256 balance = this.balance;\n // Subtract all the currently pregnant kittens we have, plus 1 of margin.\n uint256 subtractFees = (pregnantKitties + 1) * autoBirthFee;\n\n if (balance > subtractFees) {\n cfoAddress.send(balance - subtractFees);\n }\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "exportedSymbols": { "ClockAuction": [ 8872 @@ -51771,5 +51771,5 @@ export const KittyAccessControl = }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:47.755Z" + "updatedAt": "2018-10-09T17:45:35.953Z" } \ No newline at end of file diff --git a/artifacts/ts/KittyAuction.ts b/artifacts/ts/KittyAuction.ts index 62ef14b1..f32735a8 100644 --- a/artifacts/ts/KittyAuction.ts +++ b/artifacts/ts/KittyAuction.ts @@ -886,15 +886,15 @@ export const KittyAuction = "type": "event" } ], - "bytecode": "0x60606040526000600260146101000a81548160ff0219169083151502179055506101c060405190810160405280603c63ffffffff1663ffffffff168152602001607863ffffffff1663ffffffff16815260200161012c63ffffffff1663ffffffff16815260200161025863ffffffff1663ffffffff16815260200161070863ffffffff1663ffffffff168152602001610e1063ffffffff1663ffffffff168152602001611c2063ffffffff1663ffffffff16815260200161384063ffffffff1663ffffffff16815260200161708063ffffffff1663ffffffff16815260200161e10063ffffffff1663ffffffff1681526020016201518063ffffffff1663ffffffff1681526020016202a30063ffffffff1663ffffffff1681526020016205460063ffffffff1663ffffffff16815260200162093a8063ffffffff1663ffffffff16815250600390600e6200015692919062000179565b50600f60055566071afd498d0000600e5534156200017357600080fd5b62000259565b82600e600701600890048101928215620002105791602002820160005b83821115620001dc57835183826101000a81548163ffffffff021916908363ffffffff160217905550926020019260040160208160030104928301926001030262000196565b80156200020e5782816101000a81549063ffffffff0219169055600401602081600301049283019260010302620001dc565b505b5090506200021f919062000223565b5090565b6200025691905b808211156200025257600081816101000a81549063ffffffff0219169055506001016200022a565b5090565b90565b6145fe80620002696000396000f30060606040526004361061023b576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146102405780630519ce791461029a5780630560ff44146102ef57806306fdde031461039f578063095ea7b31461042d5780630a0f81681461046f57806314001f4c146104c457806318160ddd146104fd578063183a7947146105265780631940a9361461054f57806321717ebf1461058a57806323b872dd146105df57806324e7a38a1461064057806327d7874c146106795780632ba73c15146106b25780633d7d3f5a146106eb5780633f4ba83a1461072957806346116e6f1461073e57806346d22c70146107a1578063481af3d3146107e55780634ad8c938146108485780634b85fd55146108865780634dfff04f146108a95780634e0a3379146108eb5780635663896e146109245780635c975abb146109475780636352211e146109745780636fbde40d146109d757806370a0823114610a105780637a7d493714610a5d5780638456cb5914610a865780638462151c14610a9b57806388c2a0bf14610b2957806391876e5714610b6057806395d89b4114610b755780639d6fac6f14610c03578063a45f4bfc14610c46578063a9059cbb14610ca9578063b047fb5014610ceb578063b0c35c0514610d40578063bc4006f514610d69578063d3e6f49f14610dbe578063e17b25af14610df9578063e6cbe35114610e32578063ed60ade614610e87578063f2b47d5214610ea8578063f7d8c88314610efd575b600080fd5b341561024b57600080fd5b61028060048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050610f1e565b604051808215151515815260200191505060405180910390f35b34156102a557600080fd5b6102ad61122f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102fa57600080fd5b61032460048080359060200190919080359060200190820180359060200191909192905050611255565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610364578082015181840152602081019050610349565b50505050905090810190601f1680156103915780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156103aa57600080fd5b6103b26113c0565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103f25780820151818401526020810190506103d7565b50505050905090810190601f16801561041f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561043857600080fd5b61046d600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506113f9565b005b341561047a57600080fd5b6104826114bb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104cf57600080fd5b6104fb600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506114e0565b005b341561050857600080fd5b610510611617565b6040518082815260200191505060405180910390f35b341561053157600080fd5b610539611627565b6040518082815260200191505060405180910390f35b341561055a57600080fd5b610570600480803590602001909190505061162d565b604051808215151515815260200191505060405180910390f35b341561059557600080fd5b61059d61167f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156105ea57600080fd5b61063e600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506116a5565b005b341561064b57600080fd5b610677600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611756565b005b341561068457600080fd5b6106b0600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061188d565b005b34156106bd57600080fd5b6106e9600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611967565b005b34156106f657600080fd5b6107276004808035906020019091908035906020019091908035906020019091908035906020019091905050611a42565b005b341561073457600080fd5b61073c611baa565b005b341561074957600080fd5b61075f6004808035906020019091905050611c3d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156107ac57600080fd5b6107cb6004808035906020019091908035906020019091905050611c70565b604051808215151515815260200191505060405180910390f35b34156107f057600080fd5b6108066004808035906020019091905050611cf8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561085357600080fd5b6108846004808035906020019091908035906020019091908035906020019091908035906020019091905050611d2b565b005b341561089157600080fd5b6108a76004808035906020019091905050611e92565b005b34156108b457600080fd5b6108e9600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611ef8565b005b34156108f657600080fd5b610922600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611f7f565b005b341561092f57600080fd5b610945600480803590602001909190505061205a565b005b341561095257600080fd5b61095a6121ae565b604051808215151515815260200191505060405180910390f35b341561097f57600080fd5b61099560048080359060200190919050506121c1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156109e257600080fd5b610a0e600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061223a565b005b3415610a1b57600080fd5b610a47600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612371565b6040518082815260200191505060405180910390f35b3415610a6857600080fd5b610a706123ba565b6040518082815260200191505060405180910390f35b3415610a9157600080fd5b610a996123c0565b005b3415610aa657600080fd5b610ad2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612504565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610b15578082015181840152602081019050610afa565b505050509050019250505060405180910390f35b3415610b3457600080fd5b610b4a600480803590602001909190505061263b565b6040518082815260200191505060405180910390f35b3415610b6b57600080fd5b610b73612a5a565b005b3415610b8057600080fd5b610b88612c99565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610bc8578082015181840152602081019050610bad565b50505050905090810190601f168015610bf55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610c0e57600080fd5b610c246004808035906020019091905050612cd2565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3415610c5157600080fd5b610c676004808035906020019091905050612d01565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610cb457600080fd5b610ce9600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050612d34565b005b3415610cf657600080fd5b610cfe612ea5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610d4b57600080fd5b610d53612ecb565b6040518082815260200191505060405180910390f35b3415610d7457600080fd5b610d7c612ed1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610dc957600080fd5b610ddf6004808035906020019091905050612ef7565b604051808215151515815260200191505060405180910390f35b3415610e0457600080fd5b610e30600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050613066565b005b3415610e3d57600080fd5b610e45613105565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610ea6600480803590602001909190803590602001909190505061312b565b005b3415610eb357600080fd5b610ebb613314565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610f1c600480803590602001909190803590602001909190505061333a565b005b600060405180807f737570706f727473496e74657266616365286279746573342900000000000000815250601901905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611228575060405180807f746f6b656e4d657461646174612875696e743235362c737472696e6729000000815250601d019050604051809103902060405180807f746f6b656e734f664f776e6572286164647265737329000000000000000000008152506016019050604051809103902060405180807f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81526020017f74323536290000000000000000000000000000000000000000000000000000008152506025019050604051809103902060405180807f7472616e7366657228616464726573732c75696e7432353629000000000000008152506019019050604051809103902060405180807f617070726f766528616464726573732c75696e743235362900000000000000008152506018019050604051809103902060405180807f6f776e65724f662875696e7432353629000000000000000000000000000000008152506010019050604051809103902060405180807f62616c616e63654f6628616464726573732900000000000000000000000000008152506012019050604051809103902060405180807f746f74616c537570706c79282900000000000000000000000000000000000000815250600d019050604051809103902060405180807f73796d626f6c28290000000000000000000000000000000000000000000000008152506008019050604051809103902060405180807f6e616d6528290000000000000000000000000000000000000000000000000000815250600601905060405180910390201818181818181818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61125d61440d565b611265614421565b60008073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156112c457600080fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb4799f2878787600060405160a001526040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180848152602001806020018281038252848482818152602001925080828437820191505094505050505060a060405180830381600087803b151561137f57600080fd5b6102c65a03f1151561139057600080fd5b5050506040518060800180519060200160405280925081935050506113b5828261367b565b925050509392505050565b6040805190810160405280600d81526020017f43727970746f4b6974746965730000000000000000000000000000000000000081525081565b61140333826136d3565b151561140e57600080fd5b611418818361373f565b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561153d57600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166376190f8f6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156115ac57600080fd5b6102c65a03f115156115bd57600080fd5b5050506040518051905015156115d257600080fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600160068054905003905090565b600f5481565b6000808211151561163d57600080fd5b600060068381548110151561164e57fe5b906000526020600020906002020160010160189054906101000a900463ffffffff1663ffffffff1614159050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156116e157600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561171c57600080fd5b6117263382613795565b151561173157600080fd5b61173b83826136d3565b151561174657600080fd5b611751838383613801565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156117b357600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166354c15b826000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561182257600080fd5b6102c65a03f1151561183357600080fd5b50505060405180519050151561184857600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156118e857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561192457600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156119c257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156119fe57600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260149054906101000a900460ff16151515611a5e57600080fd5b611a6833856136d3565b1515611a7357600080fd5b611a7c8461162d565b151515611a8857600080fd5b611ab484600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661373f565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a85858585336040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b1515611b9057600080fd5b6102c65a03f11515611ba157600080fd5b50505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c0557600080fd5b600260149054906101000a900460ff161515611c2057600080fd5b6000600260146101000a81548160ff021916908315150217905550565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008085111515611c8357600080fd5b600084111515611c9257600080fd5b600685815481101515611ca157fe5b90600052602060002090600202019150600684815481101515611cc057fe5b90600052602060002090600202019050611cdc82868387613a39565b8015611cee5750611ced8486613c4e565b5b9250505092915050565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff16151515611d4757600080fd5b611d5133856136d3565b1515611d5c57600080fd5b611d6584612ef7565b1515611d7057600080fd5b611d9c84600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661373f565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a85858585336040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b1515611e7857600080fd5b6102c65a03f11515611e8957600080fd5b50505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611eee57600080fd5b80600e8190555050565b600260149054906101000a900460ff16151515611f1457600080fd5b611f1e33826136d3565b1515611f2957600080fd5b81600a600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611fda57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561201657600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061210257506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061215a5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561216557600080fd5b60036000600e8110151561217557fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff16811015156121a457600080fd5b8060058190555050565b600260149054906101000a900460ff1681565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561223557600080fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561229757600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166385b861886000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561230657600080fd5b6102c65a03f1151561231757600080fd5b50505060405180519050151561232c57600080fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061246857506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806124c05750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156124cb57600080fd5b600260149054906101000a900460ff161515156124e757600080fd5b6001600260146101000a81548160ff021916908315150217905550565b61250c61444c565b600061251661444c565b600080600061252487612371565b9450600085141561255657600060405180591061253e5750595b90808252806020026020018201604052509550612631565b846040518059106125645750595b9080825280602002602001820160405250935061257f611617565b925060009150600190505b828111151561262d578673ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156126205780848381518110151561260957fe5b906020019060200201818152505081806001019250505b808060010191505061258a565b8395505b5050505050919050565b600080600080600080600080600260149054906101000a900460ff1615151561266357600080fd5b60068981548110151561267257fe5b9060005260206000209060020201965060008760010160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16141515156126b457600080fd5b6127ea876101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050613d61565b15156127f557600080fd5b8660010160189054906101000a900463ffffffff1663ffffffff16955060068681548110151561282157fe5b9060005260206000209060020201945086600101601e9054906101000a900461ffff16935086600101601e9054906101000a900461ffff1661ffff1685600101601e9054906101000a900461ffff1661ffff1611156128905784600101601e9054906101000a900461ffff1693505b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d9f5aed8860000154876000015460018b60010160089054906101000a900467ffffffffffffffff16036000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018381526020018267ffffffffffffffff1681526020019350505050602060405180830381600087803b151561296657600080fd5b6102c65a03f1151561297757600080fd5b505050604051805190509250600760008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506129e7898860010160189054906101000a900463ffffffff1663ffffffff166001870161ffff168686613d9c565b90508660010160186101000a81549063ffffffff0219169055600f60008154809291906001900391905055503373ffffffffffffffffffffffffffffffffffffffff166108fc600e549081150290604051600060405180830381858888f193505050505080975050505050505050919050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612b0257506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80612b5a5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515612b6557600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b1515612bea57600080fd5b6102c65a03f11515612bfb57600080fd5b505050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b1515612c8357600080fd5b6102c65a03f11515612c9457600080fd5b505050565b6040805190810160405280600281526020017f434b00000000000000000000000000000000000000000000000000000000000081525081565b600381600e81101515612ce157fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff16151515612d5057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612d8c57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612dc757600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612e2457600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612e8157600080fd5b612e8b33826136d3565b1515612e9657600080fd5b612ea1338383613801565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600083111515612f0957600080fd5b600683815481101515612f1857fe5b9060005260206000209060020201905061305e816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff168152505061408f565b915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156130c157600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260149054906101000a900460ff1615151561314957600080fd5b61315333836136d3565b151561315e57600080fd5b61316782612ef7565b151561317257600080fd5b61317c82846140c9565b151561318757600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c55d0f56846000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561322057600080fd5b6102c65a03f1151561323157600080fd5b505050604051805190509050600e548101341015151561325057600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663454a2ab3600e543403856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808281526020019150506000604051808303818588803b15156132e457600080fd5b6125ee5a03f115156132f557600080fd5b5050505061330f8263ffffffff168463ffffffff16614122565b505050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600260149054906101000a900460ff1615151561335957600080fd5b600e54341015151561336a57600080fd5b61337433856136d3565b151561337f57600080fd5b6133898385613c4e565b151561339457600080fd5b6006848154811015156133a357fe5b906000526020600020906002020191506134e9826101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff168152505061408f565b15156134f457600080fd5b60068381548110151561350357fe5b90600052602060002090600202019050613649816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff168152505061408f565b151561365457600080fd5b61366082858386613a39565b151561366b57600080fd5b6136758484614122565b50505050565b61368361440d565b61368b61440d565b6000808460405180591061369c5750595b9080825280601f01601f191660200182016040525092506020830191508590506136c78282876142ec565b82935050505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff166007600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b806009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008273ffffffffffffffffffffffffffffffffffffffff166009600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151561399557600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600a600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556009600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b600081841415613a4c5760009050613c46565b818560010160109054906101000a900463ffffffff1663ffffffff161480613a8d5750818560010160149054906101000a900463ffffffff1663ffffffff16145b15613a9b5760009050613c46565b838360010160109054906101000a900463ffffffff1663ffffffff161480613adc5750838360010160149054906101000a900463ffffffff1663ffffffff16145b15613aea5760009050613c46565b60008360010160109054906101000a900463ffffffff1663ffffffff161480613b2d575060008560010160109054906101000a900463ffffffff1663ffffffff16145b15613b3b5760019050613c46565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff161480613bb057508460010160149054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff16145b15613bbe5760009050613c46565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff161480613c3357508460010160149054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff16145b15613c415760009050613c46565b600190505b949350505050565b60008060006007600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161480613d5757508173ffffffffffffffffffffffffffffffffffffffff16600a600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b9250505092915050565b6000808260a0015163ffffffff1614158015613d9557504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b600080613da7614460565b60008863ffffffff1689141515613dbd57600080fd5b8763ffffffff1688141515613dd157600080fd5b8661ffff1687141515613de357600080fd5b600287811515613def57fe5b049250600d8361ffff161115613e0457600d92505b610100604051908101604052808781526020014267ffffffffffffffff168152602001600067ffffffffffffffff1681526020018a63ffffffff1681526020018963ffffffff168152602001600063ffffffff1681526020018461ffff1681526020018861ffff168152509150600160068054806001018281613e8791906144d4565b916000526020600020906002020160008590919091506000820151816000015560208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601c6101000a81548161ffff021916908361ffff16021790555060e082015181600101601e6101000a81548161ffff021916908361ffff16021790555050500390508063ffffffff1681141515613fd957600080fd5b7f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad58582846060015163ffffffff16856080015163ffffffff168660000151604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a161408060008683613801565b80935050505095945050505050565b6000808260a0015163ffffffff161480156140c257504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b60008060006006858154811015156140dd57fe5b906000526020600020906002020191506006848154811015156140fc57fe5b9060005260206000209060020201905061411882868387613a39565b9250505092915050565b60008060068381548110151561413457fe5b9060005260206000209060020201915060068481548110151561415357fe5b90600052602060002090600202019050828160010160186101000a81548163ffffffff021916908363ffffffff16021790555061418f82614337565b61419881614337565b600a600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600a600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600f600081548092919060010191905055507f241ea03ca20251805084d27d4440371c34a0b85ff108f6bb5611248f73818b806007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685858460010160089054906101000a900467ffffffffffffffff16604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018267ffffffffffffffff16815260200194505050505060405180910390a150505050565b60005b60208210151561431457825184526020840193506020830192506020820391506142ef565b6001826020036101000a0390508019835116818551168181178652505050505050565b43600554600383600101601c9054906101000a900461ffff1661ffff16600e8110151561436057fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff1681151561438b57fe5b04018160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600d81600101601c9054906101000a900461ffff1661ffff16101561440a57600181600101601c8282829054906101000a900461ffff160192506101000a81548161ffff021916908361ffff1602179055505b50565b602060405190810160405280600081525090565b6080604051908101604052806004905b60008019168152602001906001900390816144315790505090565b602060405190810160405280600081525090565b6101006040519081016040528060008152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600061ffff168152602001600061ffff1681525090565b815481835581811511614501576002028160020283600052602060002091820191016145009190614506565b5b505050565b6145cf91905b808211156145cb576000808201600090556001820160006101000a81549067ffffffffffffffff02191690556001820160086101000a81549067ffffffffffffffff02191690556001820160106101000a81549063ffffffff02191690556001820160146101000a81549063ffffffff02191690556001820160186101000a81549063ffffffff021916905560018201601c6101000a81549061ffff021916905560018201601e6101000a81549061ffff02191690555060020161450c565b5090565b905600a165627a7a72305820f98b08fb3ef3e5c151dffa5e0c63c43a6e679b6ff349c8101c24a4a587f004990029", - "deployedBytecode": "0x60606040526004361061023b576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146102405780630519ce791461029a5780630560ff44146102ef57806306fdde031461039f578063095ea7b31461042d5780630a0f81681461046f57806314001f4c146104c457806318160ddd146104fd578063183a7947146105265780631940a9361461054f57806321717ebf1461058a57806323b872dd146105df57806324e7a38a1461064057806327d7874c146106795780632ba73c15146106b25780633d7d3f5a146106eb5780633f4ba83a1461072957806346116e6f1461073e57806346d22c70146107a1578063481af3d3146107e55780634ad8c938146108485780634b85fd55146108865780634dfff04f146108a95780634e0a3379146108eb5780635663896e146109245780635c975abb146109475780636352211e146109745780636fbde40d146109d757806370a0823114610a105780637a7d493714610a5d5780638456cb5914610a865780638462151c14610a9b57806388c2a0bf14610b2957806391876e5714610b6057806395d89b4114610b755780639d6fac6f14610c03578063a45f4bfc14610c46578063a9059cbb14610ca9578063b047fb5014610ceb578063b0c35c0514610d40578063bc4006f514610d69578063d3e6f49f14610dbe578063e17b25af14610df9578063e6cbe35114610e32578063ed60ade614610e87578063f2b47d5214610ea8578063f7d8c88314610efd575b600080fd5b341561024b57600080fd5b61028060048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050610f1e565b604051808215151515815260200191505060405180910390f35b34156102a557600080fd5b6102ad61122f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102fa57600080fd5b61032460048080359060200190919080359060200190820180359060200191909192905050611255565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610364578082015181840152602081019050610349565b50505050905090810190601f1680156103915780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156103aa57600080fd5b6103b26113c0565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103f25780820151818401526020810190506103d7565b50505050905090810190601f16801561041f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561043857600080fd5b61046d600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506113f9565b005b341561047a57600080fd5b6104826114bb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104cf57600080fd5b6104fb600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506114e0565b005b341561050857600080fd5b610510611617565b6040518082815260200191505060405180910390f35b341561053157600080fd5b610539611627565b6040518082815260200191505060405180910390f35b341561055a57600080fd5b610570600480803590602001909190505061162d565b604051808215151515815260200191505060405180910390f35b341561059557600080fd5b61059d61167f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156105ea57600080fd5b61063e600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506116a5565b005b341561064b57600080fd5b610677600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611756565b005b341561068457600080fd5b6106b0600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061188d565b005b34156106bd57600080fd5b6106e9600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611967565b005b34156106f657600080fd5b6107276004808035906020019091908035906020019091908035906020019091908035906020019091905050611a42565b005b341561073457600080fd5b61073c611baa565b005b341561074957600080fd5b61075f6004808035906020019091905050611c3d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156107ac57600080fd5b6107cb6004808035906020019091908035906020019091905050611c70565b604051808215151515815260200191505060405180910390f35b34156107f057600080fd5b6108066004808035906020019091905050611cf8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561085357600080fd5b6108846004808035906020019091908035906020019091908035906020019091908035906020019091905050611d2b565b005b341561089157600080fd5b6108a76004808035906020019091905050611e92565b005b34156108b457600080fd5b6108e9600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611ef8565b005b34156108f657600080fd5b610922600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611f7f565b005b341561092f57600080fd5b610945600480803590602001909190505061205a565b005b341561095257600080fd5b61095a6121ae565b604051808215151515815260200191505060405180910390f35b341561097f57600080fd5b61099560048080359060200190919050506121c1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156109e257600080fd5b610a0e600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061223a565b005b3415610a1b57600080fd5b610a47600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612371565b6040518082815260200191505060405180910390f35b3415610a6857600080fd5b610a706123ba565b6040518082815260200191505060405180910390f35b3415610a9157600080fd5b610a996123c0565b005b3415610aa657600080fd5b610ad2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612504565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610b15578082015181840152602081019050610afa565b505050509050019250505060405180910390f35b3415610b3457600080fd5b610b4a600480803590602001909190505061263b565b6040518082815260200191505060405180910390f35b3415610b6b57600080fd5b610b73612a5a565b005b3415610b8057600080fd5b610b88612c99565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610bc8578082015181840152602081019050610bad565b50505050905090810190601f168015610bf55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610c0e57600080fd5b610c246004808035906020019091905050612cd2565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3415610c5157600080fd5b610c676004808035906020019091905050612d01565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610cb457600080fd5b610ce9600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050612d34565b005b3415610cf657600080fd5b610cfe612ea5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610d4b57600080fd5b610d53612ecb565b6040518082815260200191505060405180910390f35b3415610d7457600080fd5b610d7c612ed1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610dc957600080fd5b610ddf6004808035906020019091905050612ef7565b604051808215151515815260200191505060405180910390f35b3415610e0457600080fd5b610e30600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050613066565b005b3415610e3d57600080fd5b610e45613105565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610ea6600480803590602001909190803590602001909190505061312b565b005b3415610eb357600080fd5b610ebb613314565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610f1c600480803590602001909190803590602001909190505061333a565b005b600060405180807f737570706f727473496e74657266616365286279746573342900000000000000815250601901905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611228575060405180807f746f6b656e4d657461646174612875696e743235362c737472696e6729000000815250601d019050604051809103902060405180807f746f6b656e734f664f776e6572286164647265737329000000000000000000008152506016019050604051809103902060405180807f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81526020017f74323536290000000000000000000000000000000000000000000000000000008152506025019050604051809103902060405180807f7472616e7366657228616464726573732c75696e7432353629000000000000008152506019019050604051809103902060405180807f617070726f766528616464726573732c75696e743235362900000000000000008152506018019050604051809103902060405180807f6f776e65724f662875696e7432353629000000000000000000000000000000008152506010019050604051809103902060405180807f62616c616e63654f6628616464726573732900000000000000000000000000008152506012019050604051809103902060405180807f746f74616c537570706c79282900000000000000000000000000000000000000815250600d019050604051809103902060405180807f73796d626f6c28290000000000000000000000000000000000000000000000008152506008019050604051809103902060405180807f6e616d6528290000000000000000000000000000000000000000000000000000815250600601905060405180910390201818181818181818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61125d61440d565b611265614421565b60008073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156112c457600080fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb4799f2878787600060405160a001526040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180848152602001806020018281038252848482818152602001925080828437820191505094505050505060a060405180830381600087803b151561137f57600080fd5b6102c65a03f1151561139057600080fd5b5050506040518060800180519060200160405280925081935050506113b5828261367b565b925050509392505050565b6040805190810160405280600d81526020017f43727970746f4b6974746965730000000000000000000000000000000000000081525081565b61140333826136d3565b151561140e57600080fd5b611418818361373f565b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561153d57600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166376190f8f6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156115ac57600080fd5b6102c65a03f115156115bd57600080fd5b5050506040518051905015156115d257600080fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600160068054905003905090565b600f5481565b6000808211151561163d57600080fd5b600060068381548110151561164e57fe5b906000526020600020906002020160010160189054906101000a900463ffffffff1663ffffffff1614159050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156116e157600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561171c57600080fd5b6117263382613795565b151561173157600080fd5b61173b83826136d3565b151561174657600080fd5b611751838383613801565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156117b357600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166354c15b826000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561182257600080fd5b6102c65a03f1151561183357600080fd5b50505060405180519050151561184857600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156118e857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561192457600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156119c257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156119fe57600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260149054906101000a900460ff16151515611a5e57600080fd5b611a6833856136d3565b1515611a7357600080fd5b611a7c8461162d565b151515611a8857600080fd5b611ab484600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661373f565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a85858585336040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b1515611b9057600080fd5b6102c65a03f11515611ba157600080fd5b50505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c0557600080fd5b600260149054906101000a900460ff161515611c2057600080fd5b6000600260146101000a81548160ff021916908315150217905550565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008085111515611c8357600080fd5b600084111515611c9257600080fd5b600685815481101515611ca157fe5b90600052602060002090600202019150600684815481101515611cc057fe5b90600052602060002090600202019050611cdc82868387613a39565b8015611cee5750611ced8486613c4e565b5b9250505092915050565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff16151515611d4757600080fd5b611d5133856136d3565b1515611d5c57600080fd5b611d6584612ef7565b1515611d7057600080fd5b611d9c84600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661373f565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a85858585336040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b1515611e7857600080fd5b6102c65a03f11515611e8957600080fd5b50505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611eee57600080fd5b80600e8190555050565b600260149054906101000a900460ff16151515611f1457600080fd5b611f1e33826136d3565b1515611f2957600080fd5b81600a600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611fda57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561201657600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061210257506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061215a5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561216557600080fd5b60036000600e8110151561217557fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff16811015156121a457600080fd5b8060058190555050565b600260149054906101000a900460ff1681565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561223557600080fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561229757600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166385b861886000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561230657600080fd5b6102c65a03f1151561231757600080fd5b50505060405180519050151561232c57600080fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061246857506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806124c05750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156124cb57600080fd5b600260149054906101000a900460ff161515156124e757600080fd5b6001600260146101000a81548160ff021916908315150217905550565b61250c61444c565b600061251661444c565b600080600061252487612371565b9450600085141561255657600060405180591061253e5750595b90808252806020026020018201604052509550612631565b846040518059106125645750595b9080825280602002602001820160405250935061257f611617565b925060009150600190505b828111151561262d578673ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156126205780848381518110151561260957fe5b906020019060200201818152505081806001019250505b808060010191505061258a565b8395505b5050505050919050565b600080600080600080600080600260149054906101000a900460ff1615151561266357600080fd5b60068981548110151561267257fe5b9060005260206000209060020201965060008760010160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16141515156126b457600080fd5b6127ea876101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050613d61565b15156127f557600080fd5b8660010160189054906101000a900463ffffffff1663ffffffff16955060068681548110151561282157fe5b9060005260206000209060020201945086600101601e9054906101000a900461ffff16935086600101601e9054906101000a900461ffff1661ffff1685600101601e9054906101000a900461ffff1661ffff1611156128905784600101601e9054906101000a900461ffff1693505b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d9f5aed8860000154876000015460018b60010160089054906101000a900467ffffffffffffffff16036000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018381526020018267ffffffffffffffff1681526020019350505050602060405180830381600087803b151561296657600080fd5b6102c65a03f1151561297757600080fd5b505050604051805190509250600760008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506129e7898860010160189054906101000a900463ffffffff1663ffffffff166001870161ffff168686613d9c565b90508660010160186101000a81549063ffffffff0219169055600f60008154809291906001900391905055503373ffffffffffffffffffffffffffffffffffffffff166108fc600e549081150290604051600060405180830381858888f193505050505080975050505050505050919050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612b0257506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80612b5a5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515612b6557600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b1515612bea57600080fd5b6102c65a03f11515612bfb57600080fd5b505050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b1515612c8357600080fd5b6102c65a03f11515612c9457600080fd5b505050565b6040805190810160405280600281526020017f434b00000000000000000000000000000000000000000000000000000000000081525081565b600381600e81101515612ce157fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff16151515612d5057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612d8c57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612dc757600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612e2457600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612e8157600080fd5b612e8b33826136d3565b1515612e9657600080fd5b612ea1338383613801565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600083111515612f0957600080fd5b600683815481101515612f1857fe5b9060005260206000209060020201905061305e816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff168152505061408f565b915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156130c157600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260149054906101000a900460ff1615151561314957600080fd5b61315333836136d3565b151561315e57600080fd5b61316782612ef7565b151561317257600080fd5b61317c82846140c9565b151561318757600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c55d0f56846000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561322057600080fd5b6102c65a03f1151561323157600080fd5b505050604051805190509050600e548101341015151561325057600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663454a2ab3600e543403856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808281526020019150506000604051808303818588803b15156132e457600080fd5b6125ee5a03f115156132f557600080fd5b5050505061330f8263ffffffff168463ffffffff16614122565b505050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600260149054906101000a900460ff1615151561335957600080fd5b600e54341015151561336a57600080fd5b61337433856136d3565b151561337f57600080fd5b6133898385613c4e565b151561339457600080fd5b6006848154811015156133a357fe5b906000526020600020906002020191506134e9826101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff168152505061408f565b15156134f457600080fd5b60068381548110151561350357fe5b90600052602060002090600202019050613649816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff168152505061408f565b151561365457600080fd5b61366082858386613a39565b151561366b57600080fd5b6136758484614122565b50505050565b61368361440d565b61368b61440d565b6000808460405180591061369c5750595b9080825280601f01601f191660200182016040525092506020830191508590506136c78282876142ec565b82935050505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff166007600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b806009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008273ffffffffffffffffffffffffffffffffffffffff166009600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151561399557600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600a600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556009600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b600081841415613a4c5760009050613c46565b818560010160109054906101000a900463ffffffff1663ffffffff161480613a8d5750818560010160149054906101000a900463ffffffff1663ffffffff16145b15613a9b5760009050613c46565b838360010160109054906101000a900463ffffffff1663ffffffff161480613adc5750838360010160149054906101000a900463ffffffff1663ffffffff16145b15613aea5760009050613c46565b60008360010160109054906101000a900463ffffffff1663ffffffff161480613b2d575060008560010160109054906101000a900463ffffffff1663ffffffff16145b15613b3b5760019050613c46565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff161480613bb057508460010160149054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff16145b15613bbe5760009050613c46565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff161480613c3357508460010160149054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff16145b15613c415760009050613c46565b600190505b949350505050565b60008060006007600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161480613d5757508173ffffffffffffffffffffffffffffffffffffffff16600a600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b9250505092915050565b6000808260a0015163ffffffff1614158015613d9557504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b600080613da7614460565b60008863ffffffff1689141515613dbd57600080fd5b8763ffffffff1688141515613dd157600080fd5b8661ffff1687141515613de357600080fd5b600287811515613def57fe5b049250600d8361ffff161115613e0457600d92505b610100604051908101604052808781526020014267ffffffffffffffff168152602001600067ffffffffffffffff1681526020018a63ffffffff1681526020018963ffffffff168152602001600063ffffffff1681526020018461ffff1681526020018861ffff168152509150600160068054806001018281613e8791906144d4565b916000526020600020906002020160008590919091506000820151816000015560208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601c6101000a81548161ffff021916908361ffff16021790555060e082015181600101601e6101000a81548161ffff021916908361ffff16021790555050500390508063ffffffff1681141515613fd957600080fd5b7f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad58582846060015163ffffffff16856080015163ffffffff168660000151604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a161408060008683613801565b80935050505095945050505050565b6000808260a0015163ffffffff161480156140c257504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b60008060006006858154811015156140dd57fe5b906000526020600020906002020191506006848154811015156140fc57fe5b9060005260206000209060020201905061411882868387613a39565b9250505092915050565b60008060068381548110151561413457fe5b9060005260206000209060020201915060068481548110151561415357fe5b90600052602060002090600202019050828160010160186101000a81548163ffffffff021916908363ffffffff16021790555061418f82614337565b61419881614337565b600a600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600a600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600f600081548092919060010191905055507f241ea03ca20251805084d27d4440371c34a0b85ff108f6bb5611248f73818b806007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685858460010160089054906101000a900467ffffffffffffffff16604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018267ffffffffffffffff16815260200194505050505060405180910390a150505050565b60005b60208210151561431457825184526020840193506020830192506020820391506142ef565b6001826020036101000a0390508019835116818551168181178652505050505050565b43600554600383600101601c9054906101000a900461ffff1661ffff16600e8110151561436057fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff1681151561438b57fe5b04018160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600d81600101601c9054906101000a900461ffff1661ffff16101561440a57600181600101601c8282829054906101000a900461ffff160192506101000a81548161ffff021916908361ffff1602179055505b50565b602060405190810160405280600081525090565b6080604051908101604052806004905b60008019168152602001906001900390816144315790505090565b602060405190810160405280600081525090565b6101006040519081016040528060008152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600061ffff168152602001600061ffff1681525090565b815481835581811511614501576002028160020283600052602060002091820191016145009190614506565b5b505050565b6145cf91905b808211156145cb576000808201600090556001820160006101000a81549067ffffffffffffffff02191690556001820160086101000a81549067ffffffffffffffff02191690556001820160106101000a81549063ffffffff02191690556001820160146101000a81549063ffffffff02191690556001820160186101000a81549063ffffffff021916905560018201601c6101000a81549061ffff021916905560018201601e6101000a81549061ffff02191690555060020161450c565b5090565b905600a165627a7a72305820f98b08fb3ef3e5c151dffa5e0c63c43a6e679b6ff349c8101c24a4a587f004990029", + "bytecode": "0x60606040526000600260146101000a81548160ff0219169083151502179055506101c060405190810160405280603c63ffffffff1663ffffffff168152602001607863ffffffff1663ffffffff16815260200161012c63ffffffff1663ffffffff16815260200161025863ffffffff1663ffffffff16815260200161070863ffffffff1663ffffffff168152602001610e1063ffffffff1663ffffffff168152602001611c2063ffffffff1663ffffffff16815260200161384063ffffffff1663ffffffff16815260200161708063ffffffff1663ffffffff16815260200161e10063ffffffff1663ffffffff1681526020016201518063ffffffff1663ffffffff1681526020016202a30063ffffffff1663ffffffff1681526020016205460063ffffffff1663ffffffff16815260200162093a8063ffffffff1663ffffffff16815250600390600e6200015692919062000179565b50600f60055566071afd498d0000600e5534156200017357600080fd5b62000259565b82600e600701600890048101928215620002105791602002820160005b83821115620001dc57835183826101000a81548163ffffffff021916908363ffffffff160217905550926020019260040160208160030104928301926001030262000196565b80156200020e5782816101000a81549063ffffffff0219169055600401602081600301049283019260010302620001dc565b505b5090506200021f919062000223565b5090565b6200025691905b808211156200025257600081816101000a81549063ffffffff0219169055506001016200022a565b5090565b90565b6145fe80620002696000396000f30060606040526004361061023b576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146102405780630519ce791461029a5780630560ff44146102ef57806306fdde031461039f578063095ea7b31461042d5780630a0f81681461046f57806314001f4c146104c457806318160ddd146104fd578063183a7947146105265780631940a9361461054f57806321717ebf1461058a57806323b872dd146105df57806324e7a38a1461064057806327d7874c146106795780632ba73c15146106b25780633d7d3f5a146106eb5780633f4ba83a1461072957806346116e6f1461073e57806346d22c70146107a1578063481af3d3146107e55780634ad8c938146108485780634b85fd55146108865780634dfff04f146108a95780634e0a3379146108eb5780635663896e146109245780635c975abb146109475780636352211e146109745780636fbde40d146109d757806370a0823114610a105780637a7d493714610a5d5780638456cb5914610a865780638462151c14610a9b57806388c2a0bf14610b2957806391876e5714610b6057806395d89b4114610b755780639d6fac6f14610c03578063a45f4bfc14610c46578063a9059cbb14610ca9578063b047fb5014610ceb578063b0c35c0514610d40578063bc4006f514610d69578063d3e6f49f14610dbe578063e17b25af14610df9578063e6cbe35114610e32578063ed60ade614610e87578063f2b47d5214610ea8578063f7d8c88314610efd575b600080fd5b341561024b57600080fd5b61028060048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050610f1e565b604051808215151515815260200191505060405180910390f35b34156102a557600080fd5b6102ad61122f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102fa57600080fd5b61032460048080359060200190919080359060200190820180359060200191909192905050611255565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610364578082015181840152602081019050610349565b50505050905090810190601f1680156103915780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156103aa57600080fd5b6103b26113c0565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103f25780820151818401526020810190506103d7565b50505050905090810190601f16801561041f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561043857600080fd5b61046d600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506113f9565b005b341561047a57600080fd5b6104826114bb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104cf57600080fd5b6104fb600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506114e0565b005b341561050857600080fd5b610510611617565b6040518082815260200191505060405180910390f35b341561053157600080fd5b610539611627565b6040518082815260200191505060405180910390f35b341561055a57600080fd5b610570600480803590602001909190505061162d565b604051808215151515815260200191505060405180910390f35b341561059557600080fd5b61059d61167f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156105ea57600080fd5b61063e600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506116a5565b005b341561064b57600080fd5b610677600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611756565b005b341561068457600080fd5b6106b0600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061188d565b005b34156106bd57600080fd5b6106e9600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611967565b005b34156106f657600080fd5b6107276004808035906020019091908035906020019091908035906020019091908035906020019091905050611a42565b005b341561073457600080fd5b61073c611baa565b005b341561074957600080fd5b61075f6004808035906020019091905050611c3d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156107ac57600080fd5b6107cb6004808035906020019091908035906020019091905050611c70565b604051808215151515815260200191505060405180910390f35b34156107f057600080fd5b6108066004808035906020019091905050611cf8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561085357600080fd5b6108846004808035906020019091908035906020019091908035906020019091908035906020019091905050611d2b565b005b341561089157600080fd5b6108a76004808035906020019091905050611e92565b005b34156108b457600080fd5b6108e9600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611ef8565b005b34156108f657600080fd5b610922600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611f7f565b005b341561092f57600080fd5b610945600480803590602001909190505061205a565b005b341561095257600080fd5b61095a6121ae565b604051808215151515815260200191505060405180910390f35b341561097f57600080fd5b61099560048080359060200190919050506121c1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156109e257600080fd5b610a0e600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061223a565b005b3415610a1b57600080fd5b610a47600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612371565b6040518082815260200191505060405180910390f35b3415610a6857600080fd5b610a706123ba565b6040518082815260200191505060405180910390f35b3415610a9157600080fd5b610a996123c0565b005b3415610aa657600080fd5b610ad2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612504565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610b15578082015181840152602081019050610afa565b505050509050019250505060405180910390f35b3415610b3457600080fd5b610b4a600480803590602001909190505061263b565b6040518082815260200191505060405180910390f35b3415610b6b57600080fd5b610b73612a5a565b005b3415610b8057600080fd5b610b88612c99565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610bc8578082015181840152602081019050610bad565b50505050905090810190601f168015610bf55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610c0e57600080fd5b610c246004808035906020019091905050612cd2565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3415610c5157600080fd5b610c676004808035906020019091905050612d01565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610cb457600080fd5b610ce9600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050612d34565b005b3415610cf657600080fd5b610cfe612ea5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610d4b57600080fd5b610d53612ecb565b6040518082815260200191505060405180910390f35b3415610d7457600080fd5b610d7c612ed1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610dc957600080fd5b610ddf6004808035906020019091905050612ef7565b604051808215151515815260200191505060405180910390f35b3415610e0457600080fd5b610e30600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050613066565b005b3415610e3d57600080fd5b610e45613105565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610ea6600480803590602001909190803590602001909190505061312b565b005b3415610eb357600080fd5b610ebb613314565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610f1c600480803590602001909190803590602001909190505061333a565b005b600060405180807f737570706f727473496e74657266616365286279746573342900000000000000815250601901905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611228575060405180807f746f6b656e4d657461646174612875696e743235362c737472696e6729000000815250601d019050604051809103902060405180807f746f6b656e734f664f776e6572286164647265737329000000000000000000008152506016019050604051809103902060405180807f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81526020017f74323536290000000000000000000000000000000000000000000000000000008152506025019050604051809103902060405180807f7472616e7366657228616464726573732c75696e7432353629000000000000008152506019019050604051809103902060405180807f617070726f766528616464726573732c75696e743235362900000000000000008152506018019050604051809103902060405180807f6f776e65724f662875696e7432353629000000000000000000000000000000008152506010019050604051809103902060405180807f62616c616e63654f6628616464726573732900000000000000000000000000008152506012019050604051809103902060405180807f746f74616c537570706c79282900000000000000000000000000000000000000815250600d019050604051809103902060405180807f73796d626f6c28290000000000000000000000000000000000000000000000008152506008019050604051809103902060405180807f6e616d6528290000000000000000000000000000000000000000000000000000815250600601905060405180910390201818181818181818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61125d61440d565b611265614421565b60008073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156112c457600080fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb4799f2878787600060405160a001526040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180848152602001806020018281038252848482818152602001925080828437820191505094505050505060a060405180830381600087803b151561137f57600080fd5b6102c65a03f1151561139057600080fd5b5050506040518060800180519060200160405280925081935050506113b5828261367b565b925050509392505050565b6040805190810160405280600d81526020017f43727970746f4b6974746965730000000000000000000000000000000000000081525081565b61140333826136d3565b151561140e57600080fd5b611418818361373f565b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561153d57600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166376190f8f6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156115ac57600080fd5b6102c65a03f115156115bd57600080fd5b5050506040518051905015156115d257600080fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600160068054905003905090565b600f5481565b6000808211151561163d57600080fd5b600060068381548110151561164e57fe5b906000526020600020906002020160010160189054906101000a900463ffffffff1663ffffffff1614159050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156116e157600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561171c57600080fd5b6117263382613795565b151561173157600080fd5b61173b83826136d3565b151561174657600080fd5b611751838383613801565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156117b357600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166354c15b826000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561182257600080fd5b6102c65a03f1151561183357600080fd5b50505060405180519050151561184857600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156118e857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561192457600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156119c257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156119fe57600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260149054906101000a900460ff16151515611a5e57600080fd5b611a6833856136d3565b1515611a7357600080fd5b611a7c8461162d565b151515611a8857600080fd5b611ab484600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661373f565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a85858585336040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b1515611b9057600080fd5b6102c65a03f11515611ba157600080fd5b50505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c0557600080fd5b600260149054906101000a900460ff161515611c2057600080fd5b6000600260146101000a81548160ff021916908315150217905550565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008085111515611c8357600080fd5b600084111515611c9257600080fd5b600685815481101515611ca157fe5b90600052602060002090600202019150600684815481101515611cc057fe5b90600052602060002090600202019050611cdc82868387613a39565b8015611cee5750611ced8486613c4e565b5b9250505092915050565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff16151515611d4757600080fd5b611d5133856136d3565b1515611d5c57600080fd5b611d6584612ef7565b1515611d7057600080fd5b611d9c84600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661373f565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a85858585336040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b1515611e7857600080fd5b6102c65a03f11515611e8957600080fd5b50505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611eee57600080fd5b80600e8190555050565b600260149054906101000a900460ff16151515611f1457600080fd5b611f1e33826136d3565b1515611f2957600080fd5b81600a600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611fda57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561201657600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061210257506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061215a5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561216557600080fd5b60036000600e8110151561217557fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff16811015156121a457600080fd5b8060058190555050565b600260149054906101000a900460ff1681565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561223557600080fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561229757600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166385b861886000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561230657600080fd5b6102c65a03f1151561231757600080fd5b50505060405180519050151561232c57600080fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061246857506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806124c05750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156124cb57600080fd5b600260149054906101000a900460ff161515156124e757600080fd5b6001600260146101000a81548160ff021916908315150217905550565b61250c61444c565b600061251661444c565b600080600061252487612371565b9450600085141561255657600060405180591061253e5750595b90808252806020026020018201604052509550612631565b846040518059106125645750595b9080825280602002602001820160405250935061257f611617565b925060009150600190505b828111151561262d578673ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156126205780848381518110151561260957fe5b906020019060200201818152505081806001019250505b808060010191505061258a565b8395505b5050505050919050565b600080600080600080600080600260149054906101000a900460ff1615151561266357600080fd5b60068981548110151561267257fe5b9060005260206000209060020201965060008760010160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16141515156126b457600080fd5b6127ea876101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050613d61565b15156127f557600080fd5b8660010160189054906101000a900463ffffffff1663ffffffff16955060068681548110151561282157fe5b9060005260206000209060020201945086600101601e9054906101000a900461ffff16935086600101601e9054906101000a900461ffff1661ffff1685600101601e9054906101000a900461ffff1661ffff1611156128905784600101601e9054906101000a900461ffff1693505b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d9f5aed8860000154876000015460018b60010160089054906101000a900467ffffffffffffffff16036000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018381526020018267ffffffffffffffff1681526020019350505050602060405180830381600087803b151561296657600080fd5b6102c65a03f1151561297757600080fd5b505050604051805190509250600760008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506129e7898860010160189054906101000a900463ffffffff1663ffffffff166001870161ffff168686613d9c565b90508660010160186101000a81549063ffffffff0219169055600f60008154809291906001900391905055503373ffffffffffffffffffffffffffffffffffffffff166108fc600e549081150290604051600060405180830381858888f193505050505080975050505050505050919050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612b0257506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80612b5a5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515612b6557600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b1515612bea57600080fd5b6102c65a03f11515612bfb57600080fd5b505050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b1515612c8357600080fd5b6102c65a03f11515612c9457600080fd5b505050565b6040805190810160405280600281526020017f434b00000000000000000000000000000000000000000000000000000000000081525081565b600381600e81101515612ce157fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff16151515612d5057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612d8c57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612dc757600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612e2457600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612e8157600080fd5b612e8b33826136d3565b1515612e9657600080fd5b612ea1338383613801565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600083111515612f0957600080fd5b600683815481101515612f1857fe5b9060005260206000209060020201905061305e816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff168152505061408f565b915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156130c157600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260149054906101000a900460ff1615151561314957600080fd5b61315333836136d3565b151561315e57600080fd5b61316782612ef7565b151561317257600080fd5b61317c82846140c9565b151561318757600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c55d0f56846000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561322057600080fd5b6102c65a03f1151561323157600080fd5b505050604051805190509050600e548101341015151561325057600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663454a2ab3600e543403856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808281526020019150506000604051808303818588803b15156132e457600080fd5b6125ee5a03f115156132f557600080fd5b5050505061330f8263ffffffff168463ffffffff16614122565b505050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600260149054906101000a900460ff1615151561335957600080fd5b600e54341015151561336a57600080fd5b61337433856136d3565b151561337f57600080fd5b6133898385613c4e565b151561339457600080fd5b6006848154811015156133a357fe5b906000526020600020906002020191506134e9826101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff168152505061408f565b15156134f457600080fd5b60068381548110151561350357fe5b90600052602060002090600202019050613649816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff168152505061408f565b151561365457600080fd5b61366082858386613a39565b151561366b57600080fd5b6136758484614122565b50505050565b61368361440d565b61368b61440d565b6000808460405180591061369c5750595b9080825280601f01601f191660200182016040525092506020830191508590506136c78282876142ec565b82935050505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff166007600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b806009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008273ffffffffffffffffffffffffffffffffffffffff166009600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151561399557600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600a600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556009600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b600081841415613a4c5760009050613c46565b818560010160109054906101000a900463ffffffff1663ffffffff161480613a8d5750818560010160149054906101000a900463ffffffff1663ffffffff16145b15613a9b5760009050613c46565b838360010160109054906101000a900463ffffffff1663ffffffff161480613adc5750838360010160149054906101000a900463ffffffff1663ffffffff16145b15613aea5760009050613c46565b60008360010160109054906101000a900463ffffffff1663ffffffff161480613b2d575060008560010160109054906101000a900463ffffffff1663ffffffff16145b15613b3b5760019050613c46565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff161480613bb057508460010160149054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff16145b15613bbe5760009050613c46565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff161480613c3357508460010160149054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff16145b15613c415760009050613c46565b600190505b949350505050565b60008060006007600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161480613d5757508173ffffffffffffffffffffffffffffffffffffffff16600a600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b9250505092915050565b6000808260a0015163ffffffff1614158015613d9557504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b600080613da7614460565b60008863ffffffff1689141515613dbd57600080fd5b8763ffffffff1688141515613dd157600080fd5b8661ffff1687141515613de357600080fd5b600287811515613def57fe5b049250600d8361ffff161115613e0457600d92505b610100604051908101604052808781526020014267ffffffffffffffff168152602001600067ffffffffffffffff1681526020018a63ffffffff1681526020018963ffffffff168152602001600063ffffffff1681526020018461ffff1681526020018861ffff168152509150600160068054806001018281613e8791906144d4565b916000526020600020906002020160008590919091506000820151816000015560208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601c6101000a81548161ffff021916908361ffff16021790555060e082015181600101601e6101000a81548161ffff021916908361ffff16021790555050500390508063ffffffff1681141515613fd957600080fd5b7f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad58582846060015163ffffffff16856080015163ffffffff168660000151604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a161408060008683613801565b80935050505095945050505050565b6000808260a0015163ffffffff161480156140c257504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b60008060006006858154811015156140dd57fe5b906000526020600020906002020191506006848154811015156140fc57fe5b9060005260206000209060020201905061411882868387613a39565b9250505092915050565b60008060068381548110151561413457fe5b9060005260206000209060020201915060068481548110151561415357fe5b90600052602060002090600202019050828160010160186101000a81548163ffffffff021916908363ffffffff16021790555061418f82614337565b61419881614337565b600a600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600a600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600f600081548092919060010191905055507f241ea03ca20251805084d27d4440371c34a0b85ff108f6bb5611248f73818b806007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685858460010160089054906101000a900467ffffffffffffffff16604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018267ffffffffffffffff16815260200194505050505060405180910390a150505050565b60005b60208210151561431457825184526020840193506020830192506020820391506142ef565b6001826020036101000a0390508019835116818551168181178652505050505050565b43600554600383600101601c9054906101000a900461ffff1661ffff16600e8110151561436057fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff1681151561438b57fe5b04018160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600d81600101601c9054906101000a900461ffff1661ffff16101561440a57600181600101601c8282829054906101000a900461ffff160192506101000a81548161ffff021916908361ffff1602179055505b50565b602060405190810160405280600081525090565b6080604051908101604052806004905b60008019168152602001906001900390816144315790505090565b602060405190810160405280600081525090565b6101006040519081016040528060008152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600061ffff168152602001600061ffff1681525090565b815481835581811511614501576002028160020283600052602060002091820191016145009190614506565b5b505050565b6145cf91905b808211156145cb576000808201600090556001820160006101000a81549067ffffffffffffffff02191690556001820160086101000a81549067ffffffffffffffff02191690556001820160106101000a81549063ffffffff02191690556001820160146101000a81549063ffffffff02191690556001820160186101000a81549063ffffffff021916905560018201601c6101000a81549061ffff021916905560018201601e6101000a81549061ffff02191690555060020161450c565b5090565b905600a165627a7a723058209362fe414c30b76be5bab99038d1480636f63affb77367ed007af7ff14b65b110029", + "deployedBytecode": "0x60606040526004361061023b576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146102405780630519ce791461029a5780630560ff44146102ef57806306fdde031461039f578063095ea7b31461042d5780630a0f81681461046f57806314001f4c146104c457806318160ddd146104fd578063183a7947146105265780631940a9361461054f57806321717ebf1461058a57806323b872dd146105df57806324e7a38a1461064057806327d7874c146106795780632ba73c15146106b25780633d7d3f5a146106eb5780633f4ba83a1461072957806346116e6f1461073e57806346d22c70146107a1578063481af3d3146107e55780634ad8c938146108485780634b85fd55146108865780634dfff04f146108a95780634e0a3379146108eb5780635663896e146109245780635c975abb146109475780636352211e146109745780636fbde40d146109d757806370a0823114610a105780637a7d493714610a5d5780638456cb5914610a865780638462151c14610a9b57806388c2a0bf14610b2957806391876e5714610b6057806395d89b4114610b755780639d6fac6f14610c03578063a45f4bfc14610c46578063a9059cbb14610ca9578063b047fb5014610ceb578063b0c35c0514610d40578063bc4006f514610d69578063d3e6f49f14610dbe578063e17b25af14610df9578063e6cbe35114610e32578063ed60ade614610e87578063f2b47d5214610ea8578063f7d8c88314610efd575b600080fd5b341561024b57600080fd5b61028060048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050610f1e565b604051808215151515815260200191505060405180910390f35b34156102a557600080fd5b6102ad61122f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102fa57600080fd5b61032460048080359060200190919080359060200190820180359060200191909192905050611255565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610364578082015181840152602081019050610349565b50505050905090810190601f1680156103915780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156103aa57600080fd5b6103b26113c0565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103f25780820151818401526020810190506103d7565b50505050905090810190601f16801561041f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561043857600080fd5b61046d600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506113f9565b005b341561047a57600080fd5b6104826114bb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104cf57600080fd5b6104fb600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506114e0565b005b341561050857600080fd5b610510611617565b6040518082815260200191505060405180910390f35b341561053157600080fd5b610539611627565b6040518082815260200191505060405180910390f35b341561055a57600080fd5b610570600480803590602001909190505061162d565b604051808215151515815260200191505060405180910390f35b341561059557600080fd5b61059d61167f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156105ea57600080fd5b61063e600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506116a5565b005b341561064b57600080fd5b610677600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611756565b005b341561068457600080fd5b6106b0600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061188d565b005b34156106bd57600080fd5b6106e9600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611967565b005b34156106f657600080fd5b6107276004808035906020019091908035906020019091908035906020019091908035906020019091905050611a42565b005b341561073457600080fd5b61073c611baa565b005b341561074957600080fd5b61075f6004808035906020019091905050611c3d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156107ac57600080fd5b6107cb6004808035906020019091908035906020019091905050611c70565b604051808215151515815260200191505060405180910390f35b34156107f057600080fd5b6108066004808035906020019091905050611cf8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561085357600080fd5b6108846004808035906020019091908035906020019091908035906020019091908035906020019091905050611d2b565b005b341561089157600080fd5b6108a76004808035906020019091905050611e92565b005b34156108b457600080fd5b6108e9600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611ef8565b005b34156108f657600080fd5b610922600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611f7f565b005b341561092f57600080fd5b610945600480803590602001909190505061205a565b005b341561095257600080fd5b61095a6121ae565b604051808215151515815260200191505060405180910390f35b341561097f57600080fd5b61099560048080359060200190919050506121c1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156109e257600080fd5b610a0e600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061223a565b005b3415610a1b57600080fd5b610a47600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612371565b6040518082815260200191505060405180910390f35b3415610a6857600080fd5b610a706123ba565b6040518082815260200191505060405180910390f35b3415610a9157600080fd5b610a996123c0565b005b3415610aa657600080fd5b610ad2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612504565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610b15578082015181840152602081019050610afa565b505050509050019250505060405180910390f35b3415610b3457600080fd5b610b4a600480803590602001909190505061263b565b6040518082815260200191505060405180910390f35b3415610b6b57600080fd5b610b73612a5a565b005b3415610b8057600080fd5b610b88612c99565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610bc8578082015181840152602081019050610bad565b50505050905090810190601f168015610bf55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610c0e57600080fd5b610c246004808035906020019091905050612cd2565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3415610c5157600080fd5b610c676004808035906020019091905050612d01565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610cb457600080fd5b610ce9600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050612d34565b005b3415610cf657600080fd5b610cfe612ea5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610d4b57600080fd5b610d53612ecb565b6040518082815260200191505060405180910390f35b3415610d7457600080fd5b610d7c612ed1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610dc957600080fd5b610ddf6004808035906020019091905050612ef7565b604051808215151515815260200191505060405180910390f35b3415610e0457600080fd5b610e30600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050613066565b005b3415610e3d57600080fd5b610e45613105565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610ea6600480803590602001909190803590602001909190505061312b565b005b3415610eb357600080fd5b610ebb613314565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610f1c600480803590602001909190803590602001909190505061333a565b005b600060405180807f737570706f727473496e74657266616365286279746573342900000000000000815250601901905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611228575060405180807f746f6b656e4d657461646174612875696e743235362c737472696e6729000000815250601d019050604051809103902060405180807f746f6b656e734f664f776e6572286164647265737329000000000000000000008152506016019050604051809103902060405180807f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81526020017f74323536290000000000000000000000000000000000000000000000000000008152506025019050604051809103902060405180807f7472616e7366657228616464726573732c75696e7432353629000000000000008152506019019050604051809103902060405180807f617070726f766528616464726573732c75696e743235362900000000000000008152506018019050604051809103902060405180807f6f776e65724f662875696e7432353629000000000000000000000000000000008152506010019050604051809103902060405180807f62616c616e63654f6628616464726573732900000000000000000000000000008152506012019050604051809103902060405180807f746f74616c537570706c79282900000000000000000000000000000000000000815250600d019050604051809103902060405180807f73796d626f6c28290000000000000000000000000000000000000000000000008152506008019050604051809103902060405180807f6e616d6528290000000000000000000000000000000000000000000000000000815250600601905060405180910390201818181818181818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61125d61440d565b611265614421565b60008073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156112c457600080fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb4799f2878787600060405160a001526040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180848152602001806020018281038252848482818152602001925080828437820191505094505050505060a060405180830381600087803b151561137f57600080fd5b6102c65a03f1151561139057600080fd5b5050506040518060800180519060200160405280925081935050506113b5828261367b565b925050509392505050565b6040805190810160405280600d81526020017f43727970746f4b6974746965730000000000000000000000000000000000000081525081565b61140333826136d3565b151561140e57600080fd5b611418818361373f565b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561153d57600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166376190f8f6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156115ac57600080fd5b6102c65a03f115156115bd57600080fd5b5050506040518051905015156115d257600080fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600160068054905003905090565b600f5481565b6000808211151561163d57600080fd5b600060068381548110151561164e57fe5b906000526020600020906002020160010160189054906101000a900463ffffffff1663ffffffff1614159050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156116e157600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561171c57600080fd5b6117263382613795565b151561173157600080fd5b61173b83826136d3565b151561174657600080fd5b611751838383613801565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156117b357600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166354c15b826000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561182257600080fd5b6102c65a03f1151561183357600080fd5b50505060405180519050151561184857600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156118e857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561192457600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156119c257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156119fe57600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260149054906101000a900460ff16151515611a5e57600080fd5b611a6833856136d3565b1515611a7357600080fd5b611a7c8461162d565b151515611a8857600080fd5b611ab484600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661373f565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a85858585336040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b1515611b9057600080fd5b6102c65a03f11515611ba157600080fd5b50505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c0557600080fd5b600260149054906101000a900460ff161515611c2057600080fd5b6000600260146101000a81548160ff021916908315150217905550565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008085111515611c8357600080fd5b600084111515611c9257600080fd5b600685815481101515611ca157fe5b90600052602060002090600202019150600684815481101515611cc057fe5b90600052602060002090600202019050611cdc82868387613a39565b8015611cee5750611ced8486613c4e565b5b9250505092915050565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff16151515611d4757600080fd5b611d5133856136d3565b1515611d5c57600080fd5b611d6584612ef7565b1515611d7057600080fd5b611d9c84600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661373f565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a85858585336040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b1515611e7857600080fd5b6102c65a03f11515611e8957600080fd5b50505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611eee57600080fd5b80600e8190555050565b600260149054906101000a900460ff16151515611f1457600080fd5b611f1e33826136d3565b1515611f2957600080fd5b81600a600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611fda57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561201657600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061210257506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061215a5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561216557600080fd5b60036000600e8110151561217557fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff16811015156121a457600080fd5b8060058190555050565b600260149054906101000a900460ff1681565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561223557600080fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561229757600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166385b861886000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561230657600080fd5b6102c65a03f1151561231757600080fd5b50505060405180519050151561232c57600080fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061246857506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806124c05750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156124cb57600080fd5b600260149054906101000a900460ff161515156124e757600080fd5b6001600260146101000a81548160ff021916908315150217905550565b61250c61444c565b600061251661444c565b600080600061252487612371565b9450600085141561255657600060405180591061253e5750595b90808252806020026020018201604052509550612631565b846040518059106125645750595b9080825280602002602001820160405250935061257f611617565b925060009150600190505b828111151561262d578673ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156126205780848381518110151561260957fe5b906020019060200201818152505081806001019250505b808060010191505061258a565b8395505b5050505050919050565b600080600080600080600080600260149054906101000a900460ff1615151561266357600080fd5b60068981548110151561267257fe5b9060005260206000209060020201965060008760010160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16141515156126b457600080fd5b6127ea876101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050613d61565b15156127f557600080fd5b8660010160189054906101000a900463ffffffff1663ffffffff16955060068681548110151561282157fe5b9060005260206000209060020201945086600101601e9054906101000a900461ffff16935086600101601e9054906101000a900461ffff1661ffff1685600101601e9054906101000a900461ffff1661ffff1611156128905784600101601e9054906101000a900461ffff1693505b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d9f5aed8860000154876000015460018b60010160089054906101000a900467ffffffffffffffff16036000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018381526020018267ffffffffffffffff1681526020019350505050602060405180830381600087803b151561296657600080fd5b6102c65a03f1151561297757600080fd5b505050604051805190509250600760008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506129e7898860010160189054906101000a900463ffffffff1663ffffffff166001870161ffff168686613d9c565b90508660010160186101000a81549063ffffffff0219169055600f60008154809291906001900391905055503373ffffffffffffffffffffffffffffffffffffffff166108fc600e549081150290604051600060405180830381858888f193505050505080975050505050505050919050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612b0257506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80612b5a5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515612b6557600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b1515612bea57600080fd5b6102c65a03f11515612bfb57600080fd5b505050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b1515612c8357600080fd5b6102c65a03f11515612c9457600080fd5b505050565b6040805190810160405280600281526020017f434b00000000000000000000000000000000000000000000000000000000000081525081565b600381600e81101515612ce157fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff16151515612d5057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612d8c57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612dc757600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612e2457600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612e8157600080fd5b612e8b33826136d3565b1515612e9657600080fd5b612ea1338383613801565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600083111515612f0957600080fd5b600683815481101515612f1857fe5b9060005260206000209060020201905061305e816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff168152505061408f565b915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156130c157600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260149054906101000a900460ff1615151561314957600080fd5b61315333836136d3565b151561315e57600080fd5b61316782612ef7565b151561317257600080fd5b61317c82846140c9565b151561318757600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c55d0f56846000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561322057600080fd5b6102c65a03f1151561323157600080fd5b505050604051805190509050600e548101341015151561325057600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663454a2ab3600e543403856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808281526020019150506000604051808303818588803b15156132e457600080fd5b6125ee5a03f115156132f557600080fd5b5050505061330f8263ffffffff168463ffffffff16614122565b505050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600260149054906101000a900460ff1615151561335957600080fd5b600e54341015151561336a57600080fd5b61337433856136d3565b151561337f57600080fd5b6133898385613c4e565b151561339457600080fd5b6006848154811015156133a357fe5b906000526020600020906002020191506134e9826101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff168152505061408f565b15156134f457600080fd5b60068381548110151561350357fe5b90600052602060002090600202019050613649816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff168152505061408f565b151561365457600080fd5b61366082858386613a39565b151561366b57600080fd5b6136758484614122565b50505050565b61368361440d565b61368b61440d565b6000808460405180591061369c5750595b9080825280601f01601f191660200182016040525092506020830191508590506136c78282876142ec565b82935050505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff166007600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b806009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008273ffffffffffffffffffffffffffffffffffffffff166009600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151561399557600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600a600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556009600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b600081841415613a4c5760009050613c46565b818560010160109054906101000a900463ffffffff1663ffffffff161480613a8d5750818560010160149054906101000a900463ffffffff1663ffffffff16145b15613a9b5760009050613c46565b838360010160109054906101000a900463ffffffff1663ffffffff161480613adc5750838360010160149054906101000a900463ffffffff1663ffffffff16145b15613aea5760009050613c46565b60008360010160109054906101000a900463ffffffff1663ffffffff161480613b2d575060008560010160109054906101000a900463ffffffff1663ffffffff16145b15613b3b5760019050613c46565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff161480613bb057508460010160149054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff16145b15613bbe5760009050613c46565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff161480613c3357508460010160149054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff16145b15613c415760009050613c46565b600190505b949350505050565b60008060006007600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161480613d5757508173ffffffffffffffffffffffffffffffffffffffff16600a600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b9250505092915050565b6000808260a0015163ffffffff1614158015613d9557504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b600080613da7614460565b60008863ffffffff1689141515613dbd57600080fd5b8763ffffffff1688141515613dd157600080fd5b8661ffff1687141515613de357600080fd5b600287811515613def57fe5b049250600d8361ffff161115613e0457600d92505b610100604051908101604052808781526020014267ffffffffffffffff168152602001600067ffffffffffffffff1681526020018a63ffffffff1681526020018963ffffffff168152602001600063ffffffff1681526020018461ffff1681526020018861ffff168152509150600160068054806001018281613e8791906144d4565b916000526020600020906002020160008590919091506000820151816000015560208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601c6101000a81548161ffff021916908361ffff16021790555060e082015181600101601e6101000a81548161ffff021916908361ffff16021790555050500390508063ffffffff1681141515613fd957600080fd5b7f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad58582846060015163ffffffff16856080015163ffffffff168660000151604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a161408060008683613801565b80935050505095945050505050565b6000808260a0015163ffffffff161480156140c257504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b60008060006006858154811015156140dd57fe5b906000526020600020906002020191506006848154811015156140fc57fe5b9060005260206000209060020201905061411882868387613a39565b9250505092915050565b60008060068381548110151561413457fe5b9060005260206000209060020201915060068481548110151561415357fe5b90600052602060002090600202019050828160010160186101000a81548163ffffffff021916908363ffffffff16021790555061418f82614337565b61419881614337565b600a600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600a600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600f600081548092919060010191905055507f241ea03ca20251805084d27d4440371c34a0b85ff108f6bb5611248f73818b806007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685858460010160089054906101000a900467ffffffffffffffff16604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018267ffffffffffffffff16815260200194505050505060405180910390a150505050565b60005b60208210151561431457825184526020840193506020830192506020820391506142ef565b6001826020036101000a0390508019835116818551168181178652505050505050565b43600554600383600101601c9054906101000a900461ffff1661ffff16600e8110151561436057fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff1681151561438b57fe5b04018160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600d81600101601c9054906101000a900461ffff1661ffff16101561440a57600181600101601c8282829054906101000a900461ffff160192506101000a81548161ffff021916908361ffff1602179055505b50565b602060405190810160405280600081525090565b6080604051908101604052806004905b60008019168152602001906001900390816144315790505090565b602060405190810160405280600081525090565b6101006040519081016040528060008152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600061ffff168152602001600061ffff1681525090565b815481835581811511614501576002028160020283600052602060002091820191016145009190614506565b5b505050565b6145cf91905b808211156145cb576000808201600090556001820160006101000a81549067ffffffffffffffff02191690556001820160086101000a81549067ffffffffffffffff02191690556001820160106101000a81549063ffffffff02191690556001820160146101000a81549063ffffffff02191690556001820160186101000a81549063ffffffff021916905560018201601c6101000a81549061ffff021916905560018201601e6101000a81549061ffff02191690555060020161450c565b5090565b905600a165627a7a723058209362fe414c30b76be5bab99038d1480636f63affb77367ed007af7ff14b65b110029", "sourceMap": "65949:4866:18:-;;;5032:5;5011:26;;;;;;;;;;;;;;;;;;;;11384:339;;;;;;;;;11427:9;11384:339;;;;;;;;11450:9;11384:339;;;;;;;;11473:9;11384:339;;;;;;;;11496:10;11384:339;;;;;;;;11520:10;11384:339;;;;;;;;11544:7;11384:339;;;;;;;;11565:7;11384:339;;;;;;;;11586:7;11384:339;;;;;;;;11607:7;11384:339;;;;;;;;11628:8;11384:339;;;;;;;;11650:6;11384:339;;;;;;;;11670:6;11384:339;;;;;;;;11690:6;11384:339;;;;;;;;11710:6;11384:339;;;;;;;;;;;;;;;:::i;:::-;;11840:2;11807:35;;30582:8;30552:38;;65949:4866;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;", "deployedSourceMap": "65949:4866:18:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19989:327;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4848:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29456:346;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18924:45:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24204:395:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4817:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66994:477;;;;;;;;;;;;;;;;;;;;;;;;;;;;25978:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30647:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35349:235;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13853:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25066:784;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31057:470;;;;;;;;;;;;;;;;;;;;;;;;;;;;5800:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;6346;;;;;;;;;;;;;;;;;;;;;;;;;;;;67586:978;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7359:126;;;;;;;;;;;;;;13283:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38051:388;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12965:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68725:796;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34379:90;;;;;;;;;;;;;;;;;;;;;;;;;;33972:189;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6073:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;17342:139;;;;;;;;;;;;;;;;;;;;;;;;;;5011:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26205:180;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66412:467;;;;;;;;;;;;;;;;;;;;;;;;;;;;22243:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11807:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6990:81;;;;;;;;;;;;;;26841:853;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;42595:1586:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70671:142;;;;;;;;;;;;;;18975:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11384:339:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12465:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22790:990;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4879:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30552:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19070:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34991:207;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20416:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;13564:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69769:703;;;;;;;;;;;;;;;;;;;;;;;;;;30817:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40000:1958;;;;;;;;;;;;;;;;;;;;;;;;;;19989:327;20060:4;19175:38;;;;;;;;;;;;;;;;;;;20219:41;;;:12;:41;;;;20218:90;;;;19697:42;;;;;;;;;;;;;;;;;;;19647:35;;;;;;;;;;;;;;;;;;;19582:50;;;;;;;;;;;;;;;;;;;;;;;;19529:38;;;;;;;;;;;;;;;;;;;19477:37;;;;;;;;;;;;;;;;;;;19433:29;;;;;;;;;;;;;;;;;;;19387:31;;;;;;;;;;;;;;;;;;;19346:26;;;;;;;;;;;;;;;;;;;19310:21;;;;;;;;;;;;;;;;;;;19276:19;;;;;;;;;;;;;;;;;;;19269:63;:104;:150;:194;:246;:299;:364;:414;:471;20266:41;;;:12;:41;;;;20218:90;20210:99;;19989:327;;;:::o;4848:25::-;;;;;;;;;;;;;:::o;29456:346::-;29548:14;;:::i;:::-;29621:24;;:::i;:::-;29655:13;29608:1;29582:28;;:14;;;;;;;;;;;:28;;;;29574:37;;;;;;;;29696:14;;;;;;;;;;;:26;;;29723:8;29733:19;;29696:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29678:75;;;;;;;;29771:24;29781:6;29789:5;29771:9;:24::i;:::-;29764:31;;29456:346;;;;;;;:::o;18924:45::-;;;;;;;;;;;;;;;;;;;;:::o;24204:395::-;24384:27;24390:10;24402:8;24384:5;:27::i;:::-;24376:36;;;;;;;;24491:23;24500:8;24510:3;24491:8;:23::i;:::-;24557:35;24566:10;24578:3;24583:8;24557:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24204:395;;:::o;4817:25::-;;;;;;;;;;;;;:::o;66994:477::-;67072:36;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;67130:8;67072:67;;67339:17;:38;;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67331:49;;;;;;;;67447:17;67431:13;;:33;;;;;;;;;;;;;;;;;;66994:477;;:::o;25978:92::-;26022:4;26062:1;26045:7;:14;;;;:18;26038:25;;25978:92;:::o;30647:30::-;;;;:::o;35349:235::-;35420:4;35459:1;35448:8;:12;35440:21;;;;;;;;35576:1;35542:7;35550:8;35542:17;;;;;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;:35;;;;35535:42;;35349:235;;;:::o;13853:39::-;;;;;;;;;;;;;:::o;25066:784::-;25305:1;25290:17;;:3;:17;;;;25282:26;;;;;;;;25563:4;25548:20;;:3;:20;;;;25540:29;;;;;;;;25637:34;25650:10;25662:8;25637:12;:34::i;:::-;25629:43;;;;;;;;25690:22;25696:5;25703:8;25690:5;:22::i;:::-;25682:31;;;;;;;;25812;25822:5;25829:3;25834:8;25812:9;:31::i;:::-;25066:784;;;:::o;31057:470::-;31133:38;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;31195:8;31133:71;;31404:17;:31;;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31396:42;;;;;;;;31503:17;31489:11;;:31;;;;;;;;;;;;;;;;;;31057:470;;:::o;5800:128::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;5887:1;5868:21;;:7;:21;;;;5860:30;;;;;;;;5914:7;5901:10;;:20;;;;;;;;;;;;;;;;;;5800:128;:::o;6346:::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;6433:1;6414:21;;:7;:21;;;;6406:30;;;;;;;;6460:7;6447:10;;:20;;;;;;;;;;;;;;;;;;6346:128;:::o;67586:978::-;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;67958:27;67964:10;67976:8;67958:5;:27::i;:::-;67950:36;;;;;;;;68198:20;68209:8;68198:10;:20::i;:::-;68197:21;68189:30;;;;;;;;68229:31;68238:8;68248:11;;;;;;;;;;;68229:8;:31::i;:::-;68399:11;;;;;;;;;;;:25;;;68438:8;68460:14;68488:12;68514:9;68537:10;68399:158;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67586:978;;;;:::o;7359:126::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;6812:6;;;;;;;;;;;6804:15;;;;;;;;7473:5;7464:6;;:14;;;;;;;;;;;;;;;;;;7359:126::o;13283:56::-;;;;;;;;;;;;;;;;;;;;;;:::o;38051:388::-;38143:4;38225:20;38276:18;38183:1;38171:9;:13;38163:22;;;;;;;;38213:1;38203:7;:11;38195:20;;;;;;;;38248:7;38256:9;38248:18;;;;;;;;;;;;;;;;;;;;38225:41;;38297:7;38305;38297:16;;;;;;;;;;;;;;;;;;;;38276:37;;38330:52;38349:6;38357:9;38368:4;38374:7;38330:18;:52::i;:::-;:102;;;;;38394:38;38413:7;38422:9;38394:18;:38::i;:::-;38330:102;38323:109;;38051:388;;;;;;:::o;12965:56::-;;;;;;;;;;;;;;;;;;;;;;:::o;68725:796::-;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;69099:27;69105:10;69117:8;69099:5;:27::i;:::-;69091:36;;;;;;;;69145:24;69160:8;69145:14;:24::i;:::-;69137:33;;;;;;;;69180;69189:8;69199:13;;;;;;;;;;;69180:8;:33::i;:::-;69354:13;;;;;;;;;;;:27;;;69395:8;69417:14;69445:12;69471:9;69494:10;69354:160;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68725:796;;;;:::o;34379:90::-;5435:10;;;;;;;;;;;5421:24;;:10;:24;;;5413:33;;;;;;;;34459:3;34444:12;:18;;;;34379:90;:::o;33972:189::-;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;34080:26;34086:10;34098:7;34080:5;:26::i;:::-;34072:35;;;;;;;;34149:5;34117:20;:29;34138:7;34117:29;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;33972:189;;:::o;6073:128::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;6160:1;6141:21;;:7;:21;;;;6133:30;;;;;;;;6187:7;6174:10;;:20;;;;;;;;;;;;;;;;;;6073:128;:::o;17342:139::-;5537:10;;;;;;;;;;;5523:24;;:10;:24;;;:64;;;;5577:10;;;;;;;;;;;5563:24;;:10;:24;;;5523:64;:104;;;;5617:10;;;;;;;;;;;5603:24;;:10;:24;;;5523:104;5502:135;;;;;;;;17429:9;17439:1;17429:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17422:19;;:4;:19;17414:28;;;;;;;;17470:4;17452:15;:22;;;;17342:139;:::o;5011:26::-;;;;;;;;;;;;;:::o;26205:180::-;26275:13;26312:17;:27;26330:8;26312:27;;;;;;;;;;;;;;;;;;;;;26304:35;;26375:1;26358:19;;:5;:19;;;;26350:28;;;;;;;;26205:180;;;:::o;66412:467::-;66488:34;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;66542:8;66488:63;;66751:17;:36;;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66743:47;;;;;;;;66855:17;66841:11;;:31;;;;;;;;;;;;;;;;;;66412:467;;:::o;22243:122::-;22299:13;22331:19;:27;22351:6;22331:27;;;;;;;;;;;;;;;;22324:34;;22243:122;;;:::o;11807:35::-;;;;:::o;6990:81::-;5537:10;;;;;;;;;;;5523:24;;:10;:24;;;:64;;;;5577:10;;;;;;;;;;;5563:24;;:10;:24;;;5523:64;:104;;;;5617:10;;;;;;;;;;;5603:24;;:10;:24;;;5523:104;5502:135;;;;;;;;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;7060:4;7051:6;;:13;;;;;;;;;;;;;;;;;;6990:81::o;26841:853::-;26902:21;;:::i;:::-;26935:18;27110:23;;:::i;:::-;27175:17;27222:19;27402:13;26956:17;26966:6;26956:9;:17::i;:::-;26935:38;;27002:1;26988:10;:15;26984:704;;;27077:1;27063:16;;;;;;;;;;;;;;;;;;;;;;;;27056:23;;;;26984:704;27150:10;27136:25;;;;;;;;;;;;;;;;;;;;;;;;27110:51;;27195:13;:11;:13::i;:::-;27175:33;;27244:1;27222:23;;27443:1;27435:9;;27430:220;27455:9;27446:5;:18;;27430:220;;;27525:6;27497:34;;:17;:24;27515:5;27497:24;;;;;;;;;;;;;;;;;;;;;:34;;;27493:143;;;27577:5;27555:6;27562:11;27555:19;;;;;;;;;;;;;;;;;:27;;;;;27604:13;;;;;;;27493:143;27466:7;;;;;;;27430:220;;;27671:6;27664:13;;26841:853;;;;;;;;;:::o;42595:1586::-;42676:7;42753:20;43068:14;43114:18;43230:16;43436:18;43575:13;43629:16;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;42776:7;42784:9;42776:18;;;;;;;;;;;;;;;;;;;;42753:41;;42882:1;42862:6;:16;;;;;;;;;;;;:21;;;;42854:30;;;;;;;;42977:27;42997:6;42977:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:19;:27::i;:::-;42969:36;;;;;;;;43085:6;:19;;;;;;;;;;;;43068:36;;;;43135:7;43143:6;43135:15;;;;;;;;;;;;;;;;;;;;43114:36;;43249:6;:17;;;;;;;;;;;;43230:36;;43298:6;:17;;;;;;;;;;;;43280:35;;:4;:15;;;;;;;;;;;;:35;;;43276:93;;;43343:4;:15;;;;;;;;;;;;43331:27;;43276:93;43457:11;;;;;;;;;;;:20;;;43478:6;:12;;;43492:4;:10;;;43530:1;43504:6;:23;;;;;;;;;;;;:27;43457:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43436:96;;43591:17;:28;43609:9;43591:28;;;;;;;;;;;;;;;;;;;;;43575:44;;43648:78;43661:9;43672:6;:19;;;;;;;;;;;;43648:78;;43705:1;43693:9;:13;43648:78;;43708:10;43720:5;43648:12;:78::i;:::-;43629:97;;43888:6;:19;;;43881:26;;;;;;;;;;;43984:15;;:17;;;;;;;;;;;;;;44081:10;:15;;:29;44097:12;;44081:29;;;;;;;;;;;;;;;;;;;;;;;;44166:8;44159:15;;42595:1586;;;;;;;;;;:::o;70671:142::-;5537:10;;;;;;;;;;;5523:24;;:10;:24;;;:64;;;;5577:10;;;;;;;;;;;5563:24;;:10;:24;;;5523:64;:104;;;;5617:10;;;;;;;;;;;5603:24;;:10;:24;;;5523:104;5502:135;;;;;;;;70736:11;;;;;;;;;;;:27;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70775:13;;;;;;;;;;;:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70671:142::o;18975:36::-;;;;;;;;;;;;;;;;;;;;:::o;11384:339::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;12465:53::-;;;;;;;;;;;;;;;;;;;;;;:::o;22790:990::-;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;22999:1;22984:17;;:3;:17;;;;22976:26;;;;;;;;23257:4;23242:20;;:3;:20;;;;23234:29;;;;;;;;23498:11;;;;;;;;;;;23483:27;;:3;:27;;;;23475:36;;;;;;;;23544:13;;;;;;;;;;;23529:29;;:3;:29;;;;23521:38;;;;;;;;23621:27;23627:10;23639:8;23621:5;:27::i;:::-;23613:36;;;;;;;;23737;23747:10;23759:3;23764:8;23737:9;:36::i;:::-;22790:990;;:::o;4879:25::-;;;;;;;;;;;;;:::o;30552:38::-;;;;:::o;19070:43::-;;;;;;;;;;;;;:::o;34991:207::-;35066:4;35117:17;35105:1;35094:8;:12;35086:21;;;;;;;;35137:7;35145:8;35137:17;;;;;;;;;;;;;;;;;;;;35117:37;;35171:20;35187:3;35171:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:15;:20::i;:::-;35164:27;;34991:207;;;;:::o;20416:142::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;20534:16;20495:14;;:56;;;;;;;;;;;;;;;;;;20416:142;:::o;13564:35::-;;;;;;;;;;;;;:::o;69769:703::-;70165:20;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;69967:28;69973:10;69985:9;69967:5;:28::i;:::-;69959:37;;;;;;;;70014:25;70029:9;70014:14;:25::i;:::-;70006:34;;;;;;;;70058:43;70082:9;70093:7;70058:23;:43::i;:::-;70050:52;;;;;;;;70188:13;;;;;;;;;;;:29;;;70218:7;70188:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70165:61;;70272:12;;70257;:27;70244:9;:40;;70236:49;;;;;;;;70351:13;;;;;;;;;;;:17;;;70387:12;;70375:9;:24;70401:7;70351:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70419:46;70437:9;70419:46;;70456:7;70419:46;;:10;:46::i;:::-;69769:703;;;:::o;30817:39::-;;;;;;;;;;;;;:::o;40000:1958::-;41267:20;41494:18;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;40168:12;;40155:9;:25;;40147:34;;;;;;;;40239:28;40245:10;40257:9;40239:5;:28::i;:::-;40231:37;;;;;;;;41165:38;41184:7;41193:9;41165:18;:38::i;:::-;41157:47;;;;;;;;41290:7;41298:9;41290:18;;;;;;;;;;;;;;;;;;;;41267:41;;41409:23;41425:6;41409:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:15;:23::i;:::-;41401:32;;;;;;;;41515:7;41523;41515:16;;;;;;;;;;;;;;;;;;;;41494:37;;41630:21;41646:4;41630:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:15;:21::i;:::-;41622:30;;;;;;;;41728:130;41764:6;41788:9;41815:4;41837:7;41728:18;:130::i;:::-;41720:139;;;;;;;;41921:30;41932:9;41943:7;41921:10;:30::i;:::-;40000:1958;;;;:::o;28808:403::-;28894:6;;:::i;:::-;28912:16;;:::i;:::-;28966:17;28993:16;28942:13;28931:25;;;;;;;;;;;;;;;;;;;;;;;;;;;28912:44;;29074:2;29060:12;29056:3;29043:34;;29102:9;29090:21;;29131:43;29139:9;29150:8;29160:13;29131:7;:43::i;:::-;29192:12;29185:19;;28808:403;;;;;;;:::o;20967:145::-;21042:4;21096:9;21065:40;;:17;:27;21083:8;21065:27;;;;;;;;;;;;;;;;;;;;;:40;;;21058:47;;20967:145;;;;:::o;21944:123::-;22051:9;22018:20;:30;22039:8;22018:30;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;21944:123;;:::o;21346:155::-;21428:4;21485:9;21451:43;;:20;:30;21472:8;21451:30;;;;;;;;;;;;;;;;;;;;;:43;;;21444:50;;21346:155;;;;:::o;13965:758::-;14129:19;:24;14149:3;14129:24;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;14225:3;14195:17;:27;14213:8;14195:27;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;14345:1;14328:19;;:5;:19;;;;14324:317;;;14363:19;:26;14383:5;14363:26;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;14485:20;:30;14506:8;14485:30;;;;;;;;;;;;14478:37;;;;;;;;;;;14600:20;:30;14621:8;14600:30;;;;;;;;;;;;14593:37;;;;;;;;;;;14324:317;14686:30;14695:5;14702:3;14707:8;14686:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13965:758;;;:::o;35986:1169::-;36165:4;36246:7;36233:9;:20;36229:63;;;36276:5;36269:12;;;;36229:63;36377:7;36357;:16;;;;;;;;;;;;:27;;;:56;;;;36406:7;36388;:14;;;;;;;;;;;;:25;;;36357:56;36353:99;;;36436:5;36429:12;;;;36353:99;36483:9;36465:5;:14;;;;;;;;;;;;:27;;;:56;;;;36512:9;36496:5;:12;;;;;;;;;;;;:25;;;36465:56;36461:99;;;36544:5;36537:12;;;;36461:99;36714:1;36696:5;:14;;;;;;;;;;;;:19;;;:44;;;;36739:1;36719:7;:16;;;;;;;;;;;;:21;;;36696:44;36692:86;;;36763:4;36756:11;;;;36692:86;36869:7;:16;;;;;;;;;;;;36851:34;;:5;:14;;;;;;;;;;;;:34;;;:70;;;;36907:7;:14;;;;;;;;;;;;36889:32;;:5;:14;;;;;;;;;;;;:32;;;36851:70;36847:113;;;36944:5;36937:12;;;;36847:113;36989:7;:16;;;;;;;;;;;;36973:32;;:5;:12;;;;;;;;;;;;:32;;;:66;;;;37025:7;:14;;;;;;;;;;;;37009:30;;:5;:12;;;;;;;;;;;;:30;;;36973:66;36969:109;;;37062:5;37055:12;;;;36969:109;37144:4;37137:11;;35986:1169;;;;;;;:::o;32350:441::-;32437:4;32453:19;32513:17;32475;:28;32493:9;32475:28;;;;;;;;;;;;;;;;;;;;;32453:50;;32533:17;:26;32551:7;32533:26;;;;;;;;;;;;;;;;;;;;;32513:46;;32726:9;32711:24;;:11;:24;;;:72;;;;32772:11;32739:44;;:20;:29;32760:7;32739:29;;;;;;;;;;;;;;;;;;;;;:44;;;32711:72;32703:81;;32350:441;;;;;;:::o;34588:177::-;34654:4;34702:1;34678:7;:20;;;:25;;;;34677:81;;;;;34744:12;34709:48;;:7;:24;;;:48;;;;34677:81;34670:88;;34588:177;;;:::o;15381:1876::-;15564:4;16148:20;16281:19;;:::i;:::-;16624;15942:9;15927:26;;15914:9;:39;15906:48;;;;;;;;15998:7;15983:24;;15972:7;:35;15964:44;;;;;;;;16056:11;16041:28;;16026:11;:43;16018:52;;;;;;;;16192:1;16178:11;:15;;;;;;;;16148:46;;16224:2;16208:13;:18;;;16204:67;;;16258:2;16242:18;;16204:67;16303:311;;;;;;;;;16330:6;16303:311;;;;16368:3;16303:311;;;;;;16404:1;16303:311;;;;;;16436:9;16303:311;;;;;;16475:7;16303:311;;;;;;16511:1;16303:311;;;;;;16541:13;16303:311;;;;;;16587:11;16303:311;;;;;16281:333;;16669:1;16646:7;:20;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;16659:6;16646:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:24;16624:46;;16857:11;16842:28;;16827:11;:43;16819:52;;;;;;;;16914:160;16933:6;16953:11;16986:6;:15;;;16978:24;;17024:6;:13;;;17016:22;;17052:6;:12;;;16914:160;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17188:33;17198:1;17201:6;17209:11;17188:9;:33::i;:::-;17239:11;17232:18;;15381:1876;;;;;;;;;;:::o;31720:397::-;31780:4;32057:1;32036:4;:17;;;:22;;;32035:75;;;;;32096:12;32064:45;;:4;:21;;;:45;;;;32035:75;32028:82;;31720:397;;;:::o;37332:288::-;37436:4;37456:20;37507:18;37479:7;37487:9;37479:18;;;;;;;;;;;;;;;;;;;;37456:41;;37528:7;37536;37528:16;;;;;;;;;;;;;;;;;;;;37507:37;;37561:52;37580:6;37588:9;37599:4;37605:7;37561:18;:52::i;:::-;37554:59;;37332:288;;;;;;:::o;38573:924::-;38705:18;38752:20;38726:7;38734;38726:16;;;;;;;;;;;;;;;;;;;;38705:37;;38775:7;38783:9;38775:18;;;;;;;;;;;;;;;;;;;;38752:41;;38907:7;38878:6;:19;;;:37;;;;;;;;;;;;;;;;;;38976:22;38993:4;38976:16;:22::i;:::-;39008:24;39025:6;39008:16;:24::i;:::-;39185:20;:31;39206:9;39185:31;;;;;;;;;;;;39178:38;;;;;;;;;;;39233:20;:29;39254:7;39233:29;;;;;;;;;;;;39226:36;;;;;;;;;;;39342:15;;:17;;;;;;;;;;;;;39407:83;39416:17;:28;39434:9;39416:28;;;;;;;;;;;;;;;;;;;;;39446:9;39457:7;39466:6;:23;;;;;;;;;;;;39407:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38573:924;;;;:::o;27965:565::-;28301:12;28089:170;28103:2;28095:4;:10;;28089:170;;;28180:4;28174:5;28167;28160:6;28222:2;28213:11;;;;28246:2;28238:10;;;;28115:2;28107:10;;;;28089:170;;;28337:1;28329:4;28324:2;:9;28316:3;:18;:22;28301:37;;28407:4;28403:3;28396:4;28390:5;28386:3;28460:4;28452:5;28446;28442:3;28505:7;28495:8;28492:2;28485:5;28478:6;28357:167;;;;;;:::o;33053:596::-;33306:12;33287:15;;33254:9;33264:7;:21;;;;;;;;;;;;33254:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:48;;;;;;;;;;33253:65;33219:7;:24;;;:100;;;;;;;;;;;;;;;;;;33588:2;33564:7;:21;;;;;;;;;;;;:26;;;33560:83;;;33631:1;33606:7;:21;;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33560:83;33053:596;:::o;65949:4866::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", "source": "pragma solidity 0.4.18;\n\n/**\n The following contract code, titled KittyCore, was written by Cryptokitties and published\n and retrieved from https://etherscan.io/address/0x06012c8cf97bead5deae237070f9587f8e7a266d#code.\n\n It is included in the current project for test purposes, to ensure that our collateralizer can\n handle ERC721 tokens created by the KittyCore contract.\n*/\n\n/**\n * @title KittiesOwnable\n * @dev The KittiesOwnable contract has an owner address, and provides basic authorization control\n * functions, this simplifies the implementation of \"user permissions\".\n */\ncontract KittiesOwnable {\n address public owner;\n\n\n /**\n\t * @dev The KittiesOwnable constructor sets the original `owner` of the contract to the sender\n\t * account.\n\t */\n function KittiesOwnable() {\n owner = msg.sender;\n }\n\n\n /**\n\t * @dev Throws if called by any account other than the owner.\n\t */\n modifier onlyOwner() {\n require(msg.sender == owner);\n _;\n }\n\n\n /**\n\t * @dev Allows the current owner to transfer control of the contract to a newOwner.\n\t * @param newOwner The address to transfer ownership to.\n\t */\n function transferOwnership(address newOwner) onlyOwner {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n\n}\n\n\n\n/// @title Interface for contracts conforming to ERC-721: Non-Fungible Tokens\n/// @author Dieter Shirley (https://github.com/dete)\ncontract KittiesERC721 {\n // Required methods\n function totalSupply() public view returns (uint256 total);\n function balanceOf(address _owner) public view returns (uint256 balance);\n function ownerOf(uint256 _tokenId) external view returns (address owner);\n function approve(address _to, uint256 _tokenId) external;\n function transfer(address _to, uint256 _tokenId) external;\n function transferFrom(address _from, address _to, uint256 _tokenId) external;\n\n // Events\n event Transfer(address from, address to, uint256 tokenId);\n event Approval(address owner, address approved, uint256 tokenId);\n\n // Optional\n // function name() public view returns (string name);\n // function symbol() public view returns (string symbol);\n // function tokensOfOwner(address _owner) external view returns (uint256[] tokenIds);\n // function tokenMetadata(uint256 _tokenId, string _preferredTransport) public view returns (string infoUrl);\n\n // ERC-165 Compatibility (https://github.com/ethereum/EIPs/issues/165)\n function supportsInterface(bytes4 _interfaceID) external view returns (bool);\n}\n\n\n// // Auction wrapper functions\n\n\n// Auction wrapper functions\n\n\n\n\n\n\n\n/// @title SEKRETOOOO\ncontract GeneScienceInterface {\n /// @dev simply a boolean to indicate this is the contract we expect to be\n function isGeneScience() public pure returns (bool);\n\n /// @dev given genes of kitten 1 & 2, return a genetic combination - may have a random factor\n /// @param genes1 genes of mom\n /// @param genes2 genes of sire\n /// @return the genes that are supposed to be passed down the child\n function mixGenes(uint256 genes1, uint256 genes2, uint256 targetBlock) public returns (uint256);\n}\n\n\n\n\n\n\n\n/// @title A facet of KittyCore that manages special access privileges.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyAccessControl {\n // This facet controls access control for CryptoKitties. There are four roles managed here:\n //\n // - The CEO: The CEO can reassign other roles and change the addresses of our dependent smart\n // contracts. It is also the only role that can unpause the smart contract. It is initially\n // set to the address that created the smart contract in the KittyCore constructor.\n //\n // - The CFO: The CFO can withdraw funds from KittyCore and its auction contracts.\n //\n // - The COO: The COO can release gen0 kitties to auction, and mint promo cats.\n //\n // It should be noted that these roles are distinct without overlap in their access abilities, the\n // abilities listed for each role above are exhaustive. In particular, while the CEO can assign any\n // address to any role, the CEO address itself doesn't have the ability to act in those roles. This\n // restriction is intentional so that we aren't tempted to use the CEO address frequently out of\n // convenience. The less we use an address, the less likely it is that we somehow compromise the\n // account.\n\n /// @dev Emited when contract is upgraded - See README.md for updgrade plan\n event ContractUpgrade(address newContract);\n\n // The addresses of the accounts (or contracts) that can execute actions within each roles.\n address public ceoAddress;\n address public cfoAddress;\n address public cooAddress;\n\n // @dev Keeps track whether the contract is paused. When that is true, most actions are blocked\n bool public paused = false;\n\n /// @dev Access modifier for CEO-only functionality\n modifier onlyCEO() {\n require(msg.sender == ceoAddress);\n _;\n }\n\n /// @dev Access modifier for CFO-only functionality\n modifier onlyCFO() {\n require(msg.sender == cfoAddress);\n _;\n }\n\n /// @dev Access modifier for COO-only functionality\n modifier onlyCOO() {\n require(msg.sender == cooAddress);\n _;\n }\n\n modifier onlyCLevel() {\n require(\n msg.sender == cooAddress ||\n msg.sender == ceoAddress ||\n msg.sender == cfoAddress\n );\n _;\n }\n\n /// @dev Assigns a new address to act as the CEO. Only available to the current CEO.\n /// @param _newCEO The address of the new CEO\n function setCEO(address _newCEO) external onlyCEO {\n require(_newCEO != address(0));\n\n ceoAddress = _newCEO;\n }\n\n /// @dev Assigns a new address to act as the CFO. Only available to the current CEO.\n /// @param _newCFO The address of the new CFO\n function setCFO(address _newCFO) external onlyCEO {\n require(_newCFO != address(0));\n\n cfoAddress = _newCFO;\n }\n\n /// @dev Assigns a new address to act as the COO. Only available to the current CEO.\n /// @param _newCOO The address of the new COO\n function setCOO(address _newCOO) external onlyCEO {\n require(_newCOO != address(0));\n\n cooAddress = _newCOO;\n }\n\n /*** KittiesPausable functionality adapted from OpenZeppelin ***/\n\n /// @dev Modifier to allow actions only when the contract IS NOT paused\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /// @dev Modifier to allow actions only when the contract IS paused\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /// @dev Called by any \"C-level\" role to pause the contract. Used only when\n /// a bug or exploit is detected and we need to limit damage.\n function pause() external onlyCLevel whenNotPaused {\n paused = true;\n }\n\n /// @dev Unpauses the smart contract. Can only be called by the CEO, since\n /// one reason we may pause the contract is when CFO or COO accounts are\n /// compromised.\n /// @notice This is public rather than external so it can be called by\n /// derived contracts.\n function unpause() public onlyCEO whenPaused {\n // can't unpause if contract was upgraded\n paused = false;\n }\n}\n\n\n\n\n/// @title Base contract for CryptoKitties. Holds all common structs, events and base variables.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBase is KittyAccessControl {\n /*** EVENTS ***/\n\n /// @dev The Birth event is fired whenever a new kitten comes into existence. This obviously\n /// includes any time a cat is created through the giveBirth method, but it is also called\n /// when a new gen0 cat is created.\n event Birth(address owner, uint256 kittyId, uint256 matronId, uint256 sireId, uint256 genes);\n\n /// @dev Transfer event as defined in current draft of ERC721. Emitted every time a kitten\n /// ownership is assigned, including births.\n event Transfer(address from, address to, uint256 tokenId);\n\n /*** DATA TYPES ***/\n\n /// @dev The main Kitty struct. Every cat in CryptoKitties is represented by a copy\n /// of this structure, so great care was taken to ensure that it fits neatly into\n /// exactly two 256-bit words. Note that the order of the members in this structure\n /// is important because of the byte-packing rules used by Ethereum.\n /// Ref: http://solidity.readthedocs.io/en/develop/miscellaneous.html\n struct Kitty {\n // The Kitty's genetic code is packed into these 256-bits, the format is\n // sooper-sekret! A cat's genes never change.\n uint256 genes;\n\n // The timestamp from the block when this cat came into existence.\n uint64 birthTime;\n\n // The minimum timestamp after which this cat can engage in breeding\n // activities again. This same timestamp is used for the pregnancy\n // timer (for matrons) as well as the siring cooldown.\n uint64 cooldownEndBlock;\n\n // The ID of the parents of this kitty, set to 0 for gen0 cats.\n // Note that using 32-bit unsigned integers limits us to a \"mere\"\n // 4 billion cats. This number might seem small until you realize\n // that Ethereum currently has a limit of about 500 million\n // transactions per year! So, this definitely won't be a problem\n // for several years (even as Ethereum learns to scale).\n uint32 matronId;\n uint32 sireId;\n\n // Set to the ID of the sire cat for matrons that are pregnant,\n // zero otherwise. A non-zero value here is how we know a cat\n // is pregnant. Used to retrieve the genetic material for the new\n // kitten when the birth transpires.\n uint32 siringWithId;\n\n // Set to the index in the cooldown array (see below) that represents\n // the current cooldown duration for this Kitty. This starts at zero\n // for gen0 cats, and is initialized to floor(generation/2) for others.\n // Incremented by one for each successful breeding action, regardless\n // of whether this cat is acting as matron or sire.\n uint16 cooldownIndex;\n\n // The \"generation number\" of this cat. Cats minted by the CK contract\n // for sale are called \"gen0\" and have a generation number of 0. The\n // generation number of all other cats is the larger of the two generation\n // numbers of their parents, plus one.\n // (i.e. max(matron.generation, sire.generation) + 1)\n uint16 generation;\n }\n\n /*** CONSTANTS ***/\n\n /// @dev A lookup table indicating the cooldown duration after any successful\n /// breeding action, called \"pregnancy time\" for matrons and \"siring cooldown\"\n /// for sires. Designed such that the cooldown roughly doubles each time a cat\n /// is bred, encouraging owners not to just keep breeding the same cat over\n /// and over again. Caps out at one week (a cat can breed an unbounded number\n /// of times, and the maximum cooldown is always seven days).\n uint32[14] public cooldowns = [\n uint32(1 minutes),\n uint32(2 minutes),\n uint32(5 minutes),\n uint32(10 minutes),\n uint32(30 minutes),\n uint32(1 hours),\n uint32(2 hours),\n uint32(4 hours),\n uint32(8 hours),\n uint32(16 hours),\n uint32(1 days),\n uint32(2 days),\n uint32(4 days),\n uint32(7 days)\n ];\n\n // An approximation of currently how many seconds are in between blocks.\n uint256 public secondsPerBlock = 15;\n\n /*** STORAGE ***/\n\n /// @dev An array containing the Kitty struct for all Kitties in existence. The ID\n /// of each cat is actually an index into this array. Note that ID 0 is a negacat,\n /// the unKitty, the mythical beast that is the parent of all gen0 cats. A bizarre\n /// creature that is both matron and sire... to itself! Has an invalid genetic code.\n /// In other words, cat ID 0 is invalid... ;-)\n Kitty[] kitties;\n\n /// @dev A mapping from cat IDs to the address that owns them. All cats have\n /// some valid owner address, even gen0 cats are created with a non-zero owner.\n mapping (uint256 => address) public kittyIndexToOwner;\n\n // @dev A mapping from owner address to count of tokens that address owns.\n // Used internally inside balanceOf() to resolve ownership count.\n mapping (address => uint256) ownershipTokenCount;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to call\n /// transferFrom(). Each Kitty can only have one approved address for transfer\n /// at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public kittyIndexToApproved;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to use\n /// this Kitty for siring via breedWith(). Each Kitty can only have one approved\n /// address for siring at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public sireAllowedToAddress;\n\n /// @dev The address of the ClockAuction contract that handles sales of Kitties. This\n /// same contract handles both peer-to-peer sales as well as the gen0 sales which are\n /// initiated every 15 minutes.\n SaleClockAuction public saleAuction;\n\n /// @dev The address of a custom ClockAuction subclassed contract that handles siring\n /// auctions. Needs to be separate from saleAuction because the actions taken on success\n /// after a sales and siring auction are quite different.\n SiringClockAuction public siringAuction;\n\n /// @dev Assigns ownership of a specific Kitty to an address.\n function _transfer(address _from, address _to, uint256 _tokenId) internal {\n // Since the number of kittens is capped to 2^32 we can't overflow this\n ownershipTokenCount[_to]++;\n // transfer ownership\n kittyIndexToOwner[_tokenId] = _to;\n // When creating new kittens _from is 0x0, but we can't account that address.\n if (_from != address(0)) {\n ownershipTokenCount[_from]--;\n // once the kitten is transferred also clear sire allowances\n delete sireAllowedToAddress[_tokenId];\n // clear any previously approved ownership exchange\n delete kittyIndexToApproved[_tokenId];\n }\n // Emit the transfer event.\n Transfer(_from, _to, _tokenId);\n }\n\n /// @dev An internal method that creates a new kitty and stores it. This\n /// method doesn't do any checking and should only be called when the\n /// input data is known to be valid. Will generate both a Birth event\n /// and a Transfer event.\n /// @param _matronId The kitty ID of the matron of this cat (zero for gen0)\n /// @param _sireId The kitty ID of the sire of this cat (zero for gen0)\n /// @param _generation The generation number of this cat, must be computed by caller.\n /// @param _genes The kitty's genetic code.\n /// @param _owner The inital owner of this cat, must be non-zero (except for the unKitty, ID 0)\n function _createKitty(\n uint256 _matronId,\n uint256 _sireId,\n uint256 _generation,\n uint256 _genes,\n address _owner\n )\n internal\n returns (uint)\n {\n // These requires are not strictly necessary, our calling code should make\n // sure that these conditions are never broken. However! _createKitty() is already\n // an expensive call (for storage), and it doesn't hurt to be especially careful\n // to ensure our data structures are always valid.\n require(_matronId == uint256(uint32(_matronId)));\n require(_sireId == uint256(uint32(_sireId)));\n require(_generation == uint256(uint16(_generation)));\n\n // New kitty starts with the same cooldown as parent gen/2\n uint16 cooldownIndex = uint16(_generation / 2);\n if (cooldownIndex > 13) {\n cooldownIndex = 13;\n }\n\n Kitty memory _kitty = Kitty({\n genes: _genes,\n birthTime: uint64(now),\n cooldownEndBlock: 0,\n matronId: uint32(_matronId),\n sireId: uint32(_sireId),\n siringWithId: 0,\n cooldownIndex: cooldownIndex,\n generation: uint16(_generation)\n });\n uint256 newKittenId = kitties.push(_kitty) - 1;\n\n // It's probably never going to happen, 4 billion cats is A LOT, but\n // let's just be 100% sure we never let this happen.\n require(newKittenId == uint256(uint32(newKittenId)));\n\n // emit the birth event\n Birth(\n _owner,\n newKittenId,\n uint256(_kitty.matronId),\n uint256(_kitty.sireId),\n _kitty.genes\n );\n\n // This will assign ownership, and also emit the Transfer event as\n // per ERC721 draft\n _transfer(0, _owner, newKittenId);\n\n return newKittenId;\n }\n\n // Any C-level can fix how many seconds per blocks are currently observed.\n function setSecondsPerBlock(uint256 secs) external onlyCLevel {\n require(secs < cooldowns[0]);\n secondsPerBlock = secs;\n }\n}\n\n\n\n\n\n/// @title The external contract that is responsible for generating metadata for the kitties,\n/// it has one function that will return the data as bytes.\ncontract KittiesERC721Metadata {\n /// @dev Given a token Id, returns a byte array that is supposed to be converted into string.\n function getMetadata(uint256 _tokenId, string) public view returns (bytes32[4] buffer, uint256 count) {\n if (_tokenId == 1) {\n buffer[0] = \"Hello World! :D\";\n count = 15;\n } else if (_tokenId == 2) {\n buffer[0] = \"I would definitely choose a medi\";\n buffer[1] = \"um length string.\";\n count = 49;\n } else if (_tokenId == 3) {\n buffer[0] = \"Lorem ipsum dolor sit amet, mi e\";\n buffer[1] = \"st accumsan dapibus augue lorem,\";\n buffer[2] = \" tristique vestibulum id, libero\";\n buffer[3] = \" suscipit varius sapien aliquam.\";\n count = 128;\n }\n }\n}\n\n\n/// @title The facet of the CryptoKitties core contract that manages ownership, ERC-721 (draft) compliant.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev Ref: https://github.com/ethereum/EIPs/issues/721\n/// See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyOwnership is KittyBase, KittiesERC721 {\n\n /// @notice Name and symbol of the non fungible token, as defined in ERC721.\n string public constant name = \"CryptoKitties\";\n string public constant symbol = \"CK\";\n\n // The contract that will return kitty metadata\n KittiesERC721Metadata public erc721Metadata;\n\n bytes4 constant InterfaceSignature_ERC165 =\n bytes4(keccak256('supportsInterface(bytes4)'));\n\n bytes4 constant InterfaceSignature_ERC721 =\n bytes4(keccak256('name()')) ^\n bytes4(keccak256('symbol()')) ^\n bytes4(keccak256('totalSupply()')) ^\n bytes4(keccak256('balanceOf(address)')) ^\n bytes4(keccak256('ownerOf(uint256)')) ^\n bytes4(keccak256('approve(address,uint256)')) ^\n bytes4(keccak256('transfer(address,uint256)')) ^\n bytes4(keccak256('transferFrom(address,address,uint256)')) ^\n bytes4(keccak256('tokensOfOwner(address)')) ^\n bytes4(keccak256('tokenMetadata(uint256,string)'));\n\n /// @notice Introspection interface as per ERC-165 (https://github.com/ethereum/EIPs/issues/165).\n /// Returns true for any standardized interfaces implemented by this contract. We implement\n /// ERC-165 (obviously!) and ERC-721.\n function supportsInterface(bytes4 _interfaceID) external view returns (bool)\n {\n // DEBUG ONLY\n //require((InterfaceSignature_ERC165 == 0x01ffc9a7) && (InterfaceSignature_ERC721 == 0x9a20483d));\n\n return ((_interfaceID == InterfaceSignature_ERC165) || (_interfaceID == InterfaceSignature_ERC721));\n }\n\n /// @dev Set the address of the sibling contract that tracks metadata.\n /// CEO only.\n function setMetadataAddress(address _contractAddress) public onlyCEO {\n erc721Metadata = KittiesERC721Metadata(_contractAddress);\n }\n\n // Internal utility functions: These functions all assume that their input arguments\n // are valid. We leave it to public methods to sanitize their inputs and follow\n // the required logic.\n\n /// @dev Checks if a given address is the current owner of a particular Kitty.\n /// @param _claimant the address we are validating against.\n /// @param _tokenId kitten id, only valid when > 0\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToOwner[_tokenId] == _claimant;\n }\n\n /// @dev Checks if a given address currently has transferApproval for a particular Kitty.\n /// @param _claimant the address we are confirming kitten is approved for.\n /// @param _tokenId kitten id, only valid when > 0\n function _approvedFor(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToApproved[_tokenId] == _claimant;\n }\n\n /// @dev Marks an address as being approved for transferFrom(), overwriting any previous\n /// approval. Setting _approved to address(0) clears all transfer approval.\n /// NOTE: _approve() does NOT send the Approval event. This is intentional because\n /// _approve() and transferFrom() are used together for putting Kitties on auction, and\n /// there is no value in spamming the log with Approval events in that case.\n function _approve(uint256 _tokenId, address _approved) internal {\n kittyIndexToApproved[_tokenId] = _approved;\n }\n\n /// @notice Returns the number of Kitties owned by a specific address.\n /// @param _owner The owner address to check.\n /// @dev Required for ERC-721 compliance\n function balanceOf(address _owner) public view returns (uint256 count) {\n return ownershipTokenCount[_owner];\n }\n\n /// @notice Transfers a Kitty to another address. If transferring to a smart\n /// contract be VERY CAREFUL to ensure that it is aware of ERC-721 (or\n /// CryptoKitties specifically) or your Kitty may be lost forever. Seriously.\n /// @param _to The address of the recipient, can be a user or contract.\n /// @param _tokenId The ID of the Kitty to transfer.\n /// @dev Required for ERC-721 compliance.\n function transfer(\n address _to,\n uint256 _tokenId\n )\n external\n whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Disallow transfers to the auction contracts to prevent accidental\n // misuse. Auction contracts should only take ownership of kitties\n // through the allow + transferFrom flow.\n require(_to != address(saleAuction));\n require(_to != address(siringAuction));\n\n // You can only send your own cat.\n require(_owns(msg.sender, _tokenId));\n\n // Reassign ownership, clear pending approvals, emit Transfer event.\n _transfer(msg.sender, _to, _tokenId);\n }\n\n /// @notice Grant another address the right to transfer a specific Kitty via\n /// transferFrom(). This is the preferred flow for transfering NFTs to contracts.\n /// @param _to The address to be granted transfer approval. Pass address(0) to\n /// clear all approvals.\n /// @param _tokenId The ID of the Kitty that can be transferred if this call succeeds.\n /// @dev Required for ERC-721 compliance.\n function approve(\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Only an owner can grant transfer approval.\n require(_owns(msg.sender, _tokenId));\n\n // Register the approval (replacing any previous approval).\n _approve(_tokenId, _to);\n\n // Emit approval event.\n Approval(msg.sender, _to, _tokenId);\n }\n\n /// @notice Transfer a Kitty owned by another address, for which the calling address\n /// has previously been granted transfer approval by the owner.\n /// @param _from The address that owns the Kitty to be transfered.\n /// @param _to The address that should take ownership of the Kitty. Can be any address,\n /// including the caller.\n /// @param _tokenId The ID of the Kitty to be transferred.\n /// @dev Required for ERC-721 compliance.\n function transferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Check for approval and valid ownership\n require(_approvedFor(msg.sender, _tokenId));\n require(_owns(_from, _tokenId));\n\n // Reassign ownership (also clears pending approvals and emits Transfer event).\n _transfer(_from, _to, _tokenId);\n }\n\n /// @notice Returns the total number of Kitties currently in existence.\n /// @dev Required for ERC-721 compliance.\n function totalSupply() public view returns (uint) {\n return kitties.length - 1;\n }\n\n /// @notice Returns the address currently assigned ownership of a given Kitty.\n /// @dev Required for ERC-721 compliance.\n function ownerOf(uint256 _tokenId)\n external\n view\n returns (address owner)\n {\n owner = kittyIndexToOwner[_tokenId];\n\n require(owner != address(0));\n }\n\n /// @notice Returns a list of all Kitty IDs assigned to an address.\n /// @param _owner The owner whose Kitties we are interested in.\n /// @dev This method MUST NEVER be called by smart contract code. First, it's fairly\n /// expensive (it walks the entire Kitty array looking for cats belonging to owner),\n /// but it also returns a dynamic array, which is only supported for web3 calls, and\n /// not contract-to-contract calls.\n function tokensOfOwner(address _owner) external view returns(uint256[] ownerTokens) {\n uint256 tokenCount = balanceOf(_owner);\n\n if (tokenCount == 0) {\n // Return an empty array\n return new uint256[](0);\n } else {\n uint256[] memory result = new uint256[](tokenCount);\n uint256 totalCats = totalSupply();\n uint256 resultIndex = 0;\n\n // We count on the fact that all cats have IDs starting at 1 and increasing\n // sequentially up to the totalCat count.\n uint256 catId;\n\n for (catId = 1; catId <= totalCats; catId++) {\n if (kittyIndexToOwner[catId] == _owner) {\n result[resultIndex] = catId;\n resultIndex++;\n }\n }\n\n return result;\n }\n }\n\n /// @dev Adapted from memcpy() by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _memcpy(uint _dest, uint _src, uint _len) private view {\n // Copy word-length chunks while possible\n for(; _len >= 32; _len -= 32) {\n assembly {\n mstore(_dest, mload(_src))\n }\n _dest += 32;\n _src += 32;\n }\n\n // Copy remaining bytes\n uint256 mask = 256 ** (32 - _len) - 1;\n assembly {\n let srcpart := and(mload(_src), not(mask))\n let destpart := and(mload(_dest), mask)\n mstore(_dest, or(destpart, srcpart))\n }\n }\n\n /// @dev Adapted from toString(slice) by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _toString(bytes32[4] _rawBytes, uint256 _stringLength) private view returns (string) {\n var outputString = new string(_stringLength);\n uint256 outputPtr;\n uint256 bytesPtr;\n\n assembly {\n outputPtr := add(outputString, 32)\n bytesPtr := _rawBytes\n }\n\n _memcpy(outputPtr, bytesPtr, _stringLength);\n\n return outputString;\n }\n\n /// @notice Returns a URI pointing to a metadata package for this token conforming to\n /// ERC-721 (https://github.com/ethereum/EIPs/issues/721)\n /// @param _tokenId The ID number of the Kitty whose metadata should be returned.\n function tokenMetadata(uint256 _tokenId, string _preferredTransport) external view returns (string infoUrl) {\n require(erc721Metadata != address(0));\n bytes32[4] memory buffer;\n uint256 count;\n (buffer, count) = erc721Metadata.getMetadata(_tokenId, _preferredTransport);\n\n return _toString(buffer, count);\n }\n}\n\n\n\n/// @title A facet of KittyCore that manages Kitty siring, gestation, and birth.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBreeding is KittyOwnership {\n\n /// @dev The Pregnant event is fired when two cats successfully breed and the pregnancy\n /// timer begins for the matron.\n event Pregnant(address owner, uint256 matronId, uint256 sireId, uint256 cooldownEndBlock);\n\n /// @notice The minimum payment required to use breedWithAuto(). This fee goes towards\n /// the gas cost paid by whatever calls giveBirth(), and can be dynamically updated by\n /// the COO role as the gas price changes.\n uint256 public autoBirthFee = 2 finney;\n\n // Keeps track of number of pregnant kitties.\n uint256 public pregnantKitties;\n\n /// @dev The address of the sibling contract that is used to implement the sooper-sekret\n /// genetic combination algorithm.\n GeneScienceInterface public geneScience;\n\n /// @dev Update the address of the genetic contract, can only be called by the CEO.\n /// @param _address An address of a GeneScience contract instance to be used from this point forward.\n function setGeneScienceAddress(address _address) external onlyCEO {\n GeneScienceInterface candidateContract = GeneScienceInterface(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isGeneScience());\n\n // Set the new contract address\n geneScience = candidateContract;\n }\n\n /// @dev Checks that a given kitten is able to breed. Requires that the\n /// current cooldown is finished (for sires) and also checks that there is\n /// no pending pregnancy.\n function _isReadyToBreed(Kitty _kit) internal view returns (bool) {\n // In addition to checking the cooldownEndBlock, we also need to check to see if\n // the cat has a pending birth; there can be some period of time between the end\n // of the pregnacy timer and the birth event.\n return (_kit.siringWithId == 0) && (_kit.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @dev Check if a sire has authorized breeding with this matron. True if both sire\n /// and matron have the same owner, or if the sire has given siring permission to\n /// the matron's owner (via approveSiring()).\n function _isSiringPermitted(uint256 _sireId, uint256 _matronId) internal view returns (bool) {\n address matronOwner = kittyIndexToOwner[_matronId];\n address sireOwner = kittyIndexToOwner[_sireId];\n\n // Siring is okay if they have same owner, or if the matron's owner was given\n // permission to breed with this sire.\n return (matronOwner == sireOwner || sireAllowedToAddress[_sireId] == matronOwner);\n }\n\n /// @dev Set the cooldownEndTime for the given Kitty, based on its current cooldownIndex.\n /// Also increments the cooldownIndex (unless it has hit the cap).\n /// @param _kitten A reference to the Kitty in storage which needs its timer started.\n function _triggerCooldown(Kitty storage _kitten) internal {\n // Compute an estimation of the cooldown time in blocks (based on current cooldownIndex).\n _kitten.cooldownEndBlock = uint64((cooldowns[_kitten.cooldownIndex]/secondsPerBlock) + block.number);\n\n // Increment the breeding count, clamping it at 13, which is the length of the\n // cooldowns array. We could check the array size dynamically, but hard-coding\n // this as a constant saves gas. Yay, Solidity!\n if (_kitten.cooldownIndex < 13) {\n _kitten.cooldownIndex += 1;\n }\n }\n\n /// @notice Grants approval to another user to sire with one of your Kitties.\n /// @param _addr The address that will be able to sire with your Kitty. Set to\n /// address(0) to clear all siring approvals for this Kitty.\n /// @param _sireId A Kitty that you own that _addr will now be able to sire with.\n function approveSiring(address _addr, uint256 _sireId)\n external\n whenNotPaused\n {\n require(_owns(msg.sender, _sireId));\n sireAllowedToAddress[_sireId] = _addr;\n }\n\n /// @dev Updates the minimum payment required for calling giveBirthAuto(). Can only\n /// be called by the COO address. (This fee is used to offset the gas cost incurred\n /// by the autobirth daemon).\n function setAutoBirthFee(uint256 val) external onlyCOO {\n autoBirthFee = val;\n }\n\n /// @dev Checks to see if a given Kitty is pregnant and (if so) if the gestation\n /// period has passed.\n function _isReadyToGiveBirth(Kitty _matron) private view returns (bool) {\n return (_matron.siringWithId != 0) && (_matron.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @notice Checks that a given kitten is able to breed (i.e. it is not pregnant or\n /// in the middle of a siring cooldown).\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isReadyToBreed(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n Kitty storage kit = kitties[_kittyId];\n return _isReadyToBreed(kit);\n }\n\n /// @dev Checks whether a kitty is currently pregnant.\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isPregnant(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n // A kitty is pregnant if and only if this field is set\n return kitties[_kittyId].siringWithId != 0;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair. DOES NOT\n /// check ownership permissions (that is up to the caller).\n /// @param _matron A reference to the Kitty struct of the potential matron.\n /// @param _matronId The matron's ID.\n /// @param _sire A reference to the Kitty struct of the potential sire.\n /// @param _sireId The sire's ID\n function _isValidMatingPair(\n Kitty storage _matron,\n uint256 _matronId,\n Kitty storage _sire,\n uint256 _sireId\n )\n private\n view\n returns(bool)\n {\n // A Kitty can't breed with itself!\n if (_matronId == _sireId) {\n return false;\n }\n\n // Kitties can't breed with their parents.\n if (_matron.matronId == _sireId || _matron.sireId == _sireId) {\n return false;\n }\n if (_sire.matronId == _matronId || _sire.sireId == _matronId) {\n return false;\n }\n\n // We can short circuit the sibling check (below) if either cat is\n // gen zero (has a matron ID of zero).\n if (_sire.matronId == 0 || _matron.matronId == 0) {\n return true;\n }\n\n // Kitties can't breed with full or half siblings.\n if (_sire.matronId == _matron.matronId || _sire.matronId == _matron.sireId) {\n return false;\n }\n if (_sire.sireId == _matron.matronId || _sire.sireId == _matron.sireId) {\n return false;\n }\n\n // Everything seems cool! Let's get DTF.\n return true;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair for\n /// breeding via auction (i.e. skips ownership and siring approval checks).\n function _canBreedWithViaAuction(uint256 _matronId, uint256 _sireId)\n internal\n view\n returns (bool)\n {\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId);\n }\n\n /// @notice Checks to see if two cats can breed together, including checks for\n /// ownership and siring approvals. Does NOT check that both cats are ready for\n /// breeding (i.e. breedWith could still fail until the cooldowns are finished).\n /// TODO: Shouldn't this check pregnancy and cooldowns?!?\n /// @param _matronId The ID of the proposed matron.\n /// @param _sireId The ID of the proposed sire.\n function canBreedWith(uint256 _matronId, uint256 _sireId)\n external\n view\n returns(bool)\n {\n require(_matronId > 0);\n require(_sireId > 0);\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId) &&\n _isSiringPermitted(_sireId, _matronId);\n }\n\n /// @dev Internal utility function to initiate breeding, assumes that all breeding\n /// requirements have been checked.\n function _breedWith(uint256 _matronId, uint256 _sireId) internal {\n // Grab a reference to the Kitties from storage.\n Kitty storage sire = kitties[_sireId];\n Kitty storage matron = kitties[_matronId];\n\n // Mark the matron as pregnant, keeping track of who the sire is.\n matron.siringWithId = uint32(_sireId);\n\n // Trigger the cooldown for both parents.\n _triggerCooldown(sire);\n _triggerCooldown(matron);\n\n // Clear siring permission for both parents. This may not be strictly necessary\n // but it's likely to avoid confusion!\n delete sireAllowedToAddress[_matronId];\n delete sireAllowedToAddress[_sireId];\n\n // Every time a kitty gets pregnant, counter is incremented.\n pregnantKitties++;\n\n // Emit the pregnancy event.\n Pregnant(kittyIndexToOwner[_matronId], _matronId, _sireId, matron.cooldownEndBlock);\n }\n\n /// @notice Breed a Kitty you own (as matron) with a sire that you own, or for which you\n /// have previously been given Siring approval. Will either make your cat pregnant, or will\n /// fail entirely. Requires a pre-payment of the fee given out to the first caller of giveBirth()\n /// @param _matronId The ID of the Kitty acting as matron (will end up pregnant if successful)\n /// @param _sireId The ID of the Kitty acting as sire (will begin its siring cooldown if successful)\n function breedWithAuto(uint256 _matronId, uint256 _sireId)\n external\n payable\n whenNotPaused\n {\n // Checks for payment.\n require(msg.value >= autoBirthFee);\n\n // Caller must own the matron.\n require(_owns(msg.sender, _matronId));\n\n // Neither sire nor matron are allowed to be on auction during a normal\n // breeding operation, but we don't need to check that explicitly.\n // For matron: The caller of this function can't be the owner of the matron\n // because the owner of a Kitty on auction is the auction house, and the\n // auction house will never call breedWith().\n // For sire: Similarly, a sire on auction will be owned by the auction house\n // and the act of transferring ownership will have cleared any oustanding\n // siring approval.\n // Thus we don't need to spend gas explicitly checking to see if either cat\n // is on auction.\n\n // Check that matron and sire are both owned by caller, or that the sire\n // has given siring permission to caller (i.e. matron's owner).\n // Will fail for _sireId = 0\n require(_isSiringPermitted(_sireId, _matronId));\n\n // Grab a reference to the potential matron\n Kitty storage matron = kitties[_matronId];\n\n // Make sure matron isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(matron));\n\n // Grab a reference to the potential sire\n Kitty storage sire = kitties[_sireId];\n\n // Make sure sire isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(sire));\n\n // Test that these cats are a valid mating pair.\n require(_isValidMatingPair(\n matron,\n _matronId,\n sire,\n _sireId\n ));\n\n // All checks passed, kitty gets pregnant!\n _breedWith(_matronId, _sireId);\n }\n\n /// @notice Have a pregnant Kitty give birth!\n /// @param _matronId A Kitty ready to give birth.\n /// @return The Kitty ID of the new kitten.\n /// @dev Looks at a given Kitty and, if pregnant and if the gestation period has passed,\n /// combines the genes of the two parents to create a new kitten. The new Kitty is assigned\n /// to the current owner of the matron. Upon successful completion, both the matron and the\n /// new kitten will be ready to breed again. Note that anyone can call this function (if they\n /// are willing to pay the gas!), but the new kitten always goes to the mother's owner.\n function giveBirth(uint256 _matronId)\n external\n whenNotPaused\n returns(uint256)\n {\n // Grab a reference to the matron in storage.\n Kitty storage matron = kitties[_matronId];\n\n // Check that the matron is a valid cat.\n require(matron.birthTime != 0);\n\n // Check that the matron is pregnant, and that its time has come!\n require(_isReadyToGiveBirth(matron));\n\n // Grab a reference to the sire in storage.\n uint256 sireId = matron.siringWithId;\n Kitty storage sire = kitties[sireId];\n\n // Determine the higher generation number of the two parents\n uint16 parentGen = matron.generation;\n if (sire.generation > matron.generation) {\n parentGen = sire.generation;\n }\n\n // Call the sooper-sekret gene mixing operation.\n uint256 childGenes = geneScience.mixGenes(matron.genes, sire.genes, matron.cooldownEndBlock - 1);\n\n // Make the new kitten!\n address owner = kittyIndexToOwner[_matronId];\n uint256 kittenId = _createKitty(_matronId, matron.siringWithId, parentGen + 1, childGenes, owner);\n\n // Clear the reference to sire from the matron (REQUIRED! Having siringWithId\n // set is what marks a matron as being pregnant.)\n delete matron.siringWithId;\n\n // Every time a kitty gives birth counter is decremented.\n pregnantKitties--;\n\n // Send the balance fee to the person who made birth happen.\n msg.sender.send(autoBirthFee);\n\n // return the new kitten's ID\n return kittenId;\n }\n}\n\n\n\n\n\n\n\n\n\n\n/// @title Auction Core\n/// @dev Contains models, variables, and internal methods for the auction.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuctionBase {\n\n // Represents an auction on an NFT\n struct Auction {\n // Current owner of NFT\n address seller;\n // Price (in wei) at beginning of auction\n uint128 startingPrice;\n // Price (in wei) at end of auction\n uint128 endingPrice;\n // Duration (in seconds) of auction\n uint64 duration;\n // Time when auction started\n // NOTE: 0 if this auction has been concluded\n uint64 startedAt;\n }\n\n // Reference to contract tracking NFT ownership\n KittiesERC721 public nonFungibleContract;\n\n // Cut owner takes on each auction, measured in basis points (1/100 of a percent).\n // Values 0-10,000 map to 0%-100%\n uint256 public ownerCut;\n\n // Map from token ID to their corresponding auction.\n mapping (uint256 => Auction) tokenIdToAuction;\n\n event AuctionCreated(uint256 tokenId, uint256 startingPrice, uint256 endingPrice, uint256 duration);\n event AuctionSuccessful(uint256 tokenId, uint256 totalPrice, address winner);\n event AuctionCancelled(uint256 tokenId);\n\n /// @dev Returns true if the claimant owns the token.\n /// @param _claimant - Address claiming to own the token.\n /// @param _tokenId - ID of token whose ownership to verify.\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return (nonFungibleContract.ownerOf(_tokenId) == _claimant);\n }\n\n /// @dev Escrows the NFT, assigning ownership to this contract.\n /// Throws if the escrow fails.\n /// @param _owner - Current owner address of token to escrow.\n /// @param _tokenId - ID of token whose approval to verify.\n function _escrow(address _owner, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transferFrom(_owner, this, _tokenId);\n }\n\n /// @dev Transfers an NFT owned by this contract to another address.\n /// Returns true if the transfer succeeds.\n /// @param _receiver - Address to transfer NFT to.\n /// @param _tokenId - ID of token to transfer.\n function _transfer(address _receiver, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transfer(_receiver, _tokenId);\n }\n\n /// @dev Adds an auction to the list of open auctions. Also fires the\n /// AuctionCreated event.\n /// @param _tokenId The ID of the token to be put on auction.\n /// @param _auction Auction to add.\n function _addAuction(uint256 _tokenId, Auction _auction) internal {\n // Require that all auctions have a duration of\n // at least one minute. (Keeps our math from getting hairy!)\n require(_auction.duration >= 1 minutes);\n\n tokenIdToAuction[_tokenId] = _auction;\n\n AuctionCreated(\n uint256(_tokenId),\n uint256(_auction.startingPrice),\n uint256(_auction.endingPrice),\n uint256(_auction.duration)\n );\n }\n\n /// @dev Cancels an auction unconditionally.\n function _cancelAuction(uint256 _tokenId, address _seller) internal {\n _removeAuction(_tokenId);\n _transfer(_seller, _tokenId);\n AuctionCancelled(_tokenId);\n }\n\n /// @dev Computes the price and transfers winnings.\n /// Does NOT transfer ownership of token.\n function _bid(uint256 _tokenId, uint256 _bidAmount)\n internal\n returns (uint256)\n {\n // Get a reference to the auction struct\n Auction storage auction = tokenIdToAuction[_tokenId];\n\n // Explicitly check that this auction is currently live.\n // (Because of how Ethereum mappings work, we can't just count\n // on the lookup above failing. An invalid _tokenId will just\n // return an auction object that is all zeros.)\n require(_isOnAuction(auction));\n\n // Check that the bid is greater than or equal to the current price\n uint256 price = _currentPrice(auction);\n require(_bidAmount >= price);\n\n // Grab a reference to the seller before the auction struct\n // gets deleted.\n address seller = auction.seller;\n\n // The bid is good! Remove the auction before sending the fees\n // to the sender so we can't have a reentrancy attack.\n _removeAuction(_tokenId);\n\n // Transfer proceeds to seller (if there are any!)\n if (price > 0) {\n // Calculate the auctioneer's cut.\n // (NOTE: _computeCut() is guaranteed to return a\n // value <= price, so this subtraction can't go negative.)\n uint256 auctioneerCut = _computeCut(price);\n uint256 sellerProceeds = price - auctioneerCut;\n\n // NOTE: Doing a transfer() in the middle of a complex\n // method like this is generally discouraged because of\n // reentrancy attacks and DoS attacks if the seller is\n // a contract with an invalid fallback function. We explicitly\n // guard against reentrancy attacks by removing the auction\n // before calling transfer(), and the only thing the seller\n // can DoS is the sale of their own asset! (And if it's an\n // accident, they can call cancelAuction(). )\n seller.transfer(sellerProceeds);\n }\n\n // Calculate any excess funds included with the bid. If the excess\n // is anything worth worrying about, transfer it back to bidder.\n // NOTE: We checked above that the bid amount is greater than or\n // equal to the price so this cannot underflow.\n uint256 bidExcess = _bidAmount - price;\n\n // Return the funds. Similar to the previous transfer, this is\n // not susceptible to a re-entry attack because the auction is\n // removed before any transfers occur.\n msg.sender.transfer(bidExcess);\n\n // Tell the world!\n AuctionSuccessful(_tokenId, price, msg.sender);\n\n return price;\n }\n\n /// @dev Removes an auction from the list of open auctions.\n /// @param _tokenId - ID of NFT on auction.\n function _removeAuction(uint256 _tokenId) internal {\n delete tokenIdToAuction[_tokenId];\n }\n\n /// @dev Returns true if the NFT is on auction.\n /// @param _auction - Auction to check.\n function _isOnAuction(Auction storage _auction) internal view returns (bool) {\n return (_auction.startedAt > 0);\n }\n\n /// @dev Returns current price of an NFT on auction. Broken into two\n /// functions (this one, that computes the duration from the auction\n /// structure, and the other that does the price computation) so we\n /// can easily test that the price computation works correctly.\n function _currentPrice(Auction storage _auction)\n internal\n view\n returns (uint256)\n {\n uint256 secondsPassed = 0;\n\n // A bit of insurance against negative values (or wraparound).\n // Probably not necessary (since Ethereum guarnatees that the\n // now variable doesn't ever go backwards).\n if (now > _auction.startedAt) {\n secondsPassed = now - _auction.startedAt;\n }\n\n return _computeCurrentPrice(\n _auction.startingPrice,\n _auction.endingPrice,\n _auction.duration,\n secondsPassed\n );\n }\n\n /// @dev Computes the current price of an auction. Factored out\n /// from _currentPrice so we can run extensive unit tests.\n /// When testing, make this function public and turn on\n /// `Current price computation` test suite.\n function _computeCurrentPrice(\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n uint256 _secondsPassed\n )\n internal\n pure\n returns (uint256)\n {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our public functions carefully cap the maximum values for\n // time (at 64-bits) and currency (at 128-bits). _duration is\n // also known to be non-zero (see the require() statement in\n // _addAuction())\n if (_secondsPassed >= _duration) {\n // We've reached the end of the dynamic pricing portion\n // of the auction, just return the end price.\n return _endingPrice;\n } else {\n // Starting price can be higher than ending price (and often is!), so\n // this delta can be negative.\n int256 totalPriceChange = int256(_endingPrice) - int256(_startingPrice);\n\n // This multiplication can't overflow, _secondsPassed will easily fit within\n // 64-bits, and totalPriceChange will easily fit within 128-bits, their product\n // will always fit within 256-bits.\n int256 currentPriceChange = totalPriceChange * int256(_secondsPassed) / int256(_duration);\n\n // currentPriceChange can be negative, but if so, will have a magnitude\n // less that _startingPrice. Thus, this result will always end up positive.\n int256 currentPrice = int256(_startingPrice) + currentPriceChange;\n\n return uint256(currentPrice);\n }\n }\n\n /// @dev Computes owner's cut of a sale.\n /// @param _price - Sale price of NFT.\n function _computeCut(uint256 _price) internal view returns (uint256) {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our entry functions carefully cap the maximum values for\n // currency (at 128-bits), and ownerCut <= 10000 (see the require()\n // statement in the ClockAuction constructor). The result of this\n // function is always guaranteed to be <= _price.\n return _price * ownerCut / 10000;\n }\n\n}\n\n\n\n\n\n\n\n/**\n * @title KittiesPausable\n * @dev Base contract which allows children to implement an emergency stop mechanism.\n */\ncontract KittiesPausable is KittiesOwnable {\n event Pause();\n event Unpause();\n\n bool public paused = false;\n\n\n /**\n\t * @dev modifier to allow actions only when the contract IS paused\n\t */\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /**\n\t * @dev modifier to allow actions only when the contract IS NOT paused\n\t */\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /**\n\t * @dev called by the owner to pause, triggers stopped state\n\t */\n function pause() onlyOwner whenNotPaused returns (bool) {\n paused = true;\n Pause();\n return true;\n }\n\n /**\n\t * @dev called by the owner to unpause, returns to normal state\n\t */\n function unpause() onlyOwner whenPaused returns (bool) {\n paused = false;\n Unpause();\n return true;\n }\n}\n\n\n/// @title Clock auction for non-fungible tokens.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuction is KittiesPausable, ClockAuctionBase {\n\n /// @dev The ERC-165 interface signature for ERC-721.\n /// Ref: https://github.com/ethereum/EIPs/issues/165\n /// Ref: https://github.com/ethereum/EIPs/issues/721\n bytes4 constant InterfaceSignature_ERC721 = bytes4(0x9a20483d);\n\n /// @dev Constructor creates a reference to the NFT ownership contract\n /// and verifies the owner cut is in the valid range.\n /// @param _nftAddress - address of a deployed contract implementing\n /// the Nonfungible Interface.\n /// @param _cut - percent cut the owner takes on each auction, must be\n /// between 0-10,000.\n function ClockAuction(address _nftAddress, uint256 _cut) public {\n require(_cut <= 10000);\n ownerCut = _cut;\n\n KittiesERC721 candidateContract = KittiesERC721(_nftAddress);\n require(candidateContract.supportsInterface(InterfaceSignature_ERC721));\n nonFungibleContract = candidateContract;\n }\n\n /// @dev Remove all Ether from the contract, which is the owner's cuts\n /// as well as any Ether sent directly to the contract address.\n /// Always transfers to the NFT contract, but can be called either by\n /// the owner or the NFT contract.\n function withdrawBalance() external {\n address nftAddress = address(nonFungibleContract);\n\n require(\n msg.sender == owner ||\n msg.sender == nftAddress\n );\n // We are using this boolean method to make sure that even if one fails it will still work\n bool res = nftAddress.send(this.balance);\n }\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of time to move between starting\n /// price and ending price (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n whenNotPaused\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(_owns(msg.sender, _tokenId));\n _escrow(msg.sender, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Bids on an open auction, completing the auction and transferring\n /// ownership of the NFT if enough Ether is supplied.\n /// @param _tokenId - ID of token to bid on.\n function bid(uint256 _tokenId)\n external\n payable\n whenNotPaused\n {\n // _bid will throw if the bid or funds transfer fails\n _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n }\n\n /// @dev Cancels an auction that hasn't been won yet.\n /// Returns the NFT to original owner.\n /// @notice This is a state-modifying function that can\n /// be called while the contract is paused.\n /// @param _tokenId - ID of token on auction\n function cancelAuction(uint256 _tokenId)\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n address seller = auction.seller;\n require(msg.sender == seller);\n _cancelAuction(_tokenId, seller);\n }\n\n /// @dev Cancels an auction when the contract is paused.\n /// Only the owner may do this, and NFTs are returned to\n /// the seller. This should only be used in emergencies.\n /// @param _tokenId - ID of the NFT on auction to cancel.\n function cancelAuctionWhenPaused(uint256 _tokenId)\n whenPaused\n onlyOwner\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n _cancelAuction(_tokenId, auction.seller);\n }\n\n /// @dev Returns auction info for an NFT on auction.\n /// @param _tokenId - ID of NFT on auction.\n function getAuction(uint256 _tokenId)\n external\n view\n returns\n (\n address seller,\n uint256 startingPrice,\n uint256 endingPrice,\n uint256 duration,\n uint256 startedAt\n ) {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return (\n auction.seller,\n auction.startingPrice,\n auction.endingPrice,\n auction.duration,\n auction.startedAt\n );\n }\n\n /// @dev Returns the current price of an auction.\n /// @param _tokenId - ID of the token price we are checking.\n function getCurrentPrice(uint256 _tokenId)\n external\n view\n returns (uint256)\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return _currentPrice(auction);\n }\n\n}\n\n\n/// @title Reverse auction modified for siring\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SiringClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSiringAuctionAddress() call.\n bool public isSiringClockAuction = true;\n\n // Delegate constructor\n function SiringClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction. Since this function is wrapped,\n /// require sender to be KittyCore contract.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Places a bid for siring. Requires the sender\n /// is the KittyCore contract because all bid methods\n /// should be wrapped. Also returns the kitty to the\n /// seller rather than the winner.\n function bid(uint256 _tokenId)\n external\n payable\n {\n require(msg.sender == address(nonFungibleContract));\n address seller = tokenIdToAuction[_tokenId].seller;\n // _bid checks that token ID is valid and will throw if bid fails\n _bid(_tokenId, msg.value);\n // We transfer the kitty back to the seller, the winner will get\n // the offspring\n _transfer(seller, _tokenId);\n }\n\n}\n\n\n\n\n\n/// @title Clock auction modified for sale of kitties\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SaleClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSaleAuctionAddress() call.\n bool public isSaleClockAuction = true;\n\n // Tracks last 5 sale price of gen0 kitty sales\n uint256 public gen0SaleCount;\n uint256[5] public lastGen0SalePrices;\n\n // Delegate constructor\n function SaleClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Updates lastSalePrice if seller is the nft contract\n /// Otherwise, works the same as default bid method.\n function bid(uint256 _tokenId)\n external\n payable\n {\n // _bid verifies token ID size\n address seller = tokenIdToAuction[_tokenId].seller;\n uint256 price = _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n\n // If not a gen0 auction, exit\n if (seller == address(nonFungibleContract)) {\n // Track gen0 sale prices\n lastGen0SalePrices[gen0SaleCount % 5] = price;\n gen0SaleCount++;\n }\n }\n\n function averageGen0SalePrice() external view returns (uint256) {\n uint256 sum = 0;\n for (uint256 i = 0; i < 5; i++) {\n sum += lastGen0SalePrices[i];\n }\n return sum / 5;\n }\n\n}\n\n\n/// @title Handles creating auctions for sale and siring of kitties.\n/// This wrapper of ReverseAuction exists only so that users can create\n/// auctions with only one transaction.\ncontract KittyAuction is KittyBreeding {\n\n // @notice The auction contract variables are defined in KittyBase to allow\n // us to refer to them in KittyOwnership to prevent accidental transfers.\n // `saleAuction` refers to the auction for gen0 and p2p sale of kitties.\n // `siringAuction` refers to the auction for siring rights of kitties.\n\n /// @dev Sets the reference to the sale auction.\n /// @param _address - Address of sale contract.\n function setSaleAuctionAddress(address _address) external onlyCEO {\n SaleClockAuction candidateContract = SaleClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSaleClockAuction());\n\n // Set the new contract address\n saleAuction = candidateContract;\n }\n\n /// @dev Sets the reference to the siring auction.\n /// @param _address - Address of siring contract.\n function setSiringAuctionAddress(address _address) external onlyCEO {\n SiringClockAuction candidateContract = SiringClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSiringClockAuction());\n\n // Set the new contract address\n siringAuction = candidateContract;\n }\n\n /// @dev Put a kitty up for auction.\n /// Does some ownership trickery to create auctions in one tx.\n function createSaleAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n // Ensure the kitty is not pregnant to prevent the auction\n // contract accidentally receiving ownership of the child.\n // NOTE: the kitty IS allowed to be in a cooldown.\n require(!isPregnant(_kittyId));\n _approve(_kittyId, saleAuction);\n // Sale auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n saleAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Put a kitty up for auction to be sire.\n /// Performs checks to ensure the kitty can be sired, then\n /// delegates to reverse auction.\n function createSiringAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n require(isReadyToBreed(_kittyId));\n _approve(_kittyId, siringAuction);\n // Siring auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n siringAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Completes a siring auction by bidding.\n /// Immediately breeds the winning matron with the sire on auction.\n /// @param _sireId - ID of the sire on auction.\n /// @param _matronId - ID of the matron owned by the bidder.\n function bidOnSiringAuction(\n uint256 _sireId,\n uint256 _matronId\n )\n external\n payable\n whenNotPaused\n {\n // Auction contract checks input sizes\n require(_owns(msg.sender, _matronId));\n require(isReadyToBreed(_matronId));\n require(_canBreedWithViaAuction(_matronId, _sireId));\n\n // Define the current price of the auction.\n uint256 currentPrice = siringAuction.getCurrentPrice(_sireId);\n require(msg.value >= currentPrice + autoBirthFee);\n\n // Siring auction will throw if the bid fails.\n siringAuction.bid.value(msg.value - autoBirthFee)(_sireId);\n _breedWith(uint32(_matronId), uint32(_sireId));\n }\n\n /// @dev Transfers the balance of the sale auction contract\n /// to the KittyCore contract. We use two-step withdrawal to\n /// prevent two transfer calls in the auction bid function.\n function withdrawAuctionBalances() external onlyCLevel {\n saleAuction.withdrawBalance();\n siringAuction.withdrawBalance();\n }\n}\n\n\n/// @title all functions related to creating kittens\ncontract KittyMinting is KittyAuction {\n\n // Limits the number of cats the contract owner can ever create.\n uint256 public constant PROMO_CREATION_LIMIT = 5000;\n uint256 public constant GEN0_CREATION_LIMIT = 45000;\n\n // Constants for gen0 auctions.\n uint256 public constant GEN0_STARTING_PRICE = 10 finney;\n uint256 public constant GEN0_AUCTION_DURATION = 1 days;\n\n // Counts the number of cats the contract owner has created.\n uint256 public promoCreatedCount;\n uint256 public gen0CreatedCount;\n\n /// @dev we can create promo kittens, up to a limit. Only callable by COO\n /// @param _genes the encoded genes of the kitten to be created, any value is accepted\n /// @param _owner the future owner of the created kittens. Default to contract COO\n function createPromoKitty(uint256 _genes, address _owner) external onlyCOO {\n address kittyOwner = _owner;\n if (kittyOwner == address(0)) {\n kittyOwner = cooAddress;\n }\n require(promoCreatedCount < PROMO_CREATION_LIMIT);\n\n promoCreatedCount++;\n _createKitty(0, 0, 0, _genes, kittyOwner);\n }\n\n /// @dev Creates a new gen0 kitty with the given genes and\n /// creates an auction for it.\n function createGen0Auction(uint256 _genes) external onlyCOO {\n require(gen0CreatedCount < GEN0_CREATION_LIMIT);\n\n uint256 kittyId = _createKitty(0, 0, 0, _genes, address(this));\n _approve(kittyId, saleAuction);\n\n saleAuction.createAuction(\n kittyId,\n _computeNextGen0Price(),\n 0,\n GEN0_AUCTION_DURATION,\n address(this)\n );\n\n gen0CreatedCount++;\n }\n\n /// @dev Computes the next gen0 auction starting price, given\n /// the average of the past 5 prices + 50%.\n function _computeNextGen0Price() internal view returns (uint256) {\n uint256 avePrice = saleAuction.averageGen0SalePrice();\n\n // Sanity check to ensure we don't overflow arithmetic\n require(avePrice == uint256(uint128(avePrice)));\n\n uint256 nextPrice = avePrice + (avePrice / 2);\n\n // We never auction for less than starting price\n if (nextPrice < GEN0_STARTING_PRICE) {\n nextPrice = GEN0_STARTING_PRICE;\n }\n\n return nextPrice;\n }\n}\n\n\n/// @title CryptoKitties: Collectible, breedable, and oh-so-adorable cats on the Ethereum blockchain.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev The main CryptoKitties contract, keeps track of kittens so they don't wander around and get lost.\ncontract KittyCore is KittyMinting {\n\n // This is the main CryptoKitties contract. In order to keep our code seperated into logical sections,\n // we've broken it up in two ways. First, we have several seperately-instantiated sibling contracts\n // that handle auctions and our super-top-secret genetic combination algorithm. The auctions are\n // seperate since their logic is somewhat complex and there's always a risk of subtle bugs. By keeping\n // them in their own contracts, we can upgrade them without disrupting the main contract that tracks\n // kitty ownership. The genetic combination algorithm is kept seperate so we can open-source all of\n // the rest of our code without making it _too_ easy for folks to figure out how the genetics work.\n // Don't worry, I'm sure someone will reverse engineer it soon enough!\n //\n // Secondly, we break the core contract into multiple files using inheritence, one for each major\n // facet of functionality of CK. This allows us to keep related code bundled together while still\n // avoiding a single giant file with everything in it. The breakdown is as follows:\n //\n // - KittyBase: This is where we define the most fundamental code shared throughout the core\n // functionality. This includes our main data storage, constants and data types, plus\n // internal functions for managing these items.\n //\n // - KittyAccessControl: This contract manages the various addresses and constraints for operations\n // that can be executed only by specific roles. Namely CEO, CFO and COO.\n //\n // - KittyOwnership: This provides the methods required for basic non-fungible token\n // transactions, following the draft ERC-721 spec (https://github.com/ethereum/EIPs/issues/721).\n //\n // - KittyBreeding: This file contains the methods necessary to breed cats together, including\n // keeping track of siring offers, and relies on an external genetic combination contract.\n //\n // - KittyAuctions: Here we have the public methods for auctioning or bidding on cats or siring\n // services. The actual auction functionality is handled in two sibling contracts (one\n // for sales and one for siring), while auction creation and bidding is mostly mediated\n // through this facet of the core contract.\n //\n // - KittyMinting: This final facet contains the functionality we use for creating new gen0 cats.\n // We can make up to 5000 \"promo\" cats that can be given away (especially important when\n // the community is new), and all others can only be created and then immediately put up\n // for auction via an algorithmically determined starting price. Regardless of how they\n // are created, there is a hard limit of 50k gen0 cats. After that, it's all up to the\n // community to breed, breed, breed!\n\n // Set in case the core contract is broken and an upgrade is required\n address public newContractAddress;\n\n /// @notice Creates the main CryptoKitties smart contract instance.\n function KittyCore() public {\n // Starts paused.\n paused = true;\n\n // the creator of the contract is the initial CEO\n ceoAddress = msg.sender;\n\n // the creator of the contract is also the initial COO\n cooAddress = msg.sender;\n\n // start with the mythical kitten 0 - so we don't have generation-0 parent issues\n _createKitty(0, 0, 0, uint256(-1), address(0));\n }\n\n /// @dev Used to mark the smart contract as upgraded, in case there is a serious\n /// breaking bug. This method does nothing but keep track of the new contract and\n /// emit a message indicating that the new address is set. It's up to clients of this\n /// contract to update to the new contract address in that case. (This contract will\n /// be paused indefinitely if such an upgrade takes place.)\n /// @param _v2Address new address\n function setNewAddress(address _v2Address) external onlyCEO whenPaused {\n // See README.md for updgrade plan\n newContractAddress = _v2Address;\n ContractUpgrade(_v2Address);\n }\n\n /// @notice No tipping!\n /// @dev Reject all Ether from being sent here, unless it's from one of the\n /// two auction contracts. (Hopefully, we can prevent user accidents.)\n function() external payable {\n require(\n msg.sender == address(saleAuction) ||\n msg.sender == address(siringAuction)\n );\n }\n\n /// @notice Returns all the relevant information about a specific kitty.\n /// @param _id The ID of the kitty of interest.\n function getKitty(uint256 _id)\n external\n view\n returns (\n bool isGestating,\n bool isReady,\n uint256 cooldownIndex,\n uint256 nextActionAt,\n uint256 siringWithId,\n uint256 birthTime,\n uint256 matronId,\n uint256 sireId,\n uint256 generation,\n uint256 genes\n ) {\n Kitty storage kit = kitties[_id];\n\n // if this variable is 0 then it's not gestating\n isGestating = (kit.siringWithId != 0);\n isReady = (kit.cooldownEndBlock <= block.number);\n cooldownIndex = uint256(kit.cooldownIndex);\n nextActionAt = uint256(kit.cooldownEndBlock);\n siringWithId = uint256(kit.siringWithId);\n birthTime = uint256(kit.birthTime);\n matronId = uint256(kit.matronId);\n sireId = uint256(kit.sireId);\n generation = uint256(kit.generation);\n genes = kit.genes;\n }\n\n /// @dev Override unpause so it requires all external contract addresses\n /// to be set before contract can be unpaused. Also, we can't have\n /// newContractAddress set either, because then the contract was upgraded.\n /// @notice This is public rather than external so we can call super.unpause\n /// without using an expensive CALL.\n function unpause() public onlyCEO whenPaused {\n require(saleAuction != address(0));\n require(siringAuction != address(0));\n require(geneScience != address(0));\n require(newContractAddress == address(0));\n\n // Actually unpause the contract.\n super.unpause();\n }\n\n // @dev Allows the CFO to capture the balance available to the contract.\n function withdrawBalance() external onlyCFO {\n uint256 balance = this.balance;\n // Subtract all the currently pregnant kittens we have, plus 1 of margin.\n uint256 subtractFees = (pregnantKitties + 1) * autoBirthFee;\n\n if (balance > subtractFees) {\n cfoAddress.send(balance - subtractFees);\n }\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "exportedSymbols": { "ClockAuction": [ 8872 @@ -52526,5 +52526,5 @@ export const KittyAuction = }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:47.781Z" + "updatedAt": "2018-10-09T17:45:36.264Z" } \ No newline at end of file diff --git a/artifacts/ts/KittyBase.ts b/artifacts/ts/KittyBase.ts index c13844e8..2b046e28 100644 --- a/artifacts/ts/KittyBase.ts +++ b/artifacts/ts/KittyBase.ts @@ -317,15 +317,15 @@ export const KittyBase = "type": "event" } ], - "bytecode": "0x60606040526000600260146101000a81548160ff0219169083151502179055506101c060405190810160405280603c63ffffffff1663ffffffff168152602001607863ffffffff1663ffffffff16815260200161012c63ffffffff1663ffffffff16815260200161025863ffffffff1663ffffffff16815260200161070863ffffffff1663ffffffff168152602001610e1063ffffffff1663ffffffff168152602001611c2063ffffffff1663ffffffff16815260200161384063ffffffff1663ffffffff16815260200161708063ffffffff1663ffffffff16815260200161e10063ffffffff1663ffffffff1681526020016201518063ffffffff1663ffffffff1681526020016202a30063ffffffff1663ffffffff1681526020016205460063ffffffff1663ffffffff16815260200162093a8063ffffffff1663ffffffff16815250600390600e61015492919061016a565b50600f600555341561016557600080fd5b610240565b82600e6007016008900481019282156101fc5791602002820160005b838211156101ca57835183826101000a81548163ffffffff021916908363ffffffff1602179055509260200192600401602081600301049283019260010302610186565b80156101fa5782816101000a81549063ffffffff02191690556004016020816003010492830192600103026101ca565b505b509050610209919061020d565b5090565b61023d91905b8082111561023957600081816101000a81549063ffffffff021916905550600101610213565b5090565b90565b610cde8061024f6000396000f3006060604052600436106100f1576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630519ce79146100f65780630a0f81681461014b57806321717ebf146101a057806327d7874c146101f55780632ba73c151461022e5780633f4ba83a1461026757806346116e6f1461027c578063481af3d3146102df5780634e0a3379146103425780635663896e1461037b5780635c975abb1461039e5780637a7d4937146103cb5780638456cb59146103f45780639d6fac6f14610409578063a45f4bfc1461044c578063b047fb50146104af578063e6cbe35114610504575b600080fd5b341561010157600080fd5b610109610559565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015657600080fd5b61015e61057f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101ab57600080fd5b6101b36105a4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561020057600080fd5b61022c600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506105ca565b005b341561023957600080fd5b610265600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506106a4565b005b341561027257600080fd5b61027a61077f565b005b341561028757600080fd5b61029d6004808035906020019091905050610812565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102ea57600080fd5b6103006004808035906020019091905050610845565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561034d57600080fd5b610379600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610878565b005b341561038657600080fd5b61039c6004808035906020019091905050610953565b005b34156103a957600080fd5b6103b1610aa7565b604051808215151515815260200191505060405180910390f35b34156103d657600080fd5b6103de610aba565b6040518082815260200191505060405180910390f35b34156103ff57600080fd5b610407610ac0565b005b341561041457600080fd5b61042a6004808035906020019091905050610c04565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b341561045757600080fd5b61046d6004808035906020019091905050610c33565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104ba57600080fd5b6104c2610c66565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561050f57600080fd5b610517610c8c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561062557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561066157600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156106ff57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561073b57600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156107da57600080fd5b600260149054906101000a900460ff1615156107f557600080fd5b6000600260146101000a81548160ff021916908315150217905550565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108d357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561090f57600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806109fb57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80610a535750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515610a5e57600080fd5b60036000600e81101515610a6e57fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff1681101515610a9d57600080fd5b8060058190555050565b600260149054906101000a900460ff1681565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610b6857506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80610bc05750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515610bcb57600080fd5b600260149054906101000a900460ff16151515610be757600080fd5b6001600260146101000a81548160ff021916908315150217905550565b600381600e81101515610c1357fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16815600a165627a7a72305820792f7b70c652d5440952b1544e2649682ea61239fa1f0a83403e80688010c9910029", - "deployedBytecode": "0x6060604052600436106100f1576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630519ce79146100f65780630a0f81681461014b57806321717ebf146101a057806327d7874c146101f55780632ba73c151461022e5780633f4ba83a1461026757806346116e6f1461027c578063481af3d3146102df5780634e0a3379146103425780635663896e1461037b5780635c975abb1461039e5780637a7d4937146103cb5780638456cb59146103f45780639d6fac6f14610409578063a45f4bfc1461044c578063b047fb50146104af578063e6cbe35114610504575b600080fd5b341561010157600080fd5b610109610559565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015657600080fd5b61015e61057f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101ab57600080fd5b6101b36105a4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561020057600080fd5b61022c600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506105ca565b005b341561023957600080fd5b610265600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506106a4565b005b341561027257600080fd5b61027a61077f565b005b341561028757600080fd5b61029d6004808035906020019091905050610812565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102ea57600080fd5b6103006004808035906020019091905050610845565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561034d57600080fd5b610379600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610878565b005b341561038657600080fd5b61039c6004808035906020019091905050610953565b005b34156103a957600080fd5b6103b1610aa7565b604051808215151515815260200191505060405180910390f35b34156103d657600080fd5b6103de610aba565b6040518082815260200191505060405180910390f35b34156103ff57600080fd5b610407610ac0565b005b341561041457600080fd5b61042a6004808035906020019091905050610c04565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b341561045757600080fd5b61046d6004808035906020019091905050610c33565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104ba57600080fd5b6104c2610c66565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561050f57600080fd5b610517610c8c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561062557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561066157600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156106ff57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561073b57600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156107da57600080fd5b600260149054906101000a900460ff1615156107f557600080fd5b6000600260146101000a81548160ff021916908315150217905550565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108d357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561090f57600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806109fb57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80610a535750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515610a5e57600080fd5b60036000600e81101515610a6e57fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff1681101515610a9d57600080fd5b8060058190555050565b600260149054906101000a900460ff1681565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610b6857506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80610bc05750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515610bcb57600080fd5b600260149054906101000a900460ff16151515610be757600080fd5b6001600260146101000a81548160ff021916908315150217905550565b600381600e81101515610c1357fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16815600a165627a7a72305820792f7b70c652d5440952b1544e2649682ea61239fa1f0a83403e80688010c9910029", + "bytecode": "0x60606040526000600260146101000a81548160ff0219169083151502179055506101c060405190810160405280603c63ffffffff1663ffffffff168152602001607863ffffffff1663ffffffff16815260200161012c63ffffffff1663ffffffff16815260200161025863ffffffff1663ffffffff16815260200161070863ffffffff1663ffffffff168152602001610e1063ffffffff1663ffffffff168152602001611c2063ffffffff1663ffffffff16815260200161384063ffffffff1663ffffffff16815260200161708063ffffffff1663ffffffff16815260200161e10063ffffffff1663ffffffff1681526020016201518063ffffffff1663ffffffff1681526020016202a30063ffffffff1663ffffffff1681526020016205460063ffffffff1663ffffffff16815260200162093a8063ffffffff1663ffffffff16815250600390600e61015492919061016a565b50600f600555341561016557600080fd5b610240565b82600e6007016008900481019282156101fc5791602002820160005b838211156101ca57835183826101000a81548163ffffffff021916908363ffffffff1602179055509260200192600401602081600301049283019260010302610186565b80156101fa5782816101000a81549063ffffffff02191690556004016020816003010492830192600103026101ca565b505b509050610209919061020d565b5090565b61023d91905b8082111561023957600081816101000a81549063ffffffff021916905550600101610213565b5090565b90565b610cde8061024f6000396000f3006060604052600436106100f1576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630519ce79146100f65780630a0f81681461014b57806321717ebf146101a057806327d7874c146101f55780632ba73c151461022e5780633f4ba83a1461026757806346116e6f1461027c578063481af3d3146102df5780634e0a3379146103425780635663896e1461037b5780635c975abb1461039e5780637a7d4937146103cb5780638456cb59146103f45780639d6fac6f14610409578063a45f4bfc1461044c578063b047fb50146104af578063e6cbe35114610504575b600080fd5b341561010157600080fd5b610109610559565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015657600080fd5b61015e61057f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101ab57600080fd5b6101b36105a4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561020057600080fd5b61022c600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506105ca565b005b341561023957600080fd5b610265600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506106a4565b005b341561027257600080fd5b61027a61077f565b005b341561028757600080fd5b61029d6004808035906020019091905050610812565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102ea57600080fd5b6103006004808035906020019091905050610845565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561034d57600080fd5b610379600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610878565b005b341561038657600080fd5b61039c6004808035906020019091905050610953565b005b34156103a957600080fd5b6103b1610aa7565b604051808215151515815260200191505060405180910390f35b34156103d657600080fd5b6103de610aba565b6040518082815260200191505060405180910390f35b34156103ff57600080fd5b610407610ac0565b005b341561041457600080fd5b61042a6004808035906020019091905050610c04565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b341561045757600080fd5b61046d6004808035906020019091905050610c33565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104ba57600080fd5b6104c2610c66565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561050f57600080fd5b610517610c8c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561062557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561066157600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156106ff57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561073b57600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156107da57600080fd5b600260149054906101000a900460ff1615156107f557600080fd5b6000600260146101000a81548160ff021916908315150217905550565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108d357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561090f57600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806109fb57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80610a535750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515610a5e57600080fd5b60036000600e81101515610a6e57fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff1681101515610a9d57600080fd5b8060058190555050565b600260149054906101000a900460ff1681565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610b6857506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80610bc05750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515610bcb57600080fd5b600260149054906101000a900460ff16151515610be757600080fd5b6001600260146101000a81548160ff021916908315150217905550565b600381600e81101515610c1357fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16815600a165627a7a723058209da33ce618c25c7f590fc42128c0871c0b749c7049116955bf4eb60c0d692d180029", + "deployedBytecode": "0x6060604052600436106100f1576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630519ce79146100f65780630a0f81681461014b57806321717ebf146101a057806327d7874c146101f55780632ba73c151461022e5780633f4ba83a1461026757806346116e6f1461027c578063481af3d3146102df5780634e0a3379146103425780635663896e1461037b5780635c975abb1461039e5780637a7d4937146103cb5780638456cb59146103f45780639d6fac6f14610409578063a45f4bfc1461044c578063b047fb50146104af578063e6cbe35114610504575b600080fd5b341561010157600080fd5b610109610559565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561015657600080fd5b61015e61057f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101ab57600080fd5b6101b36105a4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561020057600080fd5b61022c600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506105ca565b005b341561023957600080fd5b610265600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506106a4565b005b341561027257600080fd5b61027a61077f565b005b341561028757600080fd5b61029d6004808035906020019091905050610812565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102ea57600080fd5b6103006004808035906020019091905050610845565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561034d57600080fd5b610379600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610878565b005b341561038657600080fd5b61039c6004808035906020019091905050610953565b005b34156103a957600080fd5b6103b1610aa7565b604051808215151515815260200191505060405180910390f35b34156103d657600080fd5b6103de610aba565b6040518082815260200191505060405180910390f35b34156103ff57600080fd5b610407610ac0565b005b341561041457600080fd5b61042a6004808035906020019091905050610c04565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b341561045757600080fd5b61046d6004808035906020019091905050610c33565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104ba57600080fd5b6104c2610c66565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561050f57600080fd5b610517610c8c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561062557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561066157600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156106ff57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561073b57600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156107da57600080fd5b600260149054906101000a900460ff1615156107f557600080fd5b6000600260146101000a81548160ff021916908315150217905550565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108d357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561090f57600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806109fb57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80610a535750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515610a5e57600080fd5b60036000600e81101515610a6e57fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff1681101515610a9d57600080fd5b8060058190555050565b600260149054906101000a900460ff1681565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610b6857506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80610bc05750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515610bcb57600080fd5b600260149054906101000a900460ff16151515610be757600080fd5b6001600260146101000a81548160ff021916908315150217905550565b600381600e81101515610c1357fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16815600a165627a7a723058209da33ce618c25c7f590fc42128c0871c0b749c7049116955bf4eb60c0d692d180029", "sourceMap": "7747:9736:18:-;;;5032:5;5011:26;;;;;;;;;;;;;;;;;;;;11384:339;;;;;;;;;11427:9;11384:339;;;;;;;;11450:9;11384:339;;;;;;;;11473:9;11384:339;;;;;;;;11496:10;11384:339;;;;;;;;11520:10;11384:339;;;;;;;;11544:7;11384:339;;;;;;;;11565:7;11384:339;;;;;;;;11586:7;11384:339;;;;;;;;11607:7;11384:339;;;;;;;;11628:8;11384:339;;;;;;;;11650:6;11384:339;;;;;;;;11670:6;11384:339;;;;;;;;11690:6;11384:339;;;;;;;;11710:6;11384:339;;;;;;;;;;;;;;;:::i;:::-;;11840:2;11807:35;;7747:9736;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;", "deployedSourceMap": "7747:9736:18:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4848:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4817;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13853:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5800:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;6346;;;;;;;;;;;;;;;;;;;;;;;;;;;;7359:126;;;;;;;;;;;;;;13283:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12965;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6073:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;17342:139;;;;;;;;;;;;;;;;;;;;;;;;;;5011:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11807:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6990:81;;;;;;;;;;;;;;11384:339;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12465:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4879:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13564:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4848:25;;;;;;;;;;;;;:::o;4817:::-;;;;;;;;;;;;;:::o;13853:39::-;;;;;;;;;;;;;:::o;5800:128::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;5887:1;5868:21;;:7;:21;;;;5860:30;;;;;;;;5914:7;5901:10;;:20;;;;;;;;;;;;;;;;;;5800:128;:::o;6346:::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;6433:1;6414:21;;:7;:21;;;;6406:30;;;;;;;;6460:7;6447:10;;:20;;;;;;;;;;;;;;;;;;6346:128;:::o;7359:126::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;6812:6;;;;;;;;;;;6804:15;;;;;;;;7473:5;7464:6;;:14;;;;;;;;;;;;;;;;;;7359:126::o;13283:56::-;;;;;;;;;;;;;;;;;;;;;;:::o;12965:::-;;;;;;;;;;;;;;;;;;;;;;:::o;6073:128::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;6160:1;6141:21;;:7;:21;;;;6133:30;;;;;;;;6187:7;6174:10;;:20;;;;;;;;;;;;;;;;;;6073:128;:::o;17342:139::-;5537:10;;;;;;;;;;;5523:24;;:10;:24;;;:64;;;;5577:10;;;;;;;;;;;5563:24;;:10;:24;;;5523:64;:104;;;;5617:10;;;;;;;;;;;5603:24;;:10;:24;;;5523:104;5502:135;;;;;;;;17429:9;17439:1;17429:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17422:19;;:4;:19;17414:28;;;;;;;;17470:4;17452:15;:22;;;;17342:139;:::o;5011:26::-;;;;;;;;;;;;;:::o;11807:35::-;;;;:::o;6990:81::-;5537:10;;;;;;;;;;;5523:24;;:10;:24;;;:64;;;;5577:10;;;;;;;;;;;5563:24;;:10;:24;;;5523:64;:104;;;;5617:10;;;;;;;;;;;5603:24;;:10;:24;;;5523:104;5502:135;;;;;;;;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;7060:4;7051:6;;:13;;;;;;;;;;;;;;;;;;6990:81::o;11384:339::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;12465:53::-;;;;;;;;;;;;;;;;;;;;;;:::o;4879:25::-;;;;;;;;;;;;;:::o;13564:35::-;;;;;;;;;;;;;:::o", "source": "pragma solidity 0.4.18;\n\n/**\n The following contract code, titled KittyCore, was written by Cryptokitties and published\n and retrieved from https://etherscan.io/address/0x06012c8cf97bead5deae237070f9587f8e7a266d#code.\n\n It is included in the current project for test purposes, to ensure that our collateralizer can\n handle ERC721 tokens created by the KittyCore contract.\n*/\n\n/**\n * @title KittiesOwnable\n * @dev The KittiesOwnable contract has an owner address, and provides basic authorization control\n * functions, this simplifies the implementation of \"user permissions\".\n */\ncontract KittiesOwnable {\n address public owner;\n\n\n /**\n\t * @dev The KittiesOwnable constructor sets the original `owner` of the contract to the sender\n\t * account.\n\t */\n function KittiesOwnable() {\n owner = msg.sender;\n }\n\n\n /**\n\t * @dev Throws if called by any account other than the owner.\n\t */\n modifier onlyOwner() {\n require(msg.sender == owner);\n _;\n }\n\n\n /**\n\t * @dev Allows the current owner to transfer control of the contract to a newOwner.\n\t * @param newOwner The address to transfer ownership to.\n\t */\n function transferOwnership(address newOwner) onlyOwner {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n\n}\n\n\n\n/// @title Interface for contracts conforming to ERC-721: Non-Fungible Tokens\n/// @author Dieter Shirley (https://github.com/dete)\ncontract KittiesERC721 {\n // Required methods\n function totalSupply() public view returns (uint256 total);\n function balanceOf(address _owner) public view returns (uint256 balance);\n function ownerOf(uint256 _tokenId) external view returns (address owner);\n function approve(address _to, uint256 _tokenId) external;\n function transfer(address _to, uint256 _tokenId) external;\n function transferFrom(address _from, address _to, uint256 _tokenId) external;\n\n // Events\n event Transfer(address from, address to, uint256 tokenId);\n event Approval(address owner, address approved, uint256 tokenId);\n\n // Optional\n // function name() public view returns (string name);\n // function symbol() public view returns (string symbol);\n // function tokensOfOwner(address _owner) external view returns (uint256[] tokenIds);\n // function tokenMetadata(uint256 _tokenId, string _preferredTransport) public view returns (string infoUrl);\n\n // ERC-165 Compatibility (https://github.com/ethereum/EIPs/issues/165)\n function supportsInterface(bytes4 _interfaceID) external view returns (bool);\n}\n\n\n// // Auction wrapper functions\n\n\n// Auction wrapper functions\n\n\n\n\n\n\n\n/// @title SEKRETOOOO\ncontract GeneScienceInterface {\n /// @dev simply a boolean to indicate this is the contract we expect to be\n function isGeneScience() public pure returns (bool);\n\n /// @dev given genes of kitten 1 & 2, return a genetic combination - may have a random factor\n /// @param genes1 genes of mom\n /// @param genes2 genes of sire\n /// @return the genes that are supposed to be passed down the child\n function mixGenes(uint256 genes1, uint256 genes2, uint256 targetBlock) public returns (uint256);\n}\n\n\n\n\n\n\n\n/// @title A facet of KittyCore that manages special access privileges.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyAccessControl {\n // This facet controls access control for CryptoKitties. There are four roles managed here:\n //\n // - The CEO: The CEO can reassign other roles and change the addresses of our dependent smart\n // contracts. It is also the only role that can unpause the smart contract. It is initially\n // set to the address that created the smart contract in the KittyCore constructor.\n //\n // - The CFO: The CFO can withdraw funds from KittyCore and its auction contracts.\n //\n // - The COO: The COO can release gen0 kitties to auction, and mint promo cats.\n //\n // It should be noted that these roles are distinct without overlap in their access abilities, the\n // abilities listed for each role above are exhaustive. In particular, while the CEO can assign any\n // address to any role, the CEO address itself doesn't have the ability to act in those roles. This\n // restriction is intentional so that we aren't tempted to use the CEO address frequently out of\n // convenience. The less we use an address, the less likely it is that we somehow compromise the\n // account.\n\n /// @dev Emited when contract is upgraded - See README.md for updgrade plan\n event ContractUpgrade(address newContract);\n\n // The addresses of the accounts (or contracts) that can execute actions within each roles.\n address public ceoAddress;\n address public cfoAddress;\n address public cooAddress;\n\n // @dev Keeps track whether the contract is paused. When that is true, most actions are blocked\n bool public paused = false;\n\n /// @dev Access modifier for CEO-only functionality\n modifier onlyCEO() {\n require(msg.sender == ceoAddress);\n _;\n }\n\n /// @dev Access modifier for CFO-only functionality\n modifier onlyCFO() {\n require(msg.sender == cfoAddress);\n _;\n }\n\n /// @dev Access modifier for COO-only functionality\n modifier onlyCOO() {\n require(msg.sender == cooAddress);\n _;\n }\n\n modifier onlyCLevel() {\n require(\n msg.sender == cooAddress ||\n msg.sender == ceoAddress ||\n msg.sender == cfoAddress\n );\n _;\n }\n\n /// @dev Assigns a new address to act as the CEO. Only available to the current CEO.\n /// @param _newCEO The address of the new CEO\n function setCEO(address _newCEO) external onlyCEO {\n require(_newCEO != address(0));\n\n ceoAddress = _newCEO;\n }\n\n /// @dev Assigns a new address to act as the CFO. Only available to the current CEO.\n /// @param _newCFO The address of the new CFO\n function setCFO(address _newCFO) external onlyCEO {\n require(_newCFO != address(0));\n\n cfoAddress = _newCFO;\n }\n\n /// @dev Assigns a new address to act as the COO. Only available to the current CEO.\n /// @param _newCOO The address of the new COO\n function setCOO(address _newCOO) external onlyCEO {\n require(_newCOO != address(0));\n\n cooAddress = _newCOO;\n }\n\n /*** KittiesPausable functionality adapted from OpenZeppelin ***/\n\n /// @dev Modifier to allow actions only when the contract IS NOT paused\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /// @dev Modifier to allow actions only when the contract IS paused\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /// @dev Called by any \"C-level\" role to pause the contract. Used only when\n /// a bug or exploit is detected and we need to limit damage.\n function pause() external onlyCLevel whenNotPaused {\n paused = true;\n }\n\n /// @dev Unpauses the smart contract. Can only be called by the CEO, since\n /// one reason we may pause the contract is when CFO or COO accounts are\n /// compromised.\n /// @notice This is public rather than external so it can be called by\n /// derived contracts.\n function unpause() public onlyCEO whenPaused {\n // can't unpause if contract was upgraded\n paused = false;\n }\n}\n\n\n\n\n/// @title Base contract for CryptoKitties. Holds all common structs, events and base variables.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBase is KittyAccessControl {\n /*** EVENTS ***/\n\n /// @dev The Birth event is fired whenever a new kitten comes into existence. This obviously\n /// includes any time a cat is created through the giveBirth method, but it is also called\n /// when a new gen0 cat is created.\n event Birth(address owner, uint256 kittyId, uint256 matronId, uint256 sireId, uint256 genes);\n\n /// @dev Transfer event as defined in current draft of ERC721. Emitted every time a kitten\n /// ownership is assigned, including births.\n event Transfer(address from, address to, uint256 tokenId);\n\n /*** DATA TYPES ***/\n\n /// @dev The main Kitty struct. Every cat in CryptoKitties is represented by a copy\n /// of this structure, so great care was taken to ensure that it fits neatly into\n /// exactly two 256-bit words. Note that the order of the members in this structure\n /// is important because of the byte-packing rules used by Ethereum.\n /// Ref: http://solidity.readthedocs.io/en/develop/miscellaneous.html\n struct Kitty {\n // The Kitty's genetic code is packed into these 256-bits, the format is\n // sooper-sekret! A cat's genes never change.\n uint256 genes;\n\n // The timestamp from the block when this cat came into existence.\n uint64 birthTime;\n\n // The minimum timestamp after which this cat can engage in breeding\n // activities again. This same timestamp is used for the pregnancy\n // timer (for matrons) as well as the siring cooldown.\n uint64 cooldownEndBlock;\n\n // The ID of the parents of this kitty, set to 0 for gen0 cats.\n // Note that using 32-bit unsigned integers limits us to a \"mere\"\n // 4 billion cats. This number might seem small until you realize\n // that Ethereum currently has a limit of about 500 million\n // transactions per year! So, this definitely won't be a problem\n // for several years (even as Ethereum learns to scale).\n uint32 matronId;\n uint32 sireId;\n\n // Set to the ID of the sire cat for matrons that are pregnant,\n // zero otherwise. A non-zero value here is how we know a cat\n // is pregnant. Used to retrieve the genetic material for the new\n // kitten when the birth transpires.\n uint32 siringWithId;\n\n // Set to the index in the cooldown array (see below) that represents\n // the current cooldown duration for this Kitty. This starts at zero\n // for gen0 cats, and is initialized to floor(generation/2) for others.\n // Incremented by one for each successful breeding action, regardless\n // of whether this cat is acting as matron or sire.\n uint16 cooldownIndex;\n\n // The \"generation number\" of this cat. Cats minted by the CK contract\n // for sale are called \"gen0\" and have a generation number of 0. The\n // generation number of all other cats is the larger of the two generation\n // numbers of their parents, plus one.\n // (i.e. max(matron.generation, sire.generation) + 1)\n uint16 generation;\n }\n\n /*** CONSTANTS ***/\n\n /// @dev A lookup table indicating the cooldown duration after any successful\n /// breeding action, called \"pregnancy time\" for matrons and \"siring cooldown\"\n /// for sires. Designed such that the cooldown roughly doubles each time a cat\n /// is bred, encouraging owners not to just keep breeding the same cat over\n /// and over again. Caps out at one week (a cat can breed an unbounded number\n /// of times, and the maximum cooldown is always seven days).\n uint32[14] public cooldowns = [\n uint32(1 minutes),\n uint32(2 minutes),\n uint32(5 minutes),\n uint32(10 minutes),\n uint32(30 minutes),\n uint32(1 hours),\n uint32(2 hours),\n uint32(4 hours),\n uint32(8 hours),\n uint32(16 hours),\n uint32(1 days),\n uint32(2 days),\n uint32(4 days),\n uint32(7 days)\n ];\n\n // An approximation of currently how many seconds are in between blocks.\n uint256 public secondsPerBlock = 15;\n\n /*** STORAGE ***/\n\n /// @dev An array containing the Kitty struct for all Kitties in existence. The ID\n /// of each cat is actually an index into this array. Note that ID 0 is a negacat,\n /// the unKitty, the mythical beast that is the parent of all gen0 cats. A bizarre\n /// creature that is both matron and sire... to itself! Has an invalid genetic code.\n /// In other words, cat ID 0 is invalid... ;-)\n Kitty[] kitties;\n\n /// @dev A mapping from cat IDs to the address that owns them. All cats have\n /// some valid owner address, even gen0 cats are created with a non-zero owner.\n mapping (uint256 => address) public kittyIndexToOwner;\n\n // @dev A mapping from owner address to count of tokens that address owns.\n // Used internally inside balanceOf() to resolve ownership count.\n mapping (address => uint256) ownershipTokenCount;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to call\n /// transferFrom(). Each Kitty can only have one approved address for transfer\n /// at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public kittyIndexToApproved;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to use\n /// this Kitty for siring via breedWith(). Each Kitty can only have one approved\n /// address for siring at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public sireAllowedToAddress;\n\n /// @dev The address of the ClockAuction contract that handles sales of Kitties. This\n /// same contract handles both peer-to-peer sales as well as the gen0 sales which are\n /// initiated every 15 minutes.\n SaleClockAuction public saleAuction;\n\n /// @dev The address of a custom ClockAuction subclassed contract that handles siring\n /// auctions. Needs to be separate from saleAuction because the actions taken on success\n /// after a sales and siring auction are quite different.\n SiringClockAuction public siringAuction;\n\n /// @dev Assigns ownership of a specific Kitty to an address.\n function _transfer(address _from, address _to, uint256 _tokenId) internal {\n // Since the number of kittens is capped to 2^32 we can't overflow this\n ownershipTokenCount[_to]++;\n // transfer ownership\n kittyIndexToOwner[_tokenId] = _to;\n // When creating new kittens _from is 0x0, but we can't account that address.\n if (_from != address(0)) {\n ownershipTokenCount[_from]--;\n // once the kitten is transferred also clear sire allowances\n delete sireAllowedToAddress[_tokenId];\n // clear any previously approved ownership exchange\n delete kittyIndexToApproved[_tokenId];\n }\n // Emit the transfer event.\n Transfer(_from, _to, _tokenId);\n }\n\n /// @dev An internal method that creates a new kitty and stores it. This\n /// method doesn't do any checking and should only be called when the\n /// input data is known to be valid. Will generate both a Birth event\n /// and a Transfer event.\n /// @param _matronId The kitty ID of the matron of this cat (zero for gen0)\n /// @param _sireId The kitty ID of the sire of this cat (zero for gen0)\n /// @param _generation The generation number of this cat, must be computed by caller.\n /// @param _genes The kitty's genetic code.\n /// @param _owner The inital owner of this cat, must be non-zero (except for the unKitty, ID 0)\n function _createKitty(\n uint256 _matronId,\n uint256 _sireId,\n uint256 _generation,\n uint256 _genes,\n address _owner\n )\n internal\n returns (uint)\n {\n // These requires are not strictly necessary, our calling code should make\n // sure that these conditions are never broken. However! _createKitty() is already\n // an expensive call (for storage), and it doesn't hurt to be especially careful\n // to ensure our data structures are always valid.\n require(_matronId == uint256(uint32(_matronId)));\n require(_sireId == uint256(uint32(_sireId)));\n require(_generation == uint256(uint16(_generation)));\n\n // New kitty starts with the same cooldown as parent gen/2\n uint16 cooldownIndex = uint16(_generation / 2);\n if (cooldownIndex > 13) {\n cooldownIndex = 13;\n }\n\n Kitty memory _kitty = Kitty({\n genes: _genes,\n birthTime: uint64(now),\n cooldownEndBlock: 0,\n matronId: uint32(_matronId),\n sireId: uint32(_sireId),\n siringWithId: 0,\n cooldownIndex: cooldownIndex,\n generation: uint16(_generation)\n });\n uint256 newKittenId = kitties.push(_kitty) - 1;\n\n // It's probably never going to happen, 4 billion cats is A LOT, but\n // let's just be 100% sure we never let this happen.\n require(newKittenId == uint256(uint32(newKittenId)));\n\n // emit the birth event\n Birth(\n _owner,\n newKittenId,\n uint256(_kitty.matronId),\n uint256(_kitty.sireId),\n _kitty.genes\n );\n\n // This will assign ownership, and also emit the Transfer event as\n // per ERC721 draft\n _transfer(0, _owner, newKittenId);\n\n return newKittenId;\n }\n\n // Any C-level can fix how many seconds per blocks are currently observed.\n function setSecondsPerBlock(uint256 secs) external onlyCLevel {\n require(secs < cooldowns[0]);\n secondsPerBlock = secs;\n }\n}\n\n\n\n\n\n/// @title The external contract that is responsible for generating metadata for the kitties,\n/// it has one function that will return the data as bytes.\ncontract KittiesERC721Metadata {\n /// @dev Given a token Id, returns a byte array that is supposed to be converted into string.\n function getMetadata(uint256 _tokenId, string) public view returns (bytes32[4] buffer, uint256 count) {\n if (_tokenId == 1) {\n buffer[0] = \"Hello World! :D\";\n count = 15;\n } else if (_tokenId == 2) {\n buffer[0] = \"I would definitely choose a medi\";\n buffer[1] = \"um length string.\";\n count = 49;\n } else if (_tokenId == 3) {\n buffer[0] = \"Lorem ipsum dolor sit amet, mi e\";\n buffer[1] = \"st accumsan dapibus augue lorem,\";\n buffer[2] = \" tristique vestibulum id, libero\";\n buffer[3] = \" suscipit varius sapien aliquam.\";\n count = 128;\n }\n }\n}\n\n\n/// @title The facet of the CryptoKitties core contract that manages ownership, ERC-721 (draft) compliant.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev Ref: https://github.com/ethereum/EIPs/issues/721\n/// See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyOwnership is KittyBase, KittiesERC721 {\n\n /// @notice Name and symbol of the non fungible token, as defined in ERC721.\n string public constant name = \"CryptoKitties\";\n string public constant symbol = \"CK\";\n\n // The contract that will return kitty metadata\n KittiesERC721Metadata public erc721Metadata;\n\n bytes4 constant InterfaceSignature_ERC165 =\n bytes4(keccak256('supportsInterface(bytes4)'));\n\n bytes4 constant InterfaceSignature_ERC721 =\n bytes4(keccak256('name()')) ^\n bytes4(keccak256('symbol()')) ^\n bytes4(keccak256('totalSupply()')) ^\n bytes4(keccak256('balanceOf(address)')) ^\n bytes4(keccak256('ownerOf(uint256)')) ^\n bytes4(keccak256('approve(address,uint256)')) ^\n bytes4(keccak256('transfer(address,uint256)')) ^\n bytes4(keccak256('transferFrom(address,address,uint256)')) ^\n bytes4(keccak256('tokensOfOwner(address)')) ^\n bytes4(keccak256('tokenMetadata(uint256,string)'));\n\n /// @notice Introspection interface as per ERC-165 (https://github.com/ethereum/EIPs/issues/165).\n /// Returns true for any standardized interfaces implemented by this contract. We implement\n /// ERC-165 (obviously!) and ERC-721.\n function supportsInterface(bytes4 _interfaceID) external view returns (bool)\n {\n // DEBUG ONLY\n //require((InterfaceSignature_ERC165 == 0x01ffc9a7) && (InterfaceSignature_ERC721 == 0x9a20483d));\n\n return ((_interfaceID == InterfaceSignature_ERC165) || (_interfaceID == InterfaceSignature_ERC721));\n }\n\n /// @dev Set the address of the sibling contract that tracks metadata.\n /// CEO only.\n function setMetadataAddress(address _contractAddress) public onlyCEO {\n erc721Metadata = KittiesERC721Metadata(_contractAddress);\n }\n\n // Internal utility functions: These functions all assume that their input arguments\n // are valid. We leave it to public methods to sanitize their inputs and follow\n // the required logic.\n\n /// @dev Checks if a given address is the current owner of a particular Kitty.\n /// @param _claimant the address we are validating against.\n /// @param _tokenId kitten id, only valid when > 0\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToOwner[_tokenId] == _claimant;\n }\n\n /// @dev Checks if a given address currently has transferApproval for a particular Kitty.\n /// @param _claimant the address we are confirming kitten is approved for.\n /// @param _tokenId kitten id, only valid when > 0\n function _approvedFor(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToApproved[_tokenId] == _claimant;\n }\n\n /// @dev Marks an address as being approved for transferFrom(), overwriting any previous\n /// approval. Setting _approved to address(0) clears all transfer approval.\n /// NOTE: _approve() does NOT send the Approval event. This is intentional because\n /// _approve() and transferFrom() are used together for putting Kitties on auction, and\n /// there is no value in spamming the log with Approval events in that case.\n function _approve(uint256 _tokenId, address _approved) internal {\n kittyIndexToApproved[_tokenId] = _approved;\n }\n\n /// @notice Returns the number of Kitties owned by a specific address.\n /// @param _owner The owner address to check.\n /// @dev Required for ERC-721 compliance\n function balanceOf(address _owner) public view returns (uint256 count) {\n return ownershipTokenCount[_owner];\n }\n\n /// @notice Transfers a Kitty to another address. If transferring to a smart\n /// contract be VERY CAREFUL to ensure that it is aware of ERC-721 (or\n /// CryptoKitties specifically) or your Kitty may be lost forever. Seriously.\n /// @param _to The address of the recipient, can be a user or contract.\n /// @param _tokenId The ID of the Kitty to transfer.\n /// @dev Required for ERC-721 compliance.\n function transfer(\n address _to,\n uint256 _tokenId\n )\n external\n whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Disallow transfers to the auction contracts to prevent accidental\n // misuse. Auction contracts should only take ownership of kitties\n // through the allow + transferFrom flow.\n require(_to != address(saleAuction));\n require(_to != address(siringAuction));\n\n // You can only send your own cat.\n require(_owns(msg.sender, _tokenId));\n\n // Reassign ownership, clear pending approvals, emit Transfer event.\n _transfer(msg.sender, _to, _tokenId);\n }\n\n /// @notice Grant another address the right to transfer a specific Kitty via\n /// transferFrom(). This is the preferred flow for transfering NFTs to contracts.\n /// @param _to The address to be granted transfer approval. Pass address(0) to\n /// clear all approvals.\n /// @param _tokenId The ID of the Kitty that can be transferred if this call succeeds.\n /// @dev Required for ERC-721 compliance.\n function approve(\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Only an owner can grant transfer approval.\n require(_owns(msg.sender, _tokenId));\n\n // Register the approval (replacing any previous approval).\n _approve(_tokenId, _to);\n\n // Emit approval event.\n Approval(msg.sender, _to, _tokenId);\n }\n\n /// @notice Transfer a Kitty owned by another address, for which the calling address\n /// has previously been granted transfer approval by the owner.\n /// @param _from The address that owns the Kitty to be transfered.\n /// @param _to The address that should take ownership of the Kitty. Can be any address,\n /// including the caller.\n /// @param _tokenId The ID of the Kitty to be transferred.\n /// @dev Required for ERC-721 compliance.\n function transferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Check for approval and valid ownership\n require(_approvedFor(msg.sender, _tokenId));\n require(_owns(_from, _tokenId));\n\n // Reassign ownership (also clears pending approvals and emits Transfer event).\n _transfer(_from, _to, _tokenId);\n }\n\n /// @notice Returns the total number of Kitties currently in existence.\n /// @dev Required for ERC-721 compliance.\n function totalSupply() public view returns (uint) {\n return kitties.length - 1;\n }\n\n /// @notice Returns the address currently assigned ownership of a given Kitty.\n /// @dev Required for ERC-721 compliance.\n function ownerOf(uint256 _tokenId)\n external\n view\n returns (address owner)\n {\n owner = kittyIndexToOwner[_tokenId];\n\n require(owner != address(0));\n }\n\n /// @notice Returns a list of all Kitty IDs assigned to an address.\n /// @param _owner The owner whose Kitties we are interested in.\n /// @dev This method MUST NEVER be called by smart contract code. First, it's fairly\n /// expensive (it walks the entire Kitty array looking for cats belonging to owner),\n /// but it also returns a dynamic array, which is only supported for web3 calls, and\n /// not contract-to-contract calls.\n function tokensOfOwner(address _owner) external view returns(uint256[] ownerTokens) {\n uint256 tokenCount = balanceOf(_owner);\n\n if (tokenCount == 0) {\n // Return an empty array\n return new uint256[](0);\n } else {\n uint256[] memory result = new uint256[](tokenCount);\n uint256 totalCats = totalSupply();\n uint256 resultIndex = 0;\n\n // We count on the fact that all cats have IDs starting at 1 and increasing\n // sequentially up to the totalCat count.\n uint256 catId;\n\n for (catId = 1; catId <= totalCats; catId++) {\n if (kittyIndexToOwner[catId] == _owner) {\n result[resultIndex] = catId;\n resultIndex++;\n }\n }\n\n return result;\n }\n }\n\n /// @dev Adapted from memcpy() by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _memcpy(uint _dest, uint _src, uint _len) private view {\n // Copy word-length chunks while possible\n for(; _len >= 32; _len -= 32) {\n assembly {\n mstore(_dest, mload(_src))\n }\n _dest += 32;\n _src += 32;\n }\n\n // Copy remaining bytes\n uint256 mask = 256 ** (32 - _len) - 1;\n assembly {\n let srcpart := and(mload(_src), not(mask))\n let destpart := and(mload(_dest), mask)\n mstore(_dest, or(destpart, srcpart))\n }\n }\n\n /// @dev Adapted from toString(slice) by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _toString(bytes32[4] _rawBytes, uint256 _stringLength) private view returns (string) {\n var outputString = new string(_stringLength);\n uint256 outputPtr;\n uint256 bytesPtr;\n\n assembly {\n outputPtr := add(outputString, 32)\n bytesPtr := _rawBytes\n }\n\n _memcpy(outputPtr, bytesPtr, _stringLength);\n\n return outputString;\n }\n\n /// @notice Returns a URI pointing to a metadata package for this token conforming to\n /// ERC-721 (https://github.com/ethereum/EIPs/issues/721)\n /// @param _tokenId The ID number of the Kitty whose metadata should be returned.\n function tokenMetadata(uint256 _tokenId, string _preferredTransport) external view returns (string infoUrl) {\n require(erc721Metadata != address(0));\n bytes32[4] memory buffer;\n uint256 count;\n (buffer, count) = erc721Metadata.getMetadata(_tokenId, _preferredTransport);\n\n return _toString(buffer, count);\n }\n}\n\n\n\n/// @title A facet of KittyCore that manages Kitty siring, gestation, and birth.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBreeding is KittyOwnership {\n\n /// @dev The Pregnant event is fired when two cats successfully breed and the pregnancy\n /// timer begins for the matron.\n event Pregnant(address owner, uint256 matronId, uint256 sireId, uint256 cooldownEndBlock);\n\n /// @notice The minimum payment required to use breedWithAuto(). This fee goes towards\n /// the gas cost paid by whatever calls giveBirth(), and can be dynamically updated by\n /// the COO role as the gas price changes.\n uint256 public autoBirthFee = 2 finney;\n\n // Keeps track of number of pregnant kitties.\n uint256 public pregnantKitties;\n\n /// @dev The address of the sibling contract that is used to implement the sooper-sekret\n /// genetic combination algorithm.\n GeneScienceInterface public geneScience;\n\n /// @dev Update the address of the genetic contract, can only be called by the CEO.\n /// @param _address An address of a GeneScience contract instance to be used from this point forward.\n function setGeneScienceAddress(address _address) external onlyCEO {\n GeneScienceInterface candidateContract = GeneScienceInterface(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isGeneScience());\n\n // Set the new contract address\n geneScience = candidateContract;\n }\n\n /// @dev Checks that a given kitten is able to breed. Requires that the\n /// current cooldown is finished (for sires) and also checks that there is\n /// no pending pregnancy.\n function _isReadyToBreed(Kitty _kit) internal view returns (bool) {\n // In addition to checking the cooldownEndBlock, we also need to check to see if\n // the cat has a pending birth; there can be some period of time between the end\n // of the pregnacy timer and the birth event.\n return (_kit.siringWithId == 0) && (_kit.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @dev Check if a sire has authorized breeding with this matron. True if both sire\n /// and matron have the same owner, or if the sire has given siring permission to\n /// the matron's owner (via approveSiring()).\n function _isSiringPermitted(uint256 _sireId, uint256 _matronId) internal view returns (bool) {\n address matronOwner = kittyIndexToOwner[_matronId];\n address sireOwner = kittyIndexToOwner[_sireId];\n\n // Siring is okay if they have same owner, or if the matron's owner was given\n // permission to breed with this sire.\n return (matronOwner == sireOwner || sireAllowedToAddress[_sireId] == matronOwner);\n }\n\n /// @dev Set the cooldownEndTime for the given Kitty, based on its current cooldownIndex.\n /// Also increments the cooldownIndex (unless it has hit the cap).\n /// @param _kitten A reference to the Kitty in storage which needs its timer started.\n function _triggerCooldown(Kitty storage _kitten) internal {\n // Compute an estimation of the cooldown time in blocks (based on current cooldownIndex).\n _kitten.cooldownEndBlock = uint64((cooldowns[_kitten.cooldownIndex]/secondsPerBlock) + block.number);\n\n // Increment the breeding count, clamping it at 13, which is the length of the\n // cooldowns array. We could check the array size dynamically, but hard-coding\n // this as a constant saves gas. Yay, Solidity!\n if (_kitten.cooldownIndex < 13) {\n _kitten.cooldownIndex += 1;\n }\n }\n\n /// @notice Grants approval to another user to sire with one of your Kitties.\n /// @param _addr The address that will be able to sire with your Kitty. Set to\n /// address(0) to clear all siring approvals for this Kitty.\n /// @param _sireId A Kitty that you own that _addr will now be able to sire with.\n function approveSiring(address _addr, uint256 _sireId)\n external\n whenNotPaused\n {\n require(_owns(msg.sender, _sireId));\n sireAllowedToAddress[_sireId] = _addr;\n }\n\n /// @dev Updates the minimum payment required for calling giveBirthAuto(). Can only\n /// be called by the COO address. (This fee is used to offset the gas cost incurred\n /// by the autobirth daemon).\n function setAutoBirthFee(uint256 val) external onlyCOO {\n autoBirthFee = val;\n }\n\n /// @dev Checks to see if a given Kitty is pregnant and (if so) if the gestation\n /// period has passed.\n function _isReadyToGiveBirth(Kitty _matron) private view returns (bool) {\n return (_matron.siringWithId != 0) && (_matron.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @notice Checks that a given kitten is able to breed (i.e. it is not pregnant or\n /// in the middle of a siring cooldown).\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isReadyToBreed(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n Kitty storage kit = kitties[_kittyId];\n return _isReadyToBreed(kit);\n }\n\n /// @dev Checks whether a kitty is currently pregnant.\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isPregnant(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n // A kitty is pregnant if and only if this field is set\n return kitties[_kittyId].siringWithId != 0;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair. DOES NOT\n /// check ownership permissions (that is up to the caller).\n /// @param _matron A reference to the Kitty struct of the potential matron.\n /// @param _matronId The matron's ID.\n /// @param _sire A reference to the Kitty struct of the potential sire.\n /// @param _sireId The sire's ID\n function _isValidMatingPair(\n Kitty storage _matron,\n uint256 _matronId,\n Kitty storage _sire,\n uint256 _sireId\n )\n private\n view\n returns(bool)\n {\n // A Kitty can't breed with itself!\n if (_matronId == _sireId) {\n return false;\n }\n\n // Kitties can't breed with their parents.\n if (_matron.matronId == _sireId || _matron.sireId == _sireId) {\n return false;\n }\n if (_sire.matronId == _matronId || _sire.sireId == _matronId) {\n return false;\n }\n\n // We can short circuit the sibling check (below) if either cat is\n // gen zero (has a matron ID of zero).\n if (_sire.matronId == 0 || _matron.matronId == 0) {\n return true;\n }\n\n // Kitties can't breed with full or half siblings.\n if (_sire.matronId == _matron.matronId || _sire.matronId == _matron.sireId) {\n return false;\n }\n if (_sire.sireId == _matron.matronId || _sire.sireId == _matron.sireId) {\n return false;\n }\n\n // Everything seems cool! Let's get DTF.\n return true;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair for\n /// breeding via auction (i.e. skips ownership and siring approval checks).\n function _canBreedWithViaAuction(uint256 _matronId, uint256 _sireId)\n internal\n view\n returns (bool)\n {\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId);\n }\n\n /// @notice Checks to see if two cats can breed together, including checks for\n /// ownership and siring approvals. Does NOT check that both cats are ready for\n /// breeding (i.e. breedWith could still fail until the cooldowns are finished).\n /// TODO: Shouldn't this check pregnancy and cooldowns?!?\n /// @param _matronId The ID of the proposed matron.\n /// @param _sireId The ID of the proposed sire.\n function canBreedWith(uint256 _matronId, uint256 _sireId)\n external\n view\n returns(bool)\n {\n require(_matronId > 0);\n require(_sireId > 0);\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId) &&\n _isSiringPermitted(_sireId, _matronId);\n }\n\n /// @dev Internal utility function to initiate breeding, assumes that all breeding\n /// requirements have been checked.\n function _breedWith(uint256 _matronId, uint256 _sireId) internal {\n // Grab a reference to the Kitties from storage.\n Kitty storage sire = kitties[_sireId];\n Kitty storage matron = kitties[_matronId];\n\n // Mark the matron as pregnant, keeping track of who the sire is.\n matron.siringWithId = uint32(_sireId);\n\n // Trigger the cooldown for both parents.\n _triggerCooldown(sire);\n _triggerCooldown(matron);\n\n // Clear siring permission for both parents. This may not be strictly necessary\n // but it's likely to avoid confusion!\n delete sireAllowedToAddress[_matronId];\n delete sireAllowedToAddress[_sireId];\n\n // Every time a kitty gets pregnant, counter is incremented.\n pregnantKitties++;\n\n // Emit the pregnancy event.\n Pregnant(kittyIndexToOwner[_matronId], _matronId, _sireId, matron.cooldownEndBlock);\n }\n\n /// @notice Breed a Kitty you own (as matron) with a sire that you own, or for which you\n /// have previously been given Siring approval. Will either make your cat pregnant, or will\n /// fail entirely. Requires a pre-payment of the fee given out to the first caller of giveBirth()\n /// @param _matronId The ID of the Kitty acting as matron (will end up pregnant if successful)\n /// @param _sireId The ID of the Kitty acting as sire (will begin its siring cooldown if successful)\n function breedWithAuto(uint256 _matronId, uint256 _sireId)\n external\n payable\n whenNotPaused\n {\n // Checks for payment.\n require(msg.value >= autoBirthFee);\n\n // Caller must own the matron.\n require(_owns(msg.sender, _matronId));\n\n // Neither sire nor matron are allowed to be on auction during a normal\n // breeding operation, but we don't need to check that explicitly.\n // For matron: The caller of this function can't be the owner of the matron\n // because the owner of a Kitty on auction is the auction house, and the\n // auction house will never call breedWith().\n // For sire: Similarly, a sire on auction will be owned by the auction house\n // and the act of transferring ownership will have cleared any oustanding\n // siring approval.\n // Thus we don't need to spend gas explicitly checking to see if either cat\n // is on auction.\n\n // Check that matron and sire are both owned by caller, or that the sire\n // has given siring permission to caller (i.e. matron's owner).\n // Will fail for _sireId = 0\n require(_isSiringPermitted(_sireId, _matronId));\n\n // Grab a reference to the potential matron\n Kitty storage matron = kitties[_matronId];\n\n // Make sure matron isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(matron));\n\n // Grab a reference to the potential sire\n Kitty storage sire = kitties[_sireId];\n\n // Make sure sire isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(sire));\n\n // Test that these cats are a valid mating pair.\n require(_isValidMatingPair(\n matron,\n _matronId,\n sire,\n _sireId\n ));\n\n // All checks passed, kitty gets pregnant!\n _breedWith(_matronId, _sireId);\n }\n\n /// @notice Have a pregnant Kitty give birth!\n /// @param _matronId A Kitty ready to give birth.\n /// @return The Kitty ID of the new kitten.\n /// @dev Looks at a given Kitty and, if pregnant and if the gestation period has passed,\n /// combines the genes of the two parents to create a new kitten. The new Kitty is assigned\n /// to the current owner of the matron. Upon successful completion, both the matron and the\n /// new kitten will be ready to breed again. Note that anyone can call this function (if they\n /// are willing to pay the gas!), but the new kitten always goes to the mother's owner.\n function giveBirth(uint256 _matronId)\n external\n whenNotPaused\n returns(uint256)\n {\n // Grab a reference to the matron in storage.\n Kitty storage matron = kitties[_matronId];\n\n // Check that the matron is a valid cat.\n require(matron.birthTime != 0);\n\n // Check that the matron is pregnant, and that its time has come!\n require(_isReadyToGiveBirth(matron));\n\n // Grab a reference to the sire in storage.\n uint256 sireId = matron.siringWithId;\n Kitty storage sire = kitties[sireId];\n\n // Determine the higher generation number of the two parents\n uint16 parentGen = matron.generation;\n if (sire.generation > matron.generation) {\n parentGen = sire.generation;\n }\n\n // Call the sooper-sekret gene mixing operation.\n uint256 childGenes = geneScience.mixGenes(matron.genes, sire.genes, matron.cooldownEndBlock - 1);\n\n // Make the new kitten!\n address owner = kittyIndexToOwner[_matronId];\n uint256 kittenId = _createKitty(_matronId, matron.siringWithId, parentGen + 1, childGenes, owner);\n\n // Clear the reference to sire from the matron (REQUIRED! Having siringWithId\n // set is what marks a matron as being pregnant.)\n delete matron.siringWithId;\n\n // Every time a kitty gives birth counter is decremented.\n pregnantKitties--;\n\n // Send the balance fee to the person who made birth happen.\n msg.sender.send(autoBirthFee);\n\n // return the new kitten's ID\n return kittenId;\n }\n}\n\n\n\n\n\n\n\n\n\n\n/// @title Auction Core\n/// @dev Contains models, variables, and internal methods for the auction.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuctionBase {\n\n // Represents an auction on an NFT\n struct Auction {\n // Current owner of NFT\n address seller;\n // Price (in wei) at beginning of auction\n uint128 startingPrice;\n // Price (in wei) at end of auction\n uint128 endingPrice;\n // Duration (in seconds) of auction\n uint64 duration;\n // Time when auction started\n // NOTE: 0 if this auction has been concluded\n uint64 startedAt;\n }\n\n // Reference to contract tracking NFT ownership\n KittiesERC721 public nonFungibleContract;\n\n // Cut owner takes on each auction, measured in basis points (1/100 of a percent).\n // Values 0-10,000 map to 0%-100%\n uint256 public ownerCut;\n\n // Map from token ID to their corresponding auction.\n mapping (uint256 => Auction) tokenIdToAuction;\n\n event AuctionCreated(uint256 tokenId, uint256 startingPrice, uint256 endingPrice, uint256 duration);\n event AuctionSuccessful(uint256 tokenId, uint256 totalPrice, address winner);\n event AuctionCancelled(uint256 tokenId);\n\n /// @dev Returns true if the claimant owns the token.\n /// @param _claimant - Address claiming to own the token.\n /// @param _tokenId - ID of token whose ownership to verify.\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return (nonFungibleContract.ownerOf(_tokenId) == _claimant);\n }\n\n /// @dev Escrows the NFT, assigning ownership to this contract.\n /// Throws if the escrow fails.\n /// @param _owner - Current owner address of token to escrow.\n /// @param _tokenId - ID of token whose approval to verify.\n function _escrow(address _owner, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transferFrom(_owner, this, _tokenId);\n }\n\n /// @dev Transfers an NFT owned by this contract to another address.\n /// Returns true if the transfer succeeds.\n /// @param _receiver - Address to transfer NFT to.\n /// @param _tokenId - ID of token to transfer.\n function _transfer(address _receiver, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transfer(_receiver, _tokenId);\n }\n\n /// @dev Adds an auction to the list of open auctions. Also fires the\n /// AuctionCreated event.\n /// @param _tokenId The ID of the token to be put on auction.\n /// @param _auction Auction to add.\n function _addAuction(uint256 _tokenId, Auction _auction) internal {\n // Require that all auctions have a duration of\n // at least one minute. (Keeps our math from getting hairy!)\n require(_auction.duration >= 1 minutes);\n\n tokenIdToAuction[_tokenId] = _auction;\n\n AuctionCreated(\n uint256(_tokenId),\n uint256(_auction.startingPrice),\n uint256(_auction.endingPrice),\n uint256(_auction.duration)\n );\n }\n\n /// @dev Cancels an auction unconditionally.\n function _cancelAuction(uint256 _tokenId, address _seller) internal {\n _removeAuction(_tokenId);\n _transfer(_seller, _tokenId);\n AuctionCancelled(_tokenId);\n }\n\n /// @dev Computes the price and transfers winnings.\n /// Does NOT transfer ownership of token.\n function _bid(uint256 _tokenId, uint256 _bidAmount)\n internal\n returns (uint256)\n {\n // Get a reference to the auction struct\n Auction storage auction = tokenIdToAuction[_tokenId];\n\n // Explicitly check that this auction is currently live.\n // (Because of how Ethereum mappings work, we can't just count\n // on the lookup above failing. An invalid _tokenId will just\n // return an auction object that is all zeros.)\n require(_isOnAuction(auction));\n\n // Check that the bid is greater than or equal to the current price\n uint256 price = _currentPrice(auction);\n require(_bidAmount >= price);\n\n // Grab a reference to the seller before the auction struct\n // gets deleted.\n address seller = auction.seller;\n\n // The bid is good! Remove the auction before sending the fees\n // to the sender so we can't have a reentrancy attack.\n _removeAuction(_tokenId);\n\n // Transfer proceeds to seller (if there are any!)\n if (price > 0) {\n // Calculate the auctioneer's cut.\n // (NOTE: _computeCut() is guaranteed to return a\n // value <= price, so this subtraction can't go negative.)\n uint256 auctioneerCut = _computeCut(price);\n uint256 sellerProceeds = price - auctioneerCut;\n\n // NOTE: Doing a transfer() in the middle of a complex\n // method like this is generally discouraged because of\n // reentrancy attacks and DoS attacks if the seller is\n // a contract with an invalid fallback function. We explicitly\n // guard against reentrancy attacks by removing the auction\n // before calling transfer(), and the only thing the seller\n // can DoS is the sale of their own asset! (And if it's an\n // accident, they can call cancelAuction(). )\n seller.transfer(sellerProceeds);\n }\n\n // Calculate any excess funds included with the bid. If the excess\n // is anything worth worrying about, transfer it back to bidder.\n // NOTE: We checked above that the bid amount is greater than or\n // equal to the price so this cannot underflow.\n uint256 bidExcess = _bidAmount - price;\n\n // Return the funds. Similar to the previous transfer, this is\n // not susceptible to a re-entry attack because the auction is\n // removed before any transfers occur.\n msg.sender.transfer(bidExcess);\n\n // Tell the world!\n AuctionSuccessful(_tokenId, price, msg.sender);\n\n return price;\n }\n\n /// @dev Removes an auction from the list of open auctions.\n /// @param _tokenId - ID of NFT on auction.\n function _removeAuction(uint256 _tokenId) internal {\n delete tokenIdToAuction[_tokenId];\n }\n\n /// @dev Returns true if the NFT is on auction.\n /// @param _auction - Auction to check.\n function _isOnAuction(Auction storage _auction) internal view returns (bool) {\n return (_auction.startedAt > 0);\n }\n\n /// @dev Returns current price of an NFT on auction. Broken into two\n /// functions (this one, that computes the duration from the auction\n /// structure, and the other that does the price computation) so we\n /// can easily test that the price computation works correctly.\n function _currentPrice(Auction storage _auction)\n internal\n view\n returns (uint256)\n {\n uint256 secondsPassed = 0;\n\n // A bit of insurance against negative values (or wraparound).\n // Probably not necessary (since Ethereum guarnatees that the\n // now variable doesn't ever go backwards).\n if (now > _auction.startedAt) {\n secondsPassed = now - _auction.startedAt;\n }\n\n return _computeCurrentPrice(\n _auction.startingPrice,\n _auction.endingPrice,\n _auction.duration,\n secondsPassed\n );\n }\n\n /// @dev Computes the current price of an auction. Factored out\n /// from _currentPrice so we can run extensive unit tests.\n /// When testing, make this function public and turn on\n /// `Current price computation` test suite.\n function _computeCurrentPrice(\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n uint256 _secondsPassed\n )\n internal\n pure\n returns (uint256)\n {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our public functions carefully cap the maximum values for\n // time (at 64-bits) and currency (at 128-bits). _duration is\n // also known to be non-zero (see the require() statement in\n // _addAuction())\n if (_secondsPassed >= _duration) {\n // We've reached the end of the dynamic pricing portion\n // of the auction, just return the end price.\n return _endingPrice;\n } else {\n // Starting price can be higher than ending price (and often is!), so\n // this delta can be negative.\n int256 totalPriceChange = int256(_endingPrice) - int256(_startingPrice);\n\n // This multiplication can't overflow, _secondsPassed will easily fit within\n // 64-bits, and totalPriceChange will easily fit within 128-bits, their product\n // will always fit within 256-bits.\n int256 currentPriceChange = totalPriceChange * int256(_secondsPassed) / int256(_duration);\n\n // currentPriceChange can be negative, but if so, will have a magnitude\n // less that _startingPrice. Thus, this result will always end up positive.\n int256 currentPrice = int256(_startingPrice) + currentPriceChange;\n\n return uint256(currentPrice);\n }\n }\n\n /// @dev Computes owner's cut of a sale.\n /// @param _price - Sale price of NFT.\n function _computeCut(uint256 _price) internal view returns (uint256) {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our entry functions carefully cap the maximum values for\n // currency (at 128-bits), and ownerCut <= 10000 (see the require()\n // statement in the ClockAuction constructor). The result of this\n // function is always guaranteed to be <= _price.\n return _price * ownerCut / 10000;\n }\n\n}\n\n\n\n\n\n\n\n/**\n * @title KittiesPausable\n * @dev Base contract which allows children to implement an emergency stop mechanism.\n */\ncontract KittiesPausable is KittiesOwnable {\n event Pause();\n event Unpause();\n\n bool public paused = false;\n\n\n /**\n\t * @dev modifier to allow actions only when the contract IS paused\n\t */\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /**\n\t * @dev modifier to allow actions only when the contract IS NOT paused\n\t */\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /**\n\t * @dev called by the owner to pause, triggers stopped state\n\t */\n function pause() onlyOwner whenNotPaused returns (bool) {\n paused = true;\n Pause();\n return true;\n }\n\n /**\n\t * @dev called by the owner to unpause, returns to normal state\n\t */\n function unpause() onlyOwner whenPaused returns (bool) {\n paused = false;\n Unpause();\n return true;\n }\n}\n\n\n/// @title Clock auction for non-fungible tokens.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuction is KittiesPausable, ClockAuctionBase {\n\n /// @dev The ERC-165 interface signature for ERC-721.\n /// Ref: https://github.com/ethereum/EIPs/issues/165\n /// Ref: https://github.com/ethereum/EIPs/issues/721\n bytes4 constant InterfaceSignature_ERC721 = bytes4(0x9a20483d);\n\n /// @dev Constructor creates a reference to the NFT ownership contract\n /// and verifies the owner cut is in the valid range.\n /// @param _nftAddress - address of a deployed contract implementing\n /// the Nonfungible Interface.\n /// @param _cut - percent cut the owner takes on each auction, must be\n /// between 0-10,000.\n function ClockAuction(address _nftAddress, uint256 _cut) public {\n require(_cut <= 10000);\n ownerCut = _cut;\n\n KittiesERC721 candidateContract = KittiesERC721(_nftAddress);\n require(candidateContract.supportsInterface(InterfaceSignature_ERC721));\n nonFungibleContract = candidateContract;\n }\n\n /// @dev Remove all Ether from the contract, which is the owner's cuts\n /// as well as any Ether sent directly to the contract address.\n /// Always transfers to the NFT contract, but can be called either by\n /// the owner or the NFT contract.\n function withdrawBalance() external {\n address nftAddress = address(nonFungibleContract);\n\n require(\n msg.sender == owner ||\n msg.sender == nftAddress\n );\n // We are using this boolean method to make sure that even if one fails it will still work\n bool res = nftAddress.send(this.balance);\n }\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of time to move between starting\n /// price and ending price (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n whenNotPaused\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(_owns(msg.sender, _tokenId));\n _escrow(msg.sender, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Bids on an open auction, completing the auction and transferring\n /// ownership of the NFT if enough Ether is supplied.\n /// @param _tokenId - ID of token to bid on.\n function bid(uint256 _tokenId)\n external\n payable\n whenNotPaused\n {\n // _bid will throw if the bid or funds transfer fails\n _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n }\n\n /// @dev Cancels an auction that hasn't been won yet.\n /// Returns the NFT to original owner.\n /// @notice This is a state-modifying function that can\n /// be called while the contract is paused.\n /// @param _tokenId - ID of token on auction\n function cancelAuction(uint256 _tokenId)\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n address seller = auction.seller;\n require(msg.sender == seller);\n _cancelAuction(_tokenId, seller);\n }\n\n /// @dev Cancels an auction when the contract is paused.\n /// Only the owner may do this, and NFTs are returned to\n /// the seller. This should only be used in emergencies.\n /// @param _tokenId - ID of the NFT on auction to cancel.\n function cancelAuctionWhenPaused(uint256 _tokenId)\n whenPaused\n onlyOwner\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n _cancelAuction(_tokenId, auction.seller);\n }\n\n /// @dev Returns auction info for an NFT on auction.\n /// @param _tokenId - ID of NFT on auction.\n function getAuction(uint256 _tokenId)\n external\n view\n returns\n (\n address seller,\n uint256 startingPrice,\n uint256 endingPrice,\n uint256 duration,\n uint256 startedAt\n ) {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return (\n auction.seller,\n auction.startingPrice,\n auction.endingPrice,\n auction.duration,\n auction.startedAt\n );\n }\n\n /// @dev Returns the current price of an auction.\n /// @param _tokenId - ID of the token price we are checking.\n function getCurrentPrice(uint256 _tokenId)\n external\n view\n returns (uint256)\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return _currentPrice(auction);\n }\n\n}\n\n\n/// @title Reverse auction modified for siring\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SiringClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSiringAuctionAddress() call.\n bool public isSiringClockAuction = true;\n\n // Delegate constructor\n function SiringClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction. Since this function is wrapped,\n /// require sender to be KittyCore contract.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Places a bid for siring. Requires the sender\n /// is the KittyCore contract because all bid methods\n /// should be wrapped. Also returns the kitty to the\n /// seller rather than the winner.\n function bid(uint256 _tokenId)\n external\n payable\n {\n require(msg.sender == address(nonFungibleContract));\n address seller = tokenIdToAuction[_tokenId].seller;\n // _bid checks that token ID is valid and will throw if bid fails\n _bid(_tokenId, msg.value);\n // We transfer the kitty back to the seller, the winner will get\n // the offspring\n _transfer(seller, _tokenId);\n }\n\n}\n\n\n\n\n\n/// @title Clock auction modified for sale of kitties\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SaleClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSaleAuctionAddress() call.\n bool public isSaleClockAuction = true;\n\n // Tracks last 5 sale price of gen0 kitty sales\n uint256 public gen0SaleCount;\n uint256[5] public lastGen0SalePrices;\n\n // Delegate constructor\n function SaleClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Updates lastSalePrice if seller is the nft contract\n /// Otherwise, works the same as default bid method.\n function bid(uint256 _tokenId)\n external\n payable\n {\n // _bid verifies token ID size\n address seller = tokenIdToAuction[_tokenId].seller;\n uint256 price = _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n\n // If not a gen0 auction, exit\n if (seller == address(nonFungibleContract)) {\n // Track gen0 sale prices\n lastGen0SalePrices[gen0SaleCount % 5] = price;\n gen0SaleCount++;\n }\n }\n\n function averageGen0SalePrice() external view returns (uint256) {\n uint256 sum = 0;\n for (uint256 i = 0; i < 5; i++) {\n sum += lastGen0SalePrices[i];\n }\n return sum / 5;\n }\n\n}\n\n\n/// @title Handles creating auctions for sale and siring of kitties.\n/// This wrapper of ReverseAuction exists only so that users can create\n/// auctions with only one transaction.\ncontract KittyAuction is KittyBreeding {\n\n // @notice The auction contract variables are defined in KittyBase to allow\n // us to refer to them in KittyOwnership to prevent accidental transfers.\n // `saleAuction` refers to the auction for gen0 and p2p sale of kitties.\n // `siringAuction` refers to the auction for siring rights of kitties.\n\n /// @dev Sets the reference to the sale auction.\n /// @param _address - Address of sale contract.\n function setSaleAuctionAddress(address _address) external onlyCEO {\n SaleClockAuction candidateContract = SaleClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSaleClockAuction());\n\n // Set the new contract address\n saleAuction = candidateContract;\n }\n\n /// @dev Sets the reference to the siring auction.\n /// @param _address - Address of siring contract.\n function setSiringAuctionAddress(address _address) external onlyCEO {\n SiringClockAuction candidateContract = SiringClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSiringClockAuction());\n\n // Set the new contract address\n siringAuction = candidateContract;\n }\n\n /// @dev Put a kitty up for auction.\n /// Does some ownership trickery to create auctions in one tx.\n function createSaleAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n // Ensure the kitty is not pregnant to prevent the auction\n // contract accidentally receiving ownership of the child.\n // NOTE: the kitty IS allowed to be in a cooldown.\n require(!isPregnant(_kittyId));\n _approve(_kittyId, saleAuction);\n // Sale auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n saleAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Put a kitty up for auction to be sire.\n /// Performs checks to ensure the kitty can be sired, then\n /// delegates to reverse auction.\n function createSiringAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n require(isReadyToBreed(_kittyId));\n _approve(_kittyId, siringAuction);\n // Siring auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n siringAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Completes a siring auction by bidding.\n /// Immediately breeds the winning matron with the sire on auction.\n /// @param _sireId - ID of the sire on auction.\n /// @param _matronId - ID of the matron owned by the bidder.\n function bidOnSiringAuction(\n uint256 _sireId,\n uint256 _matronId\n )\n external\n payable\n whenNotPaused\n {\n // Auction contract checks input sizes\n require(_owns(msg.sender, _matronId));\n require(isReadyToBreed(_matronId));\n require(_canBreedWithViaAuction(_matronId, _sireId));\n\n // Define the current price of the auction.\n uint256 currentPrice = siringAuction.getCurrentPrice(_sireId);\n require(msg.value >= currentPrice + autoBirthFee);\n\n // Siring auction will throw if the bid fails.\n siringAuction.bid.value(msg.value - autoBirthFee)(_sireId);\n _breedWith(uint32(_matronId), uint32(_sireId));\n }\n\n /// @dev Transfers the balance of the sale auction contract\n /// to the KittyCore contract. We use two-step withdrawal to\n /// prevent two transfer calls in the auction bid function.\n function withdrawAuctionBalances() external onlyCLevel {\n saleAuction.withdrawBalance();\n siringAuction.withdrawBalance();\n }\n}\n\n\n/// @title all functions related to creating kittens\ncontract KittyMinting is KittyAuction {\n\n // Limits the number of cats the contract owner can ever create.\n uint256 public constant PROMO_CREATION_LIMIT = 5000;\n uint256 public constant GEN0_CREATION_LIMIT = 45000;\n\n // Constants for gen0 auctions.\n uint256 public constant GEN0_STARTING_PRICE = 10 finney;\n uint256 public constant GEN0_AUCTION_DURATION = 1 days;\n\n // Counts the number of cats the contract owner has created.\n uint256 public promoCreatedCount;\n uint256 public gen0CreatedCount;\n\n /// @dev we can create promo kittens, up to a limit. Only callable by COO\n /// @param _genes the encoded genes of the kitten to be created, any value is accepted\n /// @param _owner the future owner of the created kittens. Default to contract COO\n function createPromoKitty(uint256 _genes, address _owner) external onlyCOO {\n address kittyOwner = _owner;\n if (kittyOwner == address(0)) {\n kittyOwner = cooAddress;\n }\n require(promoCreatedCount < PROMO_CREATION_LIMIT);\n\n promoCreatedCount++;\n _createKitty(0, 0, 0, _genes, kittyOwner);\n }\n\n /// @dev Creates a new gen0 kitty with the given genes and\n /// creates an auction for it.\n function createGen0Auction(uint256 _genes) external onlyCOO {\n require(gen0CreatedCount < GEN0_CREATION_LIMIT);\n\n uint256 kittyId = _createKitty(0, 0, 0, _genes, address(this));\n _approve(kittyId, saleAuction);\n\n saleAuction.createAuction(\n kittyId,\n _computeNextGen0Price(),\n 0,\n GEN0_AUCTION_DURATION,\n address(this)\n );\n\n gen0CreatedCount++;\n }\n\n /// @dev Computes the next gen0 auction starting price, given\n /// the average of the past 5 prices + 50%.\n function _computeNextGen0Price() internal view returns (uint256) {\n uint256 avePrice = saleAuction.averageGen0SalePrice();\n\n // Sanity check to ensure we don't overflow arithmetic\n require(avePrice == uint256(uint128(avePrice)));\n\n uint256 nextPrice = avePrice + (avePrice / 2);\n\n // We never auction for less than starting price\n if (nextPrice < GEN0_STARTING_PRICE) {\n nextPrice = GEN0_STARTING_PRICE;\n }\n\n return nextPrice;\n }\n}\n\n\n/// @title CryptoKitties: Collectible, breedable, and oh-so-adorable cats on the Ethereum blockchain.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev The main CryptoKitties contract, keeps track of kittens so they don't wander around and get lost.\ncontract KittyCore is KittyMinting {\n\n // This is the main CryptoKitties contract. In order to keep our code seperated into logical sections,\n // we've broken it up in two ways. First, we have several seperately-instantiated sibling contracts\n // that handle auctions and our super-top-secret genetic combination algorithm. The auctions are\n // seperate since their logic is somewhat complex and there's always a risk of subtle bugs. By keeping\n // them in their own contracts, we can upgrade them without disrupting the main contract that tracks\n // kitty ownership. The genetic combination algorithm is kept seperate so we can open-source all of\n // the rest of our code without making it _too_ easy for folks to figure out how the genetics work.\n // Don't worry, I'm sure someone will reverse engineer it soon enough!\n //\n // Secondly, we break the core contract into multiple files using inheritence, one for each major\n // facet of functionality of CK. This allows us to keep related code bundled together while still\n // avoiding a single giant file with everything in it. The breakdown is as follows:\n //\n // - KittyBase: This is where we define the most fundamental code shared throughout the core\n // functionality. This includes our main data storage, constants and data types, plus\n // internal functions for managing these items.\n //\n // - KittyAccessControl: This contract manages the various addresses and constraints for operations\n // that can be executed only by specific roles. Namely CEO, CFO and COO.\n //\n // - KittyOwnership: This provides the methods required for basic non-fungible token\n // transactions, following the draft ERC-721 spec (https://github.com/ethereum/EIPs/issues/721).\n //\n // - KittyBreeding: This file contains the methods necessary to breed cats together, including\n // keeping track of siring offers, and relies on an external genetic combination contract.\n //\n // - KittyAuctions: Here we have the public methods for auctioning or bidding on cats or siring\n // services. The actual auction functionality is handled in two sibling contracts (one\n // for sales and one for siring), while auction creation and bidding is mostly mediated\n // through this facet of the core contract.\n //\n // - KittyMinting: This final facet contains the functionality we use for creating new gen0 cats.\n // We can make up to 5000 \"promo\" cats that can be given away (especially important when\n // the community is new), and all others can only be created and then immediately put up\n // for auction via an algorithmically determined starting price. Regardless of how they\n // are created, there is a hard limit of 50k gen0 cats. After that, it's all up to the\n // community to breed, breed, breed!\n\n // Set in case the core contract is broken and an upgrade is required\n address public newContractAddress;\n\n /// @notice Creates the main CryptoKitties smart contract instance.\n function KittyCore() public {\n // Starts paused.\n paused = true;\n\n // the creator of the contract is the initial CEO\n ceoAddress = msg.sender;\n\n // the creator of the contract is also the initial COO\n cooAddress = msg.sender;\n\n // start with the mythical kitten 0 - so we don't have generation-0 parent issues\n _createKitty(0, 0, 0, uint256(-1), address(0));\n }\n\n /// @dev Used to mark the smart contract as upgraded, in case there is a serious\n /// breaking bug. This method does nothing but keep track of the new contract and\n /// emit a message indicating that the new address is set. It's up to clients of this\n /// contract to update to the new contract address in that case. (This contract will\n /// be paused indefinitely if such an upgrade takes place.)\n /// @param _v2Address new address\n function setNewAddress(address _v2Address) external onlyCEO whenPaused {\n // See README.md for updgrade plan\n newContractAddress = _v2Address;\n ContractUpgrade(_v2Address);\n }\n\n /// @notice No tipping!\n /// @dev Reject all Ether from being sent here, unless it's from one of the\n /// two auction contracts. (Hopefully, we can prevent user accidents.)\n function() external payable {\n require(\n msg.sender == address(saleAuction) ||\n msg.sender == address(siringAuction)\n );\n }\n\n /// @notice Returns all the relevant information about a specific kitty.\n /// @param _id The ID of the kitty of interest.\n function getKitty(uint256 _id)\n external\n view\n returns (\n bool isGestating,\n bool isReady,\n uint256 cooldownIndex,\n uint256 nextActionAt,\n uint256 siringWithId,\n uint256 birthTime,\n uint256 matronId,\n uint256 sireId,\n uint256 generation,\n uint256 genes\n ) {\n Kitty storage kit = kitties[_id];\n\n // if this variable is 0 then it's not gestating\n isGestating = (kit.siringWithId != 0);\n isReady = (kit.cooldownEndBlock <= block.number);\n cooldownIndex = uint256(kit.cooldownIndex);\n nextActionAt = uint256(kit.cooldownEndBlock);\n siringWithId = uint256(kit.siringWithId);\n birthTime = uint256(kit.birthTime);\n matronId = uint256(kit.matronId);\n sireId = uint256(kit.sireId);\n generation = uint256(kit.generation);\n genes = kit.genes;\n }\n\n /// @dev Override unpause so it requires all external contract addresses\n /// to be set before contract can be unpaused. Also, we can't have\n /// newContractAddress set either, because then the contract was upgraded.\n /// @notice This is public rather than external so we can call super.unpause\n /// without using an expensive CALL.\n function unpause() public onlyCEO whenPaused {\n require(saleAuction != address(0));\n require(siringAuction != address(0));\n require(geneScience != address(0));\n require(newContractAddress == address(0));\n\n // Actually unpause the contract.\n super.unpause();\n }\n\n // @dev Allows the CFO to capture the balance available to the contract.\n function withdrawBalance() external onlyCFO {\n uint256 balance = this.balance;\n // Subtract all the currently pregnant kittens we have, plus 1 of margin.\n uint256 subtractFees = (pregnantKitties + 1) * autoBirthFee;\n\n if (balance > subtractFees) {\n cfoAddress.send(balance - subtractFees);\n }\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "exportedSymbols": { "ClockAuction": [ 8872 @@ -51957,5 +51957,5 @@ export const KittyBase = }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:47.854Z" + "updatedAt": "2018-10-09T17:45:36.187Z" } \ No newline at end of file diff --git a/artifacts/ts/KittyBreeding.ts b/artifacts/ts/KittyBreeding.ts index 0c983b22..4dab2eaf 100644 --- a/artifacts/ts/KittyBreeding.ts +++ b/artifacts/ts/KittyBreeding.ts @@ -779,15 +779,15 @@ export const KittyBreeding = "type": "event" } ], - "bytecode": "0x60606040526000600260146101000a81548160ff0219169083151502179055506101c060405190810160405280603c63ffffffff1663ffffffff168152602001607863ffffffff1663ffffffff16815260200161012c63ffffffff1663ffffffff16815260200161025863ffffffff1663ffffffff16815260200161070863ffffffff1663ffffffff168152602001610e1063ffffffff1663ffffffff168152602001611c2063ffffffff1663ffffffff16815260200161384063ffffffff1663ffffffff16815260200161708063ffffffff1663ffffffff16815260200161e10063ffffffff1663ffffffff1681526020016201518063ffffffff1663ffffffff1681526020016202a30063ffffffff1663ffffffff1681526020016205460063ffffffff1663ffffffff16815260200162093a8063ffffffff1663ffffffff16815250600390600e6200015692919062000179565b50600f60055566071afd498d0000600e5534156200017357600080fd5b62000259565b82600e600701600890048101928215620002105791602002820160005b83821115620001dc57835183826101000a81548163ffffffff021916908363ffffffff160217905550926020019260040160208160030104928301926001030262000196565b80156200020e5782816101000a81549063ffffffff0219169055600401602081600301049283019260010302620001dc565b505b5090506200021f919062000223565b5090565b6200025691905b808211156200025257600081816101000a81549063ffffffff0219169055506001016200022a565b5090565b90565b613ada80620002696000396000f3006060604052600436106101f9576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146101fe5780630519ce79146102585780630560ff44146102ad57806306fdde031461035d578063095ea7b3146103eb5780630a0f81681461042d57806318160ddd14610482578063183a7947146104ab5780631940a936146104d457806321717ebf1461050f57806323b872dd1461056457806324e7a38a146105c557806327d7874c146105fe5780632ba73c15146106375780633f4ba83a1461067057806346116e6f1461068557806346d22c70146106e8578063481af3d31461072c5780634b85fd551461078f5780634dfff04f146107b25780634e0a3379146107f45780635663896e1461082d5780635c975abb146108505780636352211e1461087d57806370a08231146108e05780637a7d49371461092d5780638456cb59146109565780638462151c1461096b57806388c2a0bf146109f957806395d89b4114610a305780639d6fac6f14610abe578063a45f4bfc14610b01578063a9059cbb14610b64578063b047fb5014610ba6578063b0c35c0514610bfb578063bc4006f514610c24578063d3e6f49f14610c79578063e17b25af14610cb4578063e6cbe35114610ced578063f2b47d5214610d42578063f7d8c88314610d97575b600080fd5b341561020957600080fd5b61023e60048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050610db8565b604051808215151515815260200191505060405180910390f35b341561026357600080fd5b61026b6110c9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102b857600080fd5b6102e2600480803590602001909190803590602001908201803590602001919091929050506110ef565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610322578082015181840152602081019050610307565b50505050905090810190601f16801561034f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561036857600080fd5b61037061125a565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103b0578082015181840152602081019050610395565b50505050905090810190601f1680156103dd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156103f657600080fd5b61042b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611293565b005b341561043857600080fd5b610440611355565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561048d57600080fd5b61049561137a565b6040518082815260200191505060405180910390f35b34156104b657600080fd5b6104be61138a565b6040518082815260200191505060405180910390f35b34156104df57600080fd5b6104f56004808035906020019091905050611390565b604051808215151515815260200191505060405180910390f35b341561051a57600080fd5b6105226113e2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561056f57600080fd5b6105c3600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611408565b005b34156105d057600080fd5b6105fc600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506114b9565b005b341561060957600080fd5b610635600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506115f0565b005b341561064257600080fd5b61066e600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506116ca565b005b341561067b57600080fd5b6106836117a5565b005b341561069057600080fd5b6106a66004808035906020019091905050611838565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156106f357600080fd5b610712600480803590602001909190803590602001909190505061186b565b604051808215151515815260200191505060405180910390f35b341561073757600080fd5b61074d60048080359060200190919050506118f3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561079a57600080fd5b6107b06004808035906020019091905050611926565b005b34156107bd57600080fd5b6107f2600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061198c565b005b34156107ff57600080fd5b61082b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611a13565b005b341561083857600080fd5b61084e6004808035906020019091905050611aee565b005b341561085b57600080fd5b610863611c42565b604051808215151515815260200191505060405180910390f35b341561088857600080fd5b61089e6004808035906020019091905050611c55565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156108eb57600080fd5b610917600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611cce565b6040518082815260200191505060405180910390f35b341561093857600080fd5b610940611d17565b6040518082815260200191505060405180910390f35b341561096157600080fd5b610969611d1d565b005b341561097657600080fd5b6109a2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611e61565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156109e55780820151818401526020810190506109ca565b505050509050019250505060405180910390f35b3415610a0457600080fd5b610a1a6004808035906020019091905050611f98565b6040518082815260200191505060405180910390f35b3415610a3b57600080fd5b610a436123b7565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610a83578082015181840152602081019050610a68565b50505050905090810190601f168015610ab05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610ac957600080fd5b610adf60048080359060200190919050506123f0565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3415610b0c57600080fd5b610b22600480803590602001909190505061241f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610b6f57600080fd5b610ba4600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050612452565b005b3415610bb157600080fd5b610bb96125c3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610c0657600080fd5b610c0e6125e9565b6040518082815260200191505060405180910390f35b3415610c2f57600080fd5b610c376125ef565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610c8457600080fd5b610c9a6004808035906020019091905050612615565b604051808215151515815260200191505060405180910390f35b3415610cbf57600080fd5b610ceb600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612784565b005b3415610cf857600080fd5b610d00612823565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610d4d57600080fd5b610d55612849565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610db6600480803590602001909190803590602001909190505061286f565b005b600060405180807f737570706f727473496e74657266616365286279746573342900000000000000815250601901905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806110c2575060405180807f746f6b656e4d657461646174612875696e743235362c737472696e6729000000815250601d019050604051809103902060405180807f746f6b656e734f664f776e6572286164647265737329000000000000000000008152506016019050604051809103902060405180807f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81526020017f74323536290000000000000000000000000000000000000000000000000000008152506025019050604051809103902060405180807f7472616e7366657228616464726573732c75696e7432353629000000000000008152506019019050604051809103902060405180807f617070726f766528616464726573732c75696e743235362900000000000000008152506018019050604051809103902060405180807f6f776e65724f662875696e7432353629000000000000000000000000000000008152506010019050604051809103902060405180807f62616c616e63654f6628616464726573732900000000000000000000000000008152506012019050604051809103902060405180807f746f74616c537570706c79282900000000000000000000000000000000000000815250600d019050604051809103902060405180807f73796d626f6c28290000000000000000000000000000000000000000000000008152506008019050604051809103902060405180807f6e616d6528290000000000000000000000000000000000000000000000000000815250600601905060405180910390201818181818181818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6110f76138e9565b6110ff6138fd565b60008073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561115e57600080fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb4799f2878787600060405160a001526040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180848152602001806020018281038252848482818152602001925080828437820191505094505050505060a060405180830381600087803b151561121957600080fd5b6102c65a03f1151561122a57600080fd5b50505060405180608001805190602001604052809250819350505061124f8282612bb0565b925050509392505050565b6040805190810160405280600d81526020017f43727970746f4b6974746965730000000000000000000000000000000000000081525081565b61129d3382612c08565b15156112a857600080fd5b6112b28183612c74565b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160068054905003905090565b600f5481565b600080821115156113a057600080fd5b60006006838154811015156113b157fe5b906000526020600020906002020160010160189054906101000a900463ffffffff1663ffffffff1614159050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561144457600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561147f57600080fd5b6114893382612cca565b151561149457600080fd5b61149e8382612c08565b15156114a957600080fd5b6114b4838383612d36565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561151657600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166354c15b826000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561158557600080fd5b6102c65a03f1151561159657600080fd5b5050506040518051905015156115ab57600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561164b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561168757600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561172557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561176157600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561180057600080fd5b600260149054906101000a900460ff16151561181b57600080fd5b6000600260146101000a81548160ff021916908315150217905550565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000808511151561187e57600080fd5b60008411151561188d57600080fd5b60068581548110151561189c57fe5b906000526020600020906002020191506006848154811015156118bb57fe5b906000526020600020906002020190506118d782868387612f6e565b80156118e957506118e88486613183565b5b9250505092915050565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561198257600080fd5b80600e8190555050565b600260149054906101000a900460ff161515156119a857600080fd5b6119b23382612c08565b15156119bd57600080fd5b81600a600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a6e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611aaa57600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611b9657506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80611bee5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515611bf957600080fd5b60036000600e81101515611c0957fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff1681101515611c3857600080fd5b8060058190555050565b600260149054906101000a900460ff1681565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611cc957600080fd5b919050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611dc557506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80611e1d5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515611e2857600080fd5b600260149054906101000a900460ff16151515611e4457600080fd5b6001600260146101000a81548160ff021916908315150217905550565b611e69613928565b6000611e73613928565b6000806000611e8187611cce565b94506000851415611eb3576000604051805910611e9b5750595b90808252806020026020018201604052509550611f8e565b84604051805910611ec15750595b90808252806020026020018201604052509350611edc61137a565b925060009150600190505b8281111515611f8a578673ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611f7d57808483815181101515611f6657fe5b906020019060200201818152505081806001019250505b8080600101915050611ee7565b8395505b5050505050919050565b600080600080600080600080600260149054906101000a900460ff16151515611fc057600080fd5b600689815481101515611fcf57fe5b9060005260206000209060020201965060008760010160009054906101000a900467ffffffffffffffff1667ffffffffffffffff161415151561201157600080fd5b612147876101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050613296565b151561215257600080fd5b8660010160189054906101000a900463ffffffff1663ffffffff16955060068681548110151561217e57fe5b9060005260206000209060020201945086600101601e9054906101000a900461ffff16935086600101601e9054906101000a900461ffff1661ffff1685600101601e9054906101000a900461ffff1661ffff1611156121ed5784600101601e9054906101000a900461ffff1693505b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d9f5aed8860000154876000015460018b60010160089054906101000a900467ffffffffffffffff16036000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018381526020018267ffffffffffffffff1681526020019350505050602060405180830381600087803b15156122c357600080fd5b6102c65a03f115156122d457600080fd5b505050604051805190509250600760008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150612344898860010160189054906101000a900463ffffffff1663ffffffff166001870161ffff1686866132d1565b90508660010160186101000a81549063ffffffff0219169055600f60008154809291906001900391905055503373ffffffffffffffffffffffffffffffffffffffff166108fc600e549081150290604051600060405180830381858888f193505050505080975050505050505050919050565b6040805190810160405280600281526020017f434b00000000000000000000000000000000000000000000000000000000000081525081565b600381600e811015156123ff57fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff1615151561246e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156124aa57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156124e557600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561254257600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561259f57600080fd5b6125a93382612c08565b15156125b457600080fd5b6125bf338383612d36565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008311151561262757600080fd5b60068381548110151561263657fe5b9060005260206000209060020201905061277c816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff16815250506135c4565b915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156127df57600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600260149054906101000a900460ff1615151561288e57600080fd5b600e54341015151561289f57600080fd5b6128a93385612c08565b15156128b457600080fd5b6128be8385613183565b15156128c957600080fd5b6006848154811015156128d857fe5b90600052602060002090600202019150612a1e826101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff16815250506135c4565b1515612a2957600080fd5b600683815481101515612a3857fe5b90600052602060002090600202019050612b7e816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff16815250506135c4565b1515612b8957600080fd5b612b9582858386612f6e565b1515612ba057600080fd5b612baa84846135fe565b50505050565b612bb86138e9565b612bc06138e9565b60008084604051805910612bd15750595b9080825280601f01601f19166020018201604052509250602083019150859050612bfc8282876137c8565b82935050505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff166007600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b806009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008273ffffffffffffffffffffffffffffffffffffffff166009600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515612eca57600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600a600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556009600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b600081841415612f81576000905061317b565b818560010160109054906101000a900463ffffffff1663ffffffff161480612fc25750818560010160149054906101000a900463ffffffff1663ffffffff16145b15612fd0576000905061317b565b838360010160109054906101000a900463ffffffff1663ffffffff1614806130115750838360010160149054906101000a900463ffffffff1663ffffffff16145b1561301f576000905061317b565b60008360010160109054906101000a900463ffffffff1663ffffffff161480613062575060008560010160109054906101000a900463ffffffff1663ffffffff16145b15613070576001905061317b565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff1614806130e557508460010160149054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff16145b156130f3576000905061317b565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff16148061316857508460010160149054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff16145b15613176576000905061317b565b600190505b949350505050565b60008060006007600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16148061328c57508173ffffffffffffffffffffffffffffffffffffffff16600a600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b9250505092915050565b6000808260a0015163ffffffff16141580156132ca57504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b6000806132dc61393c565b60008863ffffffff16891415156132f257600080fd5b8763ffffffff168814151561330657600080fd5b8661ffff168714151561331857600080fd5b60028781151561332457fe5b049250600d8361ffff16111561333957600d92505b610100604051908101604052808781526020014267ffffffffffffffff168152602001600067ffffffffffffffff1681526020018a63ffffffff1681526020018963ffffffff168152602001600063ffffffff1681526020018461ffff1681526020018861ffff1681525091506001600680548060010182816133bc91906139b0565b916000526020600020906002020160008590919091506000820151816000015560208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601c6101000a81548161ffff021916908361ffff16021790555060e082015181600101601e6101000a81548161ffff021916908361ffff16021790555050500390508063ffffffff168114151561350e57600080fd5b7f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad58582846060015163ffffffff16856080015163ffffffff168660000151604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a16135b560008683612d36565b80935050505095945050505050565b6000808260a0015163ffffffff161480156135f757504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b60008060068381548110151561361057fe5b9060005260206000209060020201915060068481548110151561362f57fe5b90600052602060002090600202019050828160010160186101000a81548163ffffffff021916908363ffffffff16021790555061366b82613813565b61367481613813565b600a600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600a600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600f600081548092919060010191905055507f241ea03ca20251805084d27d4440371c34a0b85ff108f6bb5611248f73818b806007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685858460010160089054906101000a900467ffffffffffffffff16604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018267ffffffffffffffff16815260200194505050505060405180910390a150505050565b60005b6020821015156137f057825184526020840193506020830192506020820391506137cb565b6001826020036101000a0390508019835116818551168181178652505050505050565b43600554600383600101601c9054906101000a900461ffff1661ffff16600e8110151561383c57fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff1681151561386757fe5b04018160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600d81600101601c9054906101000a900461ffff1661ffff1610156138e657600181600101601c8282829054906101000a900461ffff160192506101000a81548161ffff021916908361ffff1602179055505b50565b602060405190810160405280600081525090565b6080604051908101604052806004905b600080191681526020019060019003908161390d5790505090565b602060405190810160405280600081525090565b6101006040519081016040528060008152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600061ffff168152602001600061ffff1681525090565b8154818355818115116139dd576002028160020283600052602060002091820191016139dc91906139e2565b5b505050565b613aab91905b80821115613aa7576000808201600090556001820160006101000a81549067ffffffffffffffff02191690556001820160086101000a81549067ffffffffffffffff02191690556001820160106101000a81549063ffffffff02191690556001820160146101000a81549063ffffffff02191690556001820160186101000a81549063ffffffff021916905560018201601c6101000a81549061ffff021916905560018201601e6101000a81549061ffff0219169055506002016139e8565b5090565b905600a165627a7a72305820840f0fd2671ca6801b000327af52853444a96b86b0c33b7e35dd609b2ae20fff0029", - "deployedBytecode": "0x6060604052600436106101f9576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146101fe5780630519ce79146102585780630560ff44146102ad57806306fdde031461035d578063095ea7b3146103eb5780630a0f81681461042d57806318160ddd14610482578063183a7947146104ab5780631940a936146104d457806321717ebf1461050f57806323b872dd1461056457806324e7a38a146105c557806327d7874c146105fe5780632ba73c15146106375780633f4ba83a1461067057806346116e6f1461068557806346d22c70146106e8578063481af3d31461072c5780634b85fd551461078f5780634dfff04f146107b25780634e0a3379146107f45780635663896e1461082d5780635c975abb146108505780636352211e1461087d57806370a08231146108e05780637a7d49371461092d5780638456cb59146109565780638462151c1461096b57806388c2a0bf146109f957806395d89b4114610a305780639d6fac6f14610abe578063a45f4bfc14610b01578063a9059cbb14610b64578063b047fb5014610ba6578063b0c35c0514610bfb578063bc4006f514610c24578063d3e6f49f14610c79578063e17b25af14610cb4578063e6cbe35114610ced578063f2b47d5214610d42578063f7d8c88314610d97575b600080fd5b341561020957600080fd5b61023e60048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050610db8565b604051808215151515815260200191505060405180910390f35b341561026357600080fd5b61026b6110c9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102b857600080fd5b6102e2600480803590602001909190803590602001908201803590602001919091929050506110ef565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610322578082015181840152602081019050610307565b50505050905090810190601f16801561034f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561036857600080fd5b61037061125a565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103b0578082015181840152602081019050610395565b50505050905090810190601f1680156103dd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156103f657600080fd5b61042b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611293565b005b341561043857600080fd5b610440611355565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561048d57600080fd5b61049561137a565b6040518082815260200191505060405180910390f35b34156104b657600080fd5b6104be61138a565b6040518082815260200191505060405180910390f35b34156104df57600080fd5b6104f56004808035906020019091905050611390565b604051808215151515815260200191505060405180910390f35b341561051a57600080fd5b6105226113e2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561056f57600080fd5b6105c3600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611408565b005b34156105d057600080fd5b6105fc600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506114b9565b005b341561060957600080fd5b610635600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506115f0565b005b341561064257600080fd5b61066e600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506116ca565b005b341561067b57600080fd5b6106836117a5565b005b341561069057600080fd5b6106a66004808035906020019091905050611838565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156106f357600080fd5b610712600480803590602001909190803590602001909190505061186b565b604051808215151515815260200191505060405180910390f35b341561073757600080fd5b61074d60048080359060200190919050506118f3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561079a57600080fd5b6107b06004808035906020019091905050611926565b005b34156107bd57600080fd5b6107f2600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061198c565b005b34156107ff57600080fd5b61082b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611a13565b005b341561083857600080fd5b61084e6004808035906020019091905050611aee565b005b341561085b57600080fd5b610863611c42565b604051808215151515815260200191505060405180910390f35b341561088857600080fd5b61089e6004808035906020019091905050611c55565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156108eb57600080fd5b610917600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611cce565b6040518082815260200191505060405180910390f35b341561093857600080fd5b610940611d17565b6040518082815260200191505060405180910390f35b341561096157600080fd5b610969611d1d565b005b341561097657600080fd5b6109a2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611e61565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156109e55780820151818401526020810190506109ca565b505050509050019250505060405180910390f35b3415610a0457600080fd5b610a1a6004808035906020019091905050611f98565b6040518082815260200191505060405180910390f35b3415610a3b57600080fd5b610a436123b7565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610a83578082015181840152602081019050610a68565b50505050905090810190601f168015610ab05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610ac957600080fd5b610adf60048080359060200190919050506123f0565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3415610b0c57600080fd5b610b22600480803590602001909190505061241f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610b6f57600080fd5b610ba4600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050612452565b005b3415610bb157600080fd5b610bb96125c3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610c0657600080fd5b610c0e6125e9565b6040518082815260200191505060405180910390f35b3415610c2f57600080fd5b610c376125ef565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610c8457600080fd5b610c9a6004808035906020019091905050612615565b604051808215151515815260200191505060405180910390f35b3415610cbf57600080fd5b610ceb600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612784565b005b3415610cf857600080fd5b610d00612823565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610d4d57600080fd5b610d55612849565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610db6600480803590602001909190803590602001909190505061286f565b005b600060405180807f737570706f727473496e74657266616365286279746573342900000000000000815250601901905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806110c2575060405180807f746f6b656e4d657461646174612875696e743235362c737472696e6729000000815250601d019050604051809103902060405180807f746f6b656e734f664f776e6572286164647265737329000000000000000000008152506016019050604051809103902060405180807f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81526020017f74323536290000000000000000000000000000000000000000000000000000008152506025019050604051809103902060405180807f7472616e7366657228616464726573732c75696e7432353629000000000000008152506019019050604051809103902060405180807f617070726f766528616464726573732c75696e743235362900000000000000008152506018019050604051809103902060405180807f6f776e65724f662875696e7432353629000000000000000000000000000000008152506010019050604051809103902060405180807f62616c616e63654f6628616464726573732900000000000000000000000000008152506012019050604051809103902060405180807f746f74616c537570706c79282900000000000000000000000000000000000000815250600d019050604051809103902060405180807f73796d626f6c28290000000000000000000000000000000000000000000000008152506008019050604051809103902060405180807f6e616d6528290000000000000000000000000000000000000000000000000000815250600601905060405180910390201818181818181818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6110f76138e9565b6110ff6138fd565b60008073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561115e57600080fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb4799f2878787600060405160a001526040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180848152602001806020018281038252848482818152602001925080828437820191505094505050505060a060405180830381600087803b151561121957600080fd5b6102c65a03f1151561122a57600080fd5b50505060405180608001805190602001604052809250819350505061124f8282612bb0565b925050509392505050565b6040805190810160405280600d81526020017f43727970746f4b6974746965730000000000000000000000000000000000000081525081565b61129d3382612c08565b15156112a857600080fd5b6112b28183612c74565b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160068054905003905090565b600f5481565b600080821115156113a057600080fd5b60006006838154811015156113b157fe5b906000526020600020906002020160010160189054906101000a900463ffffffff1663ffffffff1614159050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561144457600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561147f57600080fd5b6114893382612cca565b151561149457600080fd5b61149e8382612c08565b15156114a957600080fd5b6114b4838383612d36565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561151657600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166354c15b826000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561158557600080fd5b6102c65a03f1151561159657600080fd5b5050506040518051905015156115ab57600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561164b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561168757600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561172557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561176157600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561180057600080fd5b600260149054906101000a900460ff16151561181b57600080fd5b6000600260146101000a81548160ff021916908315150217905550565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000808511151561187e57600080fd5b60008411151561188d57600080fd5b60068581548110151561189c57fe5b906000526020600020906002020191506006848154811015156118bb57fe5b906000526020600020906002020190506118d782868387612f6e565b80156118e957506118e88486613183565b5b9250505092915050565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561198257600080fd5b80600e8190555050565b600260149054906101000a900460ff161515156119a857600080fd5b6119b23382612c08565b15156119bd57600080fd5b81600a600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a6e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611aaa57600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611b9657506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80611bee5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515611bf957600080fd5b60036000600e81101515611c0957fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff1681101515611c3857600080fd5b8060058190555050565b600260149054906101000a900460ff1681565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611cc957600080fd5b919050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611dc557506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80611e1d5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515611e2857600080fd5b600260149054906101000a900460ff16151515611e4457600080fd5b6001600260146101000a81548160ff021916908315150217905550565b611e69613928565b6000611e73613928565b6000806000611e8187611cce565b94506000851415611eb3576000604051805910611e9b5750595b90808252806020026020018201604052509550611f8e565b84604051805910611ec15750595b90808252806020026020018201604052509350611edc61137a565b925060009150600190505b8281111515611f8a578673ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611f7d57808483815181101515611f6657fe5b906020019060200201818152505081806001019250505b8080600101915050611ee7565b8395505b5050505050919050565b600080600080600080600080600260149054906101000a900460ff16151515611fc057600080fd5b600689815481101515611fcf57fe5b9060005260206000209060020201965060008760010160009054906101000a900467ffffffffffffffff1667ffffffffffffffff161415151561201157600080fd5b612147876101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050613296565b151561215257600080fd5b8660010160189054906101000a900463ffffffff1663ffffffff16955060068681548110151561217e57fe5b9060005260206000209060020201945086600101601e9054906101000a900461ffff16935086600101601e9054906101000a900461ffff1661ffff1685600101601e9054906101000a900461ffff1661ffff1611156121ed5784600101601e9054906101000a900461ffff1693505b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d9f5aed8860000154876000015460018b60010160089054906101000a900467ffffffffffffffff16036000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018381526020018267ffffffffffffffff1681526020019350505050602060405180830381600087803b15156122c357600080fd5b6102c65a03f115156122d457600080fd5b505050604051805190509250600760008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150612344898860010160189054906101000a900463ffffffff1663ffffffff166001870161ffff1686866132d1565b90508660010160186101000a81549063ffffffff0219169055600f60008154809291906001900391905055503373ffffffffffffffffffffffffffffffffffffffff166108fc600e549081150290604051600060405180830381858888f193505050505080975050505050505050919050565b6040805190810160405280600281526020017f434b00000000000000000000000000000000000000000000000000000000000081525081565b600381600e811015156123ff57fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff1615151561246e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156124aa57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156124e557600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561254257600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561259f57600080fd5b6125a93382612c08565b15156125b457600080fd5b6125bf338383612d36565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008311151561262757600080fd5b60068381548110151561263657fe5b9060005260206000209060020201905061277c816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff16815250506135c4565b915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156127df57600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600260149054906101000a900460ff1615151561288e57600080fd5b600e54341015151561289f57600080fd5b6128a93385612c08565b15156128b457600080fd5b6128be8385613183565b15156128c957600080fd5b6006848154811015156128d857fe5b90600052602060002090600202019150612a1e826101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff16815250506135c4565b1515612a2957600080fd5b600683815481101515612a3857fe5b90600052602060002090600202019050612b7e816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff16815250506135c4565b1515612b8957600080fd5b612b9582858386612f6e565b1515612ba057600080fd5b612baa84846135fe565b50505050565b612bb86138e9565b612bc06138e9565b60008084604051805910612bd15750595b9080825280601f01601f19166020018201604052509250602083019150859050612bfc8282876137c8565b82935050505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff166007600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b806009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008273ffffffffffffffffffffffffffffffffffffffff166009600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515612eca57600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600a600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556009600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b600081841415612f81576000905061317b565b818560010160109054906101000a900463ffffffff1663ffffffff161480612fc25750818560010160149054906101000a900463ffffffff1663ffffffff16145b15612fd0576000905061317b565b838360010160109054906101000a900463ffffffff1663ffffffff1614806130115750838360010160149054906101000a900463ffffffff1663ffffffff16145b1561301f576000905061317b565b60008360010160109054906101000a900463ffffffff1663ffffffff161480613062575060008560010160109054906101000a900463ffffffff1663ffffffff16145b15613070576001905061317b565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff1614806130e557508460010160149054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff16145b156130f3576000905061317b565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff16148061316857508460010160149054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff16145b15613176576000905061317b565b600190505b949350505050565b60008060006007600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16148061328c57508173ffffffffffffffffffffffffffffffffffffffff16600a600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b9250505092915050565b6000808260a0015163ffffffff16141580156132ca57504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b6000806132dc61393c565b60008863ffffffff16891415156132f257600080fd5b8763ffffffff168814151561330657600080fd5b8661ffff168714151561331857600080fd5b60028781151561332457fe5b049250600d8361ffff16111561333957600d92505b610100604051908101604052808781526020014267ffffffffffffffff168152602001600067ffffffffffffffff1681526020018a63ffffffff1681526020018963ffffffff168152602001600063ffffffff1681526020018461ffff1681526020018861ffff1681525091506001600680548060010182816133bc91906139b0565b916000526020600020906002020160008590919091506000820151816000015560208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601c6101000a81548161ffff021916908361ffff16021790555060e082015181600101601e6101000a81548161ffff021916908361ffff16021790555050500390508063ffffffff168114151561350e57600080fd5b7f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad58582846060015163ffffffff16856080015163ffffffff168660000151604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a16135b560008683612d36565b80935050505095945050505050565b6000808260a0015163ffffffff161480156135f757504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b60008060068381548110151561361057fe5b9060005260206000209060020201915060068481548110151561362f57fe5b90600052602060002090600202019050828160010160186101000a81548163ffffffff021916908363ffffffff16021790555061366b82613813565b61367481613813565b600a600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600a600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600f600081548092919060010191905055507f241ea03ca20251805084d27d4440371c34a0b85ff108f6bb5611248f73818b806007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685858460010160089054906101000a900467ffffffffffffffff16604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018267ffffffffffffffff16815260200194505050505060405180910390a150505050565b60005b6020821015156137f057825184526020840193506020830192506020820391506137cb565b6001826020036101000a0390508019835116818551168181178652505050505050565b43600554600383600101601c9054906101000a900461ffff1661ffff16600e8110151561383c57fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff1681151561386757fe5b04018160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600d81600101601c9054906101000a900461ffff1661ffff1610156138e657600181600101601c8282829054906101000a900461ffff160192506101000a81548161ffff021916908361ffff1602179055505b50565b602060405190810160405280600081525090565b6080604051908101604052806004905b600080191681526020019060019003908161390d5790505090565b602060405190810160405280600081525090565b6101006040519081016040528060008152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600061ffff168152602001600061ffff1681525090565b8154818355818115116139dd576002028160020283600052602060002091820191016139dc91906139e2565b5b505050565b613aab91905b80821115613aa7576000808201600090556001820160006101000a81549067ffffffffffffffff02191690556001820160086101000a81549067ffffffffffffffff02191690556001820160106101000a81549063ffffffff02191690556001820160146101000a81549063ffffffff02191690556001820160186101000a81549063ffffffff021916905560018201601c6101000a81549061ffff021916905560018201601e6101000a81549061ffff0219169055506002016139e8565b5090565b905600a165627a7a72305820840f0fd2671ca6801b000327af52853444a96b86b0c33b7e35dd609b2ae20fff0029", + "bytecode": "0x60606040526000600260146101000a81548160ff0219169083151502179055506101c060405190810160405280603c63ffffffff1663ffffffff168152602001607863ffffffff1663ffffffff16815260200161012c63ffffffff1663ffffffff16815260200161025863ffffffff1663ffffffff16815260200161070863ffffffff1663ffffffff168152602001610e1063ffffffff1663ffffffff168152602001611c2063ffffffff1663ffffffff16815260200161384063ffffffff1663ffffffff16815260200161708063ffffffff1663ffffffff16815260200161e10063ffffffff1663ffffffff1681526020016201518063ffffffff1663ffffffff1681526020016202a30063ffffffff1663ffffffff1681526020016205460063ffffffff1663ffffffff16815260200162093a8063ffffffff1663ffffffff16815250600390600e6200015692919062000179565b50600f60055566071afd498d0000600e5534156200017357600080fd5b62000259565b82600e600701600890048101928215620002105791602002820160005b83821115620001dc57835183826101000a81548163ffffffff021916908363ffffffff160217905550926020019260040160208160030104928301926001030262000196565b80156200020e5782816101000a81549063ffffffff0219169055600401602081600301049283019260010302620001dc565b505b5090506200021f919062000223565b5090565b6200025691905b808211156200025257600081816101000a81549063ffffffff0219169055506001016200022a565b5090565b90565b613ada80620002696000396000f3006060604052600436106101f9576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146101fe5780630519ce79146102585780630560ff44146102ad57806306fdde031461035d578063095ea7b3146103eb5780630a0f81681461042d57806318160ddd14610482578063183a7947146104ab5780631940a936146104d457806321717ebf1461050f57806323b872dd1461056457806324e7a38a146105c557806327d7874c146105fe5780632ba73c15146106375780633f4ba83a1461067057806346116e6f1461068557806346d22c70146106e8578063481af3d31461072c5780634b85fd551461078f5780634dfff04f146107b25780634e0a3379146107f45780635663896e1461082d5780635c975abb146108505780636352211e1461087d57806370a08231146108e05780637a7d49371461092d5780638456cb59146109565780638462151c1461096b57806388c2a0bf146109f957806395d89b4114610a305780639d6fac6f14610abe578063a45f4bfc14610b01578063a9059cbb14610b64578063b047fb5014610ba6578063b0c35c0514610bfb578063bc4006f514610c24578063d3e6f49f14610c79578063e17b25af14610cb4578063e6cbe35114610ced578063f2b47d5214610d42578063f7d8c88314610d97575b600080fd5b341561020957600080fd5b61023e60048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050610db8565b604051808215151515815260200191505060405180910390f35b341561026357600080fd5b61026b6110c9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102b857600080fd5b6102e2600480803590602001909190803590602001908201803590602001919091929050506110ef565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610322578082015181840152602081019050610307565b50505050905090810190601f16801561034f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561036857600080fd5b61037061125a565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103b0578082015181840152602081019050610395565b50505050905090810190601f1680156103dd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156103f657600080fd5b61042b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611293565b005b341561043857600080fd5b610440611355565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561048d57600080fd5b61049561137a565b6040518082815260200191505060405180910390f35b34156104b657600080fd5b6104be61138a565b6040518082815260200191505060405180910390f35b34156104df57600080fd5b6104f56004808035906020019091905050611390565b604051808215151515815260200191505060405180910390f35b341561051a57600080fd5b6105226113e2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561056f57600080fd5b6105c3600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611408565b005b34156105d057600080fd5b6105fc600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506114b9565b005b341561060957600080fd5b610635600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506115f0565b005b341561064257600080fd5b61066e600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506116ca565b005b341561067b57600080fd5b6106836117a5565b005b341561069057600080fd5b6106a66004808035906020019091905050611838565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156106f357600080fd5b610712600480803590602001909190803590602001909190505061186b565b604051808215151515815260200191505060405180910390f35b341561073757600080fd5b61074d60048080359060200190919050506118f3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561079a57600080fd5b6107b06004808035906020019091905050611926565b005b34156107bd57600080fd5b6107f2600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061198c565b005b34156107ff57600080fd5b61082b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611a13565b005b341561083857600080fd5b61084e6004808035906020019091905050611aee565b005b341561085b57600080fd5b610863611c42565b604051808215151515815260200191505060405180910390f35b341561088857600080fd5b61089e6004808035906020019091905050611c55565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156108eb57600080fd5b610917600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611cce565b6040518082815260200191505060405180910390f35b341561093857600080fd5b610940611d17565b6040518082815260200191505060405180910390f35b341561096157600080fd5b610969611d1d565b005b341561097657600080fd5b6109a2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611e61565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156109e55780820151818401526020810190506109ca565b505050509050019250505060405180910390f35b3415610a0457600080fd5b610a1a6004808035906020019091905050611f98565b6040518082815260200191505060405180910390f35b3415610a3b57600080fd5b610a436123b7565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610a83578082015181840152602081019050610a68565b50505050905090810190601f168015610ab05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610ac957600080fd5b610adf60048080359060200190919050506123f0565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3415610b0c57600080fd5b610b22600480803590602001909190505061241f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610b6f57600080fd5b610ba4600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050612452565b005b3415610bb157600080fd5b610bb96125c3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610c0657600080fd5b610c0e6125e9565b6040518082815260200191505060405180910390f35b3415610c2f57600080fd5b610c376125ef565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610c8457600080fd5b610c9a6004808035906020019091905050612615565b604051808215151515815260200191505060405180910390f35b3415610cbf57600080fd5b610ceb600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612784565b005b3415610cf857600080fd5b610d00612823565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610d4d57600080fd5b610d55612849565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610db6600480803590602001909190803590602001909190505061286f565b005b600060405180807f737570706f727473496e74657266616365286279746573342900000000000000815250601901905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806110c2575060405180807f746f6b656e4d657461646174612875696e743235362c737472696e6729000000815250601d019050604051809103902060405180807f746f6b656e734f664f776e6572286164647265737329000000000000000000008152506016019050604051809103902060405180807f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81526020017f74323536290000000000000000000000000000000000000000000000000000008152506025019050604051809103902060405180807f7472616e7366657228616464726573732c75696e7432353629000000000000008152506019019050604051809103902060405180807f617070726f766528616464726573732c75696e743235362900000000000000008152506018019050604051809103902060405180807f6f776e65724f662875696e7432353629000000000000000000000000000000008152506010019050604051809103902060405180807f62616c616e63654f6628616464726573732900000000000000000000000000008152506012019050604051809103902060405180807f746f74616c537570706c79282900000000000000000000000000000000000000815250600d019050604051809103902060405180807f73796d626f6c28290000000000000000000000000000000000000000000000008152506008019050604051809103902060405180807f6e616d6528290000000000000000000000000000000000000000000000000000815250600601905060405180910390201818181818181818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6110f76138e9565b6110ff6138fd565b60008073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561115e57600080fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb4799f2878787600060405160a001526040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180848152602001806020018281038252848482818152602001925080828437820191505094505050505060a060405180830381600087803b151561121957600080fd5b6102c65a03f1151561122a57600080fd5b50505060405180608001805190602001604052809250819350505061124f8282612bb0565b925050509392505050565b6040805190810160405280600d81526020017f43727970746f4b6974746965730000000000000000000000000000000000000081525081565b61129d3382612c08565b15156112a857600080fd5b6112b28183612c74565b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160068054905003905090565b600f5481565b600080821115156113a057600080fd5b60006006838154811015156113b157fe5b906000526020600020906002020160010160189054906101000a900463ffffffff1663ffffffff1614159050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561144457600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561147f57600080fd5b6114893382612cca565b151561149457600080fd5b61149e8382612c08565b15156114a957600080fd5b6114b4838383612d36565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561151657600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166354c15b826000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561158557600080fd5b6102c65a03f1151561159657600080fd5b5050506040518051905015156115ab57600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561164b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561168757600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561172557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561176157600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561180057600080fd5b600260149054906101000a900460ff16151561181b57600080fd5b6000600260146101000a81548160ff021916908315150217905550565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000808511151561187e57600080fd5b60008411151561188d57600080fd5b60068581548110151561189c57fe5b906000526020600020906002020191506006848154811015156118bb57fe5b906000526020600020906002020190506118d782868387612f6e565b80156118e957506118e88486613183565b5b9250505092915050565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561198257600080fd5b80600e8190555050565b600260149054906101000a900460ff161515156119a857600080fd5b6119b23382612c08565b15156119bd57600080fd5b81600a600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a6e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611aaa57600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611b9657506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80611bee5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515611bf957600080fd5b60036000600e81101515611c0957fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff1681101515611c3857600080fd5b8060058190555050565b600260149054906101000a900460ff1681565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611cc957600080fd5b919050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611dc557506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80611e1d5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515611e2857600080fd5b600260149054906101000a900460ff16151515611e4457600080fd5b6001600260146101000a81548160ff021916908315150217905550565b611e69613928565b6000611e73613928565b6000806000611e8187611cce565b94506000851415611eb3576000604051805910611e9b5750595b90808252806020026020018201604052509550611f8e565b84604051805910611ec15750595b90808252806020026020018201604052509350611edc61137a565b925060009150600190505b8281111515611f8a578673ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611f7d57808483815181101515611f6657fe5b906020019060200201818152505081806001019250505b8080600101915050611ee7565b8395505b5050505050919050565b600080600080600080600080600260149054906101000a900460ff16151515611fc057600080fd5b600689815481101515611fcf57fe5b9060005260206000209060020201965060008760010160009054906101000a900467ffffffffffffffff1667ffffffffffffffff161415151561201157600080fd5b612147876101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050613296565b151561215257600080fd5b8660010160189054906101000a900463ffffffff1663ffffffff16955060068681548110151561217e57fe5b9060005260206000209060020201945086600101601e9054906101000a900461ffff16935086600101601e9054906101000a900461ffff1661ffff1685600101601e9054906101000a900461ffff1661ffff1611156121ed5784600101601e9054906101000a900461ffff1693505b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d9f5aed8860000154876000015460018b60010160089054906101000a900467ffffffffffffffff16036000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018381526020018267ffffffffffffffff1681526020019350505050602060405180830381600087803b15156122c357600080fd5b6102c65a03f115156122d457600080fd5b505050604051805190509250600760008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150612344898860010160189054906101000a900463ffffffff1663ffffffff166001870161ffff1686866132d1565b90508660010160186101000a81549063ffffffff0219169055600f60008154809291906001900391905055503373ffffffffffffffffffffffffffffffffffffffff166108fc600e549081150290604051600060405180830381858888f193505050505080975050505050505050919050565b6040805190810160405280600281526020017f434b00000000000000000000000000000000000000000000000000000000000081525081565b600381600e811015156123ff57fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff1615151561246e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156124aa57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156124e557600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561254257600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561259f57600080fd5b6125a93382612c08565b15156125b457600080fd5b6125bf338383612d36565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008311151561262757600080fd5b60068381548110151561263657fe5b9060005260206000209060020201905061277c816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff16815250506135c4565b915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156127df57600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600260149054906101000a900460ff1615151561288e57600080fd5b600e54341015151561289f57600080fd5b6128a93385612c08565b15156128b457600080fd5b6128be8385613183565b15156128c957600080fd5b6006848154811015156128d857fe5b90600052602060002090600202019150612a1e826101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff16815250506135c4565b1515612a2957600080fd5b600683815481101515612a3857fe5b90600052602060002090600202019050612b7e816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff16815250506135c4565b1515612b8957600080fd5b612b9582858386612f6e565b1515612ba057600080fd5b612baa84846135fe565b50505050565b612bb86138e9565b612bc06138e9565b60008084604051805910612bd15750595b9080825280601f01601f19166020018201604052509250602083019150859050612bfc8282876137c8565b82935050505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff166007600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b806009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008273ffffffffffffffffffffffffffffffffffffffff166009600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515612eca57600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600a600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556009600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b600081841415612f81576000905061317b565b818560010160109054906101000a900463ffffffff1663ffffffff161480612fc25750818560010160149054906101000a900463ffffffff1663ffffffff16145b15612fd0576000905061317b565b838360010160109054906101000a900463ffffffff1663ffffffff1614806130115750838360010160149054906101000a900463ffffffff1663ffffffff16145b1561301f576000905061317b565b60008360010160109054906101000a900463ffffffff1663ffffffff161480613062575060008560010160109054906101000a900463ffffffff1663ffffffff16145b15613070576001905061317b565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff1614806130e557508460010160149054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff16145b156130f3576000905061317b565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff16148061316857508460010160149054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff16145b15613176576000905061317b565b600190505b949350505050565b60008060006007600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16148061328c57508173ffffffffffffffffffffffffffffffffffffffff16600a600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b9250505092915050565b6000808260a0015163ffffffff16141580156132ca57504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b6000806132dc61393c565b60008863ffffffff16891415156132f257600080fd5b8763ffffffff168814151561330657600080fd5b8661ffff168714151561331857600080fd5b60028781151561332457fe5b049250600d8361ffff16111561333957600d92505b610100604051908101604052808781526020014267ffffffffffffffff168152602001600067ffffffffffffffff1681526020018a63ffffffff1681526020018963ffffffff168152602001600063ffffffff1681526020018461ffff1681526020018861ffff1681525091506001600680548060010182816133bc91906139b0565b916000526020600020906002020160008590919091506000820151816000015560208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601c6101000a81548161ffff021916908361ffff16021790555060e082015181600101601e6101000a81548161ffff021916908361ffff16021790555050500390508063ffffffff168114151561350e57600080fd5b7f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad58582846060015163ffffffff16856080015163ffffffff168660000151604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a16135b560008683612d36565b80935050505095945050505050565b6000808260a0015163ffffffff161480156135f757504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b60008060068381548110151561361057fe5b9060005260206000209060020201915060068481548110151561362f57fe5b90600052602060002090600202019050828160010160186101000a81548163ffffffff021916908363ffffffff16021790555061366b82613813565b61367481613813565b600a600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600a600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600f600081548092919060010191905055507f241ea03ca20251805084d27d4440371c34a0b85ff108f6bb5611248f73818b806007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685858460010160089054906101000a900467ffffffffffffffff16604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018267ffffffffffffffff16815260200194505050505060405180910390a150505050565b60005b6020821015156137f057825184526020840193506020830192506020820391506137cb565b6001826020036101000a0390508019835116818551168181178652505050505050565b43600554600383600101601c9054906101000a900461ffff1661ffff16600e8110151561383c57fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff1681151561386757fe5b04018160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600d81600101601c9054906101000a900461ffff1661ffff1610156138e657600181600101601c8282829054906101000a900461ffff160192506101000a81548161ffff021916908361ffff1602179055505b50565b602060405190810160405280600081525090565b6080604051908101604052806004905b600080191681526020019060019003908161390d5790505090565b602060405190810160405280600081525090565b6101006040519081016040528060008152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600061ffff168152602001600061ffff1681525090565b8154818355818115116139dd576002028160020283600052602060002091820191016139dc91906139e2565b5b505050565b613aab91905b80821115613aa7576000808201600090556001820160006101000a81549067ffffffffffffffff02191690556001820160086101000a81549067ffffffffffffffff02191690556001820160106101000a81549063ffffffff02191690556001820160146101000a81549063ffffffff02191690556001820160186101000a81549063ffffffff021916905560018201601c6101000a81549061ffff021916905560018201601e6101000a81549061ffff0219169055506002016139e8565b5090565b905600a165627a7a72305820502d44c851e6be3c227b97dcb1afe15bf3adcd2b5656c7324d92aa42dade9a0d0029", + "deployedBytecode": "0x6060604052600436106101f9576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146101fe5780630519ce79146102585780630560ff44146102ad57806306fdde031461035d578063095ea7b3146103eb5780630a0f81681461042d57806318160ddd14610482578063183a7947146104ab5780631940a936146104d457806321717ebf1461050f57806323b872dd1461056457806324e7a38a146105c557806327d7874c146105fe5780632ba73c15146106375780633f4ba83a1461067057806346116e6f1461068557806346d22c70146106e8578063481af3d31461072c5780634b85fd551461078f5780634dfff04f146107b25780634e0a3379146107f45780635663896e1461082d5780635c975abb146108505780636352211e1461087d57806370a08231146108e05780637a7d49371461092d5780638456cb59146109565780638462151c1461096b57806388c2a0bf146109f957806395d89b4114610a305780639d6fac6f14610abe578063a45f4bfc14610b01578063a9059cbb14610b64578063b047fb5014610ba6578063b0c35c0514610bfb578063bc4006f514610c24578063d3e6f49f14610c79578063e17b25af14610cb4578063e6cbe35114610ced578063f2b47d5214610d42578063f7d8c88314610d97575b600080fd5b341561020957600080fd5b61023e60048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050610db8565b604051808215151515815260200191505060405180910390f35b341561026357600080fd5b61026b6110c9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102b857600080fd5b6102e2600480803590602001909190803590602001908201803590602001919091929050506110ef565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610322578082015181840152602081019050610307565b50505050905090810190601f16801561034f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561036857600080fd5b61037061125a565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103b0578082015181840152602081019050610395565b50505050905090810190601f1680156103dd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156103f657600080fd5b61042b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611293565b005b341561043857600080fd5b610440611355565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561048d57600080fd5b61049561137a565b6040518082815260200191505060405180910390f35b34156104b657600080fd5b6104be61138a565b6040518082815260200191505060405180910390f35b34156104df57600080fd5b6104f56004808035906020019091905050611390565b604051808215151515815260200191505060405180910390f35b341561051a57600080fd5b6105226113e2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561056f57600080fd5b6105c3600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611408565b005b34156105d057600080fd5b6105fc600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506114b9565b005b341561060957600080fd5b610635600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506115f0565b005b341561064257600080fd5b61066e600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506116ca565b005b341561067b57600080fd5b6106836117a5565b005b341561069057600080fd5b6106a66004808035906020019091905050611838565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156106f357600080fd5b610712600480803590602001909190803590602001909190505061186b565b604051808215151515815260200191505060405180910390f35b341561073757600080fd5b61074d60048080359060200190919050506118f3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561079a57600080fd5b6107b06004808035906020019091905050611926565b005b34156107bd57600080fd5b6107f2600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061198c565b005b34156107ff57600080fd5b61082b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611a13565b005b341561083857600080fd5b61084e6004808035906020019091905050611aee565b005b341561085b57600080fd5b610863611c42565b604051808215151515815260200191505060405180910390f35b341561088857600080fd5b61089e6004808035906020019091905050611c55565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156108eb57600080fd5b610917600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611cce565b6040518082815260200191505060405180910390f35b341561093857600080fd5b610940611d17565b6040518082815260200191505060405180910390f35b341561096157600080fd5b610969611d1d565b005b341561097657600080fd5b6109a2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611e61565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156109e55780820151818401526020810190506109ca565b505050509050019250505060405180910390f35b3415610a0457600080fd5b610a1a6004808035906020019091905050611f98565b6040518082815260200191505060405180910390f35b3415610a3b57600080fd5b610a436123b7565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610a83578082015181840152602081019050610a68565b50505050905090810190601f168015610ab05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610ac957600080fd5b610adf60048080359060200190919050506123f0565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3415610b0c57600080fd5b610b22600480803590602001909190505061241f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610b6f57600080fd5b610ba4600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050612452565b005b3415610bb157600080fd5b610bb96125c3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610c0657600080fd5b610c0e6125e9565b6040518082815260200191505060405180910390f35b3415610c2f57600080fd5b610c376125ef565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610c8457600080fd5b610c9a6004808035906020019091905050612615565b604051808215151515815260200191505060405180910390f35b3415610cbf57600080fd5b610ceb600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612784565b005b3415610cf857600080fd5b610d00612823565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610d4d57600080fd5b610d55612849565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610db6600480803590602001909190803590602001909190505061286f565b005b600060405180807f737570706f727473496e74657266616365286279746573342900000000000000815250601901905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806110c2575060405180807f746f6b656e4d657461646174612875696e743235362c737472696e6729000000815250601d019050604051809103902060405180807f746f6b656e734f664f776e6572286164647265737329000000000000000000008152506016019050604051809103902060405180807f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81526020017f74323536290000000000000000000000000000000000000000000000000000008152506025019050604051809103902060405180807f7472616e7366657228616464726573732c75696e7432353629000000000000008152506019019050604051809103902060405180807f617070726f766528616464726573732c75696e743235362900000000000000008152506018019050604051809103902060405180807f6f776e65724f662875696e7432353629000000000000000000000000000000008152506010019050604051809103902060405180807f62616c616e63654f6628616464726573732900000000000000000000000000008152506012019050604051809103902060405180807f746f74616c537570706c79282900000000000000000000000000000000000000815250600d019050604051809103902060405180807f73796d626f6c28290000000000000000000000000000000000000000000000008152506008019050604051809103902060405180807f6e616d6528290000000000000000000000000000000000000000000000000000815250600601905060405180910390201818181818181818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6110f76138e9565b6110ff6138fd565b60008073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561115e57600080fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb4799f2878787600060405160a001526040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180848152602001806020018281038252848482818152602001925080828437820191505094505050505060a060405180830381600087803b151561121957600080fd5b6102c65a03f1151561122a57600080fd5b50505060405180608001805190602001604052809250819350505061124f8282612bb0565b925050509392505050565b6040805190810160405280600d81526020017f43727970746f4b6974746965730000000000000000000000000000000000000081525081565b61129d3382612c08565b15156112a857600080fd5b6112b28183612c74565b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160068054905003905090565b600f5481565b600080821115156113a057600080fd5b60006006838154811015156113b157fe5b906000526020600020906002020160010160189054906101000a900463ffffffff1663ffffffff1614159050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561144457600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561147f57600080fd5b6114893382612cca565b151561149457600080fd5b61149e8382612c08565b15156114a957600080fd5b6114b4838383612d36565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561151657600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166354c15b826000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561158557600080fd5b6102c65a03f1151561159657600080fd5b5050506040518051905015156115ab57600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561164b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561168757600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561172557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561176157600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561180057600080fd5b600260149054906101000a900460ff16151561181b57600080fd5b6000600260146101000a81548160ff021916908315150217905550565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000808511151561187e57600080fd5b60008411151561188d57600080fd5b60068581548110151561189c57fe5b906000526020600020906002020191506006848154811015156118bb57fe5b906000526020600020906002020190506118d782868387612f6e565b80156118e957506118e88486613183565b5b9250505092915050565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561198257600080fd5b80600e8190555050565b600260149054906101000a900460ff161515156119a857600080fd5b6119b23382612c08565b15156119bd57600080fd5b81600a600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a6e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611aaa57600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611b9657506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80611bee5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515611bf957600080fd5b60036000600e81101515611c0957fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff1681101515611c3857600080fd5b8060058190555050565b600260149054906101000a900460ff1681565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611cc957600080fd5b919050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611dc557506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80611e1d5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515611e2857600080fd5b600260149054906101000a900460ff16151515611e4457600080fd5b6001600260146101000a81548160ff021916908315150217905550565b611e69613928565b6000611e73613928565b6000806000611e8187611cce565b94506000851415611eb3576000604051805910611e9b5750595b90808252806020026020018201604052509550611f8e565b84604051805910611ec15750595b90808252806020026020018201604052509350611edc61137a565b925060009150600190505b8281111515611f8a578673ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611f7d57808483815181101515611f6657fe5b906020019060200201818152505081806001019250505b8080600101915050611ee7565b8395505b5050505050919050565b600080600080600080600080600260149054906101000a900460ff16151515611fc057600080fd5b600689815481101515611fcf57fe5b9060005260206000209060020201965060008760010160009054906101000a900467ffffffffffffffff1667ffffffffffffffff161415151561201157600080fd5b612147876101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050613296565b151561215257600080fd5b8660010160189054906101000a900463ffffffff1663ffffffff16955060068681548110151561217e57fe5b9060005260206000209060020201945086600101601e9054906101000a900461ffff16935086600101601e9054906101000a900461ffff1661ffff1685600101601e9054906101000a900461ffff1661ffff1611156121ed5784600101601e9054906101000a900461ffff1693505b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d9f5aed8860000154876000015460018b60010160089054906101000a900467ffffffffffffffff16036000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018381526020018267ffffffffffffffff1681526020019350505050602060405180830381600087803b15156122c357600080fd5b6102c65a03f115156122d457600080fd5b505050604051805190509250600760008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150612344898860010160189054906101000a900463ffffffff1663ffffffff166001870161ffff1686866132d1565b90508660010160186101000a81549063ffffffff0219169055600f60008154809291906001900391905055503373ffffffffffffffffffffffffffffffffffffffff166108fc600e549081150290604051600060405180830381858888f193505050505080975050505050505050919050565b6040805190810160405280600281526020017f434b00000000000000000000000000000000000000000000000000000000000081525081565b600381600e811015156123ff57fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff1615151561246e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156124aa57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156124e557600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561254257600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561259f57600080fd5b6125a93382612c08565b15156125b457600080fd5b6125bf338383612d36565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008311151561262757600080fd5b60068381548110151561263657fe5b9060005260206000209060020201905061277c816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff16815250506135c4565b915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156127df57600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600260149054906101000a900460ff1615151561288e57600080fd5b600e54341015151561289f57600080fd5b6128a93385612c08565b15156128b457600080fd5b6128be8385613183565b15156128c957600080fd5b6006848154811015156128d857fe5b90600052602060002090600202019150612a1e826101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff16815250506135c4565b1515612a2957600080fd5b600683815481101515612a3857fe5b90600052602060002090600202019050612b7e816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff16815250506135c4565b1515612b8957600080fd5b612b9582858386612f6e565b1515612ba057600080fd5b612baa84846135fe565b50505050565b612bb86138e9565b612bc06138e9565b60008084604051805910612bd15750595b9080825280601f01601f19166020018201604052509250602083019150859050612bfc8282876137c8565b82935050505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff166007600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b806009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008273ffffffffffffffffffffffffffffffffffffffff166009600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515612eca57600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600a600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556009600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b600081841415612f81576000905061317b565b818560010160109054906101000a900463ffffffff1663ffffffff161480612fc25750818560010160149054906101000a900463ffffffff1663ffffffff16145b15612fd0576000905061317b565b838360010160109054906101000a900463ffffffff1663ffffffff1614806130115750838360010160149054906101000a900463ffffffff1663ffffffff16145b1561301f576000905061317b565b60008360010160109054906101000a900463ffffffff1663ffffffff161480613062575060008560010160109054906101000a900463ffffffff1663ffffffff16145b15613070576001905061317b565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff1614806130e557508460010160149054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff16145b156130f3576000905061317b565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff16148061316857508460010160149054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff16145b15613176576000905061317b565b600190505b949350505050565b60008060006007600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16148061328c57508173ffffffffffffffffffffffffffffffffffffffff16600a600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b9250505092915050565b6000808260a0015163ffffffff16141580156132ca57504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b6000806132dc61393c565b60008863ffffffff16891415156132f257600080fd5b8763ffffffff168814151561330657600080fd5b8661ffff168714151561331857600080fd5b60028781151561332457fe5b049250600d8361ffff16111561333957600d92505b610100604051908101604052808781526020014267ffffffffffffffff168152602001600067ffffffffffffffff1681526020018a63ffffffff1681526020018963ffffffff168152602001600063ffffffff1681526020018461ffff1681526020018861ffff1681525091506001600680548060010182816133bc91906139b0565b916000526020600020906002020160008590919091506000820151816000015560208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601c6101000a81548161ffff021916908361ffff16021790555060e082015181600101601e6101000a81548161ffff021916908361ffff16021790555050500390508063ffffffff168114151561350e57600080fd5b7f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad58582846060015163ffffffff16856080015163ffffffff168660000151604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a16135b560008683612d36565b80935050505095945050505050565b6000808260a0015163ffffffff161480156135f757504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b60008060068381548110151561361057fe5b9060005260206000209060020201915060068481548110151561362f57fe5b90600052602060002090600202019050828160010160186101000a81548163ffffffff021916908363ffffffff16021790555061366b82613813565b61367481613813565b600a600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600a600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600f600081548092919060010191905055507f241ea03ca20251805084d27d4440371c34a0b85ff108f6bb5611248f73818b806007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685858460010160089054906101000a900467ffffffffffffffff16604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018267ffffffffffffffff16815260200194505050505060405180910390a150505050565b60005b6020821015156137f057825184526020840193506020830192506020820391506137cb565b6001826020036101000a0390508019835116818551168181178652505050505050565b43600554600383600101601c9054906101000a900461ffff1661ffff16600e8110151561383c57fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff1681151561386757fe5b04018160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600d81600101601c9054906101000a900461ffff1661ffff1610156138e657600181600101601c8282829054906101000a900461ffff160192506101000a81548161ffff021916908361ffff1602179055505b50565b602060405190810160405280600081525090565b6080604051908101604052806004905b600080191681526020019060019003908161390d5790505090565b602060405190810160405280600081525090565b6101006040519081016040528060008152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600061ffff168152602001600061ffff1681525090565b8154818355818115116139dd576002028160020283600052602060002091820191016139dc91906139e2565b5b505050565b613aab91905b80821115613aa7576000808201600090556001820160006101000a81549067ffffffffffffffff02191690556001820160086101000a81549067ffffffffffffffff02191690556001820160106101000a81549063ffffffff02191690556001820160146101000a81549063ffffffff02191690556001820160186101000a81549063ffffffff021916905560018201601c6101000a81549061ffff021916905560018201601e6101000a81549061ffff0219169055506002016139e8565b5090565b905600a165627a7a72305820502d44c851e6be3c227b97dcb1afe15bf3adcd2b5656c7324d92aa42dade9a0d0029", "sourceMap": "30047:14136:18:-;;;5032:5;5011:26;;;;;;;;;;;;;;;;;;;;11384:339;;;;;;;;;11427:9;11384:339;;;;;;;;11450:9;11384:339;;;;;;;;11473:9;11384:339;;;;;;;;11496:10;11384:339;;;;;;;;11520:10;11384:339;;;;;;;;11544:7;11384:339;;;;;;;;11565:7;11384:339;;;;;;;;11586:7;11384:339;;;;;;;;11607:7;11384:339;;;;;;;;11628:8;11384:339;;;;;;;;11650:6;11384:339;;;;;;;;11670:6;11384:339;;;;;;;;11690:6;11384:339;;;;;;;;11710:6;11384:339;;;;;;;;;;;;;;;:::i;:::-;;11840:2;11807:35;;30582:8;30552:38;;30047:14136;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;", "deployedSourceMap": "30047:14136:18:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19989:327;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4848:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29456:346;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18924:45:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24204:395:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4817:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25978:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30647:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35349:235;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13853:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25066:784;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31057:470;;;;;;;;;;;;;;;;;;;;;;;;;;;;5800:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;6346;;;;;;;;;;;;;;;;;;;;;;;;;;;;7359:126;;;;;;;;;;;;;;13283:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38051:388;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12965:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34379:90;;;;;;;;;;;;;;;;;;;;;;;;;;33972:189;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6073:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;17342:139;;;;;;;;;;;;;;;;;;;;;;;;;;5011:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26205:180;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22243:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11807:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6990:81;;;;;;;;;;;;;;26841:853;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;42595:1586:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18975:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11384:339:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12465:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22790:990;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4879:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30552:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19070:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34991:207;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20416:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;13564:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30817:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40000:1958;;;;;;;;;;;;;;;;;;;;;;;;;;19989:327;20060:4;19175:38;;;;;;;;;;;;;;;;;;;20219:41;;;:12;:41;;;;20218:90;;;;19697:42;;;;;;;;;;;;;;;;;;;19647:35;;;;;;;;;;;;;;;;;;;19582:50;;;;;;;;;;;;;;;;;;;;;;;;19529:38;;;;;;;;;;;;;;;;;;;19477:37;;;;;;;;;;;;;;;;;;;19433:29;;;;;;;;;;;;;;;;;;;19387:31;;;;;;;;;;;;;;;;;;;19346:26;;;;;;;;;;;;;;;;;;;19310:21;;;;;;;;;;;;;;;;;;;19276:19;;;;;;;;;;;;;;;;;;;19269:63;:104;:150;:194;:246;:299;:364;:414;:471;20266:41;;;:12;:41;;;;20218:90;20210:99;;19989:327;;;:::o;4848:25::-;;;;;;;;;;;;;:::o;29456:346::-;29548:14;;:::i;:::-;29621:24;;:::i;:::-;29655:13;29608:1;29582:28;;:14;;;;;;;;;;;:28;;;;29574:37;;;;;;;;29696:14;;;;;;;;;;;:26;;;29723:8;29733:19;;29696:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29678:75;;;;;;;;29771:24;29781:6;29789:5;29771:9;:24::i;:::-;29764:31;;29456:346;;;;;;;:::o;18924:45::-;;;;;;;;;;;;;;;;;;;;:::o;24204:395::-;24384:27;24390:10;24402:8;24384:5;:27::i;:::-;24376:36;;;;;;;;24491:23;24500:8;24510:3;24491:8;:23::i;:::-;24557:35;24566:10;24578:3;24583:8;24557:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24204:395;;:::o;4817:25::-;;;;;;;;;;;;;:::o;25978:92::-;26022:4;26062:1;26045:7;:14;;;;:18;26038:25;;25978:92;:::o;30647:30::-;;;;:::o;35349:235::-;35420:4;35459:1;35448:8;:12;35440:21;;;;;;;;35576:1;35542:7;35550:8;35542:17;;;;;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;:35;;;;35535:42;;35349:235;;;:::o;13853:39::-;;;;;;;;;;;;;:::o;25066:784::-;25305:1;25290:17;;:3;:17;;;;25282:26;;;;;;;;25563:4;25548:20;;:3;:20;;;;25540:29;;;;;;;;25637:34;25650:10;25662:8;25637:12;:34::i;:::-;25629:43;;;;;;;;25690:22;25696:5;25703:8;25690:5;:22::i;:::-;25682:31;;;;;;;;25812;25822:5;25829:3;25834:8;25812:9;:31::i;:::-;25066:784;;;:::o;31057:470::-;31133:38;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;31195:8;31133:71;;31404:17;:31;;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31396:42;;;;;;;;31503:17;31489:11;;:31;;;;;;;;;;;;;;;;;;31057:470;;:::o;5800:128::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;5887:1;5868:21;;:7;:21;;;;5860:30;;;;;;;;5914:7;5901:10;;:20;;;;;;;;;;;;;;;;;;5800:128;:::o;6346:::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;6433:1;6414:21;;:7;:21;;;;6406:30;;;;;;;;6460:7;6447:10;;:20;;;;;;;;;;;;;;;;;;6346:128;:::o;7359:126::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;6812:6;;;;;;;;;;;6804:15;;;;;;;;7473:5;7464:6;;:14;;;;;;;;;;;;;;;;;;7359:126::o;13283:56::-;;;;;;;;;;;;;;;;;;;;;;:::o;38051:388::-;38143:4;38225:20;38276:18;38183:1;38171:9;:13;38163:22;;;;;;;;38213:1;38203:7;:11;38195:20;;;;;;;;38248:7;38256:9;38248:18;;;;;;;;;;;;;;;;;;;;38225:41;;38297:7;38305;38297:16;;;;;;;;;;;;;;;;;;;;38276:37;;38330:52;38349:6;38357:9;38368:4;38374:7;38330:18;:52::i;:::-;:102;;;;;38394:38;38413:7;38422:9;38394:18;:38::i;:::-;38330:102;38323:109;;38051:388;;;;;;:::o;12965:56::-;;;;;;;;;;;;;;;;;;;;;;:::o;34379:90::-;5435:10;;;;;;;;;;;5421:24;;:10;:24;;;5413:33;;;;;;;;34459:3;34444:12;:18;;;;34379:90;:::o;33972:189::-;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;34080:26;34086:10;34098:7;34080:5;:26::i;:::-;34072:35;;;;;;;;34149:5;34117:20;:29;34138:7;34117:29;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;33972:189;;:::o;6073:128::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;6160:1;6141:21;;:7;:21;;;;6133:30;;;;;;;;6187:7;6174:10;;:20;;;;;;;;;;;;;;;;;;6073:128;:::o;17342:139::-;5537:10;;;;;;;;;;;5523:24;;:10;:24;;;:64;;;;5577:10;;;;;;;;;;;5563:24;;:10;:24;;;5523:64;:104;;;;5617:10;;;;;;;;;;;5603:24;;:10;:24;;;5523:104;5502:135;;;;;;;;17429:9;17439:1;17429:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17422:19;;:4;:19;17414:28;;;;;;;;17470:4;17452:15;:22;;;;17342:139;:::o;5011:26::-;;;;;;;;;;;;;:::o;26205:180::-;26275:13;26312:17;:27;26330:8;26312:27;;;;;;;;;;;;;;;;;;;;;26304:35;;26375:1;26358:19;;:5;:19;;;;26350:28;;;;;;;;26205:180;;;:::o;22243:122::-;22299:13;22331:19;:27;22351:6;22331:27;;;;;;;;;;;;;;;;22324:34;;22243:122;;;:::o;11807:35::-;;;;:::o;6990:81::-;5537:10;;;;;;;;;;;5523:24;;:10;:24;;;:64;;;;5577:10;;;;;;;;;;;5563:24;;:10;:24;;;5523:64;:104;;;;5617:10;;;;;;;;;;;5603:24;;:10;:24;;;5523:104;5502:135;;;;;;;;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;7060:4;7051:6;;:13;;;;;;;;;;;;;;;;;;6990:81::o;26841:853::-;26902:21;;:::i;:::-;26935:18;27110:23;;:::i;:::-;27175:17;27222:19;27402:13;26956:17;26966:6;26956:9;:17::i;:::-;26935:38;;27002:1;26988:10;:15;26984:704;;;27077:1;27063:16;;;;;;;;;;;;;;;;;;;;;;;;27056:23;;;;26984:704;27150:10;27136:25;;;;;;;;;;;;;;;;;;;;;;;;27110:51;;27195:13;:11;:13::i;:::-;27175:33;;27244:1;27222:23;;27443:1;27435:9;;27430:220;27455:9;27446:5;:18;;27430:220;;;27525:6;27497:34;;:17;:24;27515:5;27497:24;;;;;;;;;;;;;;;;;;;;;:34;;;27493:143;;;27577:5;27555:6;27562:11;27555:19;;;;;;;;;;;;;;;;;:27;;;;;27604:13;;;;;;;27493:143;27466:7;;;;;;;27430:220;;;27671:6;27664:13;;26841:853;;;;;;;;;:::o;42595:1586::-;42676:7;42753:20;43068:14;43114:18;43230:16;43436:18;43575:13;43629:16;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;42776:7;42784:9;42776:18;;;;;;;;;;;;;;;;;;;;42753:41;;42882:1;42862:6;:16;;;;;;;;;;;;:21;;;;42854:30;;;;;;;;42977:27;42997:6;42977:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:19;:27::i;:::-;42969:36;;;;;;;;43085:6;:19;;;;;;;;;;;;43068:36;;;;43135:7;43143:6;43135:15;;;;;;;;;;;;;;;;;;;;43114:36;;43249:6;:17;;;;;;;;;;;;43230:36;;43298:6;:17;;;;;;;;;;;;43280:35;;:4;:15;;;;;;;;;;;;:35;;;43276:93;;;43343:4;:15;;;;;;;;;;;;43331:27;;43276:93;43457:11;;;;;;;;;;;:20;;;43478:6;:12;;;43492:4;:10;;;43530:1;43504:6;:23;;;;;;;;;;;;:27;43457:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43436:96;;43591:17;:28;43609:9;43591:28;;;;;;;;;;;;;;;;;;;;;43575:44;;43648:78;43661:9;43672:6;:19;;;;;;;;;;;;43648:78;;43705:1;43693:9;:13;43648:78;;43708:10;43720:5;43648:12;:78::i;:::-;43629:97;;43888:6;:19;;;43881:26;;;;;;;;;;;43984:15;;:17;;;;;;;;;;;;;;44081:10;:15;;:29;44097:12;;44081:29;;;;;;;;;;;;;;;;;;;;;;;;44166:8;44159:15;;42595:1586;;;;;;;;;;:::o;18975:36::-;;;;;;;;;;;;;;;;;;;;:::o;11384:339::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;12465:53::-;;;;;;;;;;;;;;;;;;;;;;:::o;22790:990::-;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;22999:1;22984:17;;:3;:17;;;;22976:26;;;;;;;;23257:4;23242:20;;:3;:20;;;;23234:29;;;;;;;;23498:11;;;;;;;;;;;23483:27;;:3;:27;;;;23475:36;;;;;;;;23544:13;;;;;;;;;;;23529:29;;:3;:29;;;;23521:38;;;;;;;;23621:27;23627:10;23639:8;23621:5;:27::i;:::-;23613:36;;;;;;;;23737;23747:10;23759:3;23764:8;23737:9;:36::i;:::-;22790:990;;:::o;4879:25::-;;;;;;;;;;;;;:::o;30552:38::-;;;;:::o;19070:43::-;;;;;;;;;;;;;:::o;34991:207::-;35066:4;35117:17;35105:1;35094:8;:12;35086:21;;;;;;;;35137:7;35145:8;35137:17;;;;;;;;;;;;;;;;;;;;35117:37;;35171:20;35187:3;35171:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:15;:20::i;:::-;35164:27;;34991:207;;;;:::o;20416:142::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;20534:16;20495:14;;:56;;;;;;;;;;;;;;;;;;20416:142;:::o;13564:35::-;;;;;;;;;;;;;:::o;30817:39::-;;;;;;;;;;;;;:::o;40000:1958::-;41267:20;41494:18;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;40168:12;;40155:9;:25;;40147:34;;;;;;;;40239:28;40245:10;40257:9;40239:5;:28::i;:::-;40231:37;;;;;;;;41165:38;41184:7;41193:9;41165:18;:38::i;:::-;41157:47;;;;;;;;41290:7;41298:9;41290:18;;;;;;;;;;;;;;;;;;;;41267:41;;41409:23;41425:6;41409:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:15;:23::i;:::-;41401:32;;;;;;;;41515:7;41523;41515:16;;;;;;;;;;;;;;;;;;;;41494:37;;41630:21;41646:4;41630:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:15;:21::i;:::-;41622:30;;;;;;;;41728:130;41764:6;41788:9;41815:4;41837:7;41728:18;:130::i;:::-;41720:139;;;;;;;;41921:30;41932:9;41943:7;41921:10;:30::i;:::-;40000:1958;;;;:::o;28808:403::-;28894:6;;:::i;:::-;28912:16;;:::i;:::-;28966:17;28993:16;28942:13;28931:25;;;;;;;;;;;;;;;;;;;;;;;;;;;28912:44;;29074:2;29060:12;29056:3;29043:34;;29102:9;29090:21;;29131:43;29139:9;29150:8;29160:13;29131:7;:43::i;:::-;29192:12;29185:19;;28808:403;;;;;;;:::o;20967:145::-;21042:4;21096:9;21065:40;;:17;:27;21083:8;21065:27;;;;;;;;;;;;;;;;;;;;;:40;;;21058:47;;20967:145;;;;:::o;21944:123::-;22051:9;22018:20;:30;22039:8;22018:30;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;21944:123;;:::o;21346:155::-;21428:4;21485:9;21451:43;;:20;:30;21472:8;21451:30;;;;;;;;;;;;;;;;;;;;;:43;;;21444:50;;21346:155;;;;:::o;13965:758::-;14129:19;:24;14149:3;14129:24;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;14225:3;14195:17;:27;14213:8;14195:27;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;14345:1;14328:19;;:5;:19;;;;14324:317;;;14363:19;:26;14383:5;14363:26;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;14485:20;:30;14506:8;14485:30;;;;;;;;;;;;14478:37;;;;;;;;;;;14600:20;:30;14621:8;14600:30;;;;;;;;;;;;14593:37;;;;;;;;;;;14324:317;14686:30;14695:5;14702:3;14707:8;14686:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13965:758;;;:::o;35986:1169::-;36165:4;36246:7;36233:9;:20;36229:63;;;36276:5;36269:12;;;;36229:63;36377:7;36357;:16;;;;;;;;;;;;:27;;;:56;;;;36406:7;36388;:14;;;;;;;;;;;;:25;;;36357:56;36353:99;;;36436:5;36429:12;;;;36353:99;36483:9;36465:5;:14;;;;;;;;;;;;:27;;;:56;;;;36512:9;36496:5;:12;;;;;;;;;;;;:25;;;36465:56;36461:99;;;36544:5;36537:12;;;;36461:99;36714:1;36696:5;:14;;;;;;;;;;;;:19;;;:44;;;;36739:1;36719:7;:16;;;;;;;;;;;;:21;;;36696:44;36692:86;;;36763:4;36756:11;;;;36692:86;36869:7;:16;;;;;;;;;;;;36851:34;;:5;:14;;;;;;;;;;;;:34;;;:70;;;;36907:7;:14;;;;;;;;;;;;36889:32;;:5;:14;;;;;;;;;;;;:32;;;36851:70;36847:113;;;36944:5;36937:12;;;;36847:113;36989:7;:16;;;;;;;;;;;;36973:32;;:5;:12;;;;;;;;;;;;:32;;;:66;;;;37025:7;:14;;;;;;;;;;;;37009:30;;:5;:12;;;;;;;;;;;;:30;;;36973:66;36969:109;;;37062:5;37055:12;;;;36969:109;37144:4;37137:11;;35986:1169;;;;;;;:::o;32350:441::-;32437:4;32453:19;32513:17;32475;:28;32493:9;32475:28;;;;;;;;;;;;;;;;;;;;;32453:50;;32533:17;:26;32551:7;32533:26;;;;;;;;;;;;;;;;;;;;;32513:46;;32726:9;32711:24;;:11;:24;;;:72;;;;32772:11;32739:44;;:20;:29;32760:7;32739:29;;;;;;;;;;;;;;;;;;;;;:44;;;32711:72;32703:81;;32350:441;;;;;;:::o;34588:177::-;34654:4;34702:1;34678:7;:20;;;:25;;;;34677:81;;;;;34744:12;34709:48;;:7;:24;;;:48;;;;34677:81;34670:88;;34588:177;;;:::o;15381:1876::-;15564:4;16148:20;16281:19;;:::i;:::-;16624;15942:9;15927:26;;15914:9;:39;15906:48;;;;;;;;15998:7;15983:24;;15972:7;:35;15964:44;;;;;;;;16056:11;16041:28;;16026:11;:43;16018:52;;;;;;;;16192:1;16178:11;:15;;;;;;;;16148:46;;16224:2;16208:13;:18;;;16204:67;;;16258:2;16242:18;;16204:67;16303:311;;;;;;;;;16330:6;16303:311;;;;16368:3;16303:311;;;;;;16404:1;16303:311;;;;;;16436:9;16303:311;;;;;;16475:7;16303:311;;;;;;16511:1;16303:311;;;;;;16541:13;16303:311;;;;;;16587:11;16303:311;;;;;16281:333;;16669:1;16646:7;:20;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;16659:6;16646:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:24;16624:46;;16857:11;16842:28;;16827:11;:43;16819:52;;;;;;;;16914:160;16933:6;16953:11;16986:6;:15;;;16978:24;;17024:6;:13;;;17016:22;;17052:6;:12;;;16914:160;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17188:33;17198:1;17201:6;17209:11;17188:9;:33::i;:::-;17239:11;17232:18;;15381:1876;;;;;;;;;;:::o;31720:397::-;31780:4;32057:1;32036:4;:17;;;:22;;;32035:75;;;;;32096:12;32064:45;;:4;:21;;;:45;;;;32035:75;32028:82;;31720:397;;;:::o;38573:924::-;38705:18;38752:20;38726:7;38734;38726:16;;;;;;;;;;;;;;;;;;;;38705:37;;38775:7;38783:9;38775:18;;;;;;;;;;;;;;;;;;;;38752:41;;38907:7;38878:6;:19;;;:37;;;;;;;;;;;;;;;;;;38976:22;38993:4;38976:16;:22::i;:::-;39008:24;39025:6;39008:16;:24::i;:::-;39185:20;:31;39206:9;39185:31;;;;;;;;;;;;39178:38;;;;;;;;;;;39233:20;:29;39254:7;39233:29;;;;;;;;;;;;39226:36;;;;;;;;;;;39342:15;;:17;;;;;;;;;;;;;39407:83;39416:17;:28;39434:9;39416:28;;;;;;;;;;;;;;;;;;;;;39446:9;39457:7;39466:6;:23;;;;;;;;;;;;39407:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38573:924;;;;:::o;27965:565::-;28301:12;28089:170;28103:2;28095:4;:10;;28089:170;;;28180:4;28174:5;28167;28160:6;28222:2;28213:11;;;;28246:2;28238:10;;;;28115:2;28107:10;;;;28089:170;;;28337:1;28329:4;28324:2;:9;28316:3;:18;:22;28301:37;;28407:4;28403:3;28396:4;28390:5;28386:3;28460:4;28452:5;28446;28442:3;28505:7;28495:8;28492:2;28485:5;28478:6;28357:167;;;;;;:::o;33053:596::-;33306:12;33287:15;;33254:9;33264:7;:21;;;;;;;;;;;;33254:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:48;;;;;;;;;;33253:65;33219:7;:24;;;:100;;;;;;;;;;;;;;;;;;33588:2;33564:7;:21;;;;;;;;;;;;:26;;;33560:83;;;33631:1;33606:7;:21;;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33560:83;33053:596;:::o;30047:14136::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", "source": "pragma solidity 0.4.18;\n\n/**\n The following contract code, titled KittyCore, was written by Cryptokitties and published\n and retrieved from https://etherscan.io/address/0x06012c8cf97bead5deae237070f9587f8e7a266d#code.\n\n It is included in the current project for test purposes, to ensure that our collateralizer can\n handle ERC721 tokens created by the KittyCore contract.\n*/\n\n/**\n * @title KittiesOwnable\n * @dev The KittiesOwnable contract has an owner address, and provides basic authorization control\n * functions, this simplifies the implementation of \"user permissions\".\n */\ncontract KittiesOwnable {\n address public owner;\n\n\n /**\n\t * @dev The KittiesOwnable constructor sets the original `owner` of the contract to the sender\n\t * account.\n\t */\n function KittiesOwnable() {\n owner = msg.sender;\n }\n\n\n /**\n\t * @dev Throws if called by any account other than the owner.\n\t */\n modifier onlyOwner() {\n require(msg.sender == owner);\n _;\n }\n\n\n /**\n\t * @dev Allows the current owner to transfer control of the contract to a newOwner.\n\t * @param newOwner The address to transfer ownership to.\n\t */\n function transferOwnership(address newOwner) onlyOwner {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n\n}\n\n\n\n/// @title Interface for contracts conforming to ERC-721: Non-Fungible Tokens\n/// @author Dieter Shirley (https://github.com/dete)\ncontract KittiesERC721 {\n // Required methods\n function totalSupply() public view returns (uint256 total);\n function balanceOf(address _owner) public view returns (uint256 balance);\n function ownerOf(uint256 _tokenId) external view returns (address owner);\n function approve(address _to, uint256 _tokenId) external;\n function transfer(address _to, uint256 _tokenId) external;\n function transferFrom(address _from, address _to, uint256 _tokenId) external;\n\n // Events\n event Transfer(address from, address to, uint256 tokenId);\n event Approval(address owner, address approved, uint256 tokenId);\n\n // Optional\n // function name() public view returns (string name);\n // function symbol() public view returns (string symbol);\n // function tokensOfOwner(address _owner) external view returns (uint256[] tokenIds);\n // function tokenMetadata(uint256 _tokenId, string _preferredTransport) public view returns (string infoUrl);\n\n // ERC-165 Compatibility (https://github.com/ethereum/EIPs/issues/165)\n function supportsInterface(bytes4 _interfaceID) external view returns (bool);\n}\n\n\n// // Auction wrapper functions\n\n\n// Auction wrapper functions\n\n\n\n\n\n\n\n/// @title SEKRETOOOO\ncontract GeneScienceInterface {\n /// @dev simply a boolean to indicate this is the contract we expect to be\n function isGeneScience() public pure returns (bool);\n\n /// @dev given genes of kitten 1 & 2, return a genetic combination - may have a random factor\n /// @param genes1 genes of mom\n /// @param genes2 genes of sire\n /// @return the genes that are supposed to be passed down the child\n function mixGenes(uint256 genes1, uint256 genes2, uint256 targetBlock) public returns (uint256);\n}\n\n\n\n\n\n\n\n/// @title A facet of KittyCore that manages special access privileges.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyAccessControl {\n // This facet controls access control for CryptoKitties. There are four roles managed here:\n //\n // - The CEO: The CEO can reassign other roles and change the addresses of our dependent smart\n // contracts. It is also the only role that can unpause the smart contract. It is initially\n // set to the address that created the smart contract in the KittyCore constructor.\n //\n // - The CFO: The CFO can withdraw funds from KittyCore and its auction contracts.\n //\n // - The COO: The COO can release gen0 kitties to auction, and mint promo cats.\n //\n // It should be noted that these roles are distinct without overlap in their access abilities, the\n // abilities listed for each role above are exhaustive. In particular, while the CEO can assign any\n // address to any role, the CEO address itself doesn't have the ability to act in those roles. This\n // restriction is intentional so that we aren't tempted to use the CEO address frequently out of\n // convenience. The less we use an address, the less likely it is that we somehow compromise the\n // account.\n\n /// @dev Emited when contract is upgraded - See README.md for updgrade plan\n event ContractUpgrade(address newContract);\n\n // The addresses of the accounts (or contracts) that can execute actions within each roles.\n address public ceoAddress;\n address public cfoAddress;\n address public cooAddress;\n\n // @dev Keeps track whether the contract is paused. When that is true, most actions are blocked\n bool public paused = false;\n\n /// @dev Access modifier for CEO-only functionality\n modifier onlyCEO() {\n require(msg.sender == ceoAddress);\n _;\n }\n\n /// @dev Access modifier for CFO-only functionality\n modifier onlyCFO() {\n require(msg.sender == cfoAddress);\n _;\n }\n\n /// @dev Access modifier for COO-only functionality\n modifier onlyCOO() {\n require(msg.sender == cooAddress);\n _;\n }\n\n modifier onlyCLevel() {\n require(\n msg.sender == cooAddress ||\n msg.sender == ceoAddress ||\n msg.sender == cfoAddress\n );\n _;\n }\n\n /// @dev Assigns a new address to act as the CEO. Only available to the current CEO.\n /// @param _newCEO The address of the new CEO\n function setCEO(address _newCEO) external onlyCEO {\n require(_newCEO != address(0));\n\n ceoAddress = _newCEO;\n }\n\n /// @dev Assigns a new address to act as the CFO. Only available to the current CEO.\n /// @param _newCFO The address of the new CFO\n function setCFO(address _newCFO) external onlyCEO {\n require(_newCFO != address(0));\n\n cfoAddress = _newCFO;\n }\n\n /// @dev Assigns a new address to act as the COO. Only available to the current CEO.\n /// @param _newCOO The address of the new COO\n function setCOO(address _newCOO) external onlyCEO {\n require(_newCOO != address(0));\n\n cooAddress = _newCOO;\n }\n\n /*** KittiesPausable functionality adapted from OpenZeppelin ***/\n\n /// @dev Modifier to allow actions only when the contract IS NOT paused\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /// @dev Modifier to allow actions only when the contract IS paused\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /// @dev Called by any \"C-level\" role to pause the contract. Used only when\n /// a bug or exploit is detected and we need to limit damage.\n function pause() external onlyCLevel whenNotPaused {\n paused = true;\n }\n\n /// @dev Unpauses the smart contract. Can only be called by the CEO, since\n /// one reason we may pause the contract is when CFO or COO accounts are\n /// compromised.\n /// @notice This is public rather than external so it can be called by\n /// derived contracts.\n function unpause() public onlyCEO whenPaused {\n // can't unpause if contract was upgraded\n paused = false;\n }\n}\n\n\n\n\n/// @title Base contract for CryptoKitties. Holds all common structs, events and base variables.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBase is KittyAccessControl {\n /*** EVENTS ***/\n\n /// @dev The Birth event is fired whenever a new kitten comes into existence. This obviously\n /// includes any time a cat is created through the giveBirth method, but it is also called\n /// when a new gen0 cat is created.\n event Birth(address owner, uint256 kittyId, uint256 matronId, uint256 sireId, uint256 genes);\n\n /// @dev Transfer event as defined in current draft of ERC721. Emitted every time a kitten\n /// ownership is assigned, including births.\n event Transfer(address from, address to, uint256 tokenId);\n\n /*** DATA TYPES ***/\n\n /// @dev The main Kitty struct. Every cat in CryptoKitties is represented by a copy\n /// of this structure, so great care was taken to ensure that it fits neatly into\n /// exactly two 256-bit words. Note that the order of the members in this structure\n /// is important because of the byte-packing rules used by Ethereum.\n /// Ref: http://solidity.readthedocs.io/en/develop/miscellaneous.html\n struct Kitty {\n // The Kitty's genetic code is packed into these 256-bits, the format is\n // sooper-sekret! A cat's genes never change.\n uint256 genes;\n\n // The timestamp from the block when this cat came into existence.\n uint64 birthTime;\n\n // The minimum timestamp after which this cat can engage in breeding\n // activities again. This same timestamp is used for the pregnancy\n // timer (for matrons) as well as the siring cooldown.\n uint64 cooldownEndBlock;\n\n // The ID of the parents of this kitty, set to 0 for gen0 cats.\n // Note that using 32-bit unsigned integers limits us to a \"mere\"\n // 4 billion cats. This number might seem small until you realize\n // that Ethereum currently has a limit of about 500 million\n // transactions per year! So, this definitely won't be a problem\n // for several years (even as Ethereum learns to scale).\n uint32 matronId;\n uint32 sireId;\n\n // Set to the ID of the sire cat for matrons that are pregnant,\n // zero otherwise. A non-zero value here is how we know a cat\n // is pregnant. Used to retrieve the genetic material for the new\n // kitten when the birth transpires.\n uint32 siringWithId;\n\n // Set to the index in the cooldown array (see below) that represents\n // the current cooldown duration for this Kitty. This starts at zero\n // for gen0 cats, and is initialized to floor(generation/2) for others.\n // Incremented by one for each successful breeding action, regardless\n // of whether this cat is acting as matron or sire.\n uint16 cooldownIndex;\n\n // The \"generation number\" of this cat. Cats minted by the CK contract\n // for sale are called \"gen0\" and have a generation number of 0. The\n // generation number of all other cats is the larger of the two generation\n // numbers of their parents, plus one.\n // (i.e. max(matron.generation, sire.generation) + 1)\n uint16 generation;\n }\n\n /*** CONSTANTS ***/\n\n /// @dev A lookup table indicating the cooldown duration after any successful\n /// breeding action, called \"pregnancy time\" for matrons and \"siring cooldown\"\n /// for sires. Designed such that the cooldown roughly doubles each time a cat\n /// is bred, encouraging owners not to just keep breeding the same cat over\n /// and over again. Caps out at one week (a cat can breed an unbounded number\n /// of times, and the maximum cooldown is always seven days).\n uint32[14] public cooldowns = [\n uint32(1 minutes),\n uint32(2 minutes),\n uint32(5 minutes),\n uint32(10 minutes),\n uint32(30 minutes),\n uint32(1 hours),\n uint32(2 hours),\n uint32(4 hours),\n uint32(8 hours),\n uint32(16 hours),\n uint32(1 days),\n uint32(2 days),\n uint32(4 days),\n uint32(7 days)\n ];\n\n // An approximation of currently how many seconds are in between blocks.\n uint256 public secondsPerBlock = 15;\n\n /*** STORAGE ***/\n\n /// @dev An array containing the Kitty struct for all Kitties in existence. The ID\n /// of each cat is actually an index into this array. Note that ID 0 is a negacat,\n /// the unKitty, the mythical beast that is the parent of all gen0 cats. A bizarre\n /// creature that is both matron and sire... to itself! Has an invalid genetic code.\n /// In other words, cat ID 0 is invalid... ;-)\n Kitty[] kitties;\n\n /// @dev A mapping from cat IDs to the address that owns them. All cats have\n /// some valid owner address, even gen0 cats are created with a non-zero owner.\n mapping (uint256 => address) public kittyIndexToOwner;\n\n // @dev A mapping from owner address to count of tokens that address owns.\n // Used internally inside balanceOf() to resolve ownership count.\n mapping (address => uint256) ownershipTokenCount;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to call\n /// transferFrom(). Each Kitty can only have one approved address for transfer\n /// at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public kittyIndexToApproved;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to use\n /// this Kitty for siring via breedWith(). Each Kitty can only have one approved\n /// address for siring at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public sireAllowedToAddress;\n\n /// @dev The address of the ClockAuction contract that handles sales of Kitties. This\n /// same contract handles both peer-to-peer sales as well as the gen0 sales which are\n /// initiated every 15 minutes.\n SaleClockAuction public saleAuction;\n\n /// @dev The address of a custom ClockAuction subclassed contract that handles siring\n /// auctions. Needs to be separate from saleAuction because the actions taken on success\n /// after a sales and siring auction are quite different.\n SiringClockAuction public siringAuction;\n\n /// @dev Assigns ownership of a specific Kitty to an address.\n function _transfer(address _from, address _to, uint256 _tokenId) internal {\n // Since the number of kittens is capped to 2^32 we can't overflow this\n ownershipTokenCount[_to]++;\n // transfer ownership\n kittyIndexToOwner[_tokenId] = _to;\n // When creating new kittens _from is 0x0, but we can't account that address.\n if (_from != address(0)) {\n ownershipTokenCount[_from]--;\n // once the kitten is transferred also clear sire allowances\n delete sireAllowedToAddress[_tokenId];\n // clear any previously approved ownership exchange\n delete kittyIndexToApproved[_tokenId];\n }\n // Emit the transfer event.\n Transfer(_from, _to, _tokenId);\n }\n\n /// @dev An internal method that creates a new kitty and stores it. This\n /// method doesn't do any checking and should only be called when the\n /// input data is known to be valid. Will generate both a Birth event\n /// and a Transfer event.\n /// @param _matronId The kitty ID of the matron of this cat (zero for gen0)\n /// @param _sireId The kitty ID of the sire of this cat (zero for gen0)\n /// @param _generation The generation number of this cat, must be computed by caller.\n /// @param _genes The kitty's genetic code.\n /// @param _owner The inital owner of this cat, must be non-zero (except for the unKitty, ID 0)\n function _createKitty(\n uint256 _matronId,\n uint256 _sireId,\n uint256 _generation,\n uint256 _genes,\n address _owner\n )\n internal\n returns (uint)\n {\n // These requires are not strictly necessary, our calling code should make\n // sure that these conditions are never broken. However! _createKitty() is already\n // an expensive call (for storage), and it doesn't hurt to be especially careful\n // to ensure our data structures are always valid.\n require(_matronId == uint256(uint32(_matronId)));\n require(_sireId == uint256(uint32(_sireId)));\n require(_generation == uint256(uint16(_generation)));\n\n // New kitty starts with the same cooldown as parent gen/2\n uint16 cooldownIndex = uint16(_generation / 2);\n if (cooldownIndex > 13) {\n cooldownIndex = 13;\n }\n\n Kitty memory _kitty = Kitty({\n genes: _genes,\n birthTime: uint64(now),\n cooldownEndBlock: 0,\n matronId: uint32(_matronId),\n sireId: uint32(_sireId),\n siringWithId: 0,\n cooldownIndex: cooldownIndex,\n generation: uint16(_generation)\n });\n uint256 newKittenId = kitties.push(_kitty) - 1;\n\n // It's probably never going to happen, 4 billion cats is A LOT, but\n // let's just be 100% sure we never let this happen.\n require(newKittenId == uint256(uint32(newKittenId)));\n\n // emit the birth event\n Birth(\n _owner,\n newKittenId,\n uint256(_kitty.matronId),\n uint256(_kitty.sireId),\n _kitty.genes\n );\n\n // This will assign ownership, and also emit the Transfer event as\n // per ERC721 draft\n _transfer(0, _owner, newKittenId);\n\n return newKittenId;\n }\n\n // Any C-level can fix how many seconds per blocks are currently observed.\n function setSecondsPerBlock(uint256 secs) external onlyCLevel {\n require(secs < cooldowns[0]);\n secondsPerBlock = secs;\n }\n}\n\n\n\n\n\n/// @title The external contract that is responsible for generating metadata for the kitties,\n/// it has one function that will return the data as bytes.\ncontract KittiesERC721Metadata {\n /// @dev Given a token Id, returns a byte array that is supposed to be converted into string.\n function getMetadata(uint256 _tokenId, string) public view returns (bytes32[4] buffer, uint256 count) {\n if (_tokenId == 1) {\n buffer[0] = \"Hello World! :D\";\n count = 15;\n } else if (_tokenId == 2) {\n buffer[0] = \"I would definitely choose a medi\";\n buffer[1] = \"um length string.\";\n count = 49;\n } else if (_tokenId == 3) {\n buffer[0] = \"Lorem ipsum dolor sit amet, mi e\";\n buffer[1] = \"st accumsan dapibus augue lorem,\";\n buffer[2] = \" tristique vestibulum id, libero\";\n buffer[3] = \" suscipit varius sapien aliquam.\";\n count = 128;\n }\n }\n}\n\n\n/// @title The facet of the CryptoKitties core contract that manages ownership, ERC-721 (draft) compliant.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev Ref: https://github.com/ethereum/EIPs/issues/721\n/// See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyOwnership is KittyBase, KittiesERC721 {\n\n /// @notice Name and symbol of the non fungible token, as defined in ERC721.\n string public constant name = \"CryptoKitties\";\n string public constant symbol = \"CK\";\n\n // The contract that will return kitty metadata\n KittiesERC721Metadata public erc721Metadata;\n\n bytes4 constant InterfaceSignature_ERC165 =\n bytes4(keccak256('supportsInterface(bytes4)'));\n\n bytes4 constant InterfaceSignature_ERC721 =\n bytes4(keccak256('name()')) ^\n bytes4(keccak256('symbol()')) ^\n bytes4(keccak256('totalSupply()')) ^\n bytes4(keccak256('balanceOf(address)')) ^\n bytes4(keccak256('ownerOf(uint256)')) ^\n bytes4(keccak256('approve(address,uint256)')) ^\n bytes4(keccak256('transfer(address,uint256)')) ^\n bytes4(keccak256('transferFrom(address,address,uint256)')) ^\n bytes4(keccak256('tokensOfOwner(address)')) ^\n bytes4(keccak256('tokenMetadata(uint256,string)'));\n\n /// @notice Introspection interface as per ERC-165 (https://github.com/ethereum/EIPs/issues/165).\n /// Returns true for any standardized interfaces implemented by this contract. We implement\n /// ERC-165 (obviously!) and ERC-721.\n function supportsInterface(bytes4 _interfaceID) external view returns (bool)\n {\n // DEBUG ONLY\n //require((InterfaceSignature_ERC165 == 0x01ffc9a7) && (InterfaceSignature_ERC721 == 0x9a20483d));\n\n return ((_interfaceID == InterfaceSignature_ERC165) || (_interfaceID == InterfaceSignature_ERC721));\n }\n\n /// @dev Set the address of the sibling contract that tracks metadata.\n /// CEO only.\n function setMetadataAddress(address _contractAddress) public onlyCEO {\n erc721Metadata = KittiesERC721Metadata(_contractAddress);\n }\n\n // Internal utility functions: These functions all assume that their input arguments\n // are valid. We leave it to public methods to sanitize their inputs and follow\n // the required logic.\n\n /// @dev Checks if a given address is the current owner of a particular Kitty.\n /// @param _claimant the address we are validating against.\n /// @param _tokenId kitten id, only valid when > 0\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToOwner[_tokenId] == _claimant;\n }\n\n /// @dev Checks if a given address currently has transferApproval for a particular Kitty.\n /// @param _claimant the address we are confirming kitten is approved for.\n /// @param _tokenId kitten id, only valid when > 0\n function _approvedFor(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToApproved[_tokenId] == _claimant;\n }\n\n /// @dev Marks an address as being approved for transferFrom(), overwriting any previous\n /// approval. Setting _approved to address(0) clears all transfer approval.\n /// NOTE: _approve() does NOT send the Approval event. This is intentional because\n /// _approve() and transferFrom() are used together for putting Kitties on auction, and\n /// there is no value in spamming the log with Approval events in that case.\n function _approve(uint256 _tokenId, address _approved) internal {\n kittyIndexToApproved[_tokenId] = _approved;\n }\n\n /// @notice Returns the number of Kitties owned by a specific address.\n /// @param _owner The owner address to check.\n /// @dev Required for ERC-721 compliance\n function balanceOf(address _owner) public view returns (uint256 count) {\n return ownershipTokenCount[_owner];\n }\n\n /// @notice Transfers a Kitty to another address. If transferring to a smart\n /// contract be VERY CAREFUL to ensure that it is aware of ERC-721 (or\n /// CryptoKitties specifically) or your Kitty may be lost forever. Seriously.\n /// @param _to The address of the recipient, can be a user or contract.\n /// @param _tokenId The ID of the Kitty to transfer.\n /// @dev Required for ERC-721 compliance.\n function transfer(\n address _to,\n uint256 _tokenId\n )\n external\n whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Disallow transfers to the auction contracts to prevent accidental\n // misuse. Auction contracts should only take ownership of kitties\n // through the allow + transferFrom flow.\n require(_to != address(saleAuction));\n require(_to != address(siringAuction));\n\n // You can only send your own cat.\n require(_owns(msg.sender, _tokenId));\n\n // Reassign ownership, clear pending approvals, emit Transfer event.\n _transfer(msg.sender, _to, _tokenId);\n }\n\n /// @notice Grant another address the right to transfer a specific Kitty via\n /// transferFrom(). This is the preferred flow for transfering NFTs to contracts.\n /// @param _to The address to be granted transfer approval. Pass address(0) to\n /// clear all approvals.\n /// @param _tokenId The ID of the Kitty that can be transferred if this call succeeds.\n /// @dev Required for ERC-721 compliance.\n function approve(\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Only an owner can grant transfer approval.\n require(_owns(msg.sender, _tokenId));\n\n // Register the approval (replacing any previous approval).\n _approve(_tokenId, _to);\n\n // Emit approval event.\n Approval(msg.sender, _to, _tokenId);\n }\n\n /// @notice Transfer a Kitty owned by another address, for which the calling address\n /// has previously been granted transfer approval by the owner.\n /// @param _from The address that owns the Kitty to be transfered.\n /// @param _to The address that should take ownership of the Kitty. Can be any address,\n /// including the caller.\n /// @param _tokenId The ID of the Kitty to be transferred.\n /// @dev Required for ERC-721 compliance.\n function transferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Check for approval and valid ownership\n require(_approvedFor(msg.sender, _tokenId));\n require(_owns(_from, _tokenId));\n\n // Reassign ownership (also clears pending approvals and emits Transfer event).\n _transfer(_from, _to, _tokenId);\n }\n\n /// @notice Returns the total number of Kitties currently in existence.\n /// @dev Required for ERC-721 compliance.\n function totalSupply() public view returns (uint) {\n return kitties.length - 1;\n }\n\n /// @notice Returns the address currently assigned ownership of a given Kitty.\n /// @dev Required for ERC-721 compliance.\n function ownerOf(uint256 _tokenId)\n external\n view\n returns (address owner)\n {\n owner = kittyIndexToOwner[_tokenId];\n\n require(owner != address(0));\n }\n\n /// @notice Returns a list of all Kitty IDs assigned to an address.\n /// @param _owner The owner whose Kitties we are interested in.\n /// @dev This method MUST NEVER be called by smart contract code. First, it's fairly\n /// expensive (it walks the entire Kitty array looking for cats belonging to owner),\n /// but it also returns a dynamic array, which is only supported for web3 calls, and\n /// not contract-to-contract calls.\n function tokensOfOwner(address _owner) external view returns(uint256[] ownerTokens) {\n uint256 tokenCount = balanceOf(_owner);\n\n if (tokenCount == 0) {\n // Return an empty array\n return new uint256[](0);\n } else {\n uint256[] memory result = new uint256[](tokenCount);\n uint256 totalCats = totalSupply();\n uint256 resultIndex = 0;\n\n // We count on the fact that all cats have IDs starting at 1 and increasing\n // sequentially up to the totalCat count.\n uint256 catId;\n\n for (catId = 1; catId <= totalCats; catId++) {\n if (kittyIndexToOwner[catId] == _owner) {\n result[resultIndex] = catId;\n resultIndex++;\n }\n }\n\n return result;\n }\n }\n\n /// @dev Adapted from memcpy() by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _memcpy(uint _dest, uint _src, uint _len) private view {\n // Copy word-length chunks while possible\n for(; _len >= 32; _len -= 32) {\n assembly {\n mstore(_dest, mload(_src))\n }\n _dest += 32;\n _src += 32;\n }\n\n // Copy remaining bytes\n uint256 mask = 256 ** (32 - _len) - 1;\n assembly {\n let srcpart := and(mload(_src), not(mask))\n let destpart := and(mload(_dest), mask)\n mstore(_dest, or(destpart, srcpart))\n }\n }\n\n /// @dev Adapted from toString(slice) by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _toString(bytes32[4] _rawBytes, uint256 _stringLength) private view returns (string) {\n var outputString = new string(_stringLength);\n uint256 outputPtr;\n uint256 bytesPtr;\n\n assembly {\n outputPtr := add(outputString, 32)\n bytesPtr := _rawBytes\n }\n\n _memcpy(outputPtr, bytesPtr, _stringLength);\n\n return outputString;\n }\n\n /// @notice Returns a URI pointing to a metadata package for this token conforming to\n /// ERC-721 (https://github.com/ethereum/EIPs/issues/721)\n /// @param _tokenId The ID number of the Kitty whose metadata should be returned.\n function tokenMetadata(uint256 _tokenId, string _preferredTransport) external view returns (string infoUrl) {\n require(erc721Metadata != address(0));\n bytes32[4] memory buffer;\n uint256 count;\n (buffer, count) = erc721Metadata.getMetadata(_tokenId, _preferredTransport);\n\n return _toString(buffer, count);\n }\n}\n\n\n\n/// @title A facet of KittyCore that manages Kitty siring, gestation, and birth.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBreeding is KittyOwnership {\n\n /// @dev The Pregnant event is fired when two cats successfully breed and the pregnancy\n /// timer begins for the matron.\n event Pregnant(address owner, uint256 matronId, uint256 sireId, uint256 cooldownEndBlock);\n\n /// @notice The minimum payment required to use breedWithAuto(). This fee goes towards\n /// the gas cost paid by whatever calls giveBirth(), and can be dynamically updated by\n /// the COO role as the gas price changes.\n uint256 public autoBirthFee = 2 finney;\n\n // Keeps track of number of pregnant kitties.\n uint256 public pregnantKitties;\n\n /// @dev The address of the sibling contract that is used to implement the sooper-sekret\n /// genetic combination algorithm.\n GeneScienceInterface public geneScience;\n\n /// @dev Update the address of the genetic contract, can only be called by the CEO.\n /// @param _address An address of a GeneScience contract instance to be used from this point forward.\n function setGeneScienceAddress(address _address) external onlyCEO {\n GeneScienceInterface candidateContract = GeneScienceInterface(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isGeneScience());\n\n // Set the new contract address\n geneScience = candidateContract;\n }\n\n /// @dev Checks that a given kitten is able to breed. Requires that the\n /// current cooldown is finished (for sires) and also checks that there is\n /// no pending pregnancy.\n function _isReadyToBreed(Kitty _kit) internal view returns (bool) {\n // In addition to checking the cooldownEndBlock, we also need to check to see if\n // the cat has a pending birth; there can be some period of time between the end\n // of the pregnacy timer and the birth event.\n return (_kit.siringWithId == 0) && (_kit.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @dev Check if a sire has authorized breeding with this matron. True if both sire\n /// and matron have the same owner, or if the sire has given siring permission to\n /// the matron's owner (via approveSiring()).\n function _isSiringPermitted(uint256 _sireId, uint256 _matronId) internal view returns (bool) {\n address matronOwner = kittyIndexToOwner[_matronId];\n address sireOwner = kittyIndexToOwner[_sireId];\n\n // Siring is okay if they have same owner, or if the matron's owner was given\n // permission to breed with this sire.\n return (matronOwner == sireOwner || sireAllowedToAddress[_sireId] == matronOwner);\n }\n\n /// @dev Set the cooldownEndTime for the given Kitty, based on its current cooldownIndex.\n /// Also increments the cooldownIndex (unless it has hit the cap).\n /// @param _kitten A reference to the Kitty in storage which needs its timer started.\n function _triggerCooldown(Kitty storage _kitten) internal {\n // Compute an estimation of the cooldown time in blocks (based on current cooldownIndex).\n _kitten.cooldownEndBlock = uint64((cooldowns[_kitten.cooldownIndex]/secondsPerBlock) + block.number);\n\n // Increment the breeding count, clamping it at 13, which is the length of the\n // cooldowns array. We could check the array size dynamically, but hard-coding\n // this as a constant saves gas. Yay, Solidity!\n if (_kitten.cooldownIndex < 13) {\n _kitten.cooldownIndex += 1;\n }\n }\n\n /// @notice Grants approval to another user to sire with one of your Kitties.\n /// @param _addr The address that will be able to sire with your Kitty. Set to\n /// address(0) to clear all siring approvals for this Kitty.\n /// @param _sireId A Kitty that you own that _addr will now be able to sire with.\n function approveSiring(address _addr, uint256 _sireId)\n external\n whenNotPaused\n {\n require(_owns(msg.sender, _sireId));\n sireAllowedToAddress[_sireId] = _addr;\n }\n\n /// @dev Updates the minimum payment required for calling giveBirthAuto(). Can only\n /// be called by the COO address. (This fee is used to offset the gas cost incurred\n /// by the autobirth daemon).\n function setAutoBirthFee(uint256 val) external onlyCOO {\n autoBirthFee = val;\n }\n\n /// @dev Checks to see if a given Kitty is pregnant and (if so) if the gestation\n /// period has passed.\n function _isReadyToGiveBirth(Kitty _matron) private view returns (bool) {\n return (_matron.siringWithId != 0) && (_matron.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @notice Checks that a given kitten is able to breed (i.e. it is not pregnant or\n /// in the middle of a siring cooldown).\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isReadyToBreed(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n Kitty storage kit = kitties[_kittyId];\n return _isReadyToBreed(kit);\n }\n\n /// @dev Checks whether a kitty is currently pregnant.\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isPregnant(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n // A kitty is pregnant if and only if this field is set\n return kitties[_kittyId].siringWithId != 0;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair. DOES NOT\n /// check ownership permissions (that is up to the caller).\n /// @param _matron A reference to the Kitty struct of the potential matron.\n /// @param _matronId The matron's ID.\n /// @param _sire A reference to the Kitty struct of the potential sire.\n /// @param _sireId The sire's ID\n function _isValidMatingPair(\n Kitty storage _matron,\n uint256 _matronId,\n Kitty storage _sire,\n uint256 _sireId\n )\n private\n view\n returns(bool)\n {\n // A Kitty can't breed with itself!\n if (_matronId == _sireId) {\n return false;\n }\n\n // Kitties can't breed with their parents.\n if (_matron.matronId == _sireId || _matron.sireId == _sireId) {\n return false;\n }\n if (_sire.matronId == _matronId || _sire.sireId == _matronId) {\n return false;\n }\n\n // We can short circuit the sibling check (below) if either cat is\n // gen zero (has a matron ID of zero).\n if (_sire.matronId == 0 || _matron.matronId == 0) {\n return true;\n }\n\n // Kitties can't breed with full or half siblings.\n if (_sire.matronId == _matron.matronId || _sire.matronId == _matron.sireId) {\n return false;\n }\n if (_sire.sireId == _matron.matronId || _sire.sireId == _matron.sireId) {\n return false;\n }\n\n // Everything seems cool! Let's get DTF.\n return true;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair for\n /// breeding via auction (i.e. skips ownership and siring approval checks).\n function _canBreedWithViaAuction(uint256 _matronId, uint256 _sireId)\n internal\n view\n returns (bool)\n {\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId);\n }\n\n /// @notice Checks to see if two cats can breed together, including checks for\n /// ownership and siring approvals. Does NOT check that both cats are ready for\n /// breeding (i.e. breedWith could still fail until the cooldowns are finished).\n /// TODO: Shouldn't this check pregnancy and cooldowns?!?\n /// @param _matronId The ID of the proposed matron.\n /// @param _sireId The ID of the proposed sire.\n function canBreedWith(uint256 _matronId, uint256 _sireId)\n external\n view\n returns(bool)\n {\n require(_matronId > 0);\n require(_sireId > 0);\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId) &&\n _isSiringPermitted(_sireId, _matronId);\n }\n\n /// @dev Internal utility function to initiate breeding, assumes that all breeding\n /// requirements have been checked.\n function _breedWith(uint256 _matronId, uint256 _sireId) internal {\n // Grab a reference to the Kitties from storage.\n Kitty storage sire = kitties[_sireId];\n Kitty storage matron = kitties[_matronId];\n\n // Mark the matron as pregnant, keeping track of who the sire is.\n matron.siringWithId = uint32(_sireId);\n\n // Trigger the cooldown for both parents.\n _triggerCooldown(sire);\n _triggerCooldown(matron);\n\n // Clear siring permission for both parents. This may not be strictly necessary\n // but it's likely to avoid confusion!\n delete sireAllowedToAddress[_matronId];\n delete sireAllowedToAddress[_sireId];\n\n // Every time a kitty gets pregnant, counter is incremented.\n pregnantKitties++;\n\n // Emit the pregnancy event.\n Pregnant(kittyIndexToOwner[_matronId], _matronId, _sireId, matron.cooldownEndBlock);\n }\n\n /// @notice Breed a Kitty you own (as matron) with a sire that you own, or for which you\n /// have previously been given Siring approval. Will either make your cat pregnant, or will\n /// fail entirely. Requires a pre-payment of the fee given out to the first caller of giveBirth()\n /// @param _matronId The ID of the Kitty acting as matron (will end up pregnant if successful)\n /// @param _sireId The ID of the Kitty acting as sire (will begin its siring cooldown if successful)\n function breedWithAuto(uint256 _matronId, uint256 _sireId)\n external\n payable\n whenNotPaused\n {\n // Checks for payment.\n require(msg.value >= autoBirthFee);\n\n // Caller must own the matron.\n require(_owns(msg.sender, _matronId));\n\n // Neither sire nor matron are allowed to be on auction during a normal\n // breeding operation, but we don't need to check that explicitly.\n // For matron: The caller of this function can't be the owner of the matron\n // because the owner of a Kitty on auction is the auction house, and the\n // auction house will never call breedWith().\n // For sire: Similarly, a sire on auction will be owned by the auction house\n // and the act of transferring ownership will have cleared any oustanding\n // siring approval.\n // Thus we don't need to spend gas explicitly checking to see if either cat\n // is on auction.\n\n // Check that matron and sire are both owned by caller, or that the sire\n // has given siring permission to caller (i.e. matron's owner).\n // Will fail for _sireId = 0\n require(_isSiringPermitted(_sireId, _matronId));\n\n // Grab a reference to the potential matron\n Kitty storage matron = kitties[_matronId];\n\n // Make sure matron isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(matron));\n\n // Grab a reference to the potential sire\n Kitty storage sire = kitties[_sireId];\n\n // Make sure sire isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(sire));\n\n // Test that these cats are a valid mating pair.\n require(_isValidMatingPair(\n matron,\n _matronId,\n sire,\n _sireId\n ));\n\n // All checks passed, kitty gets pregnant!\n _breedWith(_matronId, _sireId);\n }\n\n /// @notice Have a pregnant Kitty give birth!\n /// @param _matronId A Kitty ready to give birth.\n /// @return The Kitty ID of the new kitten.\n /// @dev Looks at a given Kitty and, if pregnant and if the gestation period has passed,\n /// combines the genes of the two parents to create a new kitten. The new Kitty is assigned\n /// to the current owner of the matron. Upon successful completion, both the matron and the\n /// new kitten will be ready to breed again. Note that anyone can call this function (if they\n /// are willing to pay the gas!), but the new kitten always goes to the mother's owner.\n function giveBirth(uint256 _matronId)\n external\n whenNotPaused\n returns(uint256)\n {\n // Grab a reference to the matron in storage.\n Kitty storage matron = kitties[_matronId];\n\n // Check that the matron is a valid cat.\n require(matron.birthTime != 0);\n\n // Check that the matron is pregnant, and that its time has come!\n require(_isReadyToGiveBirth(matron));\n\n // Grab a reference to the sire in storage.\n uint256 sireId = matron.siringWithId;\n Kitty storage sire = kitties[sireId];\n\n // Determine the higher generation number of the two parents\n uint16 parentGen = matron.generation;\n if (sire.generation > matron.generation) {\n parentGen = sire.generation;\n }\n\n // Call the sooper-sekret gene mixing operation.\n uint256 childGenes = geneScience.mixGenes(matron.genes, sire.genes, matron.cooldownEndBlock - 1);\n\n // Make the new kitten!\n address owner = kittyIndexToOwner[_matronId];\n uint256 kittenId = _createKitty(_matronId, matron.siringWithId, parentGen + 1, childGenes, owner);\n\n // Clear the reference to sire from the matron (REQUIRED! Having siringWithId\n // set is what marks a matron as being pregnant.)\n delete matron.siringWithId;\n\n // Every time a kitty gives birth counter is decremented.\n pregnantKitties--;\n\n // Send the balance fee to the person who made birth happen.\n msg.sender.send(autoBirthFee);\n\n // return the new kitten's ID\n return kittenId;\n }\n}\n\n\n\n\n\n\n\n\n\n\n/// @title Auction Core\n/// @dev Contains models, variables, and internal methods for the auction.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuctionBase {\n\n // Represents an auction on an NFT\n struct Auction {\n // Current owner of NFT\n address seller;\n // Price (in wei) at beginning of auction\n uint128 startingPrice;\n // Price (in wei) at end of auction\n uint128 endingPrice;\n // Duration (in seconds) of auction\n uint64 duration;\n // Time when auction started\n // NOTE: 0 if this auction has been concluded\n uint64 startedAt;\n }\n\n // Reference to contract tracking NFT ownership\n KittiesERC721 public nonFungibleContract;\n\n // Cut owner takes on each auction, measured in basis points (1/100 of a percent).\n // Values 0-10,000 map to 0%-100%\n uint256 public ownerCut;\n\n // Map from token ID to their corresponding auction.\n mapping (uint256 => Auction) tokenIdToAuction;\n\n event AuctionCreated(uint256 tokenId, uint256 startingPrice, uint256 endingPrice, uint256 duration);\n event AuctionSuccessful(uint256 tokenId, uint256 totalPrice, address winner);\n event AuctionCancelled(uint256 tokenId);\n\n /// @dev Returns true if the claimant owns the token.\n /// @param _claimant - Address claiming to own the token.\n /// @param _tokenId - ID of token whose ownership to verify.\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return (nonFungibleContract.ownerOf(_tokenId) == _claimant);\n }\n\n /// @dev Escrows the NFT, assigning ownership to this contract.\n /// Throws if the escrow fails.\n /// @param _owner - Current owner address of token to escrow.\n /// @param _tokenId - ID of token whose approval to verify.\n function _escrow(address _owner, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transferFrom(_owner, this, _tokenId);\n }\n\n /// @dev Transfers an NFT owned by this contract to another address.\n /// Returns true if the transfer succeeds.\n /// @param _receiver - Address to transfer NFT to.\n /// @param _tokenId - ID of token to transfer.\n function _transfer(address _receiver, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transfer(_receiver, _tokenId);\n }\n\n /// @dev Adds an auction to the list of open auctions. Also fires the\n /// AuctionCreated event.\n /// @param _tokenId The ID of the token to be put on auction.\n /// @param _auction Auction to add.\n function _addAuction(uint256 _tokenId, Auction _auction) internal {\n // Require that all auctions have a duration of\n // at least one minute. (Keeps our math from getting hairy!)\n require(_auction.duration >= 1 minutes);\n\n tokenIdToAuction[_tokenId] = _auction;\n\n AuctionCreated(\n uint256(_tokenId),\n uint256(_auction.startingPrice),\n uint256(_auction.endingPrice),\n uint256(_auction.duration)\n );\n }\n\n /// @dev Cancels an auction unconditionally.\n function _cancelAuction(uint256 _tokenId, address _seller) internal {\n _removeAuction(_tokenId);\n _transfer(_seller, _tokenId);\n AuctionCancelled(_tokenId);\n }\n\n /// @dev Computes the price and transfers winnings.\n /// Does NOT transfer ownership of token.\n function _bid(uint256 _tokenId, uint256 _bidAmount)\n internal\n returns (uint256)\n {\n // Get a reference to the auction struct\n Auction storage auction = tokenIdToAuction[_tokenId];\n\n // Explicitly check that this auction is currently live.\n // (Because of how Ethereum mappings work, we can't just count\n // on the lookup above failing. An invalid _tokenId will just\n // return an auction object that is all zeros.)\n require(_isOnAuction(auction));\n\n // Check that the bid is greater than or equal to the current price\n uint256 price = _currentPrice(auction);\n require(_bidAmount >= price);\n\n // Grab a reference to the seller before the auction struct\n // gets deleted.\n address seller = auction.seller;\n\n // The bid is good! Remove the auction before sending the fees\n // to the sender so we can't have a reentrancy attack.\n _removeAuction(_tokenId);\n\n // Transfer proceeds to seller (if there are any!)\n if (price > 0) {\n // Calculate the auctioneer's cut.\n // (NOTE: _computeCut() is guaranteed to return a\n // value <= price, so this subtraction can't go negative.)\n uint256 auctioneerCut = _computeCut(price);\n uint256 sellerProceeds = price - auctioneerCut;\n\n // NOTE: Doing a transfer() in the middle of a complex\n // method like this is generally discouraged because of\n // reentrancy attacks and DoS attacks if the seller is\n // a contract with an invalid fallback function. We explicitly\n // guard against reentrancy attacks by removing the auction\n // before calling transfer(), and the only thing the seller\n // can DoS is the sale of their own asset! (And if it's an\n // accident, they can call cancelAuction(). )\n seller.transfer(sellerProceeds);\n }\n\n // Calculate any excess funds included with the bid. If the excess\n // is anything worth worrying about, transfer it back to bidder.\n // NOTE: We checked above that the bid amount is greater than or\n // equal to the price so this cannot underflow.\n uint256 bidExcess = _bidAmount - price;\n\n // Return the funds. Similar to the previous transfer, this is\n // not susceptible to a re-entry attack because the auction is\n // removed before any transfers occur.\n msg.sender.transfer(bidExcess);\n\n // Tell the world!\n AuctionSuccessful(_tokenId, price, msg.sender);\n\n return price;\n }\n\n /// @dev Removes an auction from the list of open auctions.\n /// @param _tokenId - ID of NFT on auction.\n function _removeAuction(uint256 _tokenId) internal {\n delete tokenIdToAuction[_tokenId];\n }\n\n /// @dev Returns true if the NFT is on auction.\n /// @param _auction - Auction to check.\n function _isOnAuction(Auction storage _auction) internal view returns (bool) {\n return (_auction.startedAt > 0);\n }\n\n /// @dev Returns current price of an NFT on auction. Broken into two\n /// functions (this one, that computes the duration from the auction\n /// structure, and the other that does the price computation) so we\n /// can easily test that the price computation works correctly.\n function _currentPrice(Auction storage _auction)\n internal\n view\n returns (uint256)\n {\n uint256 secondsPassed = 0;\n\n // A bit of insurance against negative values (or wraparound).\n // Probably not necessary (since Ethereum guarnatees that the\n // now variable doesn't ever go backwards).\n if (now > _auction.startedAt) {\n secondsPassed = now - _auction.startedAt;\n }\n\n return _computeCurrentPrice(\n _auction.startingPrice,\n _auction.endingPrice,\n _auction.duration,\n secondsPassed\n );\n }\n\n /// @dev Computes the current price of an auction. Factored out\n /// from _currentPrice so we can run extensive unit tests.\n /// When testing, make this function public and turn on\n /// `Current price computation` test suite.\n function _computeCurrentPrice(\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n uint256 _secondsPassed\n )\n internal\n pure\n returns (uint256)\n {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our public functions carefully cap the maximum values for\n // time (at 64-bits) and currency (at 128-bits). _duration is\n // also known to be non-zero (see the require() statement in\n // _addAuction())\n if (_secondsPassed >= _duration) {\n // We've reached the end of the dynamic pricing portion\n // of the auction, just return the end price.\n return _endingPrice;\n } else {\n // Starting price can be higher than ending price (and often is!), so\n // this delta can be negative.\n int256 totalPriceChange = int256(_endingPrice) - int256(_startingPrice);\n\n // This multiplication can't overflow, _secondsPassed will easily fit within\n // 64-bits, and totalPriceChange will easily fit within 128-bits, their product\n // will always fit within 256-bits.\n int256 currentPriceChange = totalPriceChange * int256(_secondsPassed) / int256(_duration);\n\n // currentPriceChange can be negative, but if so, will have a magnitude\n // less that _startingPrice. Thus, this result will always end up positive.\n int256 currentPrice = int256(_startingPrice) + currentPriceChange;\n\n return uint256(currentPrice);\n }\n }\n\n /// @dev Computes owner's cut of a sale.\n /// @param _price - Sale price of NFT.\n function _computeCut(uint256 _price) internal view returns (uint256) {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our entry functions carefully cap the maximum values for\n // currency (at 128-bits), and ownerCut <= 10000 (see the require()\n // statement in the ClockAuction constructor). The result of this\n // function is always guaranteed to be <= _price.\n return _price * ownerCut / 10000;\n }\n\n}\n\n\n\n\n\n\n\n/**\n * @title KittiesPausable\n * @dev Base contract which allows children to implement an emergency stop mechanism.\n */\ncontract KittiesPausable is KittiesOwnable {\n event Pause();\n event Unpause();\n\n bool public paused = false;\n\n\n /**\n\t * @dev modifier to allow actions only when the contract IS paused\n\t */\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /**\n\t * @dev modifier to allow actions only when the contract IS NOT paused\n\t */\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /**\n\t * @dev called by the owner to pause, triggers stopped state\n\t */\n function pause() onlyOwner whenNotPaused returns (bool) {\n paused = true;\n Pause();\n return true;\n }\n\n /**\n\t * @dev called by the owner to unpause, returns to normal state\n\t */\n function unpause() onlyOwner whenPaused returns (bool) {\n paused = false;\n Unpause();\n return true;\n }\n}\n\n\n/// @title Clock auction for non-fungible tokens.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuction is KittiesPausable, ClockAuctionBase {\n\n /// @dev The ERC-165 interface signature for ERC-721.\n /// Ref: https://github.com/ethereum/EIPs/issues/165\n /// Ref: https://github.com/ethereum/EIPs/issues/721\n bytes4 constant InterfaceSignature_ERC721 = bytes4(0x9a20483d);\n\n /// @dev Constructor creates a reference to the NFT ownership contract\n /// and verifies the owner cut is in the valid range.\n /// @param _nftAddress - address of a deployed contract implementing\n /// the Nonfungible Interface.\n /// @param _cut - percent cut the owner takes on each auction, must be\n /// between 0-10,000.\n function ClockAuction(address _nftAddress, uint256 _cut) public {\n require(_cut <= 10000);\n ownerCut = _cut;\n\n KittiesERC721 candidateContract = KittiesERC721(_nftAddress);\n require(candidateContract.supportsInterface(InterfaceSignature_ERC721));\n nonFungibleContract = candidateContract;\n }\n\n /// @dev Remove all Ether from the contract, which is the owner's cuts\n /// as well as any Ether sent directly to the contract address.\n /// Always transfers to the NFT contract, but can be called either by\n /// the owner or the NFT contract.\n function withdrawBalance() external {\n address nftAddress = address(nonFungibleContract);\n\n require(\n msg.sender == owner ||\n msg.sender == nftAddress\n );\n // We are using this boolean method to make sure that even if one fails it will still work\n bool res = nftAddress.send(this.balance);\n }\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of time to move between starting\n /// price and ending price (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n whenNotPaused\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(_owns(msg.sender, _tokenId));\n _escrow(msg.sender, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Bids on an open auction, completing the auction and transferring\n /// ownership of the NFT if enough Ether is supplied.\n /// @param _tokenId - ID of token to bid on.\n function bid(uint256 _tokenId)\n external\n payable\n whenNotPaused\n {\n // _bid will throw if the bid or funds transfer fails\n _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n }\n\n /// @dev Cancels an auction that hasn't been won yet.\n /// Returns the NFT to original owner.\n /// @notice This is a state-modifying function that can\n /// be called while the contract is paused.\n /// @param _tokenId - ID of token on auction\n function cancelAuction(uint256 _tokenId)\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n address seller = auction.seller;\n require(msg.sender == seller);\n _cancelAuction(_tokenId, seller);\n }\n\n /// @dev Cancels an auction when the contract is paused.\n /// Only the owner may do this, and NFTs are returned to\n /// the seller. This should only be used in emergencies.\n /// @param _tokenId - ID of the NFT on auction to cancel.\n function cancelAuctionWhenPaused(uint256 _tokenId)\n whenPaused\n onlyOwner\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n _cancelAuction(_tokenId, auction.seller);\n }\n\n /// @dev Returns auction info for an NFT on auction.\n /// @param _tokenId - ID of NFT on auction.\n function getAuction(uint256 _tokenId)\n external\n view\n returns\n (\n address seller,\n uint256 startingPrice,\n uint256 endingPrice,\n uint256 duration,\n uint256 startedAt\n ) {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return (\n auction.seller,\n auction.startingPrice,\n auction.endingPrice,\n auction.duration,\n auction.startedAt\n );\n }\n\n /// @dev Returns the current price of an auction.\n /// @param _tokenId - ID of the token price we are checking.\n function getCurrentPrice(uint256 _tokenId)\n external\n view\n returns (uint256)\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return _currentPrice(auction);\n }\n\n}\n\n\n/// @title Reverse auction modified for siring\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SiringClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSiringAuctionAddress() call.\n bool public isSiringClockAuction = true;\n\n // Delegate constructor\n function SiringClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction. Since this function is wrapped,\n /// require sender to be KittyCore contract.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Places a bid for siring. Requires the sender\n /// is the KittyCore contract because all bid methods\n /// should be wrapped. Also returns the kitty to the\n /// seller rather than the winner.\n function bid(uint256 _tokenId)\n external\n payable\n {\n require(msg.sender == address(nonFungibleContract));\n address seller = tokenIdToAuction[_tokenId].seller;\n // _bid checks that token ID is valid and will throw if bid fails\n _bid(_tokenId, msg.value);\n // We transfer the kitty back to the seller, the winner will get\n // the offspring\n _transfer(seller, _tokenId);\n }\n\n}\n\n\n\n\n\n/// @title Clock auction modified for sale of kitties\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SaleClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSaleAuctionAddress() call.\n bool public isSaleClockAuction = true;\n\n // Tracks last 5 sale price of gen0 kitty sales\n uint256 public gen0SaleCount;\n uint256[5] public lastGen0SalePrices;\n\n // Delegate constructor\n function SaleClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Updates lastSalePrice if seller is the nft contract\n /// Otherwise, works the same as default bid method.\n function bid(uint256 _tokenId)\n external\n payable\n {\n // _bid verifies token ID size\n address seller = tokenIdToAuction[_tokenId].seller;\n uint256 price = _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n\n // If not a gen0 auction, exit\n if (seller == address(nonFungibleContract)) {\n // Track gen0 sale prices\n lastGen0SalePrices[gen0SaleCount % 5] = price;\n gen0SaleCount++;\n }\n }\n\n function averageGen0SalePrice() external view returns (uint256) {\n uint256 sum = 0;\n for (uint256 i = 0; i < 5; i++) {\n sum += lastGen0SalePrices[i];\n }\n return sum / 5;\n }\n\n}\n\n\n/// @title Handles creating auctions for sale and siring of kitties.\n/// This wrapper of ReverseAuction exists only so that users can create\n/// auctions with only one transaction.\ncontract KittyAuction is KittyBreeding {\n\n // @notice The auction contract variables are defined in KittyBase to allow\n // us to refer to them in KittyOwnership to prevent accidental transfers.\n // `saleAuction` refers to the auction for gen0 and p2p sale of kitties.\n // `siringAuction` refers to the auction for siring rights of kitties.\n\n /// @dev Sets the reference to the sale auction.\n /// @param _address - Address of sale contract.\n function setSaleAuctionAddress(address _address) external onlyCEO {\n SaleClockAuction candidateContract = SaleClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSaleClockAuction());\n\n // Set the new contract address\n saleAuction = candidateContract;\n }\n\n /// @dev Sets the reference to the siring auction.\n /// @param _address - Address of siring contract.\n function setSiringAuctionAddress(address _address) external onlyCEO {\n SiringClockAuction candidateContract = SiringClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSiringClockAuction());\n\n // Set the new contract address\n siringAuction = candidateContract;\n }\n\n /// @dev Put a kitty up for auction.\n /// Does some ownership trickery to create auctions in one tx.\n function createSaleAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n // Ensure the kitty is not pregnant to prevent the auction\n // contract accidentally receiving ownership of the child.\n // NOTE: the kitty IS allowed to be in a cooldown.\n require(!isPregnant(_kittyId));\n _approve(_kittyId, saleAuction);\n // Sale auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n saleAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Put a kitty up for auction to be sire.\n /// Performs checks to ensure the kitty can be sired, then\n /// delegates to reverse auction.\n function createSiringAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n require(isReadyToBreed(_kittyId));\n _approve(_kittyId, siringAuction);\n // Siring auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n siringAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Completes a siring auction by bidding.\n /// Immediately breeds the winning matron with the sire on auction.\n /// @param _sireId - ID of the sire on auction.\n /// @param _matronId - ID of the matron owned by the bidder.\n function bidOnSiringAuction(\n uint256 _sireId,\n uint256 _matronId\n )\n external\n payable\n whenNotPaused\n {\n // Auction contract checks input sizes\n require(_owns(msg.sender, _matronId));\n require(isReadyToBreed(_matronId));\n require(_canBreedWithViaAuction(_matronId, _sireId));\n\n // Define the current price of the auction.\n uint256 currentPrice = siringAuction.getCurrentPrice(_sireId);\n require(msg.value >= currentPrice + autoBirthFee);\n\n // Siring auction will throw if the bid fails.\n siringAuction.bid.value(msg.value - autoBirthFee)(_sireId);\n _breedWith(uint32(_matronId), uint32(_sireId));\n }\n\n /// @dev Transfers the balance of the sale auction contract\n /// to the KittyCore contract. We use two-step withdrawal to\n /// prevent two transfer calls in the auction bid function.\n function withdrawAuctionBalances() external onlyCLevel {\n saleAuction.withdrawBalance();\n siringAuction.withdrawBalance();\n }\n}\n\n\n/// @title all functions related to creating kittens\ncontract KittyMinting is KittyAuction {\n\n // Limits the number of cats the contract owner can ever create.\n uint256 public constant PROMO_CREATION_LIMIT = 5000;\n uint256 public constant GEN0_CREATION_LIMIT = 45000;\n\n // Constants for gen0 auctions.\n uint256 public constant GEN0_STARTING_PRICE = 10 finney;\n uint256 public constant GEN0_AUCTION_DURATION = 1 days;\n\n // Counts the number of cats the contract owner has created.\n uint256 public promoCreatedCount;\n uint256 public gen0CreatedCount;\n\n /// @dev we can create promo kittens, up to a limit. Only callable by COO\n /// @param _genes the encoded genes of the kitten to be created, any value is accepted\n /// @param _owner the future owner of the created kittens. Default to contract COO\n function createPromoKitty(uint256 _genes, address _owner) external onlyCOO {\n address kittyOwner = _owner;\n if (kittyOwner == address(0)) {\n kittyOwner = cooAddress;\n }\n require(promoCreatedCount < PROMO_CREATION_LIMIT);\n\n promoCreatedCount++;\n _createKitty(0, 0, 0, _genes, kittyOwner);\n }\n\n /// @dev Creates a new gen0 kitty with the given genes and\n /// creates an auction for it.\n function createGen0Auction(uint256 _genes) external onlyCOO {\n require(gen0CreatedCount < GEN0_CREATION_LIMIT);\n\n uint256 kittyId = _createKitty(0, 0, 0, _genes, address(this));\n _approve(kittyId, saleAuction);\n\n saleAuction.createAuction(\n kittyId,\n _computeNextGen0Price(),\n 0,\n GEN0_AUCTION_DURATION,\n address(this)\n );\n\n gen0CreatedCount++;\n }\n\n /// @dev Computes the next gen0 auction starting price, given\n /// the average of the past 5 prices + 50%.\n function _computeNextGen0Price() internal view returns (uint256) {\n uint256 avePrice = saleAuction.averageGen0SalePrice();\n\n // Sanity check to ensure we don't overflow arithmetic\n require(avePrice == uint256(uint128(avePrice)));\n\n uint256 nextPrice = avePrice + (avePrice / 2);\n\n // We never auction for less than starting price\n if (nextPrice < GEN0_STARTING_PRICE) {\n nextPrice = GEN0_STARTING_PRICE;\n }\n\n return nextPrice;\n }\n}\n\n\n/// @title CryptoKitties: Collectible, breedable, and oh-so-adorable cats on the Ethereum blockchain.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev The main CryptoKitties contract, keeps track of kittens so they don't wander around and get lost.\ncontract KittyCore is KittyMinting {\n\n // This is the main CryptoKitties contract. In order to keep our code seperated into logical sections,\n // we've broken it up in two ways. First, we have several seperately-instantiated sibling contracts\n // that handle auctions and our super-top-secret genetic combination algorithm. The auctions are\n // seperate since their logic is somewhat complex and there's always a risk of subtle bugs. By keeping\n // them in their own contracts, we can upgrade them without disrupting the main contract that tracks\n // kitty ownership. The genetic combination algorithm is kept seperate so we can open-source all of\n // the rest of our code without making it _too_ easy for folks to figure out how the genetics work.\n // Don't worry, I'm sure someone will reverse engineer it soon enough!\n //\n // Secondly, we break the core contract into multiple files using inheritence, one for each major\n // facet of functionality of CK. This allows us to keep related code bundled together while still\n // avoiding a single giant file with everything in it. The breakdown is as follows:\n //\n // - KittyBase: This is where we define the most fundamental code shared throughout the core\n // functionality. This includes our main data storage, constants and data types, plus\n // internal functions for managing these items.\n //\n // - KittyAccessControl: This contract manages the various addresses and constraints for operations\n // that can be executed only by specific roles. Namely CEO, CFO and COO.\n //\n // - KittyOwnership: This provides the methods required for basic non-fungible token\n // transactions, following the draft ERC-721 spec (https://github.com/ethereum/EIPs/issues/721).\n //\n // - KittyBreeding: This file contains the methods necessary to breed cats together, including\n // keeping track of siring offers, and relies on an external genetic combination contract.\n //\n // - KittyAuctions: Here we have the public methods for auctioning or bidding on cats or siring\n // services. The actual auction functionality is handled in two sibling contracts (one\n // for sales and one for siring), while auction creation and bidding is mostly mediated\n // through this facet of the core contract.\n //\n // - KittyMinting: This final facet contains the functionality we use for creating new gen0 cats.\n // We can make up to 5000 \"promo\" cats that can be given away (especially important when\n // the community is new), and all others can only be created and then immediately put up\n // for auction via an algorithmically determined starting price. Regardless of how they\n // are created, there is a hard limit of 50k gen0 cats. After that, it's all up to the\n // community to breed, breed, breed!\n\n // Set in case the core contract is broken and an upgrade is required\n address public newContractAddress;\n\n /// @notice Creates the main CryptoKitties smart contract instance.\n function KittyCore() public {\n // Starts paused.\n paused = true;\n\n // the creator of the contract is the initial CEO\n ceoAddress = msg.sender;\n\n // the creator of the contract is also the initial COO\n cooAddress = msg.sender;\n\n // start with the mythical kitten 0 - so we don't have generation-0 parent issues\n _createKitty(0, 0, 0, uint256(-1), address(0));\n }\n\n /// @dev Used to mark the smart contract as upgraded, in case there is a serious\n /// breaking bug. This method does nothing but keep track of the new contract and\n /// emit a message indicating that the new address is set. It's up to clients of this\n /// contract to update to the new contract address in that case. (This contract will\n /// be paused indefinitely if such an upgrade takes place.)\n /// @param _v2Address new address\n function setNewAddress(address _v2Address) external onlyCEO whenPaused {\n // See README.md for updgrade plan\n newContractAddress = _v2Address;\n ContractUpgrade(_v2Address);\n }\n\n /// @notice No tipping!\n /// @dev Reject all Ether from being sent here, unless it's from one of the\n /// two auction contracts. (Hopefully, we can prevent user accidents.)\n function() external payable {\n require(\n msg.sender == address(saleAuction) ||\n msg.sender == address(siringAuction)\n );\n }\n\n /// @notice Returns all the relevant information about a specific kitty.\n /// @param _id The ID of the kitty of interest.\n function getKitty(uint256 _id)\n external\n view\n returns (\n bool isGestating,\n bool isReady,\n uint256 cooldownIndex,\n uint256 nextActionAt,\n uint256 siringWithId,\n uint256 birthTime,\n uint256 matronId,\n uint256 sireId,\n uint256 generation,\n uint256 genes\n ) {\n Kitty storage kit = kitties[_id];\n\n // if this variable is 0 then it's not gestating\n isGestating = (kit.siringWithId != 0);\n isReady = (kit.cooldownEndBlock <= block.number);\n cooldownIndex = uint256(kit.cooldownIndex);\n nextActionAt = uint256(kit.cooldownEndBlock);\n siringWithId = uint256(kit.siringWithId);\n birthTime = uint256(kit.birthTime);\n matronId = uint256(kit.matronId);\n sireId = uint256(kit.sireId);\n generation = uint256(kit.generation);\n genes = kit.genes;\n }\n\n /// @dev Override unpause so it requires all external contract addresses\n /// to be set before contract can be unpaused. Also, we can't have\n /// newContractAddress set either, because then the contract was upgraded.\n /// @notice This is public rather than external so we can call super.unpause\n /// without using an expensive CALL.\n function unpause() public onlyCEO whenPaused {\n require(saleAuction != address(0));\n require(siringAuction != address(0));\n require(geneScience != address(0));\n require(newContractAddress == address(0));\n\n // Actually unpause the contract.\n super.unpause();\n }\n\n // @dev Allows the CFO to capture the balance available to the contract.\n function withdrawBalance() external onlyCFO {\n uint256 balance = this.balance;\n // Subtract all the currently pregnant kittens we have, plus 1 of margin.\n uint256 subtractFees = (pregnantKitties + 1) * autoBirthFee;\n\n if (balance > subtractFees) {\n cfoAddress.send(balance - subtractFees);\n }\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "exportedSymbols": { "ClockAuction": [ 8872 @@ -52419,5 +52419,5 @@ export const KittyBreeding = }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:47.809Z" + "updatedAt": "2018-10-09T17:45:36.217Z" } \ No newline at end of file diff --git a/artifacts/ts/KittyCore.ts b/artifacts/ts/KittyCore.ts index c3b95858..89f8b818 100644 --- a/artifacts/ts/KittyCore.ts +++ b/artifacts/ts/KittyCore.ts @@ -1105,15 +1105,15 @@ export const KittyCore = "type": "event" } ], - "bytecode": "0x60606040526000600260146101000a81548160ff0219169083151502179055506101c060405190810160405280603c63ffffffff1663ffffffff168152602001607863ffffffff1663ffffffff16815260200161012c63ffffffff1663ffffffff16815260200161025863ffffffff1663ffffffff16815260200161070863ffffffff1663ffffffff168152602001610e1063ffffffff1663ffffffff168152602001611c2063ffffffff1663ffffffff16815260200161384063ffffffff1663ffffffff16815260200161708063ffffffff1663ffffffff16815260200161e10063ffffffff1663ffffffff1681526020016201518063ffffffff1663ffffffff1681526020016202a30063ffffffff1663ffffffff1681526020016205460063ffffffff1663ffffffff16815260200162093a8063ffffffff1663ffffffff16815250600390600e62000156929190620007a8565b50600f60055566071afd498d0000600e5534156200017357600080fd5b6001600260146101000a81548160ff021916908315150217905550336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200025560008060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60006200025c6401000000000262004976176401000000009004565b5062000a00565b6000806200026962000852565b60008863ffffffff16891415156200028057600080fd5b8763ffffffff16881415156200029557600080fd5b8661ffff1687141515620002a857600080fd5b600287811515620002b557fe5b049250600d8361ffff161115620002cb57600d92505b610100604051908101604052808781526020014267ffffffffffffffff168152602001600067ffffffffffffffff1681526020018a63ffffffff1681526020018963ffffffff168152602001600063ffffffff1681526020018461ffff1681526020018861ffff168152509150600160068054806001018281620003509190620008c6565b916000526020600020906002020160008590919091506000820151816000015560208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601c6101000a81548161ffff021916908361ffff16021790555060e082015181600101601e6101000a81548161ffff021916908361ffff16021790555050500390508063ffffffff1681141515620004a357600080fd5b7f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad58582846060015163ffffffff16856080015163ffffffff168660000151604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a162000560600086836200056f6401000000000262004383176401000000009004565b80935050505095945050505050565b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415156200070457600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600a600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556009600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b82600e6007016008900481019282156200083f5791602002820160005b838211156200080b57835183826101000a81548163ffffffff021916908363ffffffff1602179055509260200192600401602081600301049283019260010302620007c5565b80156200083d5782816101000a81549063ffffffff02191690556004016020816003010492830192600103026200080b565b505b5090506200084e9190620008fb565b5090565b6101006040519081016040528060008152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600061ffff168152602001600061ffff1681525090565b815481835581811511620008f657600202816002028360005260206000209182019101620008f5919062000931565b5b505050565b6200092e91905b808211156200092a57600081816101000a81549063ffffffff02191690555060010162000902565b5090565b90565b620009fd91905b80821115620009f9576000808201600090556001820160006101000a81549067ffffffffffffffff02191690556001820160086101000a81549067ffffffffffffffff02191690556001820160106101000a81549063ffffffff02191690556001820160146101000a81549063ffffffff02191690556001820160186101000a81549063ffffffff021916905560018201601c6101000a81549061ffff021916905560018201601e6101000a81549061ffff02191690555060020162000938565b5090565b90565b6153168062000a106000396000f3006060604052600436106102bf576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146103755780630519ce79146103cf5780630560ff441461042457806305e45546146104d457806306fdde03146104fd578063095ea7b31461058b5780630a0f8168146105cd5780630e583df01461062257806314001f4c1461064b57806318160ddd14610684578063183a7947146106ad5780631940a936146106d657806319c2f2011461071157806321717ebf1461073a57806323b872dd1461078f57806324e7a38a146107f057806327d7874c146108295780632ba73c15146108625780633d7d3f5a1461089b5780633f4ba83a146108d957806346116e6f146108ee57806346d22c7014610951578063481af3d3146109955780634ad8c938146109f85780634b85fd5514610a365780634dfff04f14610a595780634e0a337914610a9b5780635612913414610ad45780635663896e14610b165780635c975abb14610b395780635fd8c71014610b665780636352211e14610b7b578063680eba2714610bde5780636af04a5714610c075780636fbde40d14610c5c57806370a0823114610c955780637158798814610ce25780637a7d493714610d1b5780638456cb5914610d445780638462151c14610d5957806388c2a0bf14610de757806391876e5714610e1e57806395d89b4114610e335780639d6fac6f14610ec1578063a45f4bfc14610f04578063a9059cbb14610f67578063b047fb5014610fa9578063b0c35c0514610ffe578063bc4006f514611027578063c3bea9af1461107c578063d3e6f49f1461109f578063defb9584146110da578063e17b25af14611103578063e6cbe3511461113c578063e98b7f4d14611191578063ed60ade61461120f578063f1ca941014611230578063f2b47d5214611259578063f7d8c883146112ae575b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806103685750600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561037357600080fd5b005b341561038057600080fd5b6103b560048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190919050506112cf565b604051808215151515815260200191505060405180910390f35b34156103da57600080fd5b6103e26115e0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561042f57600080fd5b61045960048080359060200190919080359060200190820180359060200191909192905050611606565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561049957808201518184015260208101905061047e565b50505050905090810190601f1680156104c65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156104df57600080fd5b6104e7611771565b6040518082815260200191505060405180910390f35b341561050857600080fd5b610510611777565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610550578082015181840152602081019050610535565b50505050905090810190601f16801561057d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561059657600080fd5b6105cb600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506117b0565b005b34156105d857600080fd5b6105e0611872565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561062d57600080fd5b610635611897565b6040518082815260200191505060405180910390f35b341561065657600080fd5b610682600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506118a2565b005b341561068f57600080fd5b6106976119d9565b6040518082815260200191505060405180910390f35b34156106b857600080fd5b6106c06119e9565b6040518082815260200191505060405180910390f35b34156106e157600080fd5b6106f760048080359060200190919050506119ef565b604051808215151515815260200191505060405180910390f35b341561071c57600080fd5b610724611a41565b6040518082815260200191505060405180910390f35b341561074557600080fd5b61074d611a48565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561079a57600080fd5b6107ee600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611a6e565b005b34156107fb57600080fd5b610827600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611b1f565b005b341561083457600080fd5b610860600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611c56565b005b341561086d57600080fd5b610899600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611d30565b005b34156108a657600080fd5b6108d76004808035906020019091908035906020019091908035906020019091908035906020019091905050611e0b565b005b34156108e457600080fd5b6108ec611f73565b005b34156108f957600080fd5b61090f600480803590602001909190505061216a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561095c57600080fd5b61097b600480803590602001909190803590602001909190505061219d565b604051808215151515815260200191505060405180910390f35b34156109a057600080fd5b6109b66004808035906020019091905050612225565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610a0357600080fd5b610a346004808035906020019091908035906020019091908035906020019091908035906020019091905050612258565b005b3415610a4157600080fd5b610a5760048080359060200190919050506123bf565b005b3415610a6457600080fd5b610a99600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050612425565b005b3415610aa657600080fd5b610ad2600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506124ac565b005b3415610adf57600080fd5b610b14600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612587565b005b3415610b2157600080fd5b610b37600480803590602001909190505061267c565b005b3415610b4457600080fd5b610b4c6127d0565b604051808215151515815260200191505060405180910390f35b3415610b7157600080fd5b610b796127e3565b005b3415610b8657600080fd5b610b9c60048080359060200190919050506128cf565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610be957600080fd5b610bf1612948565b6040518082815260200191505060405180910390f35b3415610c1257600080fd5b610c1a61294e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610c6757600080fd5b610c93600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612974565b005b3415610ca057600080fd5b610ccc600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612aab565b6040518082815260200191505060405180910390f35b3415610ced57600080fd5b610d19600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612af4565b005b3415610d2657600080fd5b610d2e612c11565b6040518082815260200191505060405180910390f35b3415610d4f57600080fd5b610d57612c17565b005b3415610d6457600080fd5b610d90600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612d5b565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610dd3578082015181840152602081019050610db8565b505050509050019250505060405180910390f35b3415610df257600080fd5b610e086004808035906020019091905050612e92565b6040518082815260200191505060405180910390f35b3415610e2957600080fd5b610e316132b1565b005b3415610e3e57600080fd5b610e466134f0565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e86578082015181840152602081019050610e6b565b50505050905090810190601f168015610eb35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610ecc57600080fd5b610ee26004808035906020019091905050613529565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3415610f0f57600080fd5b610f256004808035906020019091905050613558565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610f7257600080fd5b610fa7600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061358b565b005b3415610fb457600080fd5b610fbc6136fc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561100957600080fd5b611011613722565b6040518082815260200191505060405180910390f35b341561103257600080fd5b61103a613728565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561108757600080fd5b61109d600480803590602001909190505061374e565b005b34156110aa57600080fd5b6110c0600480803590602001909190505061390c565b604051808215151515815260200191505060405180910390f35b34156110e557600080fd5b6110ed613a7b565b6040518082815260200191505060405180910390f35b341561110e57600080fd5b61113a600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050613a81565b005b341561114757600080fd5b61114f613b20565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561119c57600080fd5b6111b26004808035906020019091905050613b46565b604051808b1515151581526020018a1515151581526020018981526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019a505050505050505050505060405180910390f35b61122e6004808035906020019091908035906020019091905050613ca7565b005b341561123b57600080fd5b611243613e90565b6040518082815260200191505060405180910390f35b341561126457600080fd5b61126c613e96565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6112cd6004808035906020019091908035906020019091905050613ebc565b005b600060405180807f737570706f727473496e74657266616365286279746573342900000000000000815250601901905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806115d9575060405180807f746f6b656e4d657461646174612875696e743235362c737472696e6729000000815250601d019050604051809103902060405180807f746f6b656e734f664f776e6572286164647265737329000000000000000000008152506016019050604051809103902060405180807f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81526020017f74323536290000000000000000000000000000000000000000000000000000008152506025019050604051809103902060405180807f7472616e7366657228616464726573732c75696e7432353629000000000000008152506019019050604051809103902060405180807f617070726f766528616464726573732c75696e743235362900000000000000008152506018019050604051809103902060405180807f6f776e65724f662875696e7432353629000000000000000000000000000000008152506010019050604051809103902060405180807f62616c616e63654f6628616464726573732900000000000000000000000000008152506012019050604051809103902060405180807f746f74616c537570706c79282900000000000000000000000000000000000000815250600d019050604051809103902060405180807f73796d626f6c28290000000000000000000000000000000000000000000000008152506008019050604051809103902060405180807f6e616d6528290000000000000000000000000000000000000000000000000000815250600601905060405180910390201818181818181818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61160e615125565b611616615139565b60008073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561167557600080fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb4799f2878787600060405160a001526040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180848152602001806020018281038252848482818152602001925080828437820191505094505050505060a060405180830381600087803b151561173057600080fd5b6102c65a03f1151561174157600080fd5b50505060405180608001805190602001604052809250819350505061176682826141fd565b925050509392505050565b60115481565b6040805190810160405280600d81526020017f43727970746f4b6974746965730000000000000000000000000000000000000081525081565b6117ba3382614255565b15156117c557600080fd5b6117cf81836142c1565b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b662386f26fc1000081565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156118ff57600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166376190f8f6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561196e57600080fd5b6102c65a03f1151561197f57600080fd5b50505060405180519050151561199457600080fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600160068054905003905090565b600f5481565b600080821115156119ff57600080fd5b6000600683815481101515611a1057fe5b906000526020600020906002020160010160189054906101000a900463ffffffff1663ffffffff1614159050919050565b6201518081565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611aaa57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611ae557600080fd5b611aef3382614317565b1515611afa57600080fd5b611b048382614255565b1515611b0f57600080fd5b611b1a838383614383565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b7c57600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166354c15b826000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515611beb57600080fd5b6102c65a03f11515611bfc57600080fd5b505050604051805190501515611c1157600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611cb157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611ced57600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611d8b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611dc757600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260149054906101000a900460ff16151515611e2757600080fd5b611e313385614255565b1515611e3c57600080fd5b611e45846119ef565b151515611e5157600080fd5b611e7d84600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166142c1565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a85858585336040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b1515611f5957600080fd5b6102c65a03f11515611f6a57600080fd5b50505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611fce57600080fd5b600260149054906101000a900460ff161515611fe957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561204757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156120a557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561210357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561216057600080fd5b6121686145bb565b565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080851115156121b057600080fd5b6000841115156121bf57600080fd5b6006858154811015156121ce57fe5b906000526020600020906002020191506006848154811015156121ed57fe5b906000526020600020906002020190506122098286838761464e565b801561221b575061221a8486614863565b5b9250505092915050565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff1615151561227457600080fd5b61227e3385614255565b151561228957600080fd5b6122928461390c565b151561229d57600080fd5b6122c984600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166142c1565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a85858585336040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b15156123a557600080fd5b6102c65a03f115156123b657600080fd5b50505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561241b57600080fd5b80600e8190555050565b600260149054906101000a900460ff1615151561244157600080fd5b61244b3382614255565b151561245657600080fd5b81600a600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561250757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561254357600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156125e557600080fd5b819050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561264357600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b61138860115410151561265557600080fd5b60116000815480929190600101919050555061267660008060008685614976565b50505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061272457506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061277c5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561278757600080fd5b60036000600e8110151561279757fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff16811015156127c657600080fd5b8060058190555050565b600260149054906101000a900460ff1681565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561284257600080fd5b3073ffffffffffffffffffffffffffffffffffffffff16319150600e546001600f5401029050808211156128cb57600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8284039081150290604051600060405180830381858888f19350505050505b5050565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561294357600080fd5b919050565b61afc881565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156129d157600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166385b861886000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515612a4057600080fd5b6102c65a03f11515612a5157600080fd5b505050604051805190501515612a6657600080fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612b4f57600080fd5b600260149054906101000a900460ff161515612b6a57600080fd5b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f450db8da6efbe9c22f2347f7c2021231df1fc58d3ae9a2fa75d39fa44619930581604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612cbf57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80612d175750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515612d2257600080fd5b600260149054906101000a900460ff16151515612d3e57600080fd5b6001600260146101000a81548160ff021916908315150217905550565b612d63615164565b6000612d6d615164565b6000806000612d7b87612aab565b94506000851415612dad576000604051805910612d955750595b90808252806020026020018201604052509550612e88565b84604051805910612dbb5750595b90808252806020026020018201604052509350612dd66119d9565b925060009150600190505b8281111515612e84578673ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612e7757808483815181101515612e6057fe5b906020019060200201818152505081806001019250505b8080600101915050612de1565b8395505b5050505050919050565b600080600080600080600080600260149054906101000a900460ff16151515612eba57600080fd5b600689815481101515612ec957fe5b9060005260206000209060020201965060008760010160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1614151515612f0b57600080fd5b613041876101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614c69565b151561304c57600080fd5b8660010160189054906101000a900463ffffffff1663ffffffff16955060068681548110151561307857fe5b9060005260206000209060020201945086600101601e9054906101000a900461ffff16935086600101601e9054906101000a900461ffff1661ffff1685600101601e9054906101000a900461ffff1661ffff1611156130e75784600101601e9054906101000a900461ffff1693505b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d9f5aed8860000154876000015460018b60010160089054906101000a900467ffffffffffffffff16036000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018381526020018267ffffffffffffffff1681526020019350505050602060405180830381600087803b15156131bd57600080fd5b6102c65a03f115156131ce57600080fd5b505050604051805190509250600760008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915061323e898860010160189054906101000a900463ffffffff1663ffffffff166001870161ffff168686614976565b90508660010160186101000a81549063ffffffff0219169055600f60008154809291906001900391905055503373ffffffffffffffffffffffffffffffffffffffff166108fc600e549081150290604051600060405180830381858888f193505050505080975050505050505050919050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061335957506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806133b15750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156133bc57600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b151561344157600080fd5b6102c65a03f1151561345257600080fd5b505050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b15156134da57600080fd5b6102c65a03f115156134eb57600080fd5b505050565b6040805190810160405280600281526020017f434b00000000000000000000000000000000000000000000000000000000000081525081565b600381600e8110151561353857fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff161515156135a757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156135e357600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561361e57600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561367b57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156136d857600080fd5b6136e23382614255565b15156136ed57600080fd5b6136f8338383614383565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156137ac57600080fd5b61afc86012541015156137be57600080fd5b6137cd60008060008530614976565b90506137fb81600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166142c1565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a82613842614ca4565b600062015180306040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b15156138e257600080fd5b6102c65a03f115156138f357600080fd5b5050506012600081548092919060010191905055505050565b60008060008311151561391e57600080fd5b60068381548110151561392d57fe5b90600052602060002090600202019050613a73816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614da7565b915050919050565b61138881565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613adc57600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080600080600080600080600060068c815481101515613b6657fe5b9060005260206000209060020201905060008160010160189054906101000a900463ffffffff1663ffffffff1614159a50438160010160089054906101000a900467ffffffffffffffff1667ffffffffffffffff161115995080600101601c9054906101000a900461ffff1661ffff1698508060010160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1697508060010160189054906101000a900463ffffffff1663ffffffff1696508060010160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1695508060010160109054906101000a900463ffffffff1663ffffffff1694508060010160149054906101000a900463ffffffff1663ffffffff16935080600101601e9054906101000a900461ffff1661ffff16925080600001549150509193959799509193959799565b6000600260149054906101000a900460ff16151515613cc557600080fd5b613ccf3383614255565b1515613cda57600080fd5b613ce38261390c565b1515613cee57600080fd5b613cf88284614de1565b1515613d0357600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c55d0f56846000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515613d9c57600080fd5b6102c65a03f11515613dad57600080fd5b505050604051805190509050600e5481013410151515613dcc57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663454a2ab3600e543403856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808281526020019150506000604051808303818588803b1515613e6057600080fd5b6125ee5a03f11515613e7157600080fd5b50505050613e8b8263ffffffff168463ffffffff16614e3a565b505050565b60125481565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600260149054906101000a900460ff16151515613edb57600080fd5b600e543410151515613eec57600080fd5b613ef63385614255565b1515613f0157600080fd5b613f0b8385614863565b1515613f1657600080fd5b600684815481101515613f2557fe5b9060005260206000209060020201915061406b826101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614da7565b151561407657600080fd5b60068381548110151561408557fe5b906000526020600020906002020190506141cb816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614da7565b15156141d657600080fd5b6141e28285838661464e565b15156141ed57600080fd5b6141f78484614e3a565b50505050565b614205615125565b61420d615125565b6000808460405180591061421e5750595b9080825280601f01601f19166020018201604052509250602083019150859050614249828287615004565b82935050505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff166007600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b806009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008273ffffffffffffffffffffffffffffffffffffffff166009600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151561451757600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600a600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556009600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561461657600080fd5b600260149054906101000a900460ff16151561463157600080fd5b6000600260146101000a81548160ff021916908315150217905550565b600081841415614661576000905061485b565b818560010160109054906101000a900463ffffffff1663ffffffff1614806146a25750818560010160149054906101000a900463ffffffff1663ffffffff16145b156146b0576000905061485b565b838360010160109054906101000a900463ffffffff1663ffffffff1614806146f15750838360010160149054906101000a900463ffffffff1663ffffffff16145b156146ff576000905061485b565b60008360010160109054906101000a900463ffffffff1663ffffffff161480614742575060008560010160109054906101000a900463ffffffff1663ffffffff16145b15614750576001905061485b565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff1614806147c557508460010160149054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff16145b156147d3576000905061485b565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff16148061484857508460010160149054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff16145b15614856576000905061485b565b600190505b949350505050565b60008060006007600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16148061496c57508173ffffffffffffffffffffffffffffffffffffffff16600a600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b9250505092915050565b600080614981615178565b60008863ffffffff168914151561499757600080fd5b8763ffffffff16881415156149ab57600080fd5b8661ffff16871415156149bd57600080fd5b6002878115156149c957fe5b049250600d8361ffff1611156149de57600d92505b610100604051908101604052808781526020014267ffffffffffffffff168152602001600067ffffffffffffffff1681526020018a63ffffffff1681526020018963ffffffff168152602001600063ffffffff1681526020018461ffff1681526020018861ffff168152509150600160068054806001018281614a6191906151ec565b916000526020600020906002020160008590919091506000820151816000015560208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601c6101000a81548161ffff021916908361ffff16021790555060e082015181600101601e6101000a81548161ffff021916908361ffff16021790555050500390508063ffffffff1681141515614bb357600080fd5b7f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad58582846060015163ffffffff16856080015163ffffffff168660000151604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a1614c5a60008683614383565b80935050505095945050505050565b6000808260a0015163ffffffff1614158015614c9d57504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b6000806000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663eac9d94c6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515614d3757600080fd5b6102c65a03f11515614d4857600080fd5b505050604051805190509150816fffffffffffffffffffffffffffffffff1682141515614d7457600080fd5b600282811515614d8057fe5b0482019050662386f26fc10000811015614d9f57662386f26fc1000090505b809250505090565b6000808260a0015163ffffffff16148015614dda57504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b6000806000600685815481101515614df557fe5b90600052602060002090600202019150600684815481101515614e1457fe5b90600052602060002090600202019050614e308286838761464e565b9250505092915050565b600080600683815481101515614e4c57fe5b90600052602060002090600202019150600684815481101515614e6b57fe5b90600052602060002090600202019050828160010160186101000a81548163ffffffff021916908363ffffffff160217905550614ea78261504f565b614eb08161504f565b600a600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600a600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600f600081548092919060010191905055507f241ea03ca20251805084d27d4440371c34a0b85ff108f6bb5611248f73818b806007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685858460010160089054906101000a900467ffffffffffffffff16604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018267ffffffffffffffff16815260200194505050505060405180910390a150505050565b60005b60208210151561502c5782518452602084019350602083019250602082039150615007565b6001826020036101000a0390508019835116818551168181178652505050505050565b43600554600383600101601c9054906101000a900461ffff1661ffff16600e8110151561507857fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff168115156150a357fe5b04018160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600d81600101601c9054906101000a900461ffff1661ffff16101561512257600181600101601c8282829054906101000a900461ffff160192506101000a81548161ffff021916908361ffff1602179055505b50565b602060405190810160405280600081525090565b6080604051908101604052806004905b60008019168152602001906001900390816151495790505090565b602060405190810160405280600081525090565b6101006040519081016040528060008152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600061ffff168152602001600061ffff1681525090565b81548183558181151161521957600202816002028360005260206000209182019101615218919061521e565b5b505050565b6152e791905b808211156152e3576000808201600090556001820160006101000a81549067ffffffffffffffff02191690556001820160086101000a81549067ffffffffffffffff02191690556001820160106101000a81549063ffffffff02191690556001820160146101000a81549063ffffffff02191690556001820160186101000a81549063ffffffff021916905560018201601c6101000a81549061ffff021916905560018201601e6101000a81549061ffff021916905550600201615224565b5090565b905600a165627a7a7230582016f48a5de6bec06f052960f6124165218dafe9590a0d7bd601f001dca0e62e8a0029", - "deployedBytecode": "0x6060604052600436106102bf576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146103755780630519ce79146103cf5780630560ff441461042457806305e45546146104d457806306fdde03146104fd578063095ea7b31461058b5780630a0f8168146105cd5780630e583df01461062257806314001f4c1461064b57806318160ddd14610684578063183a7947146106ad5780631940a936146106d657806319c2f2011461071157806321717ebf1461073a57806323b872dd1461078f57806324e7a38a146107f057806327d7874c146108295780632ba73c15146108625780633d7d3f5a1461089b5780633f4ba83a146108d957806346116e6f146108ee57806346d22c7014610951578063481af3d3146109955780634ad8c938146109f85780634b85fd5514610a365780634dfff04f14610a595780634e0a337914610a9b5780635612913414610ad45780635663896e14610b165780635c975abb14610b395780635fd8c71014610b665780636352211e14610b7b578063680eba2714610bde5780636af04a5714610c075780636fbde40d14610c5c57806370a0823114610c955780637158798814610ce25780637a7d493714610d1b5780638456cb5914610d445780638462151c14610d5957806388c2a0bf14610de757806391876e5714610e1e57806395d89b4114610e335780639d6fac6f14610ec1578063a45f4bfc14610f04578063a9059cbb14610f67578063b047fb5014610fa9578063b0c35c0514610ffe578063bc4006f514611027578063c3bea9af1461107c578063d3e6f49f1461109f578063defb9584146110da578063e17b25af14611103578063e6cbe3511461113c578063e98b7f4d14611191578063ed60ade61461120f578063f1ca941014611230578063f2b47d5214611259578063f7d8c883146112ae575b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806103685750600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561037357600080fd5b005b341561038057600080fd5b6103b560048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190919050506112cf565b604051808215151515815260200191505060405180910390f35b34156103da57600080fd5b6103e26115e0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561042f57600080fd5b61045960048080359060200190919080359060200190820180359060200191909192905050611606565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561049957808201518184015260208101905061047e565b50505050905090810190601f1680156104c65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156104df57600080fd5b6104e7611771565b6040518082815260200191505060405180910390f35b341561050857600080fd5b610510611777565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610550578082015181840152602081019050610535565b50505050905090810190601f16801561057d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561059657600080fd5b6105cb600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506117b0565b005b34156105d857600080fd5b6105e0611872565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561062d57600080fd5b610635611897565b6040518082815260200191505060405180910390f35b341561065657600080fd5b610682600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506118a2565b005b341561068f57600080fd5b6106976119d9565b6040518082815260200191505060405180910390f35b34156106b857600080fd5b6106c06119e9565b6040518082815260200191505060405180910390f35b34156106e157600080fd5b6106f760048080359060200190919050506119ef565b604051808215151515815260200191505060405180910390f35b341561071c57600080fd5b610724611a41565b6040518082815260200191505060405180910390f35b341561074557600080fd5b61074d611a48565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561079a57600080fd5b6107ee600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611a6e565b005b34156107fb57600080fd5b610827600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611b1f565b005b341561083457600080fd5b610860600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611c56565b005b341561086d57600080fd5b610899600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611d30565b005b34156108a657600080fd5b6108d76004808035906020019091908035906020019091908035906020019091908035906020019091905050611e0b565b005b34156108e457600080fd5b6108ec611f73565b005b34156108f957600080fd5b61090f600480803590602001909190505061216a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561095c57600080fd5b61097b600480803590602001909190803590602001909190505061219d565b604051808215151515815260200191505060405180910390f35b34156109a057600080fd5b6109b66004808035906020019091905050612225565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610a0357600080fd5b610a346004808035906020019091908035906020019091908035906020019091908035906020019091905050612258565b005b3415610a4157600080fd5b610a5760048080359060200190919050506123bf565b005b3415610a6457600080fd5b610a99600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050612425565b005b3415610aa657600080fd5b610ad2600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506124ac565b005b3415610adf57600080fd5b610b14600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612587565b005b3415610b2157600080fd5b610b37600480803590602001909190505061267c565b005b3415610b4457600080fd5b610b4c6127d0565b604051808215151515815260200191505060405180910390f35b3415610b7157600080fd5b610b796127e3565b005b3415610b8657600080fd5b610b9c60048080359060200190919050506128cf565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610be957600080fd5b610bf1612948565b6040518082815260200191505060405180910390f35b3415610c1257600080fd5b610c1a61294e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610c6757600080fd5b610c93600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612974565b005b3415610ca057600080fd5b610ccc600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612aab565b6040518082815260200191505060405180910390f35b3415610ced57600080fd5b610d19600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612af4565b005b3415610d2657600080fd5b610d2e612c11565b6040518082815260200191505060405180910390f35b3415610d4f57600080fd5b610d57612c17565b005b3415610d6457600080fd5b610d90600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612d5b565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610dd3578082015181840152602081019050610db8565b505050509050019250505060405180910390f35b3415610df257600080fd5b610e086004808035906020019091905050612e92565b6040518082815260200191505060405180910390f35b3415610e2957600080fd5b610e316132b1565b005b3415610e3e57600080fd5b610e466134f0565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e86578082015181840152602081019050610e6b565b50505050905090810190601f168015610eb35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610ecc57600080fd5b610ee26004808035906020019091905050613529565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3415610f0f57600080fd5b610f256004808035906020019091905050613558565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610f7257600080fd5b610fa7600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061358b565b005b3415610fb457600080fd5b610fbc6136fc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561100957600080fd5b611011613722565b6040518082815260200191505060405180910390f35b341561103257600080fd5b61103a613728565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561108757600080fd5b61109d600480803590602001909190505061374e565b005b34156110aa57600080fd5b6110c0600480803590602001909190505061390c565b604051808215151515815260200191505060405180910390f35b34156110e557600080fd5b6110ed613a7b565b6040518082815260200191505060405180910390f35b341561110e57600080fd5b61113a600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050613a81565b005b341561114757600080fd5b61114f613b20565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561119c57600080fd5b6111b26004808035906020019091905050613b46565b604051808b1515151581526020018a1515151581526020018981526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019a505050505050505050505060405180910390f35b61122e6004808035906020019091908035906020019091905050613ca7565b005b341561123b57600080fd5b611243613e90565b6040518082815260200191505060405180910390f35b341561126457600080fd5b61126c613e96565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6112cd6004808035906020019091908035906020019091905050613ebc565b005b600060405180807f737570706f727473496e74657266616365286279746573342900000000000000815250601901905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806115d9575060405180807f746f6b656e4d657461646174612875696e743235362c737472696e6729000000815250601d019050604051809103902060405180807f746f6b656e734f664f776e6572286164647265737329000000000000000000008152506016019050604051809103902060405180807f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81526020017f74323536290000000000000000000000000000000000000000000000000000008152506025019050604051809103902060405180807f7472616e7366657228616464726573732c75696e7432353629000000000000008152506019019050604051809103902060405180807f617070726f766528616464726573732c75696e743235362900000000000000008152506018019050604051809103902060405180807f6f776e65724f662875696e7432353629000000000000000000000000000000008152506010019050604051809103902060405180807f62616c616e63654f6628616464726573732900000000000000000000000000008152506012019050604051809103902060405180807f746f74616c537570706c79282900000000000000000000000000000000000000815250600d019050604051809103902060405180807f73796d626f6c28290000000000000000000000000000000000000000000000008152506008019050604051809103902060405180807f6e616d6528290000000000000000000000000000000000000000000000000000815250600601905060405180910390201818181818181818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61160e615125565b611616615139565b60008073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561167557600080fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb4799f2878787600060405160a001526040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180848152602001806020018281038252848482818152602001925080828437820191505094505050505060a060405180830381600087803b151561173057600080fd5b6102c65a03f1151561174157600080fd5b50505060405180608001805190602001604052809250819350505061176682826141fd565b925050509392505050565b60115481565b6040805190810160405280600d81526020017f43727970746f4b6974746965730000000000000000000000000000000000000081525081565b6117ba3382614255565b15156117c557600080fd5b6117cf81836142c1565b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b662386f26fc1000081565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156118ff57600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166376190f8f6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561196e57600080fd5b6102c65a03f1151561197f57600080fd5b50505060405180519050151561199457600080fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600160068054905003905090565b600f5481565b600080821115156119ff57600080fd5b6000600683815481101515611a1057fe5b906000526020600020906002020160010160189054906101000a900463ffffffff1663ffffffff1614159050919050565b6201518081565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611aaa57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611ae557600080fd5b611aef3382614317565b1515611afa57600080fd5b611b048382614255565b1515611b0f57600080fd5b611b1a838383614383565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b7c57600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166354c15b826000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515611beb57600080fd5b6102c65a03f11515611bfc57600080fd5b505050604051805190501515611c1157600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611cb157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611ced57600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611d8b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611dc757600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260149054906101000a900460ff16151515611e2757600080fd5b611e313385614255565b1515611e3c57600080fd5b611e45846119ef565b151515611e5157600080fd5b611e7d84600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166142c1565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a85858585336040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b1515611f5957600080fd5b6102c65a03f11515611f6a57600080fd5b50505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611fce57600080fd5b600260149054906101000a900460ff161515611fe957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561204757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156120a557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561210357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561216057600080fd5b6121686145bb565b565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080851115156121b057600080fd5b6000841115156121bf57600080fd5b6006858154811015156121ce57fe5b906000526020600020906002020191506006848154811015156121ed57fe5b906000526020600020906002020190506122098286838761464e565b801561221b575061221a8486614863565b5b9250505092915050565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff1615151561227457600080fd5b61227e3385614255565b151561228957600080fd5b6122928461390c565b151561229d57600080fd5b6122c984600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166142c1565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a85858585336040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b15156123a557600080fd5b6102c65a03f115156123b657600080fd5b50505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561241b57600080fd5b80600e8190555050565b600260149054906101000a900460ff1615151561244157600080fd5b61244b3382614255565b151561245657600080fd5b81600a600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561250757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561254357600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156125e557600080fd5b819050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561264357600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b61138860115410151561265557600080fd5b60116000815480929190600101919050555061267660008060008685614976565b50505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061272457506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061277c5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561278757600080fd5b60036000600e8110151561279757fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff16811015156127c657600080fd5b8060058190555050565b600260149054906101000a900460ff1681565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561284257600080fd5b3073ffffffffffffffffffffffffffffffffffffffff16319150600e546001600f5401029050808211156128cb57600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8284039081150290604051600060405180830381858888f19350505050505b5050565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561294357600080fd5b919050565b61afc881565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156129d157600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166385b861886000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515612a4057600080fd5b6102c65a03f11515612a5157600080fd5b505050604051805190501515612a6657600080fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612b4f57600080fd5b600260149054906101000a900460ff161515612b6a57600080fd5b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f450db8da6efbe9c22f2347f7c2021231df1fc58d3ae9a2fa75d39fa44619930581604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612cbf57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80612d175750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515612d2257600080fd5b600260149054906101000a900460ff16151515612d3e57600080fd5b6001600260146101000a81548160ff021916908315150217905550565b612d63615164565b6000612d6d615164565b6000806000612d7b87612aab565b94506000851415612dad576000604051805910612d955750595b90808252806020026020018201604052509550612e88565b84604051805910612dbb5750595b90808252806020026020018201604052509350612dd66119d9565b925060009150600190505b8281111515612e84578673ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612e7757808483815181101515612e6057fe5b906020019060200201818152505081806001019250505b8080600101915050612de1565b8395505b5050505050919050565b600080600080600080600080600260149054906101000a900460ff16151515612eba57600080fd5b600689815481101515612ec957fe5b9060005260206000209060020201965060008760010160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1614151515612f0b57600080fd5b613041876101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614c69565b151561304c57600080fd5b8660010160189054906101000a900463ffffffff1663ffffffff16955060068681548110151561307857fe5b9060005260206000209060020201945086600101601e9054906101000a900461ffff16935086600101601e9054906101000a900461ffff1661ffff1685600101601e9054906101000a900461ffff1661ffff1611156130e75784600101601e9054906101000a900461ffff1693505b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d9f5aed8860000154876000015460018b60010160089054906101000a900467ffffffffffffffff16036000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018381526020018267ffffffffffffffff1681526020019350505050602060405180830381600087803b15156131bd57600080fd5b6102c65a03f115156131ce57600080fd5b505050604051805190509250600760008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915061323e898860010160189054906101000a900463ffffffff1663ffffffff166001870161ffff168686614976565b90508660010160186101000a81549063ffffffff0219169055600f60008154809291906001900391905055503373ffffffffffffffffffffffffffffffffffffffff166108fc600e549081150290604051600060405180830381858888f193505050505080975050505050505050919050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061335957506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806133b15750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156133bc57600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b151561344157600080fd5b6102c65a03f1151561345257600080fd5b505050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b15156134da57600080fd5b6102c65a03f115156134eb57600080fd5b505050565b6040805190810160405280600281526020017f434b00000000000000000000000000000000000000000000000000000000000081525081565b600381600e8110151561353857fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff161515156135a757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156135e357600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561361e57600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561367b57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156136d857600080fd5b6136e23382614255565b15156136ed57600080fd5b6136f8338383614383565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156137ac57600080fd5b61afc86012541015156137be57600080fd5b6137cd60008060008530614976565b90506137fb81600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166142c1565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a82613842614ca4565b600062015180306040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b15156138e257600080fd5b6102c65a03f115156138f357600080fd5b5050506012600081548092919060010191905055505050565b60008060008311151561391e57600080fd5b60068381548110151561392d57fe5b90600052602060002090600202019050613a73816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614da7565b915050919050565b61138881565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613adc57600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080600080600080600080600060068c815481101515613b6657fe5b9060005260206000209060020201905060008160010160189054906101000a900463ffffffff1663ffffffff1614159a50438160010160089054906101000a900467ffffffffffffffff1667ffffffffffffffff161115995080600101601c9054906101000a900461ffff1661ffff1698508060010160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1697508060010160189054906101000a900463ffffffff1663ffffffff1696508060010160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1695508060010160109054906101000a900463ffffffff1663ffffffff1694508060010160149054906101000a900463ffffffff1663ffffffff16935080600101601e9054906101000a900461ffff1661ffff16925080600001549150509193959799509193959799565b6000600260149054906101000a900460ff16151515613cc557600080fd5b613ccf3383614255565b1515613cda57600080fd5b613ce38261390c565b1515613cee57600080fd5b613cf88284614de1565b1515613d0357600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c55d0f56846000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515613d9c57600080fd5b6102c65a03f11515613dad57600080fd5b505050604051805190509050600e5481013410151515613dcc57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663454a2ab3600e543403856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808281526020019150506000604051808303818588803b1515613e6057600080fd5b6125ee5a03f11515613e7157600080fd5b50505050613e8b8263ffffffff168463ffffffff16614e3a565b505050565b60125481565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600260149054906101000a900460ff16151515613edb57600080fd5b600e543410151515613eec57600080fd5b613ef63385614255565b1515613f0157600080fd5b613f0b8385614863565b1515613f1657600080fd5b600684815481101515613f2557fe5b9060005260206000209060020201915061406b826101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614da7565b151561407657600080fd5b60068381548110151561408557fe5b906000526020600020906002020190506141cb816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614da7565b15156141d657600080fd5b6141e28285838661464e565b15156141ed57600080fd5b6141f78484614e3a565b50505050565b614205615125565b61420d615125565b6000808460405180591061421e5750595b9080825280601f01601f19166020018201604052509250602083019150859050614249828287615004565b82935050505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff166007600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b806009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008273ffffffffffffffffffffffffffffffffffffffff166009600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151561451757600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600a600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556009600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561461657600080fd5b600260149054906101000a900460ff16151561463157600080fd5b6000600260146101000a81548160ff021916908315150217905550565b600081841415614661576000905061485b565b818560010160109054906101000a900463ffffffff1663ffffffff1614806146a25750818560010160149054906101000a900463ffffffff1663ffffffff16145b156146b0576000905061485b565b838360010160109054906101000a900463ffffffff1663ffffffff1614806146f15750838360010160149054906101000a900463ffffffff1663ffffffff16145b156146ff576000905061485b565b60008360010160109054906101000a900463ffffffff1663ffffffff161480614742575060008560010160109054906101000a900463ffffffff1663ffffffff16145b15614750576001905061485b565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff1614806147c557508460010160149054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff16145b156147d3576000905061485b565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff16148061484857508460010160149054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff16145b15614856576000905061485b565b600190505b949350505050565b60008060006007600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16148061496c57508173ffffffffffffffffffffffffffffffffffffffff16600a600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b9250505092915050565b600080614981615178565b60008863ffffffff168914151561499757600080fd5b8763ffffffff16881415156149ab57600080fd5b8661ffff16871415156149bd57600080fd5b6002878115156149c957fe5b049250600d8361ffff1611156149de57600d92505b610100604051908101604052808781526020014267ffffffffffffffff168152602001600067ffffffffffffffff1681526020018a63ffffffff1681526020018963ffffffff168152602001600063ffffffff1681526020018461ffff1681526020018861ffff168152509150600160068054806001018281614a6191906151ec565b916000526020600020906002020160008590919091506000820151816000015560208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601c6101000a81548161ffff021916908361ffff16021790555060e082015181600101601e6101000a81548161ffff021916908361ffff16021790555050500390508063ffffffff1681141515614bb357600080fd5b7f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad58582846060015163ffffffff16856080015163ffffffff168660000151604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a1614c5a60008683614383565b80935050505095945050505050565b6000808260a0015163ffffffff1614158015614c9d57504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b6000806000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663eac9d94c6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515614d3757600080fd5b6102c65a03f11515614d4857600080fd5b505050604051805190509150816fffffffffffffffffffffffffffffffff1682141515614d7457600080fd5b600282811515614d8057fe5b0482019050662386f26fc10000811015614d9f57662386f26fc1000090505b809250505090565b6000808260a0015163ffffffff16148015614dda57504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b6000806000600685815481101515614df557fe5b90600052602060002090600202019150600684815481101515614e1457fe5b90600052602060002090600202019050614e308286838761464e565b9250505092915050565b600080600683815481101515614e4c57fe5b90600052602060002090600202019150600684815481101515614e6b57fe5b90600052602060002090600202019050828160010160186101000a81548163ffffffff021916908363ffffffff160217905550614ea78261504f565b614eb08161504f565b600a600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600a600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600f600081548092919060010191905055507f241ea03ca20251805084d27d4440371c34a0b85ff108f6bb5611248f73818b806007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685858460010160089054906101000a900467ffffffffffffffff16604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018267ffffffffffffffff16815260200194505050505060405180910390a150505050565b60005b60208210151561502c5782518452602084019350602083019250602082039150615007565b6001826020036101000a0390508019835116818551168181178652505050505050565b43600554600383600101601c9054906101000a900461ffff1661ffff16600e8110151561507857fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff168115156150a357fe5b04018160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600d81600101601c9054906101000a900461ffff1661ffff16101561512257600181600101601c8282829054906101000a900461ffff160192506101000a81548161ffff021916908361ffff1602179055505b50565b602060405190810160405280600081525090565b6080604051908101604052806004905b60008019168152602001906001900390816151495790505090565b602060405190810160405280600081525090565b6101006040519081016040528060008152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600061ffff168152602001600061ffff1681525090565b81548183558181151161521957600202816002028360005260206000209182019101615218919061521e565b5b505050565b6152e791905b808211156152e3576000808201600090556001820160006101000a81549067ffffffffffffffff02191690556001820160086101000a81549067ffffffffffffffff02191690556001820160106101000a81549063ffffffff02191690556001820160146101000a81549063ffffffff02191690556001820160186101000a81549063ffffffff021916905560018201601c6101000a81549061ffff021916905560018201601e6101000a81549061ffff021916905550600201615224565b5090565b905600a165627a7a7230582016f48a5de6bec06f052960f6124165218dafe9590a0d7bd601f001dca0e62e8a0029", + "bytecode": "0x60606040526000600260146101000a81548160ff0219169083151502179055506101c060405190810160405280603c63ffffffff1663ffffffff168152602001607863ffffffff1663ffffffff16815260200161012c63ffffffff1663ffffffff16815260200161025863ffffffff1663ffffffff16815260200161070863ffffffff1663ffffffff168152602001610e1063ffffffff1663ffffffff168152602001611c2063ffffffff1663ffffffff16815260200161384063ffffffff1663ffffffff16815260200161708063ffffffff1663ffffffff16815260200161e10063ffffffff1663ffffffff1681526020016201518063ffffffff1663ffffffff1681526020016202a30063ffffffff1663ffffffff1681526020016205460063ffffffff1663ffffffff16815260200162093a8063ffffffff1663ffffffff16815250600390600e62000156929190620007a8565b50600f60055566071afd498d0000600e5534156200017357600080fd5b6001600260146101000a81548160ff021916908315150217905550336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200025560008060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60006200025c6401000000000262004976176401000000009004565b5062000a00565b6000806200026962000852565b60008863ffffffff16891415156200028057600080fd5b8763ffffffff16881415156200029557600080fd5b8661ffff1687141515620002a857600080fd5b600287811515620002b557fe5b049250600d8361ffff161115620002cb57600d92505b610100604051908101604052808781526020014267ffffffffffffffff168152602001600067ffffffffffffffff1681526020018a63ffffffff1681526020018963ffffffff168152602001600063ffffffff1681526020018461ffff1681526020018861ffff168152509150600160068054806001018281620003509190620008c6565b916000526020600020906002020160008590919091506000820151816000015560208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601c6101000a81548161ffff021916908361ffff16021790555060e082015181600101601e6101000a81548161ffff021916908361ffff16021790555050500390508063ffffffff1681141515620004a357600080fd5b7f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad58582846060015163ffffffff16856080015163ffffffff168660000151604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a162000560600086836200056f6401000000000262004383176401000000009004565b80935050505095945050505050565b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415156200070457600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600a600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556009600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b82600e6007016008900481019282156200083f5791602002820160005b838211156200080b57835183826101000a81548163ffffffff021916908363ffffffff1602179055509260200192600401602081600301049283019260010302620007c5565b80156200083d5782816101000a81549063ffffffff02191690556004016020816003010492830192600103026200080b565b505b5090506200084e9190620008fb565b5090565b6101006040519081016040528060008152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600061ffff168152602001600061ffff1681525090565b815481835581811511620008f657600202816002028360005260206000209182019101620008f5919062000931565b5b505050565b6200092e91905b808211156200092a57600081816101000a81549063ffffffff02191690555060010162000902565b5090565b90565b620009fd91905b80821115620009f9576000808201600090556001820160006101000a81549067ffffffffffffffff02191690556001820160086101000a81549067ffffffffffffffff02191690556001820160106101000a81549063ffffffff02191690556001820160146101000a81549063ffffffff02191690556001820160186101000a81549063ffffffff021916905560018201601c6101000a81549061ffff021916905560018201601e6101000a81549061ffff02191690555060020162000938565b5090565b90565b6153168062000a106000396000f3006060604052600436106102bf576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146103755780630519ce79146103cf5780630560ff441461042457806305e45546146104d457806306fdde03146104fd578063095ea7b31461058b5780630a0f8168146105cd5780630e583df01461062257806314001f4c1461064b57806318160ddd14610684578063183a7947146106ad5780631940a936146106d657806319c2f2011461071157806321717ebf1461073a57806323b872dd1461078f57806324e7a38a146107f057806327d7874c146108295780632ba73c15146108625780633d7d3f5a1461089b5780633f4ba83a146108d957806346116e6f146108ee57806346d22c7014610951578063481af3d3146109955780634ad8c938146109f85780634b85fd5514610a365780634dfff04f14610a595780634e0a337914610a9b5780635612913414610ad45780635663896e14610b165780635c975abb14610b395780635fd8c71014610b665780636352211e14610b7b578063680eba2714610bde5780636af04a5714610c075780636fbde40d14610c5c57806370a0823114610c955780637158798814610ce25780637a7d493714610d1b5780638456cb5914610d445780638462151c14610d5957806388c2a0bf14610de757806391876e5714610e1e57806395d89b4114610e335780639d6fac6f14610ec1578063a45f4bfc14610f04578063a9059cbb14610f67578063b047fb5014610fa9578063b0c35c0514610ffe578063bc4006f514611027578063c3bea9af1461107c578063d3e6f49f1461109f578063defb9584146110da578063e17b25af14611103578063e6cbe3511461113c578063e98b7f4d14611191578063ed60ade61461120f578063f1ca941014611230578063f2b47d5214611259578063f7d8c883146112ae575b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806103685750600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561037357600080fd5b005b341561038057600080fd5b6103b560048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190919050506112cf565b604051808215151515815260200191505060405180910390f35b34156103da57600080fd5b6103e26115e0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561042f57600080fd5b61045960048080359060200190919080359060200190820180359060200191909192905050611606565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561049957808201518184015260208101905061047e565b50505050905090810190601f1680156104c65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156104df57600080fd5b6104e7611771565b6040518082815260200191505060405180910390f35b341561050857600080fd5b610510611777565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610550578082015181840152602081019050610535565b50505050905090810190601f16801561057d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561059657600080fd5b6105cb600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506117b0565b005b34156105d857600080fd5b6105e0611872565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561062d57600080fd5b610635611897565b6040518082815260200191505060405180910390f35b341561065657600080fd5b610682600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506118a2565b005b341561068f57600080fd5b6106976119d9565b6040518082815260200191505060405180910390f35b34156106b857600080fd5b6106c06119e9565b6040518082815260200191505060405180910390f35b34156106e157600080fd5b6106f760048080359060200190919050506119ef565b604051808215151515815260200191505060405180910390f35b341561071c57600080fd5b610724611a41565b6040518082815260200191505060405180910390f35b341561074557600080fd5b61074d611a48565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561079a57600080fd5b6107ee600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611a6e565b005b34156107fb57600080fd5b610827600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611b1f565b005b341561083457600080fd5b610860600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611c56565b005b341561086d57600080fd5b610899600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611d30565b005b34156108a657600080fd5b6108d76004808035906020019091908035906020019091908035906020019091908035906020019091905050611e0b565b005b34156108e457600080fd5b6108ec611f73565b005b34156108f957600080fd5b61090f600480803590602001909190505061216a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561095c57600080fd5b61097b600480803590602001909190803590602001909190505061219d565b604051808215151515815260200191505060405180910390f35b34156109a057600080fd5b6109b66004808035906020019091905050612225565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610a0357600080fd5b610a346004808035906020019091908035906020019091908035906020019091908035906020019091905050612258565b005b3415610a4157600080fd5b610a5760048080359060200190919050506123bf565b005b3415610a6457600080fd5b610a99600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050612425565b005b3415610aa657600080fd5b610ad2600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506124ac565b005b3415610adf57600080fd5b610b14600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612587565b005b3415610b2157600080fd5b610b37600480803590602001909190505061267c565b005b3415610b4457600080fd5b610b4c6127d0565b604051808215151515815260200191505060405180910390f35b3415610b7157600080fd5b610b796127e3565b005b3415610b8657600080fd5b610b9c60048080359060200190919050506128cf565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610be957600080fd5b610bf1612948565b6040518082815260200191505060405180910390f35b3415610c1257600080fd5b610c1a61294e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610c6757600080fd5b610c93600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612974565b005b3415610ca057600080fd5b610ccc600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612aab565b6040518082815260200191505060405180910390f35b3415610ced57600080fd5b610d19600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612af4565b005b3415610d2657600080fd5b610d2e612c11565b6040518082815260200191505060405180910390f35b3415610d4f57600080fd5b610d57612c17565b005b3415610d6457600080fd5b610d90600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612d5b565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610dd3578082015181840152602081019050610db8565b505050509050019250505060405180910390f35b3415610df257600080fd5b610e086004808035906020019091905050612e92565b6040518082815260200191505060405180910390f35b3415610e2957600080fd5b610e316132b1565b005b3415610e3e57600080fd5b610e466134f0565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e86578082015181840152602081019050610e6b565b50505050905090810190601f168015610eb35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610ecc57600080fd5b610ee26004808035906020019091905050613529565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3415610f0f57600080fd5b610f256004808035906020019091905050613558565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610f7257600080fd5b610fa7600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061358b565b005b3415610fb457600080fd5b610fbc6136fc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561100957600080fd5b611011613722565b6040518082815260200191505060405180910390f35b341561103257600080fd5b61103a613728565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561108757600080fd5b61109d600480803590602001909190505061374e565b005b34156110aa57600080fd5b6110c0600480803590602001909190505061390c565b604051808215151515815260200191505060405180910390f35b34156110e557600080fd5b6110ed613a7b565b6040518082815260200191505060405180910390f35b341561110e57600080fd5b61113a600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050613a81565b005b341561114757600080fd5b61114f613b20565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561119c57600080fd5b6111b26004808035906020019091905050613b46565b604051808b1515151581526020018a1515151581526020018981526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019a505050505050505050505060405180910390f35b61122e6004808035906020019091908035906020019091905050613ca7565b005b341561123b57600080fd5b611243613e90565b6040518082815260200191505060405180910390f35b341561126457600080fd5b61126c613e96565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6112cd6004808035906020019091908035906020019091905050613ebc565b005b600060405180807f737570706f727473496e74657266616365286279746573342900000000000000815250601901905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806115d9575060405180807f746f6b656e4d657461646174612875696e743235362c737472696e6729000000815250601d019050604051809103902060405180807f746f6b656e734f664f776e6572286164647265737329000000000000000000008152506016019050604051809103902060405180807f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81526020017f74323536290000000000000000000000000000000000000000000000000000008152506025019050604051809103902060405180807f7472616e7366657228616464726573732c75696e7432353629000000000000008152506019019050604051809103902060405180807f617070726f766528616464726573732c75696e743235362900000000000000008152506018019050604051809103902060405180807f6f776e65724f662875696e7432353629000000000000000000000000000000008152506010019050604051809103902060405180807f62616c616e63654f6628616464726573732900000000000000000000000000008152506012019050604051809103902060405180807f746f74616c537570706c79282900000000000000000000000000000000000000815250600d019050604051809103902060405180807f73796d626f6c28290000000000000000000000000000000000000000000000008152506008019050604051809103902060405180807f6e616d6528290000000000000000000000000000000000000000000000000000815250600601905060405180910390201818181818181818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61160e615125565b611616615139565b60008073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561167557600080fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb4799f2878787600060405160a001526040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180848152602001806020018281038252848482818152602001925080828437820191505094505050505060a060405180830381600087803b151561173057600080fd5b6102c65a03f1151561174157600080fd5b50505060405180608001805190602001604052809250819350505061176682826141fd565b925050509392505050565b60115481565b6040805190810160405280600d81526020017f43727970746f4b6974746965730000000000000000000000000000000000000081525081565b6117ba3382614255565b15156117c557600080fd5b6117cf81836142c1565b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b662386f26fc1000081565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156118ff57600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166376190f8f6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561196e57600080fd5b6102c65a03f1151561197f57600080fd5b50505060405180519050151561199457600080fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600160068054905003905090565b600f5481565b600080821115156119ff57600080fd5b6000600683815481101515611a1057fe5b906000526020600020906002020160010160189054906101000a900463ffffffff1663ffffffff1614159050919050565b6201518081565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611aaa57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611ae557600080fd5b611aef3382614317565b1515611afa57600080fd5b611b048382614255565b1515611b0f57600080fd5b611b1a838383614383565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b7c57600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166354c15b826000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515611beb57600080fd5b6102c65a03f11515611bfc57600080fd5b505050604051805190501515611c1157600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611cb157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611ced57600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611d8b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611dc757600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260149054906101000a900460ff16151515611e2757600080fd5b611e313385614255565b1515611e3c57600080fd5b611e45846119ef565b151515611e5157600080fd5b611e7d84600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166142c1565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a85858585336040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b1515611f5957600080fd5b6102c65a03f11515611f6a57600080fd5b50505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611fce57600080fd5b600260149054906101000a900460ff161515611fe957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561204757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156120a557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561210357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561216057600080fd5b6121686145bb565b565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080851115156121b057600080fd5b6000841115156121bf57600080fd5b6006858154811015156121ce57fe5b906000526020600020906002020191506006848154811015156121ed57fe5b906000526020600020906002020190506122098286838761464e565b801561221b575061221a8486614863565b5b9250505092915050565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff1615151561227457600080fd5b61227e3385614255565b151561228957600080fd5b6122928461390c565b151561229d57600080fd5b6122c984600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166142c1565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a85858585336040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b15156123a557600080fd5b6102c65a03f115156123b657600080fd5b50505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561241b57600080fd5b80600e8190555050565b600260149054906101000a900460ff1615151561244157600080fd5b61244b3382614255565b151561245657600080fd5b81600a600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561250757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561254357600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156125e557600080fd5b819050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561264357600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b61138860115410151561265557600080fd5b60116000815480929190600101919050555061267660008060008685614976565b50505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061272457506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061277c5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561278757600080fd5b60036000600e8110151561279757fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff16811015156127c657600080fd5b8060058190555050565b600260149054906101000a900460ff1681565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561284257600080fd5b3073ffffffffffffffffffffffffffffffffffffffff16319150600e546001600f5401029050808211156128cb57600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8284039081150290604051600060405180830381858888f19350505050505b5050565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561294357600080fd5b919050565b61afc881565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156129d157600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166385b861886000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515612a4057600080fd5b6102c65a03f11515612a5157600080fd5b505050604051805190501515612a6657600080fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612b4f57600080fd5b600260149054906101000a900460ff161515612b6a57600080fd5b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f450db8da6efbe9c22f2347f7c2021231df1fc58d3ae9a2fa75d39fa44619930581604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612cbf57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80612d175750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515612d2257600080fd5b600260149054906101000a900460ff16151515612d3e57600080fd5b6001600260146101000a81548160ff021916908315150217905550565b612d63615164565b6000612d6d615164565b6000806000612d7b87612aab565b94506000851415612dad576000604051805910612d955750595b90808252806020026020018201604052509550612e88565b84604051805910612dbb5750595b90808252806020026020018201604052509350612dd66119d9565b925060009150600190505b8281111515612e84578673ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612e7757808483815181101515612e6057fe5b906020019060200201818152505081806001019250505b8080600101915050612de1565b8395505b5050505050919050565b600080600080600080600080600260149054906101000a900460ff16151515612eba57600080fd5b600689815481101515612ec957fe5b9060005260206000209060020201965060008760010160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1614151515612f0b57600080fd5b613041876101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614c69565b151561304c57600080fd5b8660010160189054906101000a900463ffffffff1663ffffffff16955060068681548110151561307857fe5b9060005260206000209060020201945086600101601e9054906101000a900461ffff16935086600101601e9054906101000a900461ffff1661ffff1685600101601e9054906101000a900461ffff1661ffff1611156130e75784600101601e9054906101000a900461ffff1693505b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d9f5aed8860000154876000015460018b60010160089054906101000a900467ffffffffffffffff16036000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018381526020018267ffffffffffffffff1681526020019350505050602060405180830381600087803b15156131bd57600080fd5b6102c65a03f115156131ce57600080fd5b505050604051805190509250600760008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915061323e898860010160189054906101000a900463ffffffff1663ffffffff166001870161ffff168686614976565b90508660010160186101000a81549063ffffffff0219169055600f60008154809291906001900391905055503373ffffffffffffffffffffffffffffffffffffffff166108fc600e549081150290604051600060405180830381858888f193505050505080975050505050505050919050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061335957506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806133b15750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156133bc57600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b151561344157600080fd5b6102c65a03f1151561345257600080fd5b505050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b15156134da57600080fd5b6102c65a03f115156134eb57600080fd5b505050565b6040805190810160405280600281526020017f434b00000000000000000000000000000000000000000000000000000000000081525081565b600381600e8110151561353857fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff161515156135a757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156135e357600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561361e57600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561367b57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156136d857600080fd5b6136e23382614255565b15156136ed57600080fd5b6136f8338383614383565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156137ac57600080fd5b61afc86012541015156137be57600080fd5b6137cd60008060008530614976565b90506137fb81600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166142c1565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a82613842614ca4565b600062015180306040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b15156138e257600080fd5b6102c65a03f115156138f357600080fd5b5050506012600081548092919060010191905055505050565b60008060008311151561391e57600080fd5b60068381548110151561392d57fe5b90600052602060002090600202019050613a73816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614da7565b915050919050565b61138881565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613adc57600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080600080600080600080600060068c815481101515613b6657fe5b9060005260206000209060020201905060008160010160189054906101000a900463ffffffff1663ffffffff1614159a50438160010160089054906101000a900467ffffffffffffffff1667ffffffffffffffff161115995080600101601c9054906101000a900461ffff1661ffff1698508060010160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1697508060010160189054906101000a900463ffffffff1663ffffffff1696508060010160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1695508060010160109054906101000a900463ffffffff1663ffffffff1694508060010160149054906101000a900463ffffffff1663ffffffff16935080600101601e9054906101000a900461ffff1661ffff16925080600001549150509193959799509193959799565b6000600260149054906101000a900460ff16151515613cc557600080fd5b613ccf3383614255565b1515613cda57600080fd5b613ce38261390c565b1515613cee57600080fd5b613cf88284614de1565b1515613d0357600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c55d0f56846000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515613d9c57600080fd5b6102c65a03f11515613dad57600080fd5b505050604051805190509050600e5481013410151515613dcc57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663454a2ab3600e543403856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808281526020019150506000604051808303818588803b1515613e6057600080fd5b6125ee5a03f11515613e7157600080fd5b50505050613e8b8263ffffffff168463ffffffff16614e3a565b505050565b60125481565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600260149054906101000a900460ff16151515613edb57600080fd5b600e543410151515613eec57600080fd5b613ef63385614255565b1515613f0157600080fd5b613f0b8385614863565b1515613f1657600080fd5b600684815481101515613f2557fe5b9060005260206000209060020201915061406b826101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614da7565b151561407657600080fd5b60068381548110151561408557fe5b906000526020600020906002020190506141cb816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614da7565b15156141d657600080fd5b6141e28285838661464e565b15156141ed57600080fd5b6141f78484614e3a565b50505050565b614205615125565b61420d615125565b6000808460405180591061421e5750595b9080825280601f01601f19166020018201604052509250602083019150859050614249828287615004565b82935050505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff166007600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b806009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008273ffffffffffffffffffffffffffffffffffffffff166009600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151561451757600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600a600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556009600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561461657600080fd5b600260149054906101000a900460ff16151561463157600080fd5b6000600260146101000a81548160ff021916908315150217905550565b600081841415614661576000905061485b565b818560010160109054906101000a900463ffffffff1663ffffffff1614806146a25750818560010160149054906101000a900463ffffffff1663ffffffff16145b156146b0576000905061485b565b838360010160109054906101000a900463ffffffff1663ffffffff1614806146f15750838360010160149054906101000a900463ffffffff1663ffffffff16145b156146ff576000905061485b565b60008360010160109054906101000a900463ffffffff1663ffffffff161480614742575060008560010160109054906101000a900463ffffffff1663ffffffff16145b15614750576001905061485b565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff1614806147c557508460010160149054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff16145b156147d3576000905061485b565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff16148061484857508460010160149054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff16145b15614856576000905061485b565b600190505b949350505050565b60008060006007600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16148061496c57508173ffffffffffffffffffffffffffffffffffffffff16600a600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b9250505092915050565b600080614981615178565b60008863ffffffff168914151561499757600080fd5b8763ffffffff16881415156149ab57600080fd5b8661ffff16871415156149bd57600080fd5b6002878115156149c957fe5b049250600d8361ffff1611156149de57600d92505b610100604051908101604052808781526020014267ffffffffffffffff168152602001600067ffffffffffffffff1681526020018a63ffffffff1681526020018963ffffffff168152602001600063ffffffff1681526020018461ffff1681526020018861ffff168152509150600160068054806001018281614a6191906151ec565b916000526020600020906002020160008590919091506000820151816000015560208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601c6101000a81548161ffff021916908361ffff16021790555060e082015181600101601e6101000a81548161ffff021916908361ffff16021790555050500390508063ffffffff1681141515614bb357600080fd5b7f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad58582846060015163ffffffff16856080015163ffffffff168660000151604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a1614c5a60008683614383565b80935050505095945050505050565b6000808260a0015163ffffffff1614158015614c9d57504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b6000806000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663eac9d94c6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515614d3757600080fd5b6102c65a03f11515614d4857600080fd5b505050604051805190509150816fffffffffffffffffffffffffffffffff1682141515614d7457600080fd5b600282811515614d8057fe5b0482019050662386f26fc10000811015614d9f57662386f26fc1000090505b809250505090565b6000808260a0015163ffffffff16148015614dda57504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b6000806000600685815481101515614df557fe5b90600052602060002090600202019150600684815481101515614e1457fe5b90600052602060002090600202019050614e308286838761464e565b9250505092915050565b600080600683815481101515614e4c57fe5b90600052602060002090600202019150600684815481101515614e6b57fe5b90600052602060002090600202019050828160010160186101000a81548163ffffffff021916908363ffffffff160217905550614ea78261504f565b614eb08161504f565b600a600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600a600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600f600081548092919060010191905055507f241ea03ca20251805084d27d4440371c34a0b85ff108f6bb5611248f73818b806007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685858460010160089054906101000a900467ffffffffffffffff16604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018267ffffffffffffffff16815260200194505050505060405180910390a150505050565b60005b60208210151561502c5782518452602084019350602083019250602082039150615007565b6001826020036101000a0390508019835116818551168181178652505050505050565b43600554600383600101601c9054906101000a900461ffff1661ffff16600e8110151561507857fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff168115156150a357fe5b04018160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600d81600101601c9054906101000a900461ffff1661ffff16101561512257600181600101601c8282829054906101000a900461ffff160192506101000a81548161ffff021916908361ffff1602179055505b50565b602060405190810160405280600081525090565b6080604051908101604052806004905b60008019168152602001906001900390816151495790505090565b602060405190810160405280600081525090565b6101006040519081016040528060008152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600061ffff168152602001600061ffff1681525090565b81548183558181151161521957600202816002028360005260206000209182019101615218919061521e565b5b505050565b6152e791905b808211156152e3576000808201600090556001820160006101000a81549067ffffffffffffffff02191690556001820160086101000a81549067ffffffffffffffff02191690556001820160106101000a81549063ffffffff02191690556001820160146101000a81549063ffffffff02191690556001820160186101000a81549063ffffffff021916905560018201601c6101000a81549061ffff021916905560018201601e6101000a81549061ffff021916905550600201615224565b5090565b905600a165627a7a7230582050f78557fd249f103d4560680752c81acc85f1ce7e1a3b0c48f75d38529cc1a70029", + "deployedBytecode": "0x6060604052600436106102bf576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146103755780630519ce79146103cf5780630560ff441461042457806305e45546146104d457806306fdde03146104fd578063095ea7b31461058b5780630a0f8168146105cd5780630e583df01461062257806314001f4c1461064b57806318160ddd14610684578063183a7947146106ad5780631940a936146106d657806319c2f2011461071157806321717ebf1461073a57806323b872dd1461078f57806324e7a38a146107f057806327d7874c146108295780632ba73c15146108625780633d7d3f5a1461089b5780633f4ba83a146108d957806346116e6f146108ee57806346d22c7014610951578063481af3d3146109955780634ad8c938146109f85780634b85fd5514610a365780634dfff04f14610a595780634e0a337914610a9b5780635612913414610ad45780635663896e14610b165780635c975abb14610b395780635fd8c71014610b665780636352211e14610b7b578063680eba2714610bde5780636af04a5714610c075780636fbde40d14610c5c57806370a0823114610c955780637158798814610ce25780637a7d493714610d1b5780638456cb5914610d445780638462151c14610d5957806388c2a0bf14610de757806391876e5714610e1e57806395d89b4114610e335780639d6fac6f14610ec1578063a45f4bfc14610f04578063a9059cbb14610f67578063b047fb5014610fa9578063b0c35c0514610ffe578063bc4006f514611027578063c3bea9af1461107c578063d3e6f49f1461109f578063defb9584146110da578063e17b25af14611103578063e6cbe3511461113c578063e98b7f4d14611191578063ed60ade61461120f578063f1ca941014611230578063f2b47d5214611259578063f7d8c883146112ae575b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806103685750600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561037357600080fd5b005b341561038057600080fd5b6103b560048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190919050506112cf565b604051808215151515815260200191505060405180910390f35b34156103da57600080fd5b6103e26115e0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561042f57600080fd5b61045960048080359060200190919080359060200190820180359060200191909192905050611606565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561049957808201518184015260208101905061047e565b50505050905090810190601f1680156104c65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156104df57600080fd5b6104e7611771565b6040518082815260200191505060405180910390f35b341561050857600080fd5b610510611777565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610550578082015181840152602081019050610535565b50505050905090810190601f16801561057d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561059657600080fd5b6105cb600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506117b0565b005b34156105d857600080fd5b6105e0611872565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561062d57600080fd5b610635611897565b6040518082815260200191505060405180910390f35b341561065657600080fd5b610682600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506118a2565b005b341561068f57600080fd5b6106976119d9565b6040518082815260200191505060405180910390f35b34156106b857600080fd5b6106c06119e9565b6040518082815260200191505060405180910390f35b34156106e157600080fd5b6106f760048080359060200190919050506119ef565b604051808215151515815260200191505060405180910390f35b341561071c57600080fd5b610724611a41565b6040518082815260200191505060405180910390f35b341561074557600080fd5b61074d611a48565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561079a57600080fd5b6107ee600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611a6e565b005b34156107fb57600080fd5b610827600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611b1f565b005b341561083457600080fd5b610860600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611c56565b005b341561086d57600080fd5b610899600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611d30565b005b34156108a657600080fd5b6108d76004808035906020019091908035906020019091908035906020019091908035906020019091905050611e0b565b005b34156108e457600080fd5b6108ec611f73565b005b34156108f957600080fd5b61090f600480803590602001909190505061216a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561095c57600080fd5b61097b600480803590602001909190803590602001909190505061219d565b604051808215151515815260200191505060405180910390f35b34156109a057600080fd5b6109b66004808035906020019091905050612225565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610a0357600080fd5b610a346004808035906020019091908035906020019091908035906020019091908035906020019091905050612258565b005b3415610a4157600080fd5b610a5760048080359060200190919050506123bf565b005b3415610a6457600080fd5b610a99600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050612425565b005b3415610aa657600080fd5b610ad2600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506124ac565b005b3415610adf57600080fd5b610b14600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612587565b005b3415610b2157600080fd5b610b37600480803590602001909190505061267c565b005b3415610b4457600080fd5b610b4c6127d0565b604051808215151515815260200191505060405180910390f35b3415610b7157600080fd5b610b796127e3565b005b3415610b8657600080fd5b610b9c60048080359060200190919050506128cf565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610be957600080fd5b610bf1612948565b6040518082815260200191505060405180910390f35b3415610c1257600080fd5b610c1a61294e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610c6757600080fd5b610c93600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612974565b005b3415610ca057600080fd5b610ccc600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612aab565b6040518082815260200191505060405180910390f35b3415610ced57600080fd5b610d19600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612af4565b005b3415610d2657600080fd5b610d2e612c11565b6040518082815260200191505060405180910390f35b3415610d4f57600080fd5b610d57612c17565b005b3415610d6457600080fd5b610d90600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612d5b565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610dd3578082015181840152602081019050610db8565b505050509050019250505060405180910390f35b3415610df257600080fd5b610e086004808035906020019091905050612e92565b6040518082815260200191505060405180910390f35b3415610e2957600080fd5b610e316132b1565b005b3415610e3e57600080fd5b610e466134f0565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e86578082015181840152602081019050610e6b565b50505050905090810190601f168015610eb35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610ecc57600080fd5b610ee26004808035906020019091905050613529565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3415610f0f57600080fd5b610f256004808035906020019091905050613558565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610f7257600080fd5b610fa7600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061358b565b005b3415610fb457600080fd5b610fbc6136fc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561100957600080fd5b611011613722565b6040518082815260200191505060405180910390f35b341561103257600080fd5b61103a613728565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561108757600080fd5b61109d600480803590602001909190505061374e565b005b34156110aa57600080fd5b6110c0600480803590602001909190505061390c565b604051808215151515815260200191505060405180910390f35b34156110e557600080fd5b6110ed613a7b565b6040518082815260200191505060405180910390f35b341561110e57600080fd5b61113a600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050613a81565b005b341561114757600080fd5b61114f613b20565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561119c57600080fd5b6111b26004808035906020019091905050613b46565b604051808b1515151581526020018a1515151581526020018981526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019a505050505050505050505060405180910390f35b61122e6004808035906020019091908035906020019091905050613ca7565b005b341561123b57600080fd5b611243613e90565b6040518082815260200191505060405180910390f35b341561126457600080fd5b61126c613e96565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6112cd6004808035906020019091908035906020019091905050613ebc565b005b600060405180807f737570706f727473496e74657266616365286279746573342900000000000000815250601901905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806115d9575060405180807f746f6b656e4d657461646174612875696e743235362c737472696e6729000000815250601d019050604051809103902060405180807f746f6b656e734f664f776e6572286164647265737329000000000000000000008152506016019050604051809103902060405180807f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81526020017f74323536290000000000000000000000000000000000000000000000000000008152506025019050604051809103902060405180807f7472616e7366657228616464726573732c75696e7432353629000000000000008152506019019050604051809103902060405180807f617070726f766528616464726573732c75696e743235362900000000000000008152506018019050604051809103902060405180807f6f776e65724f662875696e7432353629000000000000000000000000000000008152506010019050604051809103902060405180807f62616c616e63654f6628616464726573732900000000000000000000000000008152506012019050604051809103902060405180807f746f74616c537570706c79282900000000000000000000000000000000000000815250600d019050604051809103902060405180807f73796d626f6c28290000000000000000000000000000000000000000000000008152506008019050604051809103902060405180807f6e616d6528290000000000000000000000000000000000000000000000000000815250600601905060405180910390201818181818181818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61160e615125565b611616615139565b60008073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561167557600080fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb4799f2878787600060405160a001526040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180848152602001806020018281038252848482818152602001925080828437820191505094505050505060a060405180830381600087803b151561173057600080fd5b6102c65a03f1151561174157600080fd5b50505060405180608001805190602001604052809250819350505061176682826141fd565b925050509392505050565b60115481565b6040805190810160405280600d81526020017f43727970746f4b6974746965730000000000000000000000000000000000000081525081565b6117ba3382614255565b15156117c557600080fd5b6117cf81836142c1565b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b662386f26fc1000081565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156118ff57600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166376190f8f6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561196e57600080fd5b6102c65a03f1151561197f57600080fd5b50505060405180519050151561199457600080fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600160068054905003905090565b600f5481565b600080821115156119ff57600080fd5b6000600683815481101515611a1057fe5b906000526020600020906002020160010160189054906101000a900463ffffffff1663ffffffff1614159050919050565b6201518081565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611aaa57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611ae557600080fd5b611aef3382614317565b1515611afa57600080fd5b611b048382614255565b1515611b0f57600080fd5b611b1a838383614383565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b7c57600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166354c15b826000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515611beb57600080fd5b6102c65a03f11515611bfc57600080fd5b505050604051805190501515611c1157600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611cb157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611ced57600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611d8b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611dc757600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260149054906101000a900460ff16151515611e2757600080fd5b611e313385614255565b1515611e3c57600080fd5b611e45846119ef565b151515611e5157600080fd5b611e7d84600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166142c1565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a85858585336040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b1515611f5957600080fd5b6102c65a03f11515611f6a57600080fd5b50505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611fce57600080fd5b600260149054906101000a900460ff161515611fe957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561204757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156120a557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561210357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561216057600080fd5b6121686145bb565b565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080851115156121b057600080fd5b6000841115156121bf57600080fd5b6006858154811015156121ce57fe5b906000526020600020906002020191506006848154811015156121ed57fe5b906000526020600020906002020190506122098286838761464e565b801561221b575061221a8486614863565b5b9250505092915050565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff1615151561227457600080fd5b61227e3385614255565b151561228957600080fd5b6122928461390c565b151561229d57600080fd5b6122c984600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166142c1565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a85858585336040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b15156123a557600080fd5b6102c65a03f115156123b657600080fd5b50505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561241b57600080fd5b80600e8190555050565b600260149054906101000a900460ff1615151561244157600080fd5b61244b3382614255565b151561245657600080fd5b81600a600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561250757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561254357600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156125e557600080fd5b819050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561264357600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b61138860115410151561265557600080fd5b60116000815480929190600101919050555061267660008060008685614976565b50505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061272457506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061277c5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561278757600080fd5b60036000600e8110151561279757fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff16811015156127c657600080fd5b8060058190555050565b600260149054906101000a900460ff1681565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561284257600080fd5b3073ffffffffffffffffffffffffffffffffffffffff16319150600e546001600f5401029050808211156128cb57600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8284039081150290604051600060405180830381858888f19350505050505b5050565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561294357600080fd5b919050565b61afc881565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156129d157600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166385b861886000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515612a4057600080fd5b6102c65a03f11515612a5157600080fd5b505050604051805190501515612a6657600080fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612b4f57600080fd5b600260149054906101000a900460ff161515612b6a57600080fd5b80601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f450db8da6efbe9c22f2347f7c2021231df1fc58d3ae9a2fa75d39fa44619930581604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612cbf57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80612d175750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515612d2257600080fd5b600260149054906101000a900460ff16151515612d3e57600080fd5b6001600260146101000a81548160ff021916908315150217905550565b612d63615164565b6000612d6d615164565b6000806000612d7b87612aab565b94506000851415612dad576000604051805910612d955750595b90808252806020026020018201604052509550612e88565b84604051805910612dbb5750595b90808252806020026020018201604052509350612dd66119d9565b925060009150600190505b8281111515612e84578673ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612e7757808483815181101515612e6057fe5b906020019060200201818152505081806001019250505b8080600101915050612de1565b8395505b5050505050919050565b600080600080600080600080600260149054906101000a900460ff16151515612eba57600080fd5b600689815481101515612ec957fe5b9060005260206000209060020201965060008760010160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1614151515612f0b57600080fd5b613041876101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614c69565b151561304c57600080fd5b8660010160189054906101000a900463ffffffff1663ffffffff16955060068681548110151561307857fe5b9060005260206000209060020201945086600101601e9054906101000a900461ffff16935086600101601e9054906101000a900461ffff1661ffff1685600101601e9054906101000a900461ffff1661ffff1611156130e75784600101601e9054906101000a900461ffff1693505b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d9f5aed8860000154876000015460018b60010160089054906101000a900467ffffffffffffffff16036000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018381526020018267ffffffffffffffff1681526020019350505050602060405180830381600087803b15156131bd57600080fd5b6102c65a03f115156131ce57600080fd5b505050604051805190509250600760008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915061323e898860010160189054906101000a900463ffffffff1663ffffffff166001870161ffff168686614976565b90508660010160186101000a81549063ffffffff0219169055600f60008154809291906001900391905055503373ffffffffffffffffffffffffffffffffffffffff166108fc600e549081150290604051600060405180830381858888f193505050505080975050505050505050919050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061335957506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806133b15750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156133bc57600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b151561344157600080fd5b6102c65a03f1151561345257600080fd5b505050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b15156134da57600080fd5b6102c65a03f115156134eb57600080fd5b505050565b6040805190810160405280600281526020017f434b00000000000000000000000000000000000000000000000000000000000081525081565b600381600e8110151561353857fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff161515156135a757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156135e357600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561361e57600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561367b57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156136d857600080fd5b6136e23382614255565b15156136ed57600080fd5b6136f8338383614383565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156137ac57600080fd5b61afc86012541015156137be57600080fd5b6137cd60008060008530614976565b90506137fb81600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166142c1565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a82613842614ca4565b600062015180306040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b15156138e257600080fd5b6102c65a03f115156138f357600080fd5b5050506012600081548092919060010191905055505050565b60008060008311151561391e57600080fd5b60068381548110151561392d57fe5b90600052602060002090600202019050613a73816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614da7565b915050919050565b61138881565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613adc57600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080600080600080600080600060068c815481101515613b6657fe5b9060005260206000209060020201905060008160010160189054906101000a900463ffffffff1663ffffffff1614159a50438160010160089054906101000a900467ffffffffffffffff1667ffffffffffffffff161115995080600101601c9054906101000a900461ffff1661ffff1698508060010160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1697508060010160189054906101000a900463ffffffff1663ffffffff1696508060010160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1695508060010160109054906101000a900463ffffffff1663ffffffff1694508060010160149054906101000a900463ffffffff1663ffffffff16935080600101601e9054906101000a900461ffff1661ffff16925080600001549150509193959799509193959799565b6000600260149054906101000a900460ff16151515613cc557600080fd5b613ccf3383614255565b1515613cda57600080fd5b613ce38261390c565b1515613cee57600080fd5b613cf88284614de1565b1515613d0357600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c55d0f56846000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515613d9c57600080fd5b6102c65a03f11515613dad57600080fd5b505050604051805190509050600e5481013410151515613dcc57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663454a2ab3600e543403856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808281526020019150506000604051808303818588803b1515613e6057600080fd5b6125ee5a03f11515613e7157600080fd5b50505050613e8b8263ffffffff168463ffffffff16614e3a565b505050565b60125481565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600260149054906101000a900460ff16151515613edb57600080fd5b600e543410151515613eec57600080fd5b613ef63385614255565b1515613f0157600080fd5b613f0b8385614863565b1515613f1657600080fd5b600684815481101515613f2557fe5b9060005260206000209060020201915061406b826101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614da7565b151561407657600080fd5b60068381548110151561408557fe5b906000526020600020906002020190506141cb816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614da7565b15156141d657600080fd5b6141e28285838661464e565b15156141ed57600080fd5b6141f78484614e3a565b50505050565b614205615125565b61420d615125565b6000808460405180591061421e5750595b9080825280601f01601f19166020018201604052509250602083019150859050614249828287615004565b82935050505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff166007600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b806009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008273ffffffffffffffffffffffffffffffffffffffff166009600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151561451757600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600a600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556009600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561461657600080fd5b600260149054906101000a900460ff16151561463157600080fd5b6000600260146101000a81548160ff021916908315150217905550565b600081841415614661576000905061485b565b818560010160109054906101000a900463ffffffff1663ffffffff1614806146a25750818560010160149054906101000a900463ffffffff1663ffffffff16145b156146b0576000905061485b565b838360010160109054906101000a900463ffffffff1663ffffffff1614806146f15750838360010160149054906101000a900463ffffffff1663ffffffff16145b156146ff576000905061485b565b60008360010160109054906101000a900463ffffffff1663ffffffff161480614742575060008560010160109054906101000a900463ffffffff1663ffffffff16145b15614750576001905061485b565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff1614806147c557508460010160149054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff16145b156147d3576000905061485b565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff16148061484857508460010160149054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff16145b15614856576000905061485b565b600190505b949350505050565b60008060006007600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16148061496c57508173ffffffffffffffffffffffffffffffffffffffff16600a600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b9250505092915050565b600080614981615178565b60008863ffffffff168914151561499757600080fd5b8763ffffffff16881415156149ab57600080fd5b8661ffff16871415156149bd57600080fd5b6002878115156149c957fe5b049250600d8361ffff1611156149de57600d92505b610100604051908101604052808781526020014267ffffffffffffffff168152602001600067ffffffffffffffff1681526020018a63ffffffff1681526020018963ffffffff168152602001600063ffffffff1681526020018461ffff1681526020018861ffff168152509150600160068054806001018281614a6191906151ec565b916000526020600020906002020160008590919091506000820151816000015560208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601c6101000a81548161ffff021916908361ffff16021790555060e082015181600101601e6101000a81548161ffff021916908361ffff16021790555050500390508063ffffffff1681141515614bb357600080fd5b7f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad58582846060015163ffffffff16856080015163ffffffff168660000151604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a1614c5a60008683614383565b80935050505095945050505050565b6000808260a0015163ffffffff1614158015614c9d57504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b6000806000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663eac9d94c6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515614d3757600080fd5b6102c65a03f11515614d4857600080fd5b505050604051805190509150816fffffffffffffffffffffffffffffffff1682141515614d7457600080fd5b600282811515614d8057fe5b0482019050662386f26fc10000811015614d9f57662386f26fc1000090505b809250505090565b6000808260a0015163ffffffff16148015614dda57504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b6000806000600685815481101515614df557fe5b90600052602060002090600202019150600684815481101515614e1457fe5b90600052602060002090600202019050614e308286838761464e565b9250505092915050565b600080600683815481101515614e4c57fe5b90600052602060002090600202019150600684815481101515614e6b57fe5b90600052602060002090600202019050828160010160186101000a81548163ffffffff021916908363ffffffff160217905550614ea78261504f565b614eb08161504f565b600a600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600a600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600f600081548092919060010191905055507f241ea03ca20251805084d27d4440371c34a0b85ff108f6bb5611248f73818b806007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685858460010160089054906101000a900467ffffffffffffffff16604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018267ffffffffffffffff16815260200194505050505060405180910390a150505050565b60005b60208210151561502c5782518452602084019350602083019250602082039150615007565b6001826020036101000a0390508019835116818551168181178652505050505050565b43600554600383600101601c9054906101000a900461ffff1661ffff16600e8110151561507857fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff168115156150a357fe5b04018160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600d81600101601c9054906101000a900461ffff1661ffff16101561512257600181600101601c8282829054906101000a900461ffff160192506101000a81548161ffff021916908361ffff1602179055505b50565b602060405190810160405280600081525090565b6080604051908101604052806004905b60008019168152602001906001900390816151495790505090565b602060405190810160405280600081525090565b6101006040519081016040528060008152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600061ffff168152602001600061ffff1681525090565b81548183558181151161521957600202816002028360005260206000209182019101615218919061521e565b5b505050565b6152e791905b808211156152e3576000808201600090556001820160006101000a81549067ffffffffffffffff02191690556001820160086101000a81549067ffffffffffffffff02191690556001820160106101000a81549063ffffffff02191690556001820160146101000a81549063ffffffff02191690556001820160186101000a81549063ffffffff021916905560018201601c6101000a81549061ffff021916905560018201601e6101000a81549061ffff021916905550600201615224565b5090565b905600a165627a7a7230582050f78557fd249f103d4560680752c81acc85f1ce7e1a3b0c48f75d38529cc1a70029", "sourceMap": "73435:6774:18:-;;;5032:5;5011:26;;;;;;;;;;;;;;;;;;;;11384:339;;;;;;;;;11427:9;11384:339;;;;;;;;11450:9;11384:339;;;;;;;;11473:9;11384:339;;;;;;;;11496:10;11384:339;;;;;;;;11520:10;11384:339;;;;;;;;11544:7;11384:339;;;;;;;;11565:7;11384:339;;;;;;;;11586:7;11384:339;;;;;;;;11607:7;11384:339;;;;;;;;11628:8;11384:339;;;;;;;;11650:6;11384:339;;;;;;;;11670:6;11384:339;;;;;;;;11690:6;11384:339;;;;;;;;11710:6;11384:339;;;;;;;;;;;;;;;:::i;:::-;;11840:2;11807:35;;30582:8;30552:38;;76645:420;;;;;;;;76718:4;76709:6;;:13;;;;;;;;;;;;;;;;;;76804:10;76791;;:23;;;;;;;;;;;;;;;;;;76901:10;76888;;:23;;;;;;;;;;;;;;;;;;77012:46;77025:1;77028;77031;77042:2;77055:1;77012:12;;;;;:46;;;:::i;:::-;;73435:6774;;15381:1876;15564:4;16148:20;16281:19;;:::i;:::-;16624;15942:9;15927:26;;15914:9;:39;15906:48;;;;;;;;15998:7;15983:24;;15972:7;:35;15964:44;;;;;;;;16056:11;16041:28;;16026:11;:43;16018:52;;;;;;;;16192:1;16178:11;:15;;;;;;;;16148:46;;16224:2;16208:13;:18;;;16204:67;;;16258:2;16242:18;;16204:67;16303:311;;;;;;;;;16330:6;16303:311;;;;16368:3;16303:311;;;;;;16404:1;16303:311;;;;;;16436:9;16303:311;;;;;;16475:7;16303:311;;;;;;16511:1;16303:311;;;;;;16541:13;16303:311;;;;;;16587:11;16303:311;;;;;16281:333;;16669:1;16646:7;:20;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;16659:6;16646:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:24;16624:46;;16857:11;16842:28;;16827:11;:43;16819:52;;;;;;;;16914:160;16933:6;16953:11;16986:6;:15;;;16978:24;;17024:6;:13;;;17016:22;;17052:6;:12;;;16914:160;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17188:33;17198:1;17201:6;17209:11;17188:9;;;;;:33;;;:::i;:::-;17239:11;17232:18;;15381:1876;;;;;;;;;;:::o;13965:758::-;14129:19;:24;14149:3;14129:24;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;14225:3;14195:17;:27;14213:8;14195:27;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;14345:1;14328:19;;:5;:19;;;;14324:317;;;14363:19;:26;14383:5;14363:26;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;14485:20;:30;14506:8;14485:30;;;;;;;;;;;;14478:37;;;;;;;;;;;14600:20;:30;14621:8;14600:30;;;;;;;;;;;;14593:37;;;;;;;;;;;14324:317;14686:30;14695:5;14702:3;14707:8;14686:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13965:758;;;:::o;73435:6774::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;", "deployedSourceMap": "73435:6774:18:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77997:11;;;;;;;;;;;77975:34;;:10;:34;;;:86;;;;78047:13;;;;;;;;;;;78025:36;;:10;:36;;;77975:86;77954:117;;;;;;;;73435:6774;19989:327;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4848:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29456:346;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71323:32:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18924:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24204:395:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4817:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71136:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66994:477;;;;;;;;;;;;;;;;;;;;;;;;;;;;25978:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30647:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35349:235;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71197:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13853:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25066:784;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31057:470;;;;;;;;;;;;;;;;;;;;;;;;;;;;5800:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;6346;;;;;;;;;;;;;;;;;;;;;;;;;;;;67586:978;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79475:305;;;;;;;;;;;;;;13283:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38051:388;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12965:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68725:796;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34379:90;;;;;;;;;;;;;;;;;;;;;;;;;;33972:189;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6073:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;71655:346;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17342:139;;;;;;;;;;;;;;;;;;;;;;;;;;5011:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79863:344;;;;;;;;;;;;;;26205:180;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71042:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76533:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66412:467;;;;;;;;;;;;;;;;;;;;;;;;;;;;22243:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77527:199;;;;;;;;;;;;;;;;;;;;;;;;;;;;11807:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6990:81;;;;;;;;;;;;;;26841:853;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;42595:1586:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70671:142;;;;;;;;;;;;;;18975:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11384:339:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12465:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22790:990;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4879:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30552:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19070:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72106:447;;;;;;;;;;;;;;;;;;;;;;;;;;34991:207;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70985:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20416:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;13564:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78213:904;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69769:703;;;;;;;;;;;;;;;;;;;;;;;;;;71361:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30817:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40000:1958;;;;;;;;;;;;;;;;;;;;;;;;;;19989:327;20060:4;19175:38;;;;;;;;;;;;;;;;;;;20219:41;;;:12;:41;;;;20218:90;;;;19697:42;;;;;;;;;;;;;;;;;;;19647:35;;;;;;;;;;;;;;;;;;;19582:50;;;;;;;;;;;;;;;;;;;;;;;;19529:38;;;;;;;;;;;;;;;;;;;19477:37;;;;;;;;;;;;;;;;;;;19433:29;;;;;;;;;;;;;;;;;;;19387:31;;;;;;;;;;;;;;;;;;;19346:26;;;;;;;;;;;;;;;;;;;19310:21;;;;;;;;;;;;;;;;;;;19276:19;;;;;;;;;;;;;;;;;;;19269:63;:104;:150;:194;:246;:299;:364;:414;:471;20266:41;;;:12;:41;;;;20218:90;20210:99;;19989:327;;;:::o;4848:25::-;;;;;;;;;;;;;:::o;29456:346::-;29548:14;;:::i;:::-;29621:24;;:::i;:::-;29655:13;29608:1;29582:28;;:14;;;;;;;;;;;:28;;;;29574:37;;;;;;;;29696:14;;;;;;;;;;;:26;;;29723:8;29733:19;;29696:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29678:75;;;;;;;;29771:24;29781:6;29789:5;29771:9;:24::i;:::-;29764:31;;29456:346;;;;;;;:::o;71323:32::-;;;;:::o;18924:45::-;;;;;;;;;;;;;;;;;;;;:::o;24204:395::-;24384:27;24390:10;24402:8;24384:5;:27::i;:::-;24376:36;;;;;;;;24491:23;24500:8;24510:3;24491:8;:23::i;:::-;24557:35;24566:10;24578:3;24583:8;24557:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24204:395;;:::o;4817:25::-;;;;;;;;;;;;;:::o;71136:55::-;71182:9;71136:55;:::o;66994:477::-;67072:36;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;67130:8;67072:67;;67339:17;:38;;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67331:49;;;;;;;;67447:17;67431:13;;:33;;;;;;;;;;;;;;;;;;66994:477;;:::o;25978:92::-;26022:4;26062:1;26045:7;:14;;;;:18;26038:25;;25978:92;:::o;30647:30::-;;;;:::o;35349:235::-;35420:4;35459:1;35448:8;:12;35440:21;;;;;;;;35576:1;35542:7;35550:8;35542:17;;;;;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;:35;;;;35535:42;;35349:235;;;:::o;71197:54::-;71245:6;71197:54;:::o;13853:39::-;;;;;;;;;;;;;:::o;25066:784::-;25305:1;25290:17;;:3;:17;;;;25282:26;;;;;;;;25563:4;25548:20;;:3;:20;;;;25540:29;;;;;;;;25637:34;25650:10;25662:8;25637:12;:34::i;:::-;25629:43;;;;;;;;25690:22;25696:5;25703:8;25690:5;:22::i;:::-;25682:31;;;;;;;;25812;25822:5;25829:3;25834:8;25812:9;:31::i;:::-;25066:784;;;:::o;31057:470::-;31133:38;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;31195:8;31133:71;;31404:17;:31;;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31396:42;;;;;;;;31503:17;31489:11;;:31;;;;;;;;;;;;;;;;;;31057:470;;:::o;5800:128::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;5887:1;5868:21;;:7;:21;;;;5860:30;;;;;;;;5914:7;5901:10;;:20;;;;;;;;;;;;;;;;;;5800:128;:::o;6346:::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;6433:1;6414:21;;:7;:21;;;;6406:30;;;;;;;;6460:7;6447:10;;:20;;;;;;;;;;;;;;;;;;6346:128;:::o;67586:978::-;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;67958:27;67964:10;67976:8;67958:5;:27::i;:::-;67950:36;;;;;;;;68198:20;68209:8;68198:10;:20::i;:::-;68197:21;68189:30;;;;;;;;68229:31;68238:8;68248:11;;;;;;;;;;;68229:8;:31::i;:::-;68399:11;;;;;;;;;;;:25;;;68438:8;68460:14;68488:12;68514:9;68537:10;68399:158;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67586:978;;;;:::o;79475:305::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;6812:6;;;;;;;;;;;6804:15;;;;;;;;79561:1;79538:25;;:11;;;;;;;;;;;:25;;;;79530:34;;;;;;;;79607:1;79582:27;;:13;;;;;;;;;;;:27;;;;79574:36;;;;;;;;79651:1;79628:25;;:11;;;;;;;;;;;:25;;;;79620:34;;;;;;;;79702:1;79672:32;;:18;;;;;;;;;;;:32;;;79664:41;;;;;;;;79758:15;:13;:15::i;:::-;79475:305::o;13283:56::-;;;;;;;;;;;;;;;;;;;;;;:::o;38051:388::-;38143:4;38225:20;38276:18;38183:1;38171:9;:13;38163:22;;;;;;;;38213:1;38203:7;:11;38195:20;;;;;;;;38248:7;38256:9;38248:18;;;;;;;;;;;;;;;;;;;;38225:41;;38297:7;38305;38297:16;;;;;;;;;;;;;;;;;;;;38276:37;;38330:52;38349:6;38357:9;38368:4;38374:7;38330:18;:52::i;:::-;:102;;;;;38394:38;38413:7;38422:9;38394:18;:38::i;:::-;38330:102;38323:109;;38051:388;;;;;;:::o;12965:56::-;;;;;;;;;;;;;;;;;;;;;;:::o;68725:796::-;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;69099:27;69105:10;69117:8;69099:5;:27::i;:::-;69091:36;;;;;;;;69145:24;69160:8;69145:14;:24::i;:::-;69137:33;;;;;;;;69180;69189:8;69199:13;;;;;;;;;;;69180:8;:33::i;:::-;69354:13;;;;;;;;;;;:27;;;69395:8;69417:14;69445:12;69471:9;69494:10;69354:160;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68725:796;;;;:::o;34379:90::-;5435:10;;;;;;;;;;;5421:24;;:10;:24;;;5413:33;;;;;;;;34459:3;34444:12;:18;;;;34379:90;:::o;33972:189::-;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;34080:26;34086:10;34098:7;34080:5;:26::i;:::-;34072:35;;;;;;;;34149:5;34117:20;:29;34138:7;34117:29;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;33972:189;;:::o;6073:128::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;6160:1;6141:21;;:7;:21;;;;6133:30;;;;;;;;6187:7;6174:10;;:20;;;;;;;;;;;;;;;;;;6073:128;:::o;71655:346::-;71740:18;5435:10;;;;;;;;;;;5421:24;;:10;:24;;;5413:33;;;;;;;;71761:6;71740:27;;71803:1;71781:24;;:10;:24;;;71777:78;;;71834:10;;;;;;;;;;;71821:23;;71777:78;71032:4;71872:17;;:40;71864:49;;;;;;;;71924:17;;:19;;;;;;;;;;;;;71953:41;71966:1;71969;71972;71975:6;71983:10;71953:12;:41::i;:::-;;71655:346;;;:::o;17342:139::-;5537:10;;;;;;;;;;;5523:24;;:10;:24;;;:64;;;;5577:10;;;;;;;;;;;5563:24;;:10;:24;;;5523:64;:104;;;;5617:10;;;;;;;;;;;5603:24;;:10;:24;;;5523:104;5502:135;;;;;;;;17429:9;17439:1;17429:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17422:19;;:4;:19;17414:28;;;;;;;;17470:4;17452:15;:22;;;;17342:139;:::o;5011:26::-;;;;;;;;;;;;;:::o;79863:344::-;79917:15;80039:20;5293:10;;;;;;;;;;;5279:24;;:10;:24;;;5271:33;;;;;;;;79935:4;:12;;;79917:30;;80086:12;;80081:1;80063:15;;:19;80062:36;80039:59;;80123:12;80113:7;:22;80109:92;;;80151:10;;;;;;;;;;;:15;;:39;80177:12;80167:7;:22;80151:39;;;;;;;;;;;;;;;;;;;;;;;;80109:92;79863:344;;:::o;26205:180::-;26275:13;26312:17;:27;26330:8;26312:27;;;;;;;;;;;;;;;;;;;;;26304:35;;26375:1;26358:19;;:5;:19;;;;26350:28;;;;;;;;26205:180;;;:::o;71042:51::-;71088:5;71042:51;:::o;76533:33::-;;;;;;;;;;;;;:::o;66412:467::-;66488:34;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;66542:8;66488:63;;66751:17;:36;;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66743:47;;;;;;;;66855:17;66841:11;;:31;;;;;;;;;;;;;;;;;;66412:467;;:::o;22243:122::-;22299:13;22331:19;:27;22351:6;22331:27;;;;;;;;;;;;;;;;22324:34;;22243:122;;;:::o;77527:199::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;6812:6;;;;;;;;;;;6804:15;;;;;;;;77672:10;77651:18;;:31;;;;;;;;;;;;;;;;;;77692:27;77708:10;77692:27;;;;;;;;;;;;;;;;;;;;;;77527:199;:::o;11807:35::-;;;;:::o;6990:81::-;5537:10;;;;;;;;;;;5523:24;;:10;:24;;;:64;;;;5577:10;;;;;;;;;;;5563:24;;:10;:24;;;5523:64;:104;;;;5617:10;;;;;;;;;;;5603:24;;:10;:24;;;5523:104;5502:135;;;;;;;;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;7060:4;7051:6;;:13;;;;;;;;;;;;;;;;;;6990:81::o;26841:853::-;26902:21;;:::i;:::-;26935:18;27110:23;;:::i;:::-;27175:17;27222:19;27402:13;26956:17;26966:6;26956:9;:17::i;:::-;26935:38;;27002:1;26988:10;:15;26984:704;;;27077:1;27063:16;;;;;;;;;;;;;;;;;;;;;;;;27056:23;;;;26984:704;27150:10;27136:25;;;;;;;;;;;;;;;;;;;;;;;;27110:51;;27195:13;:11;:13::i;:::-;27175:33;;27244:1;27222:23;;27443:1;27435:9;;27430:220;27455:9;27446:5;:18;;27430:220;;;27525:6;27497:34;;:17;:24;27515:5;27497:24;;;;;;;;;;;;;;;;;;;;;:34;;;27493:143;;;27577:5;27555:6;27562:11;27555:19;;;;;;;;;;;;;;;;;:27;;;;;27604:13;;;;;;;27493:143;27466:7;;;;;;;27430:220;;;27671:6;27664:13;;26841:853;;;;;;;;;:::o;42595:1586::-;42676:7;42753:20;43068:14;43114:18;43230:16;43436:18;43575:13;43629:16;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;42776:7;42784:9;42776:18;;;;;;;;;;;;;;;;;;;;42753:41;;42882:1;42862:6;:16;;;;;;;;;;;;:21;;;;42854:30;;;;;;;;42977:27;42997:6;42977:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:19;:27::i;:::-;42969:36;;;;;;;;43085:6;:19;;;;;;;;;;;;43068:36;;;;43135:7;43143:6;43135:15;;;;;;;;;;;;;;;;;;;;43114:36;;43249:6;:17;;;;;;;;;;;;43230:36;;43298:6;:17;;;;;;;;;;;;43280:35;;:4;:15;;;;;;;;;;;;:35;;;43276:93;;;43343:4;:15;;;;;;;;;;;;43331:27;;43276:93;43457:11;;;;;;;;;;;:20;;;43478:6;:12;;;43492:4;:10;;;43530:1;43504:6;:23;;;;;;;;;;;;:27;43457:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43436:96;;43591:17;:28;43609:9;43591:28;;;;;;;;;;;;;;;;;;;;;43575:44;;43648:78;43661:9;43672:6;:19;;;;;;;;;;;;43648:78;;43705:1;43693:9;:13;43648:78;;43708:10;43720:5;43648:12;:78::i;:::-;43629:97;;43888:6;:19;;;43881:26;;;;;;;;;;;43984:15;;:17;;;;;;;;;;;;;;44081:10;:15;;:29;44097:12;;44081:29;;;;;;;;;;;;;;;;;;;;;;;;44166:8;44159:15;;42595:1586;;;;;;;;;;:::o;70671:142::-;5537:10;;;;;;;;;;;5523:24;;:10;:24;;;:64;;;;5577:10;;;;;;;;;;;5563:24;;:10;:24;;;5523:64;:104;;;;5617:10;;;;;;;;;;;5603:24;;:10;:24;;;5523:104;5502:135;;;;;;;;70736:11;;;;;;;;;;;:27;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70775:13;;;;;;;;;;;:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70671:142::o;18975:36::-;;;;;;;;;;;;;;;;;;;;:::o;11384:339::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;12465:53::-;;;;;;;;;;;;;;;;;;;;;;:::o;22790:990::-;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;22999:1;22984:17;;:3;:17;;;;22976:26;;;;;;;;23257:4;23242:20;;:3;:20;;;;23234:29;;;;;;;;23498:11;;;;;;;;;;;23483:27;;:3;:27;;;;23475:36;;;;;;;;23544:13;;;;;;;;;;;23529:29;;:3;:29;;;;23521:38;;;;;;;;23621:27;23627:10;23639:8;23621:5;:27::i;:::-;23613:36;;;;;;;;23737;23747:10;23759:3;23764:8;23737:9;:36::i;:::-;22790:990;;:::o;4879:25::-;;;;;;;;;;;;;:::o;30552:38::-;;;;:::o;19070:43::-;;;;;;;;;;;;;:::o;72106:447::-;72234:15;5435:10;;;;;;;;;;;5421:24;;:10;:24;;;5413:33;;;;;;;;71088:5;72184:16;;:38;72176:47;;;;;;;;72252:44;72265:1;72268;72271;72274:6;72290:4;72252:12;:44::i;:::-;72234:62;;72306:30;72315:7;72324:11;;;;;;;;;;;72306:8;:30::i;:::-;72347:11;;;;;;;;;;;:25;;;72386:7;72407:23;:21;:23::i;:::-;72444:1;71245:6;72502:4;72347:170;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72528:16;;:18;;;;;;;;;;;;;72106:447;;:::o;34991:207::-;35066:4;35117:17;35105:1;35094:8;:12;35086:21;;;;;;;;35137:7;35145:8;35137:17;;;;;;;;;;;;;;;;;;;;35117:37;;35171:20;35187:3;35171:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:15;:20::i;:::-;35164:27;;34991:207;;;;:::o;70985:51::-;71032:4;70985:51;:::o;20416:142::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;20534:16;20495:14;;:56;;;;;;;;;;;;;;;;;;20416:142;:::o;13564:35::-;;;;;;;;;;;;;:::o;78213:904::-;78288:16;78314:12;78336:21;78367:20;78397;78427:17;78454:16;78480:14;78504:18;78532:13;78562:17;78582:7;78590:3;78582:12;;;;;;;;;;;;;;;;;;;;78562:32;;78697:1;78677:3;:16;;;;;;;;;;;;:21;;;;78662:37;;78744:12;78720:3;:20;;;;;;;;;;;;:36;;;;78709:48;;78791:3;:17;;;;;;;;;;;;78783:26;;78767:42;;78842:3;:20;;;;;;;;;;;;78834:29;;78819:44;;78896:3;:16;;;;;;;;;;;;78888:25;;78873:40;;78943:3;:13;;;;;;;;;;;;78935:22;;78923:34;;78986:3;:12;;;;;;;;;;;;78978:21;;78967:32;;79026:3;:10;;;;;;;;;;;;79018:19;;79009:28;;79068:3;:14;;;;;;;;;;;;79060:23;;79047:36;;79101:3;:9;;;79093:17;;78213:904;;;;;;;;;;;;:::o;69769:703::-;70165:20;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;69967:28;69973:10;69985:9;69967:5;:28::i;:::-;69959:37;;;;;;;;70014:25;70029:9;70014:14;:25::i;:::-;70006:34;;;;;;;;70058:43;70082:9;70093:7;70058:23;:43::i;:::-;70050:52;;;;;;;;70188:13;;;;;;;;;;;:29;;;70218:7;70188:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70165:61;;70272:12;;70257;:27;70244:9;:40;;70236:49;;;;;;;;70351:13;;;;;;;;;;;:17;;;70387:12;;70375:9;:24;70401:7;70351:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70419:46;70437:9;70419:46;;70456:7;70419:46;;:10;:46::i;:::-;69769:703;;;:::o;71361:31::-;;;;:::o;30817:39::-;;;;;;;;;;;;;:::o;40000:1958::-;41267:20;41494:18;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;40168:12;;40155:9;:25;;40147:34;;;;;;;;40239:28;40245:10;40257:9;40239:5;:28::i;:::-;40231:37;;;;;;;;41165:38;41184:7;41193:9;41165:18;:38::i;:::-;41157:47;;;;;;;;41290:7;41298:9;41290:18;;;;;;;;;;;;;;;;;;;;41267:41;;41409:23;41425:6;41409:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:15;:23::i;:::-;41401:32;;;;;;;;41515:7;41523;41515:16;;;;;;;;;;;;;;;;;;;;41494:37;;41630:21;41646:4;41630:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:15;:21::i;:::-;41622:30;;;;;;;;41728:130;41764:6;41788:9;41815:4;41837:7;41728:18;:130::i;:::-;41720:139;;;;;;;;41921:30;41932:9;41943:7;41921:10;:30::i;:::-;40000:1958;;;;:::o;28808:403::-;28894:6;;:::i;:::-;28912:16;;:::i;:::-;28966:17;28993:16;28942:13;28931:25;;;;;;;;;;;;;;;;;;;;;;;;;;;28912:44;;29074:2;29060:12;29056:3;29043:34;;29102:9;29090:21;;29131:43;29139:9;29150:8;29160:13;29131:7;:43::i;:::-;29192:12;29185:19;;28808:403;;;;;;;:::o;20967:145::-;21042:4;21096:9;21065:40;;:17;:27;21083:8;21065:27;;;;;;;;;;;;;;;;;;;;;:40;;;21058:47;;20967:145;;;;:::o;21944:123::-;22051:9;22018:20;:30;22039:8;22018:30;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;21944:123;;:::o;21346:155::-;21428:4;21485:9;21451:43;;:20;:30;21472:8;21451:30;;;;;;;;;;;;;;;;;;;;;:43;;;21444:50;;21346:155;;;;:::o;13965:758::-;14129:19;:24;14149:3;14129:24;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;14225:3;14195:17;:27;14213:8;14195:27;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;14345:1;14328:19;;:5;:19;;;;14324:317;;;14363:19;:26;14383:5;14363:26;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;14485:20;:30;14506:8;14485:30;;;;;;;;;;;;14478:37;;;;;;;;;;;14600:20;:30;14621:8;14600:30;;;;;;;;;;;;14593:37;;;;;;;;;;;14324:317;14686:30;14695:5;14702:3;14707:8;14686:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13965:758;;;:::o;7359:126::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;6812:6;;;;;;;;;;;6804:15;;;;;;;;7473:5;7464:6;;:14;;;;;;;;;;;;;;;;;;7359:126::o;35986:1169::-;36165:4;36246:7;36233:9;:20;36229:63;;;36276:5;36269:12;;;;36229:63;36377:7;36357;:16;;;;;;;;;;;;:27;;;:56;;;;36406:7;36388;:14;;;;;;;;;;;;:25;;;36357:56;36353:99;;;36436:5;36429:12;;;;36353:99;36483:9;36465:5;:14;;;;;;;;;;;;:27;;;:56;;;;36512:9;36496:5;:12;;;;;;;;;;;;:25;;;36465:56;36461:99;;;36544:5;36537:12;;;;36461:99;36714:1;36696:5;:14;;;;;;;;;;;;:19;;;:44;;;;36739:1;36719:7;:16;;;;;;;;;;;;:21;;;36696:44;36692:86;;;36763:4;36756:11;;;;36692:86;36869:7;:16;;;;;;;;;;;;36851:34;;:5;:14;;;;;;;;;;;;:34;;;:70;;;;36907:7;:14;;;;;;;;;;;;36889:32;;:5;:14;;;;;;;;;;;;:32;;;36851:70;36847:113;;;36944:5;36937:12;;;;36847:113;36989:7;:16;;;;;;;;;;;;36973:32;;:5;:12;;;;;;;;;;;;:32;;;:66;;;;37025:7;:14;;;;;;;;;;;;37009:30;;:5;:12;;;;;;;;;;;;:30;;;36973:66;36969:109;;;37062:5;37055:12;;;;36969:109;37144:4;37137:11;;35986:1169;;;;;;;:::o;32350:441::-;32437:4;32453:19;32513:17;32475;:28;32493:9;32475:28;;;;;;;;;;;;;;;;;;;;;32453:50;;32533:17;:26;32551:7;32533:26;;;;;;;;;;;;;;;;;;;;;32513:46;;32726:9;32711:24;;:11;:24;;;:72;;;;32772:11;32739:44;;:20;:29;32760:7;32739:29;;;;;;;;;;;;;;;;;;;;;:44;;;32711:72;32703:81;;32350:441;;;;;;:::o;15381:1876::-;15564:4;16148:20;16281:19;;:::i;:::-;16624;15942:9;15927:26;;15914:9;:39;15906:48;;;;;;;;15998:7;15983:24;;15972:7;:35;15964:44;;;;;;;;16056:11;16041:28;;16026:11;:43;16018:52;;;;;;;;16192:1;16178:11;:15;;;;;;;;16148:46;;16224:2;16208:13;:18;;;16204:67;;;16258:2;16242:18;;16204:67;16303:311;;;;;;;;;16330:6;16303:311;;;;16368:3;16303:311;;;;;;16404:1;16303:311;;;;;;16436:9;16303:311;;;;;;16475:7;16303:311;;;;;;16511:1;16303:311;;;;;;16541:13;16303:311;;;;;;16587:11;16303:311;;;;;16281:333;;16669:1;16646:7;:20;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;16659:6;16646:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:24;16624:46;;16857:11;16842:28;;16827:11;:43;16819:52;;;;;;;;16914:160;16933:6;16953:11;16986:6;:15;;;16978:24;;17024:6;:13;;;17016:22;;17052:6;:12;;;16914:160;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17188:33;17198:1;17201:6;17209:11;17188:9;:33::i;:::-;17239:11;17232:18;;15381:1876;;;;;;;;;;:::o;34588:177::-;34654:4;34702:1;34678:7;:20;;;:25;;;;34677:81;;;;;34744:12;34709:48;;:7;:24;;;:48;;;;34677:81;34670:88;;34588:177;;;:::o;72674:499::-;72730:7;72749:16;72934:17;72768:11;;;;;;;;;;;:32;;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72749:53;;72912:8;72896:26;;72884:8;:38;72876:47;;;;;;;;72977:1;72966:8;:12;;;;;;;;72954:8;:25;72934:45;;71182:9;73051;:31;73047:93;;;71182:9;73098:31;;73047:93;73157:9;73150:16;;72674:499;;;:::o;31720:397::-;31780:4;32057:1;32036:4;:17;;;:22;;;32035:75;;;;;32096:12;32064:45;;:4;:21;;;:45;;;;32035:75;32028:82;;31720:397;;;:::o;37332:288::-;37436:4;37456:20;37507:18;37479:7;37487:9;37479:18;;;;;;;;;;;;;;;;;;;;37456:41;;37528:7;37536;37528:16;;;;;;;;;;;;;;;;;;;;37507:37;;37561:52;37580:6;37588:9;37599:4;37605:7;37561:18;:52::i;:::-;37554:59;;37332:288;;;;;;:::o;38573:924::-;38705:18;38752:20;38726:7;38734;38726:16;;;;;;;;;;;;;;;;;;;;38705:37;;38775:7;38783:9;38775:18;;;;;;;;;;;;;;;;;;;;38752:41;;38907:7;38878:6;:19;;;:37;;;;;;;;;;;;;;;;;;38976:22;38993:4;38976:16;:22::i;:::-;39008:24;39025:6;39008:16;:24::i;:::-;39185:20;:31;39206:9;39185:31;;;;;;;;;;;;39178:38;;;;;;;;;;;39233:20;:29;39254:7;39233:29;;;;;;;;;;;;39226:36;;;;;;;;;;;39342:15;;:17;;;;;;;;;;;;;39407:83;39416:17;:28;39434:9;39416:28;;;;;;;;;;;;;;;;;;;;;39446:9;39457:7;39466:6;:23;;;;;;;;;;;;39407:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38573:924;;;;:::o;27965:565::-;28301:12;28089:170;28103:2;28095:4;:10;;28089:170;;;28180:4;28174:5;28167;28160:6;28222:2;28213:11;;;;28246:2;28238:10;;;;28115:2;28107:10;;;;28089:170;;;28337:1;28329:4;28324:2;:9;28316:3;:18;:22;28301:37;;28407:4;28403:3;28396:4;28390:5;28386:3;28460:4;28452:5;28446;28442:3;28505:7;28495:8;28492:2;28485:5;28478:6;28357:167;;;;;;:::o;33053:596::-;33306:12;33287:15;;33254:9;33264:7;:21;;;;;;;;;;;;33254:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:48;;;;;;;;;;33253:65;33219:7;:24;;;:100;;;;;;;;;;;;;;;;;;33588:2;33564:7;:21;;;;;;;;;;;;:26;;;33560:83;;;33631:1;33606:7;:21;;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33560:83;33053:596;:::o;73435:6774::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", "source": "pragma solidity 0.4.18;\n\n/**\n The following contract code, titled KittyCore, was written by Cryptokitties and published\n and retrieved from https://etherscan.io/address/0x06012c8cf97bead5deae237070f9587f8e7a266d#code.\n\n It is included in the current project for test purposes, to ensure that our collateralizer can\n handle ERC721 tokens created by the KittyCore contract.\n*/\n\n/**\n * @title KittiesOwnable\n * @dev The KittiesOwnable contract has an owner address, and provides basic authorization control\n * functions, this simplifies the implementation of \"user permissions\".\n */\ncontract KittiesOwnable {\n address public owner;\n\n\n /**\n\t * @dev The KittiesOwnable constructor sets the original `owner` of the contract to the sender\n\t * account.\n\t */\n function KittiesOwnable() {\n owner = msg.sender;\n }\n\n\n /**\n\t * @dev Throws if called by any account other than the owner.\n\t */\n modifier onlyOwner() {\n require(msg.sender == owner);\n _;\n }\n\n\n /**\n\t * @dev Allows the current owner to transfer control of the contract to a newOwner.\n\t * @param newOwner The address to transfer ownership to.\n\t */\n function transferOwnership(address newOwner) onlyOwner {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n\n}\n\n\n\n/// @title Interface for contracts conforming to ERC-721: Non-Fungible Tokens\n/// @author Dieter Shirley (https://github.com/dete)\ncontract KittiesERC721 {\n // Required methods\n function totalSupply() public view returns (uint256 total);\n function balanceOf(address _owner) public view returns (uint256 balance);\n function ownerOf(uint256 _tokenId) external view returns (address owner);\n function approve(address _to, uint256 _tokenId) external;\n function transfer(address _to, uint256 _tokenId) external;\n function transferFrom(address _from, address _to, uint256 _tokenId) external;\n\n // Events\n event Transfer(address from, address to, uint256 tokenId);\n event Approval(address owner, address approved, uint256 tokenId);\n\n // Optional\n // function name() public view returns (string name);\n // function symbol() public view returns (string symbol);\n // function tokensOfOwner(address _owner) external view returns (uint256[] tokenIds);\n // function tokenMetadata(uint256 _tokenId, string _preferredTransport) public view returns (string infoUrl);\n\n // ERC-165 Compatibility (https://github.com/ethereum/EIPs/issues/165)\n function supportsInterface(bytes4 _interfaceID) external view returns (bool);\n}\n\n\n// // Auction wrapper functions\n\n\n// Auction wrapper functions\n\n\n\n\n\n\n\n/// @title SEKRETOOOO\ncontract GeneScienceInterface {\n /// @dev simply a boolean to indicate this is the contract we expect to be\n function isGeneScience() public pure returns (bool);\n\n /// @dev given genes of kitten 1 & 2, return a genetic combination - may have a random factor\n /// @param genes1 genes of mom\n /// @param genes2 genes of sire\n /// @return the genes that are supposed to be passed down the child\n function mixGenes(uint256 genes1, uint256 genes2, uint256 targetBlock) public returns (uint256);\n}\n\n\n\n\n\n\n\n/// @title A facet of KittyCore that manages special access privileges.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyAccessControl {\n // This facet controls access control for CryptoKitties. There are four roles managed here:\n //\n // - The CEO: The CEO can reassign other roles and change the addresses of our dependent smart\n // contracts. It is also the only role that can unpause the smart contract. It is initially\n // set to the address that created the smart contract in the KittyCore constructor.\n //\n // - The CFO: The CFO can withdraw funds from KittyCore and its auction contracts.\n //\n // - The COO: The COO can release gen0 kitties to auction, and mint promo cats.\n //\n // It should be noted that these roles are distinct without overlap in their access abilities, the\n // abilities listed for each role above are exhaustive. In particular, while the CEO can assign any\n // address to any role, the CEO address itself doesn't have the ability to act in those roles. This\n // restriction is intentional so that we aren't tempted to use the CEO address frequently out of\n // convenience. The less we use an address, the less likely it is that we somehow compromise the\n // account.\n\n /// @dev Emited when contract is upgraded - See README.md for updgrade plan\n event ContractUpgrade(address newContract);\n\n // The addresses of the accounts (or contracts) that can execute actions within each roles.\n address public ceoAddress;\n address public cfoAddress;\n address public cooAddress;\n\n // @dev Keeps track whether the contract is paused. When that is true, most actions are blocked\n bool public paused = false;\n\n /// @dev Access modifier for CEO-only functionality\n modifier onlyCEO() {\n require(msg.sender == ceoAddress);\n _;\n }\n\n /// @dev Access modifier for CFO-only functionality\n modifier onlyCFO() {\n require(msg.sender == cfoAddress);\n _;\n }\n\n /// @dev Access modifier for COO-only functionality\n modifier onlyCOO() {\n require(msg.sender == cooAddress);\n _;\n }\n\n modifier onlyCLevel() {\n require(\n msg.sender == cooAddress ||\n msg.sender == ceoAddress ||\n msg.sender == cfoAddress\n );\n _;\n }\n\n /// @dev Assigns a new address to act as the CEO. Only available to the current CEO.\n /// @param _newCEO The address of the new CEO\n function setCEO(address _newCEO) external onlyCEO {\n require(_newCEO != address(0));\n\n ceoAddress = _newCEO;\n }\n\n /// @dev Assigns a new address to act as the CFO. Only available to the current CEO.\n /// @param _newCFO The address of the new CFO\n function setCFO(address _newCFO) external onlyCEO {\n require(_newCFO != address(0));\n\n cfoAddress = _newCFO;\n }\n\n /// @dev Assigns a new address to act as the COO. Only available to the current CEO.\n /// @param _newCOO The address of the new COO\n function setCOO(address _newCOO) external onlyCEO {\n require(_newCOO != address(0));\n\n cooAddress = _newCOO;\n }\n\n /*** KittiesPausable functionality adapted from OpenZeppelin ***/\n\n /// @dev Modifier to allow actions only when the contract IS NOT paused\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /// @dev Modifier to allow actions only when the contract IS paused\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /// @dev Called by any \"C-level\" role to pause the contract. Used only when\n /// a bug or exploit is detected and we need to limit damage.\n function pause() external onlyCLevel whenNotPaused {\n paused = true;\n }\n\n /// @dev Unpauses the smart contract. Can only be called by the CEO, since\n /// one reason we may pause the contract is when CFO or COO accounts are\n /// compromised.\n /// @notice This is public rather than external so it can be called by\n /// derived contracts.\n function unpause() public onlyCEO whenPaused {\n // can't unpause if contract was upgraded\n paused = false;\n }\n}\n\n\n\n\n/// @title Base contract for CryptoKitties. Holds all common structs, events and base variables.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBase is KittyAccessControl {\n /*** EVENTS ***/\n\n /// @dev The Birth event is fired whenever a new kitten comes into existence. This obviously\n /// includes any time a cat is created through the giveBirth method, but it is also called\n /// when a new gen0 cat is created.\n event Birth(address owner, uint256 kittyId, uint256 matronId, uint256 sireId, uint256 genes);\n\n /// @dev Transfer event as defined in current draft of ERC721. Emitted every time a kitten\n /// ownership is assigned, including births.\n event Transfer(address from, address to, uint256 tokenId);\n\n /*** DATA TYPES ***/\n\n /// @dev The main Kitty struct. Every cat in CryptoKitties is represented by a copy\n /// of this structure, so great care was taken to ensure that it fits neatly into\n /// exactly two 256-bit words. Note that the order of the members in this structure\n /// is important because of the byte-packing rules used by Ethereum.\n /// Ref: http://solidity.readthedocs.io/en/develop/miscellaneous.html\n struct Kitty {\n // The Kitty's genetic code is packed into these 256-bits, the format is\n // sooper-sekret! A cat's genes never change.\n uint256 genes;\n\n // The timestamp from the block when this cat came into existence.\n uint64 birthTime;\n\n // The minimum timestamp after which this cat can engage in breeding\n // activities again. This same timestamp is used for the pregnancy\n // timer (for matrons) as well as the siring cooldown.\n uint64 cooldownEndBlock;\n\n // The ID of the parents of this kitty, set to 0 for gen0 cats.\n // Note that using 32-bit unsigned integers limits us to a \"mere\"\n // 4 billion cats. This number might seem small until you realize\n // that Ethereum currently has a limit of about 500 million\n // transactions per year! So, this definitely won't be a problem\n // for several years (even as Ethereum learns to scale).\n uint32 matronId;\n uint32 sireId;\n\n // Set to the ID of the sire cat for matrons that are pregnant,\n // zero otherwise. A non-zero value here is how we know a cat\n // is pregnant. Used to retrieve the genetic material for the new\n // kitten when the birth transpires.\n uint32 siringWithId;\n\n // Set to the index in the cooldown array (see below) that represents\n // the current cooldown duration for this Kitty. This starts at zero\n // for gen0 cats, and is initialized to floor(generation/2) for others.\n // Incremented by one for each successful breeding action, regardless\n // of whether this cat is acting as matron or sire.\n uint16 cooldownIndex;\n\n // The \"generation number\" of this cat. Cats minted by the CK contract\n // for sale are called \"gen0\" and have a generation number of 0. The\n // generation number of all other cats is the larger of the two generation\n // numbers of their parents, plus one.\n // (i.e. max(matron.generation, sire.generation) + 1)\n uint16 generation;\n }\n\n /*** CONSTANTS ***/\n\n /// @dev A lookup table indicating the cooldown duration after any successful\n /// breeding action, called \"pregnancy time\" for matrons and \"siring cooldown\"\n /// for sires. Designed such that the cooldown roughly doubles each time a cat\n /// is bred, encouraging owners not to just keep breeding the same cat over\n /// and over again. Caps out at one week (a cat can breed an unbounded number\n /// of times, and the maximum cooldown is always seven days).\n uint32[14] public cooldowns = [\n uint32(1 minutes),\n uint32(2 minutes),\n uint32(5 minutes),\n uint32(10 minutes),\n uint32(30 minutes),\n uint32(1 hours),\n uint32(2 hours),\n uint32(4 hours),\n uint32(8 hours),\n uint32(16 hours),\n uint32(1 days),\n uint32(2 days),\n uint32(4 days),\n uint32(7 days)\n ];\n\n // An approximation of currently how many seconds are in between blocks.\n uint256 public secondsPerBlock = 15;\n\n /*** STORAGE ***/\n\n /// @dev An array containing the Kitty struct for all Kitties in existence. The ID\n /// of each cat is actually an index into this array. Note that ID 0 is a negacat,\n /// the unKitty, the mythical beast that is the parent of all gen0 cats. A bizarre\n /// creature that is both matron and sire... to itself! Has an invalid genetic code.\n /// In other words, cat ID 0 is invalid... ;-)\n Kitty[] kitties;\n\n /// @dev A mapping from cat IDs to the address that owns them. All cats have\n /// some valid owner address, even gen0 cats are created with a non-zero owner.\n mapping (uint256 => address) public kittyIndexToOwner;\n\n // @dev A mapping from owner address to count of tokens that address owns.\n // Used internally inside balanceOf() to resolve ownership count.\n mapping (address => uint256) ownershipTokenCount;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to call\n /// transferFrom(). Each Kitty can only have one approved address for transfer\n /// at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public kittyIndexToApproved;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to use\n /// this Kitty for siring via breedWith(). Each Kitty can only have one approved\n /// address for siring at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public sireAllowedToAddress;\n\n /// @dev The address of the ClockAuction contract that handles sales of Kitties. This\n /// same contract handles both peer-to-peer sales as well as the gen0 sales which are\n /// initiated every 15 minutes.\n SaleClockAuction public saleAuction;\n\n /// @dev The address of a custom ClockAuction subclassed contract that handles siring\n /// auctions. Needs to be separate from saleAuction because the actions taken on success\n /// after a sales and siring auction are quite different.\n SiringClockAuction public siringAuction;\n\n /// @dev Assigns ownership of a specific Kitty to an address.\n function _transfer(address _from, address _to, uint256 _tokenId) internal {\n // Since the number of kittens is capped to 2^32 we can't overflow this\n ownershipTokenCount[_to]++;\n // transfer ownership\n kittyIndexToOwner[_tokenId] = _to;\n // When creating new kittens _from is 0x0, but we can't account that address.\n if (_from != address(0)) {\n ownershipTokenCount[_from]--;\n // once the kitten is transferred also clear sire allowances\n delete sireAllowedToAddress[_tokenId];\n // clear any previously approved ownership exchange\n delete kittyIndexToApproved[_tokenId];\n }\n // Emit the transfer event.\n Transfer(_from, _to, _tokenId);\n }\n\n /// @dev An internal method that creates a new kitty and stores it. This\n /// method doesn't do any checking and should only be called when the\n /// input data is known to be valid. Will generate both a Birth event\n /// and a Transfer event.\n /// @param _matronId The kitty ID of the matron of this cat (zero for gen0)\n /// @param _sireId The kitty ID of the sire of this cat (zero for gen0)\n /// @param _generation The generation number of this cat, must be computed by caller.\n /// @param _genes The kitty's genetic code.\n /// @param _owner The inital owner of this cat, must be non-zero (except for the unKitty, ID 0)\n function _createKitty(\n uint256 _matronId,\n uint256 _sireId,\n uint256 _generation,\n uint256 _genes,\n address _owner\n )\n internal\n returns (uint)\n {\n // These requires are not strictly necessary, our calling code should make\n // sure that these conditions are never broken. However! _createKitty() is already\n // an expensive call (for storage), and it doesn't hurt to be especially careful\n // to ensure our data structures are always valid.\n require(_matronId == uint256(uint32(_matronId)));\n require(_sireId == uint256(uint32(_sireId)));\n require(_generation == uint256(uint16(_generation)));\n\n // New kitty starts with the same cooldown as parent gen/2\n uint16 cooldownIndex = uint16(_generation / 2);\n if (cooldownIndex > 13) {\n cooldownIndex = 13;\n }\n\n Kitty memory _kitty = Kitty({\n genes: _genes,\n birthTime: uint64(now),\n cooldownEndBlock: 0,\n matronId: uint32(_matronId),\n sireId: uint32(_sireId),\n siringWithId: 0,\n cooldownIndex: cooldownIndex,\n generation: uint16(_generation)\n });\n uint256 newKittenId = kitties.push(_kitty) - 1;\n\n // It's probably never going to happen, 4 billion cats is A LOT, but\n // let's just be 100% sure we never let this happen.\n require(newKittenId == uint256(uint32(newKittenId)));\n\n // emit the birth event\n Birth(\n _owner,\n newKittenId,\n uint256(_kitty.matronId),\n uint256(_kitty.sireId),\n _kitty.genes\n );\n\n // This will assign ownership, and also emit the Transfer event as\n // per ERC721 draft\n _transfer(0, _owner, newKittenId);\n\n return newKittenId;\n }\n\n // Any C-level can fix how many seconds per blocks are currently observed.\n function setSecondsPerBlock(uint256 secs) external onlyCLevel {\n require(secs < cooldowns[0]);\n secondsPerBlock = secs;\n }\n}\n\n\n\n\n\n/// @title The external contract that is responsible for generating metadata for the kitties,\n/// it has one function that will return the data as bytes.\ncontract KittiesERC721Metadata {\n /// @dev Given a token Id, returns a byte array that is supposed to be converted into string.\n function getMetadata(uint256 _tokenId, string) public view returns (bytes32[4] buffer, uint256 count) {\n if (_tokenId == 1) {\n buffer[0] = \"Hello World! :D\";\n count = 15;\n } else if (_tokenId == 2) {\n buffer[0] = \"I would definitely choose a medi\";\n buffer[1] = \"um length string.\";\n count = 49;\n } else if (_tokenId == 3) {\n buffer[0] = \"Lorem ipsum dolor sit amet, mi e\";\n buffer[1] = \"st accumsan dapibus augue lorem,\";\n buffer[2] = \" tristique vestibulum id, libero\";\n buffer[3] = \" suscipit varius sapien aliquam.\";\n count = 128;\n }\n }\n}\n\n\n/// @title The facet of the CryptoKitties core contract that manages ownership, ERC-721 (draft) compliant.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev Ref: https://github.com/ethereum/EIPs/issues/721\n/// See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyOwnership is KittyBase, KittiesERC721 {\n\n /// @notice Name and symbol of the non fungible token, as defined in ERC721.\n string public constant name = \"CryptoKitties\";\n string public constant symbol = \"CK\";\n\n // The contract that will return kitty metadata\n KittiesERC721Metadata public erc721Metadata;\n\n bytes4 constant InterfaceSignature_ERC165 =\n bytes4(keccak256('supportsInterface(bytes4)'));\n\n bytes4 constant InterfaceSignature_ERC721 =\n bytes4(keccak256('name()')) ^\n bytes4(keccak256('symbol()')) ^\n bytes4(keccak256('totalSupply()')) ^\n bytes4(keccak256('balanceOf(address)')) ^\n bytes4(keccak256('ownerOf(uint256)')) ^\n bytes4(keccak256('approve(address,uint256)')) ^\n bytes4(keccak256('transfer(address,uint256)')) ^\n bytes4(keccak256('transferFrom(address,address,uint256)')) ^\n bytes4(keccak256('tokensOfOwner(address)')) ^\n bytes4(keccak256('tokenMetadata(uint256,string)'));\n\n /// @notice Introspection interface as per ERC-165 (https://github.com/ethereum/EIPs/issues/165).\n /// Returns true for any standardized interfaces implemented by this contract. We implement\n /// ERC-165 (obviously!) and ERC-721.\n function supportsInterface(bytes4 _interfaceID) external view returns (bool)\n {\n // DEBUG ONLY\n //require((InterfaceSignature_ERC165 == 0x01ffc9a7) && (InterfaceSignature_ERC721 == 0x9a20483d));\n\n return ((_interfaceID == InterfaceSignature_ERC165) || (_interfaceID == InterfaceSignature_ERC721));\n }\n\n /// @dev Set the address of the sibling contract that tracks metadata.\n /// CEO only.\n function setMetadataAddress(address _contractAddress) public onlyCEO {\n erc721Metadata = KittiesERC721Metadata(_contractAddress);\n }\n\n // Internal utility functions: These functions all assume that their input arguments\n // are valid. We leave it to public methods to sanitize their inputs and follow\n // the required logic.\n\n /// @dev Checks if a given address is the current owner of a particular Kitty.\n /// @param _claimant the address we are validating against.\n /// @param _tokenId kitten id, only valid when > 0\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToOwner[_tokenId] == _claimant;\n }\n\n /// @dev Checks if a given address currently has transferApproval for a particular Kitty.\n /// @param _claimant the address we are confirming kitten is approved for.\n /// @param _tokenId kitten id, only valid when > 0\n function _approvedFor(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToApproved[_tokenId] == _claimant;\n }\n\n /// @dev Marks an address as being approved for transferFrom(), overwriting any previous\n /// approval. Setting _approved to address(0) clears all transfer approval.\n /// NOTE: _approve() does NOT send the Approval event. This is intentional because\n /// _approve() and transferFrom() are used together for putting Kitties on auction, and\n /// there is no value in spamming the log with Approval events in that case.\n function _approve(uint256 _tokenId, address _approved) internal {\n kittyIndexToApproved[_tokenId] = _approved;\n }\n\n /// @notice Returns the number of Kitties owned by a specific address.\n /// @param _owner The owner address to check.\n /// @dev Required for ERC-721 compliance\n function balanceOf(address _owner) public view returns (uint256 count) {\n return ownershipTokenCount[_owner];\n }\n\n /// @notice Transfers a Kitty to another address. If transferring to a smart\n /// contract be VERY CAREFUL to ensure that it is aware of ERC-721 (or\n /// CryptoKitties specifically) or your Kitty may be lost forever. Seriously.\n /// @param _to The address of the recipient, can be a user or contract.\n /// @param _tokenId The ID of the Kitty to transfer.\n /// @dev Required for ERC-721 compliance.\n function transfer(\n address _to,\n uint256 _tokenId\n )\n external\n whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Disallow transfers to the auction contracts to prevent accidental\n // misuse. Auction contracts should only take ownership of kitties\n // through the allow + transferFrom flow.\n require(_to != address(saleAuction));\n require(_to != address(siringAuction));\n\n // You can only send your own cat.\n require(_owns(msg.sender, _tokenId));\n\n // Reassign ownership, clear pending approvals, emit Transfer event.\n _transfer(msg.sender, _to, _tokenId);\n }\n\n /// @notice Grant another address the right to transfer a specific Kitty via\n /// transferFrom(). This is the preferred flow for transfering NFTs to contracts.\n /// @param _to The address to be granted transfer approval. Pass address(0) to\n /// clear all approvals.\n /// @param _tokenId The ID of the Kitty that can be transferred if this call succeeds.\n /// @dev Required for ERC-721 compliance.\n function approve(\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Only an owner can grant transfer approval.\n require(_owns(msg.sender, _tokenId));\n\n // Register the approval (replacing any previous approval).\n _approve(_tokenId, _to);\n\n // Emit approval event.\n Approval(msg.sender, _to, _tokenId);\n }\n\n /// @notice Transfer a Kitty owned by another address, for which the calling address\n /// has previously been granted transfer approval by the owner.\n /// @param _from The address that owns the Kitty to be transfered.\n /// @param _to The address that should take ownership of the Kitty. Can be any address,\n /// including the caller.\n /// @param _tokenId The ID of the Kitty to be transferred.\n /// @dev Required for ERC-721 compliance.\n function transferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Check for approval and valid ownership\n require(_approvedFor(msg.sender, _tokenId));\n require(_owns(_from, _tokenId));\n\n // Reassign ownership (also clears pending approvals and emits Transfer event).\n _transfer(_from, _to, _tokenId);\n }\n\n /// @notice Returns the total number of Kitties currently in existence.\n /// @dev Required for ERC-721 compliance.\n function totalSupply() public view returns (uint) {\n return kitties.length - 1;\n }\n\n /// @notice Returns the address currently assigned ownership of a given Kitty.\n /// @dev Required for ERC-721 compliance.\n function ownerOf(uint256 _tokenId)\n external\n view\n returns (address owner)\n {\n owner = kittyIndexToOwner[_tokenId];\n\n require(owner != address(0));\n }\n\n /// @notice Returns a list of all Kitty IDs assigned to an address.\n /// @param _owner The owner whose Kitties we are interested in.\n /// @dev This method MUST NEVER be called by smart contract code. First, it's fairly\n /// expensive (it walks the entire Kitty array looking for cats belonging to owner),\n /// but it also returns a dynamic array, which is only supported for web3 calls, and\n /// not contract-to-contract calls.\n function tokensOfOwner(address _owner) external view returns(uint256[] ownerTokens) {\n uint256 tokenCount = balanceOf(_owner);\n\n if (tokenCount == 0) {\n // Return an empty array\n return new uint256[](0);\n } else {\n uint256[] memory result = new uint256[](tokenCount);\n uint256 totalCats = totalSupply();\n uint256 resultIndex = 0;\n\n // We count on the fact that all cats have IDs starting at 1 and increasing\n // sequentially up to the totalCat count.\n uint256 catId;\n\n for (catId = 1; catId <= totalCats; catId++) {\n if (kittyIndexToOwner[catId] == _owner) {\n result[resultIndex] = catId;\n resultIndex++;\n }\n }\n\n return result;\n }\n }\n\n /// @dev Adapted from memcpy() by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _memcpy(uint _dest, uint _src, uint _len) private view {\n // Copy word-length chunks while possible\n for(; _len >= 32; _len -= 32) {\n assembly {\n mstore(_dest, mload(_src))\n }\n _dest += 32;\n _src += 32;\n }\n\n // Copy remaining bytes\n uint256 mask = 256 ** (32 - _len) - 1;\n assembly {\n let srcpart := and(mload(_src), not(mask))\n let destpart := and(mload(_dest), mask)\n mstore(_dest, or(destpart, srcpart))\n }\n }\n\n /// @dev Adapted from toString(slice) by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _toString(bytes32[4] _rawBytes, uint256 _stringLength) private view returns (string) {\n var outputString = new string(_stringLength);\n uint256 outputPtr;\n uint256 bytesPtr;\n\n assembly {\n outputPtr := add(outputString, 32)\n bytesPtr := _rawBytes\n }\n\n _memcpy(outputPtr, bytesPtr, _stringLength);\n\n return outputString;\n }\n\n /// @notice Returns a URI pointing to a metadata package for this token conforming to\n /// ERC-721 (https://github.com/ethereum/EIPs/issues/721)\n /// @param _tokenId The ID number of the Kitty whose metadata should be returned.\n function tokenMetadata(uint256 _tokenId, string _preferredTransport) external view returns (string infoUrl) {\n require(erc721Metadata != address(0));\n bytes32[4] memory buffer;\n uint256 count;\n (buffer, count) = erc721Metadata.getMetadata(_tokenId, _preferredTransport);\n\n return _toString(buffer, count);\n }\n}\n\n\n\n/// @title A facet of KittyCore that manages Kitty siring, gestation, and birth.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBreeding is KittyOwnership {\n\n /// @dev The Pregnant event is fired when two cats successfully breed and the pregnancy\n /// timer begins for the matron.\n event Pregnant(address owner, uint256 matronId, uint256 sireId, uint256 cooldownEndBlock);\n\n /// @notice The minimum payment required to use breedWithAuto(). This fee goes towards\n /// the gas cost paid by whatever calls giveBirth(), and can be dynamically updated by\n /// the COO role as the gas price changes.\n uint256 public autoBirthFee = 2 finney;\n\n // Keeps track of number of pregnant kitties.\n uint256 public pregnantKitties;\n\n /// @dev The address of the sibling contract that is used to implement the sooper-sekret\n /// genetic combination algorithm.\n GeneScienceInterface public geneScience;\n\n /// @dev Update the address of the genetic contract, can only be called by the CEO.\n /// @param _address An address of a GeneScience contract instance to be used from this point forward.\n function setGeneScienceAddress(address _address) external onlyCEO {\n GeneScienceInterface candidateContract = GeneScienceInterface(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isGeneScience());\n\n // Set the new contract address\n geneScience = candidateContract;\n }\n\n /// @dev Checks that a given kitten is able to breed. Requires that the\n /// current cooldown is finished (for sires) and also checks that there is\n /// no pending pregnancy.\n function _isReadyToBreed(Kitty _kit) internal view returns (bool) {\n // In addition to checking the cooldownEndBlock, we also need to check to see if\n // the cat has a pending birth; there can be some period of time between the end\n // of the pregnacy timer and the birth event.\n return (_kit.siringWithId == 0) && (_kit.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @dev Check if a sire has authorized breeding with this matron. True if both sire\n /// and matron have the same owner, or if the sire has given siring permission to\n /// the matron's owner (via approveSiring()).\n function _isSiringPermitted(uint256 _sireId, uint256 _matronId) internal view returns (bool) {\n address matronOwner = kittyIndexToOwner[_matronId];\n address sireOwner = kittyIndexToOwner[_sireId];\n\n // Siring is okay if they have same owner, or if the matron's owner was given\n // permission to breed with this sire.\n return (matronOwner == sireOwner || sireAllowedToAddress[_sireId] == matronOwner);\n }\n\n /// @dev Set the cooldownEndTime for the given Kitty, based on its current cooldownIndex.\n /// Also increments the cooldownIndex (unless it has hit the cap).\n /// @param _kitten A reference to the Kitty in storage which needs its timer started.\n function _triggerCooldown(Kitty storage _kitten) internal {\n // Compute an estimation of the cooldown time in blocks (based on current cooldownIndex).\n _kitten.cooldownEndBlock = uint64((cooldowns[_kitten.cooldownIndex]/secondsPerBlock) + block.number);\n\n // Increment the breeding count, clamping it at 13, which is the length of the\n // cooldowns array. We could check the array size dynamically, but hard-coding\n // this as a constant saves gas. Yay, Solidity!\n if (_kitten.cooldownIndex < 13) {\n _kitten.cooldownIndex += 1;\n }\n }\n\n /// @notice Grants approval to another user to sire with one of your Kitties.\n /// @param _addr The address that will be able to sire with your Kitty. Set to\n /// address(0) to clear all siring approvals for this Kitty.\n /// @param _sireId A Kitty that you own that _addr will now be able to sire with.\n function approveSiring(address _addr, uint256 _sireId)\n external\n whenNotPaused\n {\n require(_owns(msg.sender, _sireId));\n sireAllowedToAddress[_sireId] = _addr;\n }\n\n /// @dev Updates the minimum payment required for calling giveBirthAuto(). Can only\n /// be called by the COO address. (This fee is used to offset the gas cost incurred\n /// by the autobirth daemon).\n function setAutoBirthFee(uint256 val) external onlyCOO {\n autoBirthFee = val;\n }\n\n /// @dev Checks to see if a given Kitty is pregnant and (if so) if the gestation\n /// period has passed.\n function _isReadyToGiveBirth(Kitty _matron) private view returns (bool) {\n return (_matron.siringWithId != 0) && (_matron.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @notice Checks that a given kitten is able to breed (i.e. it is not pregnant or\n /// in the middle of a siring cooldown).\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isReadyToBreed(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n Kitty storage kit = kitties[_kittyId];\n return _isReadyToBreed(kit);\n }\n\n /// @dev Checks whether a kitty is currently pregnant.\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isPregnant(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n // A kitty is pregnant if and only if this field is set\n return kitties[_kittyId].siringWithId != 0;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair. DOES NOT\n /// check ownership permissions (that is up to the caller).\n /// @param _matron A reference to the Kitty struct of the potential matron.\n /// @param _matronId The matron's ID.\n /// @param _sire A reference to the Kitty struct of the potential sire.\n /// @param _sireId The sire's ID\n function _isValidMatingPair(\n Kitty storage _matron,\n uint256 _matronId,\n Kitty storage _sire,\n uint256 _sireId\n )\n private\n view\n returns(bool)\n {\n // A Kitty can't breed with itself!\n if (_matronId == _sireId) {\n return false;\n }\n\n // Kitties can't breed with their parents.\n if (_matron.matronId == _sireId || _matron.sireId == _sireId) {\n return false;\n }\n if (_sire.matronId == _matronId || _sire.sireId == _matronId) {\n return false;\n }\n\n // We can short circuit the sibling check (below) if either cat is\n // gen zero (has a matron ID of zero).\n if (_sire.matronId == 0 || _matron.matronId == 0) {\n return true;\n }\n\n // Kitties can't breed with full or half siblings.\n if (_sire.matronId == _matron.matronId || _sire.matronId == _matron.sireId) {\n return false;\n }\n if (_sire.sireId == _matron.matronId || _sire.sireId == _matron.sireId) {\n return false;\n }\n\n // Everything seems cool! Let's get DTF.\n return true;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair for\n /// breeding via auction (i.e. skips ownership and siring approval checks).\n function _canBreedWithViaAuction(uint256 _matronId, uint256 _sireId)\n internal\n view\n returns (bool)\n {\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId);\n }\n\n /// @notice Checks to see if two cats can breed together, including checks for\n /// ownership and siring approvals. Does NOT check that both cats are ready for\n /// breeding (i.e. breedWith could still fail until the cooldowns are finished).\n /// TODO: Shouldn't this check pregnancy and cooldowns?!?\n /// @param _matronId The ID of the proposed matron.\n /// @param _sireId The ID of the proposed sire.\n function canBreedWith(uint256 _matronId, uint256 _sireId)\n external\n view\n returns(bool)\n {\n require(_matronId > 0);\n require(_sireId > 0);\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId) &&\n _isSiringPermitted(_sireId, _matronId);\n }\n\n /// @dev Internal utility function to initiate breeding, assumes that all breeding\n /// requirements have been checked.\n function _breedWith(uint256 _matronId, uint256 _sireId) internal {\n // Grab a reference to the Kitties from storage.\n Kitty storage sire = kitties[_sireId];\n Kitty storage matron = kitties[_matronId];\n\n // Mark the matron as pregnant, keeping track of who the sire is.\n matron.siringWithId = uint32(_sireId);\n\n // Trigger the cooldown for both parents.\n _triggerCooldown(sire);\n _triggerCooldown(matron);\n\n // Clear siring permission for both parents. This may not be strictly necessary\n // but it's likely to avoid confusion!\n delete sireAllowedToAddress[_matronId];\n delete sireAllowedToAddress[_sireId];\n\n // Every time a kitty gets pregnant, counter is incremented.\n pregnantKitties++;\n\n // Emit the pregnancy event.\n Pregnant(kittyIndexToOwner[_matronId], _matronId, _sireId, matron.cooldownEndBlock);\n }\n\n /// @notice Breed a Kitty you own (as matron) with a sire that you own, or for which you\n /// have previously been given Siring approval. Will either make your cat pregnant, or will\n /// fail entirely. Requires a pre-payment of the fee given out to the first caller of giveBirth()\n /// @param _matronId The ID of the Kitty acting as matron (will end up pregnant if successful)\n /// @param _sireId The ID of the Kitty acting as sire (will begin its siring cooldown if successful)\n function breedWithAuto(uint256 _matronId, uint256 _sireId)\n external\n payable\n whenNotPaused\n {\n // Checks for payment.\n require(msg.value >= autoBirthFee);\n\n // Caller must own the matron.\n require(_owns(msg.sender, _matronId));\n\n // Neither sire nor matron are allowed to be on auction during a normal\n // breeding operation, but we don't need to check that explicitly.\n // For matron: The caller of this function can't be the owner of the matron\n // because the owner of a Kitty on auction is the auction house, and the\n // auction house will never call breedWith().\n // For sire: Similarly, a sire on auction will be owned by the auction house\n // and the act of transferring ownership will have cleared any oustanding\n // siring approval.\n // Thus we don't need to spend gas explicitly checking to see if either cat\n // is on auction.\n\n // Check that matron and sire are both owned by caller, or that the sire\n // has given siring permission to caller (i.e. matron's owner).\n // Will fail for _sireId = 0\n require(_isSiringPermitted(_sireId, _matronId));\n\n // Grab a reference to the potential matron\n Kitty storage matron = kitties[_matronId];\n\n // Make sure matron isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(matron));\n\n // Grab a reference to the potential sire\n Kitty storage sire = kitties[_sireId];\n\n // Make sure sire isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(sire));\n\n // Test that these cats are a valid mating pair.\n require(_isValidMatingPair(\n matron,\n _matronId,\n sire,\n _sireId\n ));\n\n // All checks passed, kitty gets pregnant!\n _breedWith(_matronId, _sireId);\n }\n\n /// @notice Have a pregnant Kitty give birth!\n /// @param _matronId A Kitty ready to give birth.\n /// @return The Kitty ID of the new kitten.\n /// @dev Looks at a given Kitty and, if pregnant and if the gestation period has passed,\n /// combines the genes of the two parents to create a new kitten. The new Kitty is assigned\n /// to the current owner of the matron. Upon successful completion, both the matron and the\n /// new kitten will be ready to breed again. Note that anyone can call this function (if they\n /// are willing to pay the gas!), but the new kitten always goes to the mother's owner.\n function giveBirth(uint256 _matronId)\n external\n whenNotPaused\n returns(uint256)\n {\n // Grab a reference to the matron in storage.\n Kitty storage matron = kitties[_matronId];\n\n // Check that the matron is a valid cat.\n require(matron.birthTime != 0);\n\n // Check that the matron is pregnant, and that its time has come!\n require(_isReadyToGiveBirth(matron));\n\n // Grab a reference to the sire in storage.\n uint256 sireId = matron.siringWithId;\n Kitty storage sire = kitties[sireId];\n\n // Determine the higher generation number of the two parents\n uint16 parentGen = matron.generation;\n if (sire.generation > matron.generation) {\n parentGen = sire.generation;\n }\n\n // Call the sooper-sekret gene mixing operation.\n uint256 childGenes = geneScience.mixGenes(matron.genes, sire.genes, matron.cooldownEndBlock - 1);\n\n // Make the new kitten!\n address owner = kittyIndexToOwner[_matronId];\n uint256 kittenId = _createKitty(_matronId, matron.siringWithId, parentGen + 1, childGenes, owner);\n\n // Clear the reference to sire from the matron (REQUIRED! Having siringWithId\n // set is what marks a matron as being pregnant.)\n delete matron.siringWithId;\n\n // Every time a kitty gives birth counter is decremented.\n pregnantKitties--;\n\n // Send the balance fee to the person who made birth happen.\n msg.sender.send(autoBirthFee);\n\n // return the new kitten's ID\n return kittenId;\n }\n}\n\n\n\n\n\n\n\n\n\n\n/// @title Auction Core\n/// @dev Contains models, variables, and internal methods for the auction.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuctionBase {\n\n // Represents an auction on an NFT\n struct Auction {\n // Current owner of NFT\n address seller;\n // Price (in wei) at beginning of auction\n uint128 startingPrice;\n // Price (in wei) at end of auction\n uint128 endingPrice;\n // Duration (in seconds) of auction\n uint64 duration;\n // Time when auction started\n // NOTE: 0 if this auction has been concluded\n uint64 startedAt;\n }\n\n // Reference to contract tracking NFT ownership\n KittiesERC721 public nonFungibleContract;\n\n // Cut owner takes on each auction, measured in basis points (1/100 of a percent).\n // Values 0-10,000 map to 0%-100%\n uint256 public ownerCut;\n\n // Map from token ID to their corresponding auction.\n mapping (uint256 => Auction) tokenIdToAuction;\n\n event AuctionCreated(uint256 tokenId, uint256 startingPrice, uint256 endingPrice, uint256 duration);\n event AuctionSuccessful(uint256 tokenId, uint256 totalPrice, address winner);\n event AuctionCancelled(uint256 tokenId);\n\n /// @dev Returns true if the claimant owns the token.\n /// @param _claimant - Address claiming to own the token.\n /// @param _tokenId - ID of token whose ownership to verify.\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return (nonFungibleContract.ownerOf(_tokenId) == _claimant);\n }\n\n /// @dev Escrows the NFT, assigning ownership to this contract.\n /// Throws if the escrow fails.\n /// @param _owner - Current owner address of token to escrow.\n /// @param _tokenId - ID of token whose approval to verify.\n function _escrow(address _owner, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transferFrom(_owner, this, _tokenId);\n }\n\n /// @dev Transfers an NFT owned by this contract to another address.\n /// Returns true if the transfer succeeds.\n /// @param _receiver - Address to transfer NFT to.\n /// @param _tokenId - ID of token to transfer.\n function _transfer(address _receiver, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transfer(_receiver, _tokenId);\n }\n\n /// @dev Adds an auction to the list of open auctions. Also fires the\n /// AuctionCreated event.\n /// @param _tokenId The ID of the token to be put on auction.\n /// @param _auction Auction to add.\n function _addAuction(uint256 _tokenId, Auction _auction) internal {\n // Require that all auctions have a duration of\n // at least one minute. (Keeps our math from getting hairy!)\n require(_auction.duration >= 1 minutes);\n\n tokenIdToAuction[_tokenId] = _auction;\n\n AuctionCreated(\n uint256(_tokenId),\n uint256(_auction.startingPrice),\n uint256(_auction.endingPrice),\n uint256(_auction.duration)\n );\n }\n\n /// @dev Cancels an auction unconditionally.\n function _cancelAuction(uint256 _tokenId, address _seller) internal {\n _removeAuction(_tokenId);\n _transfer(_seller, _tokenId);\n AuctionCancelled(_tokenId);\n }\n\n /// @dev Computes the price and transfers winnings.\n /// Does NOT transfer ownership of token.\n function _bid(uint256 _tokenId, uint256 _bidAmount)\n internal\n returns (uint256)\n {\n // Get a reference to the auction struct\n Auction storage auction = tokenIdToAuction[_tokenId];\n\n // Explicitly check that this auction is currently live.\n // (Because of how Ethereum mappings work, we can't just count\n // on the lookup above failing. An invalid _tokenId will just\n // return an auction object that is all zeros.)\n require(_isOnAuction(auction));\n\n // Check that the bid is greater than or equal to the current price\n uint256 price = _currentPrice(auction);\n require(_bidAmount >= price);\n\n // Grab a reference to the seller before the auction struct\n // gets deleted.\n address seller = auction.seller;\n\n // The bid is good! Remove the auction before sending the fees\n // to the sender so we can't have a reentrancy attack.\n _removeAuction(_tokenId);\n\n // Transfer proceeds to seller (if there are any!)\n if (price > 0) {\n // Calculate the auctioneer's cut.\n // (NOTE: _computeCut() is guaranteed to return a\n // value <= price, so this subtraction can't go negative.)\n uint256 auctioneerCut = _computeCut(price);\n uint256 sellerProceeds = price - auctioneerCut;\n\n // NOTE: Doing a transfer() in the middle of a complex\n // method like this is generally discouraged because of\n // reentrancy attacks and DoS attacks if the seller is\n // a contract with an invalid fallback function. We explicitly\n // guard against reentrancy attacks by removing the auction\n // before calling transfer(), and the only thing the seller\n // can DoS is the sale of their own asset! (And if it's an\n // accident, they can call cancelAuction(). )\n seller.transfer(sellerProceeds);\n }\n\n // Calculate any excess funds included with the bid. If the excess\n // is anything worth worrying about, transfer it back to bidder.\n // NOTE: We checked above that the bid amount is greater than or\n // equal to the price so this cannot underflow.\n uint256 bidExcess = _bidAmount - price;\n\n // Return the funds. Similar to the previous transfer, this is\n // not susceptible to a re-entry attack because the auction is\n // removed before any transfers occur.\n msg.sender.transfer(bidExcess);\n\n // Tell the world!\n AuctionSuccessful(_tokenId, price, msg.sender);\n\n return price;\n }\n\n /// @dev Removes an auction from the list of open auctions.\n /// @param _tokenId - ID of NFT on auction.\n function _removeAuction(uint256 _tokenId) internal {\n delete tokenIdToAuction[_tokenId];\n }\n\n /// @dev Returns true if the NFT is on auction.\n /// @param _auction - Auction to check.\n function _isOnAuction(Auction storage _auction) internal view returns (bool) {\n return (_auction.startedAt > 0);\n }\n\n /// @dev Returns current price of an NFT on auction. Broken into two\n /// functions (this one, that computes the duration from the auction\n /// structure, and the other that does the price computation) so we\n /// can easily test that the price computation works correctly.\n function _currentPrice(Auction storage _auction)\n internal\n view\n returns (uint256)\n {\n uint256 secondsPassed = 0;\n\n // A bit of insurance against negative values (or wraparound).\n // Probably not necessary (since Ethereum guarnatees that the\n // now variable doesn't ever go backwards).\n if (now > _auction.startedAt) {\n secondsPassed = now - _auction.startedAt;\n }\n\n return _computeCurrentPrice(\n _auction.startingPrice,\n _auction.endingPrice,\n _auction.duration,\n secondsPassed\n );\n }\n\n /// @dev Computes the current price of an auction. Factored out\n /// from _currentPrice so we can run extensive unit tests.\n /// When testing, make this function public and turn on\n /// `Current price computation` test suite.\n function _computeCurrentPrice(\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n uint256 _secondsPassed\n )\n internal\n pure\n returns (uint256)\n {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our public functions carefully cap the maximum values for\n // time (at 64-bits) and currency (at 128-bits). _duration is\n // also known to be non-zero (see the require() statement in\n // _addAuction())\n if (_secondsPassed >= _duration) {\n // We've reached the end of the dynamic pricing portion\n // of the auction, just return the end price.\n return _endingPrice;\n } else {\n // Starting price can be higher than ending price (and often is!), so\n // this delta can be negative.\n int256 totalPriceChange = int256(_endingPrice) - int256(_startingPrice);\n\n // This multiplication can't overflow, _secondsPassed will easily fit within\n // 64-bits, and totalPriceChange will easily fit within 128-bits, their product\n // will always fit within 256-bits.\n int256 currentPriceChange = totalPriceChange * int256(_secondsPassed) / int256(_duration);\n\n // currentPriceChange can be negative, but if so, will have a magnitude\n // less that _startingPrice. Thus, this result will always end up positive.\n int256 currentPrice = int256(_startingPrice) + currentPriceChange;\n\n return uint256(currentPrice);\n }\n }\n\n /// @dev Computes owner's cut of a sale.\n /// @param _price - Sale price of NFT.\n function _computeCut(uint256 _price) internal view returns (uint256) {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our entry functions carefully cap the maximum values for\n // currency (at 128-bits), and ownerCut <= 10000 (see the require()\n // statement in the ClockAuction constructor). The result of this\n // function is always guaranteed to be <= _price.\n return _price * ownerCut / 10000;\n }\n\n}\n\n\n\n\n\n\n\n/**\n * @title KittiesPausable\n * @dev Base contract which allows children to implement an emergency stop mechanism.\n */\ncontract KittiesPausable is KittiesOwnable {\n event Pause();\n event Unpause();\n\n bool public paused = false;\n\n\n /**\n\t * @dev modifier to allow actions only when the contract IS paused\n\t */\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /**\n\t * @dev modifier to allow actions only when the contract IS NOT paused\n\t */\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /**\n\t * @dev called by the owner to pause, triggers stopped state\n\t */\n function pause() onlyOwner whenNotPaused returns (bool) {\n paused = true;\n Pause();\n return true;\n }\n\n /**\n\t * @dev called by the owner to unpause, returns to normal state\n\t */\n function unpause() onlyOwner whenPaused returns (bool) {\n paused = false;\n Unpause();\n return true;\n }\n}\n\n\n/// @title Clock auction for non-fungible tokens.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuction is KittiesPausable, ClockAuctionBase {\n\n /// @dev The ERC-165 interface signature for ERC-721.\n /// Ref: https://github.com/ethereum/EIPs/issues/165\n /// Ref: https://github.com/ethereum/EIPs/issues/721\n bytes4 constant InterfaceSignature_ERC721 = bytes4(0x9a20483d);\n\n /// @dev Constructor creates a reference to the NFT ownership contract\n /// and verifies the owner cut is in the valid range.\n /// @param _nftAddress - address of a deployed contract implementing\n /// the Nonfungible Interface.\n /// @param _cut - percent cut the owner takes on each auction, must be\n /// between 0-10,000.\n function ClockAuction(address _nftAddress, uint256 _cut) public {\n require(_cut <= 10000);\n ownerCut = _cut;\n\n KittiesERC721 candidateContract = KittiesERC721(_nftAddress);\n require(candidateContract.supportsInterface(InterfaceSignature_ERC721));\n nonFungibleContract = candidateContract;\n }\n\n /// @dev Remove all Ether from the contract, which is the owner's cuts\n /// as well as any Ether sent directly to the contract address.\n /// Always transfers to the NFT contract, but can be called either by\n /// the owner or the NFT contract.\n function withdrawBalance() external {\n address nftAddress = address(nonFungibleContract);\n\n require(\n msg.sender == owner ||\n msg.sender == nftAddress\n );\n // We are using this boolean method to make sure that even if one fails it will still work\n bool res = nftAddress.send(this.balance);\n }\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of time to move between starting\n /// price and ending price (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n whenNotPaused\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(_owns(msg.sender, _tokenId));\n _escrow(msg.sender, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Bids on an open auction, completing the auction and transferring\n /// ownership of the NFT if enough Ether is supplied.\n /// @param _tokenId - ID of token to bid on.\n function bid(uint256 _tokenId)\n external\n payable\n whenNotPaused\n {\n // _bid will throw if the bid or funds transfer fails\n _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n }\n\n /// @dev Cancels an auction that hasn't been won yet.\n /// Returns the NFT to original owner.\n /// @notice This is a state-modifying function that can\n /// be called while the contract is paused.\n /// @param _tokenId - ID of token on auction\n function cancelAuction(uint256 _tokenId)\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n address seller = auction.seller;\n require(msg.sender == seller);\n _cancelAuction(_tokenId, seller);\n }\n\n /// @dev Cancels an auction when the contract is paused.\n /// Only the owner may do this, and NFTs are returned to\n /// the seller. This should only be used in emergencies.\n /// @param _tokenId - ID of the NFT on auction to cancel.\n function cancelAuctionWhenPaused(uint256 _tokenId)\n whenPaused\n onlyOwner\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n _cancelAuction(_tokenId, auction.seller);\n }\n\n /// @dev Returns auction info for an NFT on auction.\n /// @param _tokenId - ID of NFT on auction.\n function getAuction(uint256 _tokenId)\n external\n view\n returns\n (\n address seller,\n uint256 startingPrice,\n uint256 endingPrice,\n uint256 duration,\n uint256 startedAt\n ) {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return (\n auction.seller,\n auction.startingPrice,\n auction.endingPrice,\n auction.duration,\n auction.startedAt\n );\n }\n\n /// @dev Returns the current price of an auction.\n /// @param _tokenId - ID of the token price we are checking.\n function getCurrentPrice(uint256 _tokenId)\n external\n view\n returns (uint256)\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return _currentPrice(auction);\n }\n\n}\n\n\n/// @title Reverse auction modified for siring\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SiringClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSiringAuctionAddress() call.\n bool public isSiringClockAuction = true;\n\n // Delegate constructor\n function SiringClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction. Since this function is wrapped,\n /// require sender to be KittyCore contract.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Places a bid for siring. Requires the sender\n /// is the KittyCore contract because all bid methods\n /// should be wrapped. Also returns the kitty to the\n /// seller rather than the winner.\n function bid(uint256 _tokenId)\n external\n payable\n {\n require(msg.sender == address(nonFungibleContract));\n address seller = tokenIdToAuction[_tokenId].seller;\n // _bid checks that token ID is valid and will throw if bid fails\n _bid(_tokenId, msg.value);\n // We transfer the kitty back to the seller, the winner will get\n // the offspring\n _transfer(seller, _tokenId);\n }\n\n}\n\n\n\n\n\n/// @title Clock auction modified for sale of kitties\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SaleClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSaleAuctionAddress() call.\n bool public isSaleClockAuction = true;\n\n // Tracks last 5 sale price of gen0 kitty sales\n uint256 public gen0SaleCount;\n uint256[5] public lastGen0SalePrices;\n\n // Delegate constructor\n function SaleClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Updates lastSalePrice if seller is the nft contract\n /// Otherwise, works the same as default bid method.\n function bid(uint256 _tokenId)\n external\n payable\n {\n // _bid verifies token ID size\n address seller = tokenIdToAuction[_tokenId].seller;\n uint256 price = _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n\n // If not a gen0 auction, exit\n if (seller == address(nonFungibleContract)) {\n // Track gen0 sale prices\n lastGen0SalePrices[gen0SaleCount % 5] = price;\n gen0SaleCount++;\n }\n }\n\n function averageGen0SalePrice() external view returns (uint256) {\n uint256 sum = 0;\n for (uint256 i = 0; i < 5; i++) {\n sum += lastGen0SalePrices[i];\n }\n return sum / 5;\n }\n\n}\n\n\n/// @title Handles creating auctions for sale and siring of kitties.\n/// This wrapper of ReverseAuction exists only so that users can create\n/// auctions with only one transaction.\ncontract KittyAuction is KittyBreeding {\n\n // @notice The auction contract variables are defined in KittyBase to allow\n // us to refer to them in KittyOwnership to prevent accidental transfers.\n // `saleAuction` refers to the auction for gen0 and p2p sale of kitties.\n // `siringAuction` refers to the auction for siring rights of kitties.\n\n /// @dev Sets the reference to the sale auction.\n /// @param _address - Address of sale contract.\n function setSaleAuctionAddress(address _address) external onlyCEO {\n SaleClockAuction candidateContract = SaleClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSaleClockAuction());\n\n // Set the new contract address\n saleAuction = candidateContract;\n }\n\n /// @dev Sets the reference to the siring auction.\n /// @param _address - Address of siring contract.\n function setSiringAuctionAddress(address _address) external onlyCEO {\n SiringClockAuction candidateContract = SiringClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSiringClockAuction());\n\n // Set the new contract address\n siringAuction = candidateContract;\n }\n\n /// @dev Put a kitty up for auction.\n /// Does some ownership trickery to create auctions in one tx.\n function createSaleAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n // Ensure the kitty is not pregnant to prevent the auction\n // contract accidentally receiving ownership of the child.\n // NOTE: the kitty IS allowed to be in a cooldown.\n require(!isPregnant(_kittyId));\n _approve(_kittyId, saleAuction);\n // Sale auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n saleAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Put a kitty up for auction to be sire.\n /// Performs checks to ensure the kitty can be sired, then\n /// delegates to reverse auction.\n function createSiringAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n require(isReadyToBreed(_kittyId));\n _approve(_kittyId, siringAuction);\n // Siring auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n siringAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Completes a siring auction by bidding.\n /// Immediately breeds the winning matron with the sire on auction.\n /// @param _sireId - ID of the sire on auction.\n /// @param _matronId - ID of the matron owned by the bidder.\n function bidOnSiringAuction(\n uint256 _sireId,\n uint256 _matronId\n )\n external\n payable\n whenNotPaused\n {\n // Auction contract checks input sizes\n require(_owns(msg.sender, _matronId));\n require(isReadyToBreed(_matronId));\n require(_canBreedWithViaAuction(_matronId, _sireId));\n\n // Define the current price of the auction.\n uint256 currentPrice = siringAuction.getCurrentPrice(_sireId);\n require(msg.value >= currentPrice + autoBirthFee);\n\n // Siring auction will throw if the bid fails.\n siringAuction.bid.value(msg.value - autoBirthFee)(_sireId);\n _breedWith(uint32(_matronId), uint32(_sireId));\n }\n\n /// @dev Transfers the balance of the sale auction contract\n /// to the KittyCore contract. We use two-step withdrawal to\n /// prevent two transfer calls in the auction bid function.\n function withdrawAuctionBalances() external onlyCLevel {\n saleAuction.withdrawBalance();\n siringAuction.withdrawBalance();\n }\n}\n\n\n/// @title all functions related to creating kittens\ncontract KittyMinting is KittyAuction {\n\n // Limits the number of cats the contract owner can ever create.\n uint256 public constant PROMO_CREATION_LIMIT = 5000;\n uint256 public constant GEN0_CREATION_LIMIT = 45000;\n\n // Constants for gen0 auctions.\n uint256 public constant GEN0_STARTING_PRICE = 10 finney;\n uint256 public constant GEN0_AUCTION_DURATION = 1 days;\n\n // Counts the number of cats the contract owner has created.\n uint256 public promoCreatedCount;\n uint256 public gen0CreatedCount;\n\n /// @dev we can create promo kittens, up to a limit. Only callable by COO\n /// @param _genes the encoded genes of the kitten to be created, any value is accepted\n /// @param _owner the future owner of the created kittens. Default to contract COO\n function createPromoKitty(uint256 _genes, address _owner) external onlyCOO {\n address kittyOwner = _owner;\n if (kittyOwner == address(0)) {\n kittyOwner = cooAddress;\n }\n require(promoCreatedCount < PROMO_CREATION_LIMIT);\n\n promoCreatedCount++;\n _createKitty(0, 0, 0, _genes, kittyOwner);\n }\n\n /// @dev Creates a new gen0 kitty with the given genes and\n /// creates an auction for it.\n function createGen0Auction(uint256 _genes) external onlyCOO {\n require(gen0CreatedCount < GEN0_CREATION_LIMIT);\n\n uint256 kittyId = _createKitty(0, 0, 0, _genes, address(this));\n _approve(kittyId, saleAuction);\n\n saleAuction.createAuction(\n kittyId,\n _computeNextGen0Price(),\n 0,\n GEN0_AUCTION_DURATION,\n address(this)\n );\n\n gen0CreatedCount++;\n }\n\n /// @dev Computes the next gen0 auction starting price, given\n /// the average of the past 5 prices + 50%.\n function _computeNextGen0Price() internal view returns (uint256) {\n uint256 avePrice = saleAuction.averageGen0SalePrice();\n\n // Sanity check to ensure we don't overflow arithmetic\n require(avePrice == uint256(uint128(avePrice)));\n\n uint256 nextPrice = avePrice + (avePrice / 2);\n\n // We never auction for less than starting price\n if (nextPrice < GEN0_STARTING_PRICE) {\n nextPrice = GEN0_STARTING_PRICE;\n }\n\n return nextPrice;\n }\n}\n\n\n/// @title CryptoKitties: Collectible, breedable, and oh-so-adorable cats on the Ethereum blockchain.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev The main CryptoKitties contract, keeps track of kittens so they don't wander around and get lost.\ncontract KittyCore is KittyMinting {\n\n // This is the main CryptoKitties contract. In order to keep our code seperated into logical sections,\n // we've broken it up in two ways. First, we have several seperately-instantiated sibling contracts\n // that handle auctions and our super-top-secret genetic combination algorithm. The auctions are\n // seperate since their logic is somewhat complex and there's always a risk of subtle bugs. By keeping\n // them in their own contracts, we can upgrade them without disrupting the main contract that tracks\n // kitty ownership. The genetic combination algorithm is kept seperate so we can open-source all of\n // the rest of our code without making it _too_ easy for folks to figure out how the genetics work.\n // Don't worry, I'm sure someone will reverse engineer it soon enough!\n //\n // Secondly, we break the core contract into multiple files using inheritence, one for each major\n // facet of functionality of CK. This allows us to keep related code bundled together while still\n // avoiding a single giant file with everything in it. The breakdown is as follows:\n //\n // - KittyBase: This is where we define the most fundamental code shared throughout the core\n // functionality. This includes our main data storage, constants and data types, plus\n // internal functions for managing these items.\n //\n // - KittyAccessControl: This contract manages the various addresses and constraints for operations\n // that can be executed only by specific roles. Namely CEO, CFO and COO.\n //\n // - KittyOwnership: This provides the methods required for basic non-fungible token\n // transactions, following the draft ERC-721 spec (https://github.com/ethereum/EIPs/issues/721).\n //\n // - KittyBreeding: This file contains the methods necessary to breed cats together, including\n // keeping track of siring offers, and relies on an external genetic combination contract.\n //\n // - KittyAuctions: Here we have the public methods for auctioning or bidding on cats or siring\n // services. The actual auction functionality is handled in two sibling contracts (one\n // for sales and one for siring), while auction creation and bidding is mostly mediated\n // through this facet of the core contract.\n //\n // - KittyMinting: This final facet contains the functionality we use for creating new gen0 cats.\n // We can make up to 5000 \"promo\" cats that can be given away (especially important when\n // the community is new), and all others can only be created and then immediately put up\n // for auction via an algorithmically determined starting price. Regardless of how they\n // are created, there is a hard limit of 50k gen0 cats. After that, it's all up to the\n // community to breed, breed, breed!\n\n // Set in case the core contract is broken and an upgrade is required\n address public newContractAddress;\n\n /// @notice Creates the main CryptoKitties smart contract instance.\n function KittyCore() public {\n // Starts paused.\n paused = true;\n\n // the creator of the contract is the initial CEO\n ceoAddress = msg.sender;\n\n // the creator of the contract is also the initial COO\n cooAddress = msg.sender;\n\n // start with the mythical kitten 0 - so we don't have generation-0 parent issues\n _createKitty(0, 0, 0, uint256(-1), address(0));\n }\n\n /// @dev Used to mark the smart contract as upgraded, in case there is a serious\n /// breaking bug. This method does nothing but keep track of the new contract and\n /// emit a message indicating that the new address is set. It's up to clients of this\n /// contract to update to the new contract address in that case. (This contract will\n /// be paused indefinitely if such an upgrade takes place.)\n /// @param _v2Address new address\n function setNewAddress(address _v2Address) external onlyCEO whenPaused {\n // See README.md for updgrade plan\n newContractAddress = _v2Address;\n ContractUpgrade(_v2Address);\n }\n\n /// @notice No tipping!\n /// @dev Reject all Ether from being sent here, unless it's from one of the\n /// two auction contracts. (Hopefully, we can prevent user accidents.)\n function() external payable {\n require(\n msg.sender == address(saleAuction) ||\n msg.sender == address(siringAuction)\n );\n }\n\n /// @notice Returns all the relevant information about a specific kitty.\n /// @param _id The ID of the kitty of interest.\n function getKitty(uint256 _id)\n external\n view\n returns (\n bool isGestating,\n bool isReady,\n uint256 cooldownIndex,\n uint256 nextActionAt,\n uint256 siringWithId,\n uint256 birthTime,\n uint256 matronId,\n uint256 sireId,\n uint256 generation,\n uint256 genes\n ) {\n Kitty storage kit = kitties[_id];\n\n // if this variable is 0 then it's not gestating\n isGestating = (kit.siringWithId != 0);\n isReady = (kit.cooldownEndBlock <= block.number);\n cooldownIndex = uint256(kit.cooldownIndex);\n nextActionAt = uint256(kit.cooldownEndBlock);\n siringWithId = uint256(kit.siringWithId);\n birthTime = uint256(kit.birthTime);\n matronId = uint256(kit.matronId);\n sireId = uint256(kit.sireId);\n generation = uint256(kit.generation);\n genes = kit.genes;\n }\n\n /// @dev Override unpause so it requires all external contract addresses\n /// to be set before contract can be unpaused. Also, we can't have\n /// newContractAddress set either, because then the contract was upgraded.\n /// @notice This is public rather than external so we can call super.unpause\n /// without using an expensive CALL.\n function unpause() public onlyCEO whenPaused {\n require(saleAuction != address(0));\n require(siringAuction != address(0));\n require(geneScience != address(0));\n require(newContractAddress == address(0));\n\n // Actually unpause the contract.\n super.unpause();\n }\n\n // @dev Allows the CFO to capture the balance available to the contract.\n function withdrawBalance() external onlyCFO {\n uint256 balance = this.balance;\n // Subtract all the currently pregnant kittens we have, plus 1 of margin.\n uint256 subtractFees = (pregnantKitties + 1) * autoBirthFee;\n\n if (balance > subtractFees) {\n cfoAddress.send(balance - subtractFees);\n }\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "exportedSymbols": { "ClockAuction": [ 8872 @@ -52747,7 +52747,7 @@ export const KittyCore = "42": { "events": {}, "links": {}, - "address": "0xb5da2e05709786b89c6124c7a202dd13de2b8cd8" + "address": "0x116a62dad694e694f17cbccc917739c3f0c51666" }, "70": { "events": {}, @@ -52756,5 +52756,5 @@ export const KittyCore = } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:16:13.792Z" + "updatedAt": "2018-10-09T17:53:04.937Z" } \ No newline at end of file diff --git a/artifacts/ts/KittyMinting.ts b/artifacts/ts/KittyMinting.ts index d049eaea..fc3d05f6 100644 --- a/artifacts/ts/KittyMinting.ts +++ b/artifacts/ts/KittyMinting.ts @@ -1002,15 +1002,15 @@ export const KittyMinting = "type": "event" } ], - "bytecode": "0x60606040526000600260146101000a81548160ff0219169083151502179055506101c060405190810160405280603c63ffffffff1663ffffffff168152602001607863ffffffff1663ffffffff16815260200161012c63ffffffff1663ffffffff16815260200161025863ffffffff1663ffffffff16815260200161070863ffffffff1663ffffffff168152602001610e1063ffffffff1663ffffffff168152602001611c2063ffffffff1663ffffffff16815260200161384063ffffffff1663ffffffff16815260200161708063ffffffff1663ffffffff16815260200161e10063ffffffff1663ffffffff1681526020016201518063ffffffff1663ffffffff1681526020016202a30063ffffffff1663ffffffff1681526020016205460063ffffffff1663ffffffff16815260200162093a8063ffffffff1663ffffffff16815250600390600e6200015692919062000179565b50600f60055566071afd498d0000600e5534156200017357600080fd5b62000259565b82600e600701600890048101928215620002105791602002820160005b83821115620001dc57835183826101000a81548163ffffffff021916908363ffffffff160217905550926020019260040160208160030104928301926001030262000196565b80156200020e5782816101000a81549063ffffffff0219169055600401602081600301049283019260010302620001dc565b505b5090506200021f919062000223565b5090565b6200025691905b808211156200025257600081816101000a81549063ffffffff0219169055506001016200022a565b5090565b90565b614b9180620002696000396000f300606060405260043610610293576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146102985780630519ce79146102f25780630560ff441461034757806305e45546146103f757806306fdde0314610420578063095ea7b3146104ae5780630a0f8168146104f05780630e583df01461054557806314001f4c1461056e57806318160ddd146105a7578063183a7947146105d05780631940a936146105f957806319c2f2011461063457806321717ebf1461065d57806323b872dd146106b257806324e7a38a1461071357806327d7874c1461074c5780632ba73c15146107855780633d7d3f5a146107be5780633f4ba83a146107fc57806346116e6f1461081157806346d22c7014610874578063481af3d3146108b85780634ad8c9381461091b5780634b85fd55146109595780634dfff04f1461097c5780634e0a3379146109be57806356129134146109f75780635663896e14610a395780635c975abb14610a5c5780636352211e14610a89578063680eba2714610aec5780636fbde40d14610b1557806370a0823114610b4e5780637a7d493714610b9b5780638456cb5914610bc45780638462151c14610bd957806388c2a0bf14610c6757806391876e5714610c9e57806395d89b4114610cb35780639d6fac6f14610d41578063a45f4bfc14610d84578063a9059cbb14610de7578063b047fb5014610e29578063b0c35c0514610e7e578063bc4006f514610ea7578063c3bea9af14610efc578063d3e6f49f14610f1f578063defb958414610f5a578063e17b25af14610f83578063e6cbe35114610fbc578063ed60ade614611011578063f1ca941014611032578063f2b47d521461105b578063f7d8c883146110b0575b600080fd5b34156102a357600080fd5b6102d860048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190919050506110d1565b604051808215151515815260200191505060405180910390f35b34156102fd57600080fd5b6103056113e2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561035257600080fd5b61037c60048080359060200190919080359060200190820180359060200191909192905050611408565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103bc5780820151818401526020810190506103a1565b50505050905090810190601f1680156103e95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561040257600080fd5b61040a611573565b6040518082815260200191505060405180910390f35b341561042b57600080fd5b610433611579565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610473578082015181840152602081019050610458565b50505050905090810190601f1680156104a05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156104b957600080fd5b6104ee600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506115b2565b005b34156104fb57600080fd5b610503611674565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561055057600080fd5b610558611699565b6040518082815260200191505060405180910390f35b341561057957600080fd5b6105a5600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506116a4565b005b34156105b257600080fd5b6105ba6117db565b6040518082815260200191505060405180910390f35b34156105db57600080fd5b6105e36117eb565b6040518082815260200191505060405180910390f35b341561060457600080fd5b61061a60048080359060200190919050506117f1565b604051808215151515815260200191505060405180910390f35b341561063f57600080fd5b610647611843565b6040518082815260200191505060405180910390f35b341561066857600080fd5b61067061184a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156106bd57600080fd5b610711600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611870565b005b341561071e57600080fd5b61074a600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611921565b005b341561075757600080fd5b610783600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611a58565b005b341561079057600080fd5b6107bc600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611b32565b005b34156107c957600080fd5b6107fa6004808035906020019091908035906020019091908035906020019091908035906020019091905050611c0d565b005b341561080757600080fd5b61080f611d75565b005b341561081c57600080fd5b6108326004808035906020019091905050611e08565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561087f57600080fd5b61089e6004808035906020019091908035906020019091905050611e3b565b604051808215151515815260200191505060405180910390f35b34156108c357600080fd5b6108d96004808035906020019091905050611ec3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561092657600080fd5b6109576004808035906020019091908035906020019091908035906020019091908035906020019091905050611ef6565b005b341561096457600080fd5b61097a600480803590602001909190505061205d565b005b341561098757600080fd5b6109bc600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506120c3565b005b34156109c957600080fd5b6109f5600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061214a565b005b3415610a0257600080fd5b610a37600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612225565b005b3415610a4457600080fd5b610a5a600480803590602001909190505061231a565b005b3415610a6757600080fd5b610a6f61246e565b604051808215151515815260200191505060405180910390f35b3415610a9457600080fd5b610aaa6004808035906020019091905050612481565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610af757600080fd5b610aff6124fa565b6040518082815260200191505060405180910390f35b3415610b2057600080fd5b610b4c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612500565b005b3415610b5957600080fd5b610b85600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612637565b6040518082815260200191505060405180910390f35b3415610ba657600080fd5b610bae612680565b6040518082815260200191505060405180910390f35b3415610bcf57600080fd5b610bd7612686565b005b3415610be457600080fd5b610c10600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506127ca565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610c53578082015181840152602081019050610c38565b505050509050019250505060405180910390f35b3415610c7257600080fd5b610c886004808035906020019091905050612901565b6040518082815260200191505060405180910390f35b3415610ca957600080fd5b610cb1612d20565b005b3415610cbe57600080fd5b610cc6612f5f565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610d06578082015181840152602081019050610ceb565b50505050905090810190601f168015610d335780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610d4c57600080fd5b610d626004808035906020019091905050612f98565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3415610d8f57600080fd5b610da56004808035906020019091905050612fc7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610df257600080fd5b610e27600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050612ffa565b005b3415610e3457600080fd5b610e3c61316b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610e8957600080fd5b610e91613191565b6040518082815260200191505060405180910390f35b3415610eb257600080fd5b610eba613197565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610f0757600080fd5b610f1d60048080359060200190919050506131bd565b005b3415610f2a57600080fd5b610f40600480803590602001909190505061337b565b604051808215151515815260200191505060405180910390f35b3415610f6557600080fd5b610f6d6134ea565b6040518082815260200191505060405180910390f35b3415610f8e57600080fd5b610fba600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506134f0565b005b3415610fc757600080fd5b610fcf61358f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61103060048080359060200190919080359060200190919050506135b5565b005b341561103d57600080fd5b61104561379e565b6040518082815260200191505060405180910390f35b341561106657600080fd5b61106e6137a4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6110cf60048080359060200190919080359060200190919050506137ca565b005b600060405180807f737570706f727473496e74657266616365286279746573342900000000000000815250601901905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806113db575060405180807f746f6b656e4d657461646174612875696e743235362c737472696e6729000000815250601d019050604051809103902060405180807f746f6b656e734f664f776e6572286164647265737329000000000000000000008152506016019050604051809103902060405180807f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81526020017f74323536290000000000000000000000000000000000000000000000000000008152506025019050604051809103902060405180807f7472616e7366657228616464726573732c75696e7432353629000000000000008152506019019050604051809103902060405180807f617070726f766528616464726573732c75696e743235362900000000000000008152506018019050604051809103902060405180807f6f776e65724f662875696e7432353629000000000000000000000000000000008152506010019050604051809103902060405180807f62616c616e63654f6628616464726573732900000000000000000000000000008152506012019050604051809103902060405180807f746f74616c537570706c79282900000000000000000000000000000000000000815250600d019050604051809103902060405180807f73796d626f6c28290000000000000000000000000000000000000000000000008152506008019050604051809103902060405180807f6e616d6528290000000000000000000000000000000000000000000000000000815250600601905060405180910390201818181818181818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6114106149a0565b6114186149b4565b60008073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561147757600080fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb4799f2878787600060405160a001526040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180848152602001806020018281038252848482818152602001925080828437820191505094505050505060a060405180830381600087803b151561153257600080fd5b6102c65a03f1151561154357600080fd5b5050506040518060800180519060200160405280925081935050506115688282613b0b565b925050509392505050565b60115481565b6040805190810160405280600d81526020017f43727970746f4b6974746965730000000000000000000000000000000000000081525081565b6115bc3382613b63565b15156115c757600080fd5b6115d18183613bcf565b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b662386f26fc1000081565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561170157600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166376190f8f6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561177057600080fd5b6102c65a03f1151561178157600080fd5b50505060405180519050151561179657600080fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600160068054905003905090565b600f5481565b6000808211151561180157600080fd5b600060068381548110151561181257fe5b906000526020600020906002020160010160189054906101000a900463ffffffff1663ffffffff1614159050919050565b6201518081565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156118ac57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156118e757600080fd5b6118f13382613c25565b15156118fc57600080fd5b6119068382613b63565b151561191157600080fd5b61191c838383613c91565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561197e57600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166354c15b826000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156119ed57600080fd5b6102c65a03f115156119fe57600080fd5b505050604051805190501515611a1357600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611ab357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611aef57600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b8d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611bc957600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260149054906101000a900460ff16151515611c2957600080fd5b611c333385613b63565b1515611c3e57600080fd5b611c47846117f1565b151515611c5357600080fd5b611c7f84600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613bcf565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a85858585336040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b1515611d5b57600080fd5b6102c65a03f11515611d6c57600080fd5b50505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611dd057600080fd5b600260149054906101000a900460ff161515611deb57600080fd5b6000600260146101000a81548160ff021916908315150217905550565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008085111515611e4e57600080fd5b600084111515611e5d57600080fd5b600685815481101515611e6c57fe5b90600052602060002090600202019150600684815481101515611e8b57fe5b90600052602060002090600202019050611ea782868387613ec9565b8015611eb95750611eb884866140de565b5b9250505092915050565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff16151515611f1257600080fd5b611f1c3385613b63565b1515611f2757600080fd5b611f308461337b565b1515611f3b57600080fd5b611f6784600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613bcf565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a85858585336040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b151561204357600080fd5b6102c65a03f1151561205457600080fd5b50505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156120b957600080fd5b80600e8190555050565b600260149054906101000a900460ff161515156120df57600080fd5b6120e93382613b63565b15156120f457600080fd5b81600a600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156121a557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156121e157600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561228357600080fd5b819050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156122e157600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b6113886011541015156122f357600080fd5b601160008154809291906001019190505550612314600080600086856141f1565b50505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806123c257506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061241a5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561242557600080fd5b60036000600e8110151561243557fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff168110151561246457600080fd5b8060058190555050565b600260149054906101000a900460ff1681565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156124f557600080fd5b919050565b61afc881565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561255d57600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166385b861886000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156125cc57600080fd5b6102c65a03f115156125dd57600080fd5b5050506040518051905015156125f257600080fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061272e57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806127865750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561279157600080fd5b600260149054906101000a900460ff161515156127ad57600080fd5b6001600260146101000a81548160ff021916908315150217905550565b6127d26149df565b60006127dc6149df565b60008060006127ea87612637565b9450600085141561281c5760006040518059106128045750595b908082528060200260200182016040525095506128f7565b8460405180591061282a5750595b908082528060200260200182016040525093506128456117db565b925060009150600190505b82811115156128f3578673ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156128e6578084838151811015156128cf57fe5b906020019060200201818152505081806001019250505b8080600101915050612850565b8395505b5050505050919050565b600080600080600080600080600260149054906101000a900460ff1615151561292957600080fd5b60068981548110151561293857fe5b9060005260206000209060020201965060008760010160009054906101000a900467ffffffffffffffff1667ffffffffffffffff161415151561297a57600080fd5b612ab0876101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff16815250506144e4565b1515612abb57600080fd5b8660010160189054906101000a900463ffffffff1663ffffffff169550600686815481101515612ae757fe5b9060005260206000209060020201945086600101601e9054906101000a900461ffff16935086600101601e9054906101000a900461ffff1661ffff1685600101601e9054906101000a900461ffff1661ffff161115612b565784600101601e9054906101000a900461ffff1693505b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d9f5aed8860000154876000015460018b60010160089054906101000a900467ffffffffffffffff16036000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018381526020018267ffffffffffffffff1681526020019350505050602060405180830381600087803b1515612c2c57600080fd5b6102c65a03f11515612c3d57600080fd5b505050604051805190509250600760008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150612cad898860010160189054906101000a900463ffffffff1663ffffffff166001870161ffff1686866141f1565b90508660010160186101000a81549063ffffffff0219169055600f60008154809291906001900391905055503373ffffffffffffffffffffffffffffffffffffffff166108fc600e549081150290604051600060405180830381858888f193505050505080975050505050505050919050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612dc857506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80612e205750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515612e2b57600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b1515612eb057600080fd5b6102c65a03f11515612ec157600080fd5b505050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b1515612f4957600080fd5b6102c65a03f11515612f5a57600080fd5b505050565b6040805190810160405280600281526020017f434b00000000000000000000000000000000000000000000000000000000000081525081565b600381600e81101515612fa757fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff1615151561301657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561305257600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561308d57600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156130ea57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561314757600080fd5b6131513382613b63565b151561315c57600080fd5b613167338383613c91565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561321b57600080fd5b61afc860125410151561322d57600080fd5b61323c600080600085306141f1565b905061326a81600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613bcf565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a826132b161451f565b600062015180306040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b151561335157600080fd5b6102c65a03f1151561336257600080fd5b5050506012600081548092919060010191905055505050565b60008060008311151561338d57600080fd5b60068381548110151561339c57fe5b906000526020600020906002020190506134e2816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614622565b915050919050565b61138881565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561354b57600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260149054906101000a900460ff161515156135d357600080fd5b6135dd3383613b63565b15156135e857600080fd5b6135f18261337b565b15156135fc57600080fd5b613606828461465c565b151561361157600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c55d0f56846000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15156136aa57600080fd5b6102c65a03f115156136bb57600080fd5b505050604051805190509050600e54810134101515156136da57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663454a2ab3600e543403856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808281526020019150506000604051808303818588803b151561376e57600080fd5b6125ee5a03f1151561377f57600080fd5b505050506137998263ffffffff168463ffffffff166146b5565b505050565b60125481565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600260149054906101000a900460ff161515156137e957600080fd5b600e5434101515156137fa57600080fd5b6138043385613b63565b151561380f57600080fd5b61381983856140de565b151561382457600080fd5b60068481548110151561383357fe5b90600052602060002090600202019150613979826101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614622565b151561398457600080fd5b60068381548110151561399357fe5b90600052602060002090600202019050613ad9816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614622565b1515613ae457600080fd5b613af082858386613ec9565b1515613afb57600080fd5b613b0584846146b5565b50505050565b613b136149a0565b613b1b6149a0565b60008084604051805910613b2c5750595b9080825280601f01601f19166020018201604052509250602083019150859050613b5782828761487f565b82935050505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff166007600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b806009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008273ffffffffffffffffffffffffffffffffffffffff166009600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515613e2557600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600a600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556009600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b600081841415613edc57600090506140d6565b818560010160109054906101000a900463ffffffff1663ffffffff161480613f1d5750818560010160149054906101000a900463ffffffff1663ffffffff16145b15613f2b57600090506140d6565b838360010160109054906101000a900463ffffffff1663ffffffff161480613f6c5750838360010160149054906101000a900463ffffffff1663ffffffff16145b15613f7a57600090506140d6565b60008360010160109054906101000a900463ffffffff1663ffffffff161480613fbd575060008560010160109054906101000a900463ffffffff1663ffffffff16145b15613fcb57600190506140d6565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff16148061404057508460010160149054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff16145b1561404e57600090506140d6565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff1614806140c357508460010160149054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff16145b156140d157600090506140d6565b600190505b949350505050565b60008060006007600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806141e757508173ffffffffffffffffffffffffffffffffffffffff16600a600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b9250505092915050565b6000806141fc6149f3565b60008863ffffffff168914151561421257600080fd5b8763ffffffff168814151561422657600080fd5b8661ffff168714151561423857600080fd5b60028781151561424457fe5b049250600d8361ffff16111561425957600d92505b610100604051908101604052808781526020014267ffffffffffffffff168152602001600067ffffffffffffffff1681526020018a63ffffffff1681526020018963ffffffff168152602001600063ffffffff1681526020018461ffff1681526020018861ffff1681525091506001600680548060010182816142dc9190614a67565b916000526020600020906002020160008590919091506000820151816000015560208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601c6101000a81548161ffff021916908361ffff16021790555060e082015181600101601e6101000a81548161ffff021916908361ffff16021790555050500390508063ffffffff168114151561442e57600080fd5b7f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad58582846060015163ffffffff16856080015163ffffffff168660000151604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a16144d560008683613c91565b80935050505095945050505050565b6000808260a0015163ffffffff161415801561451857504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b6000806000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663eac9d94c6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156145b257600080fd5b6102c65a03f115156145c357600080fd5b505050604051805190509150816fffffffffffffffffffffffffffffffff16821415156145ef57600080fd5b6002828115156145fb57fe5b0482019050662386f26fc1000081101561461a57662386f26fc1000090505b809250505090565b6000808260a0015163ffffffff1614801561465557504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b600080600060068581548110151561467057fe5b9060005260206000209060020201915060068481548110151561468f57fe5b906000526020600020906002020190506146ab82868387613ec9565b9250505092915050565b6000806006838154811015156146c757fe5b906000526020600020906002020191506006848154811015156146e657fe5b90600052602060002090600202019050828160010160186101000a81548163ffffffff021916908363ffffffff160217905550614722826148ca565b61472b816148ca565b600a600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600a600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600f600081548092919060010191905055507f241ea03ca20251805084d27d4440371c34a0b85ff108f6bb5611248f73818b806007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685858460010160089054906101000a900467ffffffffffffffff16604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018267ffffffffffffffff16815260200194505050505060405180910390a150505050565b60005b6020821015156148a75782518452602084019350602083019250602082039150614882565b6001826020036101000a0390508019835116818551168181178652505050505050565b43600554600383600101601c9054906101000a900461ffff1661ffff16600e811015156148f357fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff1681151561491e57fe5b04018160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600d81600101601c9054906101000a900461ffff1661ffff16101561499d57600181600101601c8282829054906101000a900461ffff160192506101000a81548161ffff021916908361ffff1602179055505b50565b602060405190810160405280600081525090565b6080604051908101604052806004905b60008019168152602001906001900390816149c45790505090565b602060405190810160405280600081525090565b6101006040519081016040528060008152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600061ffff168152602001600061ffff1681525090565b815481835581811511614a9457600202816002028360005260206000209182019101614a939190614a99565b5b505050565b614b6291905b80821115614b5e576000808201600090556001820160006101000a81549067ffffffffffffffff02191690556001820160086101000a81549067ffffffffffffffff02191690556001820160106101000a81549063ffffffff02191690556001820160146101000a81549063ffffffff02191690556001820160186101000a81549063ffffffff021916905560018201601c6101000a81549061ffff021916905560018201601e6101000a81549061ffff021916905550600201614a9f565b5090565b905600a165627a7a72305820eb87229a99a533a2433b22e3391b8381a60f80c64c82bf3a1954747fc8acd7420029", - "deployedBytecode": "0x606060405260043610610293576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146102985780630519ce79146102f25780630560ff441461034757806305e45546146103f757806306fdde0314610420578063095ea7b3146104ae5780630a0f8168146104f05780630e583df01461054557806314001f4c1461056e57806318160ddd146105a7578063183a7947146105d05780631940a936146105f957806319c2f2011461063457806321717ebf1461065d57806323b872dd146106b257806324e7a38a1461071357806327d7874c1461074c5780632ba73c15146107855780633d7d3f5a146107be5780633f4ba83a146107fc57806346116e6f1461081157806346d22c7014610874578063481af3d3146108b85780634ad8c9381461091b5780634b85fd55146109595780634dfff04f1461097c5780634e0a3379146109be57806356129134146109f75780635663896e14610a395780635c975abb14610a5c5780636352211e14610a89578063680eba2714610aec5780636fbde40d14610b1557806370a0823114610b4e5780637a7d493714610b9b5780638456cb5914610bc45780638462151c14610bd957806388c2a0bf14610c6757806391876e5714610c9e57806395d89b4114610cb35780639d6fac6f14610d41578063a45f4bfc14610d84578063a9059cbb14610de7578063b047fb5014610e29578063b0c35c0514610e7e578063bc4006f514610ea7578063c3bea9af14610efc578063d3e6f49f14610f1f578063defb958414610f5a578063e17b25af14610f83578063e6cbe35114610fbc578063ed60ade614611011578063f1ca941014611032578063f2b47d521461105b578063f7d8c883146110b0575b600080fd5b34156102a357600080fd5b6102d860048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190919050506110d1565b604051808215151515815260200191505060405180910390f35b34156102fd57600080fd5b6103056113e2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561035257600080fd5b61037c60048080359060200190919080359060200190820180359060200191909192905050611408565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103bc5780820151818401526020810190506103a1565b50505050905090810190601f1680156103e95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561040257600080fd5b61040a611573565b6040518082815260200191505060405180910390f35b341561042b57600080fd5b610433611579565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610473578082015181840152602081019050610458565b50505050905090810190601f1680156104a05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156104b957600080fd5b6104ee600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506115b2565b005b34156104fb57600080fd5b610503611674565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561055057600080fd5b610558611699565b6040518082815260200191505060405180910390f35b341561057957600080fd5b6105a5600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506116a4565b005b34156105b257600080fd5b6105ba6117db565b6040518082815260200191505060405180910390f35b34156105db57600080fd5b6105e36117eb565b6040518082815260200191505060405180910390f35b341561060457600080fd5b61061a60048080359060200190919050506117f1565b604051808215151515815260200191505060405180910390f35b341561063f57600080fd5b610647611843565b6040518082815260200191505060405180910390f35b341561066857600080fd5b61067061184a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156106bd57600080fd5b610711600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611870565b005b341561071e57600080fd5b61074a600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611921565b005b341561075757600080fd5b610783600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611a58565b005b341561079057600080fd5b6107bc600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611b32565b005b34156107c957600080fd5b6107fa6004808035906020019091908035906020019091908035906020019091908035906020019091905050611c0d565b005b341561080757600080fd5b61080f611d75565b005b341561081c57600080fd5b6108326004808035906020019091905050611e08565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561087f57600080fd5b61089e6004808035906020019091908035906020019091905050611e3b565b604051808215151515815260200191505060405180910390f35b34156108c357600080fd5b6108d96004808035906020019091905050611ec3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561092657600080fd5b6109576004808035906020019091908035906020019091908035906020019091908035906020019091905050611ef6565b005b341561096457600080fd5b61097a600480803590602001909190505061205d565b005b341561098757600080fd5b6109bc600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506120c3565b005b34156109c957600080fd5b6109f5600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061214a565b005b3415610a0257600080fd5b610a37600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612225565b005b3415610a4457600080fd5b610a5a600480803590602001909190505061231a565b005b3415610a6757600080fd5b610a6f61246e565b604051808215151515815260200191505060405180910390f35b3415610a9457600080fd5b610aaa6004808035906020019091905050612481565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610af757600080fd5b610aff6124fa565b6040518082815260200191505060405180910390f35b3415610b2057600080fd5b610b4c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612500565b005b3415610b5957600080fd5b610b85600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612637565b6040518082815260200191505060405180910390f35b3415610ba657600080fd5b610bae612680565b6040518082815260200191505060405180910390f35b3415610bcf57600080fd5b610bd7612686565b005b3415610be457600080fd5b610c10600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506127ca565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610c53578082015181840152602081019050610c38565b505050509050019250505060405180910390f35b3415610c7257600080fd5b610c886004808035906020019091905050612901565b6040518082815260200191505060405180910390f35b3415610ca957600080fd5b610cb1612d20565b005b3415610cbe57600080fd5b610cc6612f5f565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610d06578082015181840152602081019050610ceb565b50505050905090810190601f168015610d335780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610d4c57600080fd5b610d626004808035906020019091905050612f98565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3415610d8f57600080fd5b610da56004808035906020019091905050612fc7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610df257600080fd5b610e27600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050612ffa565b005b3415610e3457600080fd5b610e3c61316b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610e8957600080fd5b610e91613191565b6040518082815260200191505060405180910390f35b3415610eb257600080fd5b610eba613197565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610f0757600080fd5b610f1d60048080359060200190919050506131bd565b005b3415610f2a57600080fd5b610f40600480803590602001909190505061337b565b604051808215151515815260200191505060405180910390f35b3415610f6557600080fd5b610f6d6134ea565b6040518082815260200191505060405180910390f35b3415610f8e57600080fd5b610fba600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506134f0565b005b3415610fc757600080fd5b610fcf61358f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61103060048080359060200190919080359060200190919050506135b5565b005b341561103d57600080fd5b61104561379e565b6040518082815260200191505060405180910390f35b341561106657600080fd5b61106e6137a4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6110cf60048080359060200190919080359060200190919050506137ca565b005b600060405180807f737570706f727473496e74657266616365286279746573342900000000000000815250601901905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806113db575060405180807f746f6b656e4d657461646174612875696e743235362c737472696e6729000000815250601d019050604051809103902060405180807f746f6b656e734f664f776e6572286164647265737329000000000000000000008152506016019050604051809103902060405180807f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81526020017f74323536290000000000000000000000000000000000000000000000000000008152506025019050604051809103902060405180807f7472616e7366657228616464726573732c75696e7432353629000000000000008152506019019050604051809103902060405180807f617070726f766528616464726573732c75696e743235362900000000000000008152506018019050604051809103902060405180807f6f776e65724f662875696e7432353629000000000000000000000000000000008152506010019050604051809103902060405180807f62616c616e63654f6628616464726573732900000000000000000000000000008152506012019050604051809103902060405180807f746f74616c537570706c79282900000000000000000000000000000000000000815250600d019050604051809103902060405180807f73796d626f6c28290000000000000000000000000000000000000000000000008152506008019050604051809103902060405180807f6e616d6528290000000000000000000000000000000000000000000000000000815250600601905060405180910390201818181818181818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6114106149a0565b6114186149b4565b60008073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561147757600080fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb4799f2878787600060405160a001526040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180848152602001806020018281038252848482818152602001925080828437820191505094505050505060a060405180830381600087803b151561153257600080fd5b6102c65a03f1151561154357600080fd5b5050506040518060800180519060200160405280925081935050506115688282613b0b565b925050509392505050565b60115481565b6040805190810160405280600d81526020017f43727970746f4b6974746965730000000000000000000000000000000000000081525081565b6115bc3382613b63565b15156115c757600080fd5b6115d18183613bcf565b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b662386f26fc1000081565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561170157600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166376190f8f6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561177057600080fd5b6102c65a03f1151561178157600080fd5b50505060405180519050151561179657600080fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600160068054905003905090565b600f5481565b6000808211151561180157600080fd5b600060068381548110151561181257fe5b906000526020600020906002020160010160189054906101000a900463ffffffff1663ffffffff1614159050919050565b6201518081565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156118ac57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156118e757600080fd5b6118f13382613c25565b15156118fc57600080fd5b6119068382613b63565b151561191157600080fd5b61191c838383613c91565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561197e57600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166354c15b826000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156119ed57600080fd5b6102c65a03f115156119fe57600080fd5b505050604051805190501515611a1357600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611ab357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611aef57600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b8d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611bc957600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260149054906101000a900460ff16151515611c2957600080fd5b611c333385613b63565b1515611c3e57600080fd5b611c47846117f1565b151515611c5357600080fd5b611c7f84600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613bcf565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a85858585336040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b1515611d5b57600080fd5b6102c65a03f11515611d6c57600080fd5b50505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611dd057600080fd5b600260149054906101000a900460ff161515611deb57600080fd5b6000600260146101000a81548160ff021916908315150217905550565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008085111515611e4e57600080fd5b600084111515611e5d57600080fd5b600685815481101515611e6c57fe5b90600052602060002090600202019150600684815481101515611e8b57fe5b90600052602060002090600202019050611ea782868387613ec9565b8015611eb95750611eb884866140de565b5b9250505092915050565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff16151515611f1257600080fd5b611f1c3385613b63565b1515611f2757600080fd5b611f308461337b565b1515611f3b57600080fd5b611f6784600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613bcf565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a85858585336040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b151561204357600080fd5b6102c65a03f1151561205457600080fd5b50505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156120b957600080fd5b80600e8190555050565b600260149054906101000a900460ff161515156120df57600080fd5b6120e93382613b63565b15156120f457600080fd5b81600a600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156121a557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156121e157600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561228357600080fd5b819050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156122e157600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b6113886011541015156122f357600080fd5b601160008154809291906001019190505550612314600080600086856141f1565b50505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806123c257506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061241a5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561242557600080fd5b60036000600e8110151561243557fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff168110151561246457600080fd5b8060058190555050565b600260149054906101000a900460ff1681565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156124f557600080fd5b919050565b61afc881565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561255d57600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166385b861886000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156125cc57600080fd5b6102c65a03f115156125dd57600080fd5b5050506040518051905015156125f257600080fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061272e57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806127865750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561279157600080fd5b600260149054906101000a900460ff161515156127ad57600080fd5b6001600260146101000a81548160ff021916908315150217905550565b6127d26149df565b60006127dc6149df565b60008060006127ea87612637565b9450600085141561281c5760006040518059106128045750595b908082528060200260200182016040525095506128f7565b8460405180591061282a5750595b908082528060200260200182016040525093506128456117db565b925060009150600190505b82811115156128f3578673ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156128e6578084838151811015156128cf57fe5b906020019060200201818152505081806001019250505b8080600101915050612850565b8395505b5050505050919050565b600080600080600080600080600260149054906101000a900460ff1615151561292957600080fd5b60068981548110151561293857fe5b9060005260206000209060020201965060008760010160009054906101000a900467ffffffffffffffff1667ffffffffffffffff161415151561297a57600080fd5b612ab0876101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff16815250506144e4565b1515612abb57600080fd5b8660010160189054906101000a900463ffffffff1663ffffffff169550600686815481101515612ae757fe5b9060005260206000209060020201945086600101601e9054906101000a900461ffff16935086600101601e9054906101000a900461ffff1661ffff1685600101601e9054906101000a900461ffff1661ffff161115612b565784600101601e9054906101000a900461ffff1693505b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d9f5aed8860000154876000015460018b60010160089054906101000a900467ffffffffffffffff16036000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018381526020018267ffffffffffffffff1681526020019350505050602060405180830381600087803b1515612c2c57600080fd5b6102c65a03f11515612c3d57600080fd5b505050604051805190509250600760008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150612cad898860010160189054906101000a900463ffffffff1663ffffffff166001870161ffff1686866141f1565b90508660010160186101000a81549063ffffffff0219169055600f60008154809291906001900391905055503373ffffffffffffffffffffffffffffffffffffffff166108fc600e549081150290604051600060405180830381858888f193505050505080975050505050505050919050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612dc857506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80612e205750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515612e2b57600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b1515612eb057600080fd5b6102c65a03f11515612ec157600080fd5b505050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b1515612f4957600080fd5b6102c65a03f11515612f5a57600080fd5b505050565b6040805190810160405280600281526020017f434b00000000000000000000000000000000000000000000000000000000000081525081565b600381600e81101515612fa757fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff1615151561301657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561305257600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561308d57600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156130ea57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561314757600080fd5b6131513382613b63565b151561315c57600080fd5b613167338383613c91565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561321b57600080fd5b61afc860125410151561322d57600080fd5b61323c600080600085306141f1565b905061326a81600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613bcf565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a826132b161451f565b600062015180306040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b151561335157600080fd5b6102c65a03f1151561336257600080fd5b5050506012600081548092919060010191905055505050565b60008060008311151561338d57600080fd5b60068381548110151561339c57fe5b906000526020600020906002020190506134e2816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614622565b915050919050565b61138881565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561354b57600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260149054906101000a900460ff161515156135d357600080fd5b6135dd3383613b63565b15156135e857600080fd5b6135f18261337b565b15156135fc57600080fd5b613606828461465c565b151561361157600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c55d0f56846000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15156136aa57600080fd5b6102c65a03f115156136bb57600080fd5b505050604051805190509050600e54810134101515156136da57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663454a2ab3600e543403856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808281526020019150506000604051808303818588803b151561376e57600080fd5b6125ee5a03f1151561377f57600080fd5b505050506137998263ffffffff168463ffffffff166146b5565b505050565b60125481565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600260149054906101000a900460ff161515156137e957600080fd5b600e5434101515156137fa57600080fd5b6138043385613b63565b151561380f57600080fd5b61381983856140de565b151561382457600080fd5b60068481548110151561383357fe5b90600052602060002090600202019150613979826101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614622565b151561398457600080fd5b60068381548110151561399357fe5b90600052602060002090600202019050613ad9816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614622565b1515613ae457600080fd5b613af082858386613ec9565b1515613afb57600080fd5b613b0584846146b5565b50505050565b613b136149a0565b613b1b6149a0565b60008084604051805910613b2c5750595b9080825280601f01601f19166020018201604052509250602083019150859050613b5782828761487f565b82935050505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff166007600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b806009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008273ffffffffffffffffffffffffffffffffffffffff166009600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515613e2557600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600a600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556009600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b600081841415613edc57600090506140d6565b818560010160109054906101000a900463ffffffff1663ffffffff161480613f1d5750818560010160149054906101000a900463ffffffff1663ffffffff16145b15613f2b57600090506140d6565b838360010160109054906101000a900463ffffffff1663ffffffff161480613f6c5750838360010160149054906101000a900463ffffffff1663ffffffff16145b15613f7a57600090506140d6565b60008360010160109054906101000a900463ffffffff1663ffffffff161480613fbd575060008560010160109054906101000a900463ffffffff1663ffffffff16145b15613fcb57600190506140d6565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff16148061404057508460010160149054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff16145b1561404e57600090506140d6565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff1614806140c357508460010160149054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff16145b156140d157600090506140d6565b600190505b949350505050565b60008060006007600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806141e757508173ffffffffffffffffffffffffffffffffffffffff16600a600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b9250505092915050565b6000806141fc6149f3565b60008863ffffffff168914151561421257600080fd5b8763ffffffff168814151561422657600080fd5b8661ffff168714151561423857600080fd5b60028781151561424457fe5b049250600d8361ffff16111561425957600d92505b610100604051908101604052808781526020014267ffffffffffffffff168152602001600067ffffffffffffffff1681526020018a63ffffffff1681526020018963ffffffff168152602001600063ffffffff1681526020018461ffff1681526020018861ffff1681525091506001600680548060010182816142dc9190614a67565b916000526020600020906002020160008590919091506000820151816000015560208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601c6101000a81548161ffff021916908361ffff16021790555060e082015181600101601e6101000a81548161ffff021916908361ffff16021790555050500390508063ffffffff168114151561442e57600080fd5b7f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad58582846060015163ffffffff16856080015163ffffffff168660000151604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a16144d560008683613c91565b80935050505095945050505050565b6000808260a0015163ffffffff161415801561451857504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b6000806000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663eac9d94c6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156145b257600080fd5b6102c65a03f115156145c357600080fd5b505050604051805190509150816fffffffffffffffffffffffffffffffff16821415156145ef57600080fd5b6002828115156145fb57fe5b0482019050662386f26fc1000081101561461a57662386f26fc1000090505b809250505090565b6000808260a0015163ffffffff1614801561465557504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b600080600060068581548110151561467057fe5b9060005260206000209060020201915060068481548110151561468f57fe5b906000526020600020906002020190506146ab82868387613ec9565b9250505092915050565b6000806006838154811015156146c757fe5b906000526020600020906002020191506006848154811015156146e657fe5b90600052602060002090600202019050828160010160186101000a81548163ffffffff021916908363ffffffff160217905550614722826148ca565b61472b816148ca565b600a600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600a600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600f600081548092919060010191905055507f241ea03ca20251805084d27d4440371c34a0b85ff108f6bb5611248f73818b806007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685858460010160089054906101000a900467ffffffffffffffff16604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018267ffffffffffffffff16815260200194505050505060405180910390a150505050565b60005b6020821015156148a75782518452602084019350602083019250602082039150614882565b6001826020036101000a0390508019835116818551168181178652505050505050565b43600554600383600101601c9054906101000a900461ffff1661ffff16600e811015156148f357fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff1681151561491e57fe5b04018160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600d81600101601c9054906101000a900461ffff1661ffff16101561499d57600181600101601c8282829054906101000a900461ffff160192506101000a81548161ffff021916908361ffff1602179055505b50565b602060405190810160405280600081525090565b6080604051908101604052806004905b60008019168152602001906001900390816149c45790505090565b602060405190810160405280600081525090565b6101006040519081016040528060008152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600061ffff168152602001600061ffff1681525090565b815481835581811511614a9457600202816002028360005260206000209182019101614a939190614a99565b5b505050565b614b6291905b80821115614b5e576000808201600090556001820160006101000a81549067ffffffffffffffff02191690556001820160086101000a81549067ffffffffffffffff02191690556001820160106101000a81549063ffffffff02191690556001820160146101000a81549063ffffffff02191690556001820160186101000a81549063ffffffff021916905560018201601c6101000a81549061ffff021916905560018201601e6101000a81549061ffff021916905550600201614a9f565b5090565b905600a165627a7a72305820eb87229a99a533a2433b22e3391b8381a60f80c64c82bf3a1954747fc8acd7420029", + "bytecode": "0x60606040526000600260146101000a81548160ff0219169083151502179055506101c060405190810160405280603c63ffffffff1663ffffffff168152602001607863ffffffff1663ffffffff16815260200161012c63ffffffff1663ffffffff16815260200161025863ffffffff1663ffffffff16815260200161070863ffffffff1663ffffffff168152602001610e1063ffffffff1663ffffffff168152602001611c2063ffffffff1663ffffffff16815260200161384063ffffffff1663ffffffff16815260200161708063ffffffff1663ffffffff16815260200161e10063ffffffff1663ffffffff1681526020016201518063ffffffff1663ffffffff1681526020016202a30063ffffffff1663ffffffff1681526020016205460063ffffffff1663ffffffff16815260200162093a8063ffffffff1663ffffffff16815250600390600e6200015692919062000179565b50600f60055566071afd498d0000600e5534156200017357600080fd5b62000259565b82600e600701600890048101928215620002105791602002820160005b83821115620001dc57835183826101000a81548163ffffffff021916908363ffffffff160217905550926020019260040160208160030104928301926001030262000196565b80156200020e5782816101000a81549063ffffffff0219169055600401602081600301049283019260010302620001dc565b505b5090506200021f919062000223565b5090565b6200025691905b808211156200025257600081816101000a81549063ffffffff0219169055506001016200022a565b5090565b90565b614b9180620002696000396000f300606060405260043610610293576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146102985780630519ce79146102f25780630560ff441461034757806305e45546146103f757806306fdde0314610420578063095ea7b3146104ae5780630a0f8168146104f05780630e583df01461054557806314001f4c1461056e57806318160ddd146105a7578063183a7947146105d05780631940a936146105f957806319c2f2011461063457806321717ebf1461065d57806323b872dd146106b257806324e7a38a1461071357806327d7874c1461074c5780632ba73c15146107855780633d7d3f5a146107be5780633f4ba83a146107fc57806346116e6f1461081157806346d22c7014610874578063481af3d3146108b85780634ad8c9381461091b5780634b85fd55146109595780634dfff04f1461097c5780634e0a3379146109be57806356129134146109f75780635663896e14610a395780635c975abb14610a5c5780636352211e14610a89578063680eba2714610aec5780636fbde40d14610b1557806370a0823114610b4e5780637a7d493714610b9b5780638456cb5914610bc45780638462151c14610bd957806388c2a0bf14610c6757806391876e5714610c9e57806395d89b4114610cb35780639d6fac6f14610d41578063a45f4bfc14610d84578063a9059cbb14610de7578063b047fb5014610e29578063b0c35c0514610e7e578063bc4006f514610ea7578063c3bea9af14610efc578063d3e6f49f14610f1f578063defb958414610f5a578063e17b25af14610f83578063e6cbe35114610fbc578063ed60ade614611011578063f1ca941014611032578063f2b47d521461105b578063f7d8c883146110b0575b600080fd5b34156102a357600080fd5b6102d860048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190919050506110d1565b604051808215151515815260200191505060405180910390f35b34156102fd57600080fd5b6103056113e2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561035257600080fd5b61037c60048080359060200190919080359060200190820180359060200191909192905050611408565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103bc5780820151818401526020810190506103a1565b50505050905090810190601f1680156103e95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561040257600080fd5b61040a611573565b6040518082815260200191505060405180910390f35b341561042b57600080fd5b610433611579565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610473578082015181840152602081019050610458565b50505050905090810190601f1680156104a05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156104b957600080fd5b6104ee600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506115b2565b005b34156104fb57600080fd5b610503611674565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561055057600080fd5b610558611699565b6040518082815260200191505060405180910390f35b341561057957600080fd5b6105a5600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506116a4565b005b34156105b257600080fd5b6105ba6117db565b6040518082815260200191505060405180910390f35b34156105db57600080fd5b6105e36117eb565b6040518082815260200191505060405180910390f35b341561060457600080fd5b61061a60048080359060200190919050506117f1565b604051808215151515815260200191505060405180910390f35b341561063f57600080fd5b610647611843565b6040518082815260200191505060405180910390f35b341561066857600080fd5b61067061184a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156106bd57600080fd5b610711600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611870565b005b341561071e57600080fd5b61074a600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611921565b005b341561075757600080fd5b610783600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611a58565b005b341561079057600080fd5b6107bc600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611b32565b005b34156107c957600080fd5b6107fa6004808035906020019091908035906020019091908035906020019091908035906020019091905050611c0d565b005b341561080757600080fd5b61080f611d75565b005b341561081c57600080fd5b6108326004808035906020019091905050611e08565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561087f57600080fd5b61089e6004808035906020019091908035906020019091905050611e3b565b604051808215151515815260200191505060405180910390f35b34156108c357600080fd5b6108d96004808035906020019091905050611ec3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561092657600080fd5b6109576004808035906020019091908035906020019091908035906020019091908035906020019091905050611ef6565b005b341561096457600080fd5b61097a600480803590602001909190505061205d565b005b341561098757600080fd5b6109bc600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506120c3565b005b34156109c957600080fd5b6109f5600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061214a565b005b3415610a0257600080fd5b610a37600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612225565b005b3415610a4457600080fd5b610a5a600480803590602001909190505061231a565b005b3415610a6757600080fd5b610a6f61246e565b604051808215151515815260200191505060405180910390f35b3415610a9457600080fd5b610aaa6004808035906020019091905050612481565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610af757600080fd5b610aff6124fa565b6040518082815260200191505060405180910390f35b3415610b2057600080fd5b610b4c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612500565b005b3415610b5957600080fd5b610b85600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612637565b6040518082815260200191505060405180910390f35b3415610ba657600080fd5b610bae612680565b6040518082815260200191505060405180910390f35b3415610bcf57600080fd5b610bd7612686565b005b3415610be457600080fd5b610c10600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506127ca565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610c53578082015181840152602081019050610c38565b505050509050019250505060405180910390f35b3415610c7257600080fd5b610c886004808035906020019091905050612901565b6040518082815260200191505060405180910390f35b3415610ca957600080fd5b610cb1612d20565b005b3415610cbe57600080fd5b610cc6612f5f565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610d06578082015181840152602081019050610ceb565b50505050905090810190601f168015610d335780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610d4c57600080fd5b610d626004808035906020019091905050612f98565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3415610d8f57600080fd5b610da56004808035906020019091905050612fc7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610df257600080fd5b610e27600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050612ffa565b005b3415610e3457600080fd5b610e3c61316b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610e8957600080fd5b610e91613191565b6040518082815260200191505060405180910390f35b3415610eb257600080fd5b610eba613197565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610f0757600080fd5b610f1d60048080359060200190919050506131bd565b005b3415610f2a57600080fd5b610f40600480803590602001909190505061337b565b604051808215151515815260200191505060405180910390f35b3415610f6557600080fd5b610f6d6134ea565b6040518082815260200191505060405180910390f35b3415610f8e57600080fd5b610fba600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506134f0565b005b3415610fc757600080fd5b610fcf61358f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61103060048080359060200190919080359060200190919050506135b5565b005b341561103d57600080fd5b61104561379e565b6040518082815260200191505060405180910390f35b341561106657600080fd5b61106e6137a4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6110cf60048080359060200190919080359060200190919050506137ca565b005b600060405180807f737570706f727473496e74657266616365286279746573342900000000000000815250601901905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806113db575060405180807f746f6b656e4d657461646174612875696e743235362c737472696e6729000000815250601d019050604051809103902060405180807f746f6b656e734f664f776e6572286164647265737329000000000000000000008152506016019050604051809103902060405180807f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81526020017f74323536290000000000000000000000000000000000000000000000000000008152506025019050604051809103902060405180807f7472616e7366657228616464726573732c75696e7432353629000000000000008152506019019050604051809103902060405180807f617070726f766528616464726573732c75696e743235362900000000000000008152506018019050604051809103902060405180807f6f776e65724f662875696e7432353629000000000000000000000000000000008152506010019050604051809103902060405180807f62616c616e63654f6628616464726573732900000000000000000000000000008152506012019050604051809103902060405180807f746f74616c537570706c79282900000000000000000000000000000000000000815250600d019050604051809103902060405180807f73796d626f6c28290000000000000000000000000000000000000000000000008152506008019050604051809103902060405180807f6e616d6528290000000000000000000000000000000000000000000000000000815250600601905060405180910390201818181818181818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6114106149a0565b6114186149b4565b60008073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561147757600080fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb4799f2878787600060405160a001526040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180848152602001806020018281038252848482818152602001925080828437820191505094505050505060a060405180830381600087803b151561153257600080fd5b6102c65a03f1151561154357600080fd5b5050506040518060800180519060200160405280925081935050506115688282613b0b565b925050509392505050565b60115481565b6040805190810160405280600d81526020017f43727970746f4b6974746965730000000000000000000000000000000000000081525081565b6115bc3382613b63565b15156115c757600080fd5b6115d18183613bcf565b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b662386f26fc1000081565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561170157600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166376190f8f6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561177057600080fd5b6102c65a03f1151561178157600080fd5b50505060405180519050151561179657600080fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600160068054905003905090565b600f5481565b6000808211151561180157600080fd5b600060068381548110151561181257fe5b906000526020600020906002020160010160189054906101000a900463ffffffff1663ffffffff1614159050919050565b6201518081565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156118ac57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156118e757600080fd5b6118f13382613c25565b15156118fc57600080fd5b6119068382613b63565b151561191157600080fd5b61191c838383613c91565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561197e57600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166354c15b826000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156119ed57600080fd5b6102c65a03f115156119fe57600080fd5b505050604051805190501515611a1357600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611ab357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611aef57600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b8d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611bc957600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260149054906101000a900460ff16151515611c2957600080fd5b611c333385613b63565b1515611c3e57600080fd5b611c47846117f1565b151515611c5357600080fd5b611c7f84600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613bcf565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a85858585336040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b1515611d5b57600080fd5b6102c65a03f11515611d6c57600080fd5b50505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611dd057600080fd5b600260149054906101000a900460ff161515611deb57600080fd5b6000600260146101000a81548160ff021916908315150217905550565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008085111515611e4e57600080fd5b600084111515611e5d57600080fd5b600685815481101515611e6c57fe5b90600052602060002090600202019150600684815481101515611e8b57fe5b90600052602060002090600202019050611ea782868387613ec9565b8015611eb95750611eb884866140de565b5b9250505092915050565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff16151515611f1257600080fd5b611f1c3385613b63565b1515611f2757600080fd5b611f308461337b565b1515611f3b57600080fd5b611f6784600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613bcf565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a85858585336040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b151561204357600080fd5b6102c65a03f1151561205457600080fd5b50505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156120b957600080fd5b80600e8190555050565b600260149054906101000a900460ff161515156120df57600080fd5b6120e93382613b63565b15156120f457600080fd5b81600a600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156121a557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156121e157600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561228357600080fd5b819050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156122e157600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b6113886011541015156122f357600080fd5b601160008154809291906001019190505550612314600080600086856141f1565b50505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806123c257506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061241a5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561242557600080fd5b60036000600e8110151561243557fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff168110151561246457600080fd5b8060058190555050565b600260149054906101000a900460ff1681565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156124f557600080fd5b919050565b61afc881565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561255d57600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166385b861886000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156125cc57600080fd5b6102c65a03f115156125dd57600080fd5b5050506040518051905015156125f257600080fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061272e57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806127865750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561279157600080fd5b600260149054906101000a900460ff161515156127ad57600080fd5b6001600260146101000a81548160ff021916908315150217905550565b6127d26149df565b60006127dc6149df565b60008060006127ea87612637565b9450600085141561281c5760006040518059106128045750595b908082528060200260200182016040525095506128f7565b8460405180591061282a5750595b908082528060200260200182016040525093506128456117db565b925060009150600190505b82811115156128f3578673ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156128e6578084838151811015156128cf57fe5b906020019060200201818152505081806001019250505b8080600101915050612850565b8395505b5050505050919050565b600080600080600080600080600260149054906101000a900460ff1615151561292957600080fd5b60068981548110151561293857fe5b9060005260206000209060020201965060008760010160009054906101000a900467ffffffffffffffff1667ffffffffffffffff161415151561297a57600080fd5b612ab0876101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff16815250506144e4565b1515612abb57600080fd5b8660010160189054906101000a900463ffffffff1663ffffffff169550600686815481101515612ae757fe5b9060005260206000209060020201945086600101601e9054906101000a900461ffff16935086600101601e9054906101000a900461ffff1661ffff1685600101601e9054906101000a900461ffff1661ffff161115612b565784600101601e9054906101000a900461ffff1693505b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d9f5aed8860000154876000015460018b60010160089054906101000a900467ffffffffffffffff16036000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018381526020018267ffffffffffffffff1681526020019350505050602060405180830381600087803b1515612c2c57600080fd5b6102c65a03f11515612c3d57600080fd5b505050604051805190509250600760008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150612cad898860010160189054906101000a900463ffffffff1663ffffffff166001870161ffff1686866141f1565b90508660010160186101000a81549063ffffffff0219169055600f60008154809291906001900391905055503373ffffffffffffffffffffffffffffffffffffffff166108fc600e549081150290604051600060405180830381858888f193505050505080975050505050505050919050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612dc857506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80612e205750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515612e2b57600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b1515612eb057600080fd5b6102c65a03f11515612ec157600080fd5b505050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b1515612f4957600080fd5b6102c65a03f11515612f5a57600080fd5b505050565b6040805190810160405280600281526020017f434b00000000000000000000000000000000000000000000000000000000000081525081565b600381600e81101515612fa757fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff1615151561301657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561305257600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561308d57600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156130ea57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561314757600080fd5b6131513382613b63565b151561315c57600080fd5b613167338383613c91565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561321b57600080fd5b61afc860125410151561322d57600080fd5b61323c600080600085306141f1565b905061326a81600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613bcf565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a826132b161451f565b600062015180306040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b151561335157600080fd5b6102c65a03f1151561336257600080fd5b5050506012600081548092919060010191905055505050565b60008060008311151561338d57600080fd5b60068381548110151561339c57fe5b906000526020600020906002020190506134e2816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614622565b915050919050565b61138881565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561354b57600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260149054906101000a900460ff161515156135d357600080fd5b6135dd3383613b63565b15156135e857600080fd5b6135f18261337b565b15156135fc57600080fd5b613606828461465c565b151561361157600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c55d0f56846000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15156136aa57600080fd5b6102c65a03f115156136bb57600080fd5b505050604051805190509050600e54810134101515156136da57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663454a2ab3600e543403856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808281526020019150506000604051808303818588803b151561376e57600080fd5b6125ee5a03f1151561377f57600080fd5b505050506137998263ffffffff168463ffffffff166146b5565b505050565b60125481565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600260149054906101000a900460ff161515156137e957600080fd5b600e5434101515156137fa57600080fd5b6138043385613b63565b151561380f57600080fd5b61381983856140de565b151561382457600080fd5b60068481548110151561383357fe5b90600052602060002090600202019150613979826101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614622565b151561398457600080fd5b60068381548110151561399357fe5b90600052602060002090600202019050613ad9816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614622565b1515613ae457600080fd5b613af082858386613ec9565b1515613afb57600080fd5b613b0584846146b5565b50505050565b613b136149a0565b613b1b6149a0565b60008084604051805910613b2c5750595b9080825280601f01601f19166020018201604052509250602083019150859050613b5782828761487f565b82935050505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff166007600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b806009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008273ffffffffffffffffffffffffffffffffffffffff166009600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515613e2557600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600a600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556009600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b600081841415613edc57600090506140d6565b818560010160109054906101000a900463ffffffff1663ffffffff161480613f1d5750818560010160149054906101000a900463ffffffff1663ffffffff16145b15613f2b57600090506140d6565b838360010160109054906101000a900463ffffffff1663ffffffff161480613f6c5750838360010160149054906101000a900463ffffffff1663ffffffff16145b15613f7a57600090506140d6565b60008360010160109054906101000a900463ffffffff1663ffffffff161480613fbd575060008560010160109054906101000a900463ffffffff1663ffffffff16145b15613fcb57600190506140d6565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff16148061404057508460010160149054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff16145b1561404e57600090506140d6565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff1614806140c357508460010160149054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff16145b156140d157600090506140d6565b600190505b949350505050565b60008060006007600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806141e757508173ffffffffffffffffffffffffffffffffffffffff16600a600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b9250505092915050565b6000806141fc6149f3565b60008863ffffffff168914151561421257600080fd5b8763ffffffff168814151561422657600080fd5b8661ffff168714151561423857600080fd5b60028781151561424457fe5b049250600d8361ffff16111561425957600d92505b610100604051908101604052808781526020014267ffffffffffffffff168152602001600067ffffffffffffffff1681526020018a63ffffffff1681526020018963ffffffff168152602001600063ffffffff1681526020018461ffff1681526020018861ffff1681525091506001600680548060010182816142dc9190614a67565b916000526020600020906002020160008590919091506000820151816000015560208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601c6101000a81548161ffff021916908361ffff16021790555060e082015181600101601e6101000a81548161ffff021916908361ffff16021790555050500390508063ffffffff168114151561442e57600080fd5b7f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad58582846060015163ffffffff16856080015163ffffffff168660000151604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a16144d560008683613c91565b80935050505095945050505050565b6000808260a0015163ffffffff161415801561451857504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b6000806000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663eac9d94c6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156145b257600080fd5b6102c65a03f115156145c357600080fd5b505050604051805190509150816fffffffffffffffffffffffffffffffff16821415156145ef57600080fd5b6002828115156145fb57fe5b0482019050662386f26fc1000081101561461a57662386f26fc1000090505b809250505090565b6000808260a0015163ffffffff1614801561465557504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b600080600060068581548110151561467057fe5b9060005260206000209060020201915060068481548110151561468f57fe5b906000526020600020906002020190506146ab82868387613ec9565b9250505092915050565b6000806006838154811015156146c757fe5b906000526020600020906002020191506006848154811015156146e657fe5b90600052602060002090600202019050828160010160186101000a81548163ffffffff021916908363ffffffff160217905550614722826148ca565b61472b816148ca565b600a600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600a600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600f600081548092919060010191905055507f241ea03ca20251805084d27d4440371c34a0b85ff108f6bb5611248f73818b806007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685858460010160089054906101000a900467ffffffffffffffff16604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018267ffffffffffffffff16815260200194505050505060405180910390a150505050565b60005b6020821015156148a75782518452602084019350602083019250602082039150614882565b6001826020036101000a0390508019835116818551168181178652505050505050565b43600554600383600101601c9054906101000a900461ffff1661ffff16600e811015156148f357fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff1681151561491e57fe5b04018160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600d81600101601c9054906101000a900461ffff1661ffff16101561499d57600181600101601c8282829054906101000a900461ffff160192506101000a81548161ffff021916908361ffff1602179055505b50565b602060405190810160405280600081525090565b6080604051908101604052806004905b60008019168152602001906001900390816149c45790505090565b602060405190810160405280600081525090565b6101006040519081016040528060008152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600061ffff168152602001600061ffff1681525090565b815481835581811511614a9457600202816002028360005260206000209182019101614a939190614a99565b5b505050565b614b6291905b80821115614b5e576000808201600090556001820160006101000a81549067ffffffffffffffff02191690556001820160086101000a81549067ffffffffffffffff02191690556001820160106101000a81549063ffffffff02191690556001820160146101000a81549063ffffffff02191690556001820160186101000a81549063ffffffff021916905560018201601c6101000a81549061ffff021916905560018201601e6101000a81549061ffff021916905550600201614a9f565b5090565b905600a165627a7a72305820730f57a104c61a4b1492548005ff8f2a716b15b17146ae8e47acc98fbe82815b0029", + "deployedBytecode": "0x606060405260043610610293576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146102985780630519ce79146102f25780630560ff441461034757806305e45546146103f757806306fdde0314610420578063095ea7b3146104ae5780630a0f8168146104f05780630e583df01461054557806314001f4c1461056e57806318160ddd146105a7578063183a7947146105d05780631940a936146105f957806319c2f2011461063457806321717ebf1461065d57806323b872dd146106b257806324e7a38a1461071357806327d7874c1461074c5780632ba73c15146107855780633d7d3f5a146107be5780633f4ba83a146107fc57806346116e6f1461081157806346d22c7014610874578063481af3d3146108b85780634ad8c9381461091b5780634b85fd55146109595780634dfff04f1461097c5780634e0a3379146109be57806356129134146109f75780635663896e14610a395780635c975abb14610a5c5780636352211e14610a89578063680eba2714610aec5780636fbde40d14610b1557806370a0823114610b4e5780637a7d493714610b9b5780638456cb5914610bc45780638462151c14610bd957806388c2a0bf14610c6757806391876e5714610c9e57806395d89b4114610cb35780639d6fac6f14610d41578063a45f4bfc14610d84578063a9059cbb14610de7578063b047fb5014610e29578063b0c35c0514610e7e578063bc4006f514610ea7578063c3bea9af14610efc578063d3e6f49f14610f1f578063defb958414610f5a578063e17b25af14610f83578063e6cbe35114610fbc578063ed60ade614611011578063f1ca941014611032578063f2b47d521461105b578063f7d8c883146110b0575b600080fd5b34156102a357600080fd5b6102d860048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190919050506110d1565b604051808215151515815260200191505060405180910390f35b34156102fd57600080fd5b6103056113e2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561035257600080fd5b61037c60048080359060200190919080359060200190820180359060200191909192905050611408565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103bc5780820151818401526020810190506103a1565b50505050905090810190601f1680156103e95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561040257600080fd5b61040a611573565b6040518082815260200191505060405180910390f35b341561042b57600080fd5b610433611579565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610473578082015181840152602081019050610458565b50505050905090810190601f1680156104a05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156104b957600080fd5b6104ee600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506115b2565b005b34156104fb57600080fd5b610503611674565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561055057600080fd5b610558611699565b6040518082815260200191505060405180910390f35b341561057957600080fd5b6105a5600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506116a4565b005b34156105b257600080fd5b6105ba6117db565b6040518082815260200191505060405180910390f35b34156105db57600080fd5b6105e36117eb565b6040518082815260200191505060405180910390f35b341561060457600080fd5b61061a60048080359060200190919050506117f1565b604051808215151515815260200191505060405180910390f35b341561063f57600080fd5b610647611843565b6040518082815260200191505060405180910390f35b341561066857600080fd5b61067061184a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156106bd57600080fd5b610711600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611870565b005b341561071e57600080fd5b61074a600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611921565b005b341561075757600080fd5b610783600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611a58565b005b341561079057600080fd5b6107bc600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611b32565b005b34156107c957600080fd5b6107fa6004808035906020019091908035906020019091908035906020019091908035906020019091905050611c0d565b005b341561080757600080fd5b61080f611d75565b005b341561081c57600080fd5b6108326004808035906020019091905050611e08565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561087f57600080fd5b61089e6004808035906020019091908035906020019091905050611e3b565b604051808215151515815260200191505060405180910390f35b34156108c357600080fd5b6108d96004808035906020019091905050611ec3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561092657600080fd5b6109576004808035906020019091908035906020019091908035906020019091908035906020019091905050611ef6565b005b341561096457600080fd5b61097a600480803590602001909190505061205d565b005b341561098757600080fd5b6109bc600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506120c3565b005b34156109c957600080fd5b6109f5600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061214a565b005b3415610a0257600080fd5b610a37600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612225565b005b3415610a4457600080fd5b610a5a600480803590602001909190505061231a565b005b3415610a6757600080fd5b610a6f61246e565b604051808215151515815260200191505060405180910390f35b3415610a9457600080fd5b610aaa6004808035906020019091905050612481565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610af757600080fd5b610aff6124fa565b6040518082815260200191505060405180910390f35b3415610b2057600080fd5b610b4c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612500565b005b3415610b5957600080fd5b610b85600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612637565b6040518082815260200191505060405180910390f35b3415610ba657600080fd5b610bae612680565b6040518082815260200191505060405180910390f35b3415610bcf57600080fd5b610bd7612686565b005b3415610be457600080fd5b610c10600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506127ca565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610c53578082015181840152602081019050610c38565b505050509050019250505060405180910390f35b3415610c7257600080fd5b610c886004808035906020019091905050612901565b6040518082815260200191505060405180910390f35b3415610ca957600080fd5b610cb1612d20565b005b3415610cbe57600080fd5b610cc6612f5f565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610d06578082015181840152602081019050610ceb565b50505050905090810190601f168015610d335780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610d4c57600080fd5b610d626004808035906020019091905050612f98565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3415610d8f57600080fd5b610da56004808035906020019091905050612fc7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610df257600080fd5b610e27600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050612ffa565b005b3415610e3457600080fd5b610e3c61316b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610e8957600080fd5b610e91613191565b6040518082815260200191505060405180910390f35b3415610eb257600080fd5b610eba613197565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610f0757600080fd5b610f1d60048080359060200190919050506131bd565b005b3415610f2a57600080fd5b610f40600480803590602001909190505061337b565b604051808215151515815260200191505060405180910390f35b3415610f6557600080fd5b610f6d6134ea565b6040518082815260200191505060405180910390f35b3415610f8e57600080fd5b610fba600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506134f0565b005b3415610fc757600080fd5b610fcf61358f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61103060048080359060200190919080359060200190919050506135b5565b005b341561103d57600080fd5b61104561379e565b6040518082815260200191505060405180910390f35b341561106657600080fd5b61106e6137a4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6110cf60048080359060200190919080359060200190919050506137ca565b005b600060405180807f737570706f727473496e74657266616365286279746573342900000000000000815250601901905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806113db575060405180807f746f6b656e4d657461646174612875696e743235362c737472696e6729000000815250601d019050604051809103902060405180807f746f6b656e734f664f776e6572286164647265737329000000000000000000008152506016019050604051809103902060405180807f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81526020017f74323536290000000000000000000000000000000000000000000000000000008152506025019050604051809103902060405180807f7472616e7366657228616464726573732c75696e7432353629000000000000008152506019019050604051809103902060405180807f617070726f766528616464726573732c75696e743235362900000000000000008152506018019050604051809103902060405180807f6f776e65724f662875696e7432353629000000000000000000000000000000008152506010019050604051809103902060405180807f62616c616e63654f6628616464726573732900000000000000000000000000008152506012019050604051809103902060405180807f746f74616c537570706c79282900000000000000000000000000000000000000815250600d019050604051809103902060405180807f73796d626f6c28290000000000000000000000000000000000000000000000008152506008019050604051809103902060405180807f6e616d6528290000000000000000000000000000000000000000000000000000815250600601905060405180910390201818181818181818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6114106149a0565b6114186149b4565b60008073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561147757600080fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb4799f2878787600060405160a001526040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180848152602001806020018281038252848482818152602001925080828437820191505094505050505060a060405180830381600087803b151561153257600080fd5b6102c65a03f1151561154357600080fd5b5050506040518060800180519060200160405280925081935050506115688282613b0b565b925050509392505050565b60115481565b6040805190810160405280600d81526020017f43727970746f4b6974746965730000000000000000000000000000000000000081525081565b6115bc3382613b63565b15156115c757600080fd5b6115d18183613bcf565b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b662386f26fc1000081565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561170157600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166376190f8f6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561177057600080fd5b6102c65a03f1151561178157600080fd5b50505060405180519050151561179657600080fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600160068054905003905090565b600f5481565b6000808211151561180157600080fd5b600060068381548110151561181257fe5b906000526020600020906002020160010160189054906101000a900463ffffffff1663ffffffff1614159050919050565b6201518081565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156118ac57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156118e757600080fd5b6118f13382613c25565b15156118fc57600080fd5b6119068382613b63565b151561191157600080fd5b61191c838383613c91565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561197e57600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166354c15b826000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156119ed57600080fd5b6102c65a03f115156119fe57600080fd5b505050604051805190501515611a1357600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611ab357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611aef57600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b8d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611bc957600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260149054906101000a900460ff16151515611c2957600080fd5b611c333385613b63565b1515611c3e57600080fd5b611c47846117f1565b151515611c5357600080fd5b611c7f84600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613bcf565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a85858585336040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b1515611d5b57600080fd5b6102c65a03f11515611d6c57600080fd5b50505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611dd057600080fd5b600260149054906101000a900460ff161515611deb57600080fd5b6000600260146101000a81548160ff021916908315150217905550565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008085111515611e4e57600080fd5b600084111515611e5d57600080fd5b600685815481101515611e6c57fe5b90600052602060002090600202019150600684815481101515611e8b57fe5b90600052602060002090600202019050611ea782868387613ec9565b8015611eb95750611eb884866140de565b5b9250505092915050565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff16151515611f1257600080fd5b611f1c3385613b63565b1515611f2757600080fd5b611f308461337b565b1515611f3b57600080fd5b611f6784600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613bcf565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a85858585336040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b151561204357600080fd5b6102c65a03f1151561205457600080fd5b50505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156120b957600080fd5b80600e8190555050565b600260149054906101000a900460ff161515156120df57600080fd5b6120e93382613b63565b15156120f457600080fd5b81600a600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156121a557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156121e157600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561228357600080fd5b819050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156122e157600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b6113886011541015156122f357600080fd5b601160008154809291906001019190505550612314600080600086856141f1565b50505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806123c257506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061241a5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561242557600080fd5b60036000600e8110151561243557fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff168110151561246457600080fd5b8060058190555050565b600260149054906101000a900460ff1681565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156124f557600080fd5b919050565b61afc881565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561255d57600080fd5b8190508073ffffffffffffffffffffffffffffffffffffffff166385b861886000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156125cc57600080fd5b6102c65a03f115156125dd57600080fd5b5050506040518051905015156125f257600080fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061272e57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806127865750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561279157600080fd5b600260149054906101000a900460ff161515156127ad57600080fd5b6001600260146101000a81548160ff021916908315150217905550565b6127d26149df565b60006127dc6149df565b60008060006127ea87612637565b9450600085141561281c5760006040518059106128045750595b908082528060200260200182016040525095506128f7565b8460405180591061282a5750595b908082528060200260200182016040525093506128456117db565b925060009150600190505b82811115156128f3578673ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156128e6578084838151811015156128cf57fe5b906020019060200201818152505081806001019250505b8080600101915050612850565b8395505b5050505050919050565b600080600080600080600080600260149054906101000a900460ff1615151561292957600080fd5b60068981548110151561293857fe5b9060005260206000209060020201965060008760010160009054906101000a900467ffffffffffffffff1667ffffffffffffffff161415151561297a57600080fd5b612ab0876101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff16815250506144e4565b1515612abb57600080fd5b8660010160189054906101000a900463ffffffff1663ffffffff169550600686815481101515612ae757fe5b9060005260206000209060020201945086600101601e9054906101000a900461ffff16935086600101601e9054906101000a900461ffff1661ffff1685600101601e9054906101000a900461ffff1661ffff161115612b565784600101601e9054906101000a900461ffff1693505b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d9f5aed8860000154876000015460018b60010160089054906101000a900467ffffffffffffffff16036000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018381526020018267ffffffffffffffff1681526020019350505050602060405180830381600087803b1515612c2c57600080fd5b6102c65a03f11515612c3d57600080fd5b505050604051805190509250600760008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150612cad898860010160189054906101000a900463ffffffff1663ffffffff166001870161ffff1686866141f1565b90508660010160186101000a81549063ffffffff0219169055600f60008154809291906001900391905055503373ffffffffffffffffffffffffffffffffffffffff166108fc600e549081150290604051600060405180830381858888f193505050505080975050505050505050919050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612dc857506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80612e205750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515612e2b57600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b1515612eb057600080fd5b6102c65a03f11515612ec157600080fd5b505050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b1515612f4957600080fd5b6102c65a03f11515612f5a57600080fd5b505050565b6040805190810160405280600281526020017f434b00000000000000000000000000000000000000000000000000000000000081525081565b600381600e81101515612fa757fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff1615151561301657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561305257600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561308d57600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156130ea57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561314757600080fd5b6131513382613b63565b151561315c57600080fd5b613167338383613c91565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e5481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561321b57600080fd5b61afc860125410151561322d57600080fd5b61323c600080600085306141f1565b905061326a81600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16613bcf565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327ebe40a826132b161451f565b600062015180306040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808681526020018581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050600060405180830381600087803b151561335157600080fd5b6102c65a03f1151561336257600080fd5b5050506012600081548092919060010191905055505050565b60008060008311151561338d57600080fd5b60068381548110151561339c57fe5b906000526020600020906002020190506134e2816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614622565b915050919050565b61138881565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561354b57600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260149054906101000a900460ff161515156135d357600080fd5b6135dd3383613b63565b15156135e857600080fd5b6135f18261337b565b15156135fc57600080fd5b613606828461465c565b151561361157600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c55d0f56846000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15156136aa57600080fd5b6102c65a03f115156136bb57600080fd5b505050604051805190509050600e54810134101515156136da57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663454a2ab3600e543403856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808281526020019150506000604051808303818588803b151561376e57600080fd5b6125ee5a03f1151561377f57600080fd5b505050506137998263ffffffff168463ffffffff166146b5565b505050565b60125481565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600260149054906101000a900460ff161515156137e957600080fd5b600e5434101515156137fa57600080fd5b6138043385613b63565b151561380f57600080fd5b61381983856140de565b151561382457600080fd5b60068481548110151561383357fe5b90600052602060002090600202019150613979826101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614622565b151561398457600080fd5b60068381548110151561399357fe5b90600052602060002090600202019050613ad9816101006040519081016040529081600082015481526020016001820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016001820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff16815260200160018201601e9054906101000a900461ffff1661ffff1661ffff1681525050614622565b1515613ae457600080fd5b613af082858386613ec9565b1515613afb57600080fd5b613b0584846146b5565b50505050565b613b136149a0565b613b1b6149a0565b60008084604051805910613b2c5750595b9080825280601f01601f19166020018201604052509250602083019150859050613b5782828761487f565b82935050505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff166007600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b806009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008273ffffffffffffffffffffffffffffffffffffffff166009600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515613e2557600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600a600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556009600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b600081841415613edc57600090506140d6565b818560010160109054906101000a900463ffffffff1663ffffffff161480613f1d5750818560010160149054906101000a900463ffffffff1663ffffffff16145b15613f2b57600090506140d6565b838360010160109054906101000a900463ffffffff1663ffffffff161480613f6c5750838360010160149054906101000a900463ffffffff1663ffffffff16145b15613f7a57600090506140d6565b60008360010160109054906101000a900463ffffffff1663ffffffff161480613fbd575060008560010160109054906101000a900463ffffffff1663ffffffff16145b15613fcb57600190506140d6565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff16148061404057508460010160149054906101000a900463ffffffff1663ffffffff168360010160109054906101000a900463ffffffff1663ffffffff16145b1561404e57600090506140d6565b8460010160109054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff1614806140c357508460010160149054906101000a900463ffffffff1663ffffffff168360010160149054906101000a900463ffffffff1663ffffffff16145b156140d157600090506140d6565b600190505b949350505050565b60008060006007600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806141e757508173ffffffffffffffffffffffffffffffffffffffff16600a600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b9250505092915050565b6000806141fc6149f3565b60008863ffffffff168914151561421257600080fd5b8763ffffffff168814151561422657600080fd5b8661ffff168714151561423857600080fd5b60028781151561424457fe5b049250600d8361ffff16111561425957600d92505b610100604051908101604052808781526020014267ffffffffffffffff168152602001600067ffffffffffffffff1681526020018a63ffffffff1681526020018963ffffffff168152602001600063ffffffff1681526020018461ffff1681526020018861ffff1681525091506001600680548060010182816142dc9190614a67565b916000526020600020906002020160008590919091506000820151816000015560208201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060c082015181600101601c6101000a81548161ffff021916908361ffff16021790555060e082015181600101601e6101000a81548161ffff021916908361ffff16021790555050500390508063ffffffff168114151561442e57600080fd5b7f0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad58582846060015163ffffffff16856080015163ffffffff168660000151604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a16144d560008683613c91565b80935050505095945050505050565b6000808260a0015163ffffffff161415801561451857504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b6000806000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663eac9d94c6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156145b257600080fd5b6102c65a03f115156145c357600080fd5b505050604051805190509150816fffffffffffffffffffffffffffffffff16821415156145ef57600080fd5b6002828115156145fb57fe5b0482019050662386f26fc1000081101561461a57662386f26fc1000090505b809250505090565b6000808260a0015163ffffffff1614801561465557504367ffffffffffffffff16826040015167ffffffffffffffff1611155b9050919050565b600080600060068581548110151561467057fe5b9060005260206000209060020201915060068481548110151561468f57fe5b906000526020600020906002020190506146ab82868387613ec9565b9250505092915050565b6000806006838154811015156146c757fe5b906000526020600020906002020191506006848154811015156146e657fe5b90600052602060002090600202019050828160010160186101000a81548163ffffffff021916908363ffffffff160217905550614722826148ca565b61472b816148ca565b600a600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600a600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600f600081548092919060010191905055507f241ea03ca20251805084d27d4440371c34a0b85ff108f6bb5611248f73818b806007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685858460010160089054906101000a900467ffffffffffffffff16604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018381526020018267ffffffffffffffff16815260200194505050505060405180910390a150505050565b60005b6020821015156148a75782518452602084019350602083019250602082039150614882565b6001826020036101000a0390508019835116818551168181178652505050505050565b43600554600383600101601c9054906101000a900461ffff1661ffff16600e811015156148f357fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff1681151561491e57fe5b04018160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600d81600101601c9054906101000a900461ffff1661ffff16101561499d57600181600101601c8282829054906101000a900461ffff160192506101000a81548161ffff021916908361ffff1602179055505b50565b602060405190810160405280600081525090565b6080604051908101604052806004905b60008019168152602001906001900390816149c45790505090565b602060405190810160405280600081525090565b6101006040519081016040528060008152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600061ffff168152602001600061ffff1681525090565b815481835581811511614a9457600202816002028360005260206000209182019101614a939190614a99565b5b505050565b614b6291905b80821115614b5e576000808201600090556001820160006101000a81549067ffffffffffffffff02191690556001820160086101000a81549067ffffffffffffffff02191690556001820160106101000a81549063ffffffff02191690556001820160146101000a81549063ffffffff02191690556001820160186101000a81549063ffffffff021916905560018201601c6101000a81549061ffff021916905560018201601e6101000a81549061ffff021916905550600201614a9f565b5090565b905600a165627a7a72305820730f57a104c61a4b1492548005ff8f2a716b15b17146ae8e47acc98fbe82815b0029", "sourceMap": "70871:2304:18:-;;;5032:5;5011:26;;;;;;;;;;;;;;;;;;;;11384:339;;;;;;;;;11427:9;11384:339;;;;;;;;11450:9;11384:339;;;;;;;;11473:9;11384:339;;;;;;;;11496:10;11384:339;;;;;;;;11520:10;11384:339;;;;;;;;11544:7;11384:339;;;;;;;;11565:7;11384:339;;;;;;;;11586:7;11384:339;;;;;;;;11607:7;11384:339;;;;;;;;11628:8;11384:339;;;;;;;;11650:6;11384:339;;;;;;;;11670:6;11384:339;;;;;;;;11690:6;11384:339;;;;;;;;11710:6;11384:339;;;;;;;;;;;;;;;:::i;:::-;;11840:2;11807:35;;30582:8;30552:38;;70871:2304;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;", "deployedSourceMap": "70871:2304:18:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19989:327;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4848:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29456:346;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71323:32:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18924:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24204:395:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4817:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71136:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66994:477;;;;;;;;;;;;;;;;;;;;;;;;;;;;25978:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30647:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35349:235;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71197:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13853:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25066:784;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31057:470;;;;;;;;;;;;;;;;;;;;;;;;;;;;5800:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;6346;;;;;;;;;;;;;;;;;;;;;;;;;;;;67586:978;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7359:126;;;;;;;;;;;;;;13283:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38051:388;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12965:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68725:796;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34379:90;;;;;;;;;;;;;;;;;;;;;;;;;;33972:189;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6073:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;71655:346;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17342:139;;;;;;;;;;;;;;;;;;;;;;;;;;5011:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26205:180;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71042:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66412:467;;;;;;;;;;;;;;;;;;;;;;;;;;;;22243:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11807:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6990:81;;;;;;;;;;;;;;26841:853;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;42595:1586:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70671:142;;;;;;;;;;;;;;18975:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11384:339:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12465:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22790:990;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4879:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30552:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19070:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72106:447;;;;;;;;;;;;;;;;;;;;;;;;;;34991:207;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70985:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20416:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;13564:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69769:703;;;;;;;;;;;;;;;;;;;;;;;;;;71361:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30817:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40000:1958;;;;;;;;;;;;;;;;;;;;;;;;;;19989:327;20060:4;19175:38;;;;;;;;;;;;;;;;;;;20219:41;;;:12;:41;;;;20218:90;;;;19697:42;;;;;;;;;;;;;;;;;;;19647:35;;;;;;;;;;;;;;;;;;;19582:50;;;;;;;;;;;;;;;;;;;;;;;;19529:38;;;;;;;;;;;;;;;;;;;19477:37;;;;;;;;;;;;;;;;;;;19433:29;;;;;;;;;;;;;;;;;;;19387:31;;;;;;;;;;;;;;;;;;;19346:26;;;;;;;;;;;;;;;;;;;19310:21;;;;;;;;;;;;;;;;;;;19276:19;;;;;;;;;;;;;;;;;;;19269:63;:104;:150;:194;:246;:299;:364;:414;:471;20266:41;;;:12;:41;;;;20218:90;20210:99;;19989:327;;;:::o;4848:25::-;;;;;;;;;;;;;:::o;29456:346::-;29548:14;;:::i;:::-;29621:24;;:::i;:::-;29655:13;29608:1;29582:28;;:14;;;;;;;;;;;:28;;;;29574:37;;;;;;;;29696:14;;;;;;;;;;;:26;;;29723:8;29733:19;;29696:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29678:75;;;;;;;;29771:24;29781:6;29789:5;29771:9;:24::i;:::-;29764:31;;29456:346;;;;;;;:::o;71323:32::-;;;;:::o;18924:45::-;;;;;;;;;;;;;;;;;;;;:::o;24204:395::-;24384:27;24390:10;24402:8;24384:5;:27::i;:::-;24376:36;;;;;;;;24491:23;24500:8;24510:3;24491:8;:23::i;:::-;24557:35;24566:10;24578:3;24583:8;24557:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24204:395;;:::o;4817:25::-;;;;;;;;;;;;;:::o;71136:55::-;71182:9;71136:55;:::o;66994:477::-;67072:36;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;67130:8;67072:67;;67339:17;:38;;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67331:49;;;;;;;;67447:17;67431:13;;:33;;;;;;;;;;;;;;;;;;66994:477;;:::o;25978:92::-;26022:4;26062:1;26045:7;:14;;;;:18;26038:25;;25978:92;:::o;30647:30::-;;;;:::o;35349:235::-;35420:4;35459:1;35448:8;:12;35440:21;;;;;;;;35576:1;35542:7;35550:8;35542:17;;;;;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;:35;;;;35535:42;;35349:235;;;:::o;71197:54::-;71245:6;71197:54;:::o;13853:39::-;;;;;;;;;;;;;:::o;25066:784::-;25305:1;25290:17;;:3;:17;;;;25282:26;;;;;;;;25563:4;25548:20;;:3;:20;;;;25540:29;;;;;;;;25637:34;25650:10;25662:8;25637:12;:34::i;:::-;25629:43;;;;;;;;25690:22;25696:5;25703:8;25690:5;:22::i;:::-;25682:31;;;;;;;;25812;25822:5;25829:3;25834:8;25812:9;:31::i;:::-;25066:784;;;:::o;31057:470::-;31133:38;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;31195:8;31133:71;;31404:17;:31;;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31396:42;;;;;;;;31503:17;31489:11;;:31;;;;;;;;;;;;;;;;;;31057:470;;:::o;5800:128::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;5887:1;5868:21;;:7;:21;;;;5860:30;;;;;;;;5914:7;5901:10;;:20;;;;;;;;;;;;;;;;;;5800:128;:::o;6346:::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;6433:1;6414:21;;:7;:21;;;;6406:30;;;;;;;;6460:7;6447:10;;:20;;;;;;;;;;;;;;;;;;6346:128;:::o;67586:978::-;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;67958:27;67964:10;67976:8;67958:5;:27::i;:::-;67950:36;;;;;;;;68198:20;68209:8;68198:10;:20::i;:::-;68197:21;68189:30;;;;;;;;68229:31;68238:8;68248:11;;;;;;;;;;;68229:8;:31::i;:::-;68399:11;;;;;;;;;;;:25;;;68438:8;68460:14;68488:12;68514:9;68537:10;68399:158;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67586:978;;;;:::o;7359:126::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;6812:6;;;;;;;;;;;6804:15;;;;;;;;7473:5;7464:6;;:14;;;;;;;;;;;;;;;;;;7359:126::o;13283:56::-;;;;;;;;;;;;;;;;;;;;;;:::o;38051:388::-;38143:4;38225:20;38276:18;38183:1;38171:9;:13;38163:22;;;;;;;;38213:1;38203:7;:11;38195:20;;;;;;;;38248:7;38256:9;38248:18;;;;;;;;;;;;;;;;;;;;38225:41;;38297:7;38305;38297:16;;;;;;;;;;;;;;;;;;;;38276:37;;38330:52;38349:6;38357:9;38368:4;38374:7;38330:18;:52::i;:::-;:102;;;;;38394:38;38413:7;38422:9;38394:18;:38::i;:::-;38330:102;38323:109;;38051:388;;;;;;:::o;12965:56::-;;;;;;;;;;;;;;;;;;;;;;:::o;68725:796::-;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;69099:27;69105:10;69117:8;69099:5;:27::i;:::-;69091:36;;;;;;;;69145:24;69160:8;69145:14;:24::i;:::-;69137:33;;;;;;;;69180;69189:8;69199:13;;;;;;;;;;;69180:8;:33::i;:::-;69354:13;;;;;;;;;;;:27;;;69395:8;69417:14;69445:12;69471:9;69494:10;69354:160;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68725:796;;;;:::o;34379:90::-;5435:10;;;;;;;;;;;5421:24;;:10;:24;;;5413:33;;;;;;;;34459:3;34444:12;:18;;;;34379:90;:::o;33972:189::-;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;34080:26;34086:10;34098:7;34080:5;:26::i;:::-;34072:35;;;;;;;;34149:5;34117:20;:29;34138:7;34117:29;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;33972:189;;:::o;6073:128::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;6160:1;6141:21;;:7;:21;;;;6133:30;;;;;;;;6187:7;6174:10;;:20;;;;;;;;;;;;;;;;;;6073:128;:::o;71655:346::-;71740:18;5435:10;;;;;;;;;;;5421:24;;:10;:24;;;5413:33;;;;;;;;71761:6;71740:27;;71803:1;71781:24;;:10;:24;;;71777:78;;;71834:10;;;;;;;;;;;71821:23;;71777:78;71032:4;71872:17;;:40;71864:49;;;;;;;;71924:17;;:19;;;;;;;;;;;;;71953:41;71966:1;71969;71972;71975:6;71983:10;71953:12;:41::i;:::-;;71655:346;;;:::o;17342:139::-;5537:10;;;;;;;;;;;5523:24;;:10;:24;;;:64;;;;5577:10;;;;;;;;;;;5563:24;;:10;:24;;;5523:64;:104;;;;5617:10;;;;;;;;;;;5603:24;;:10;:24;;;5523:104;5502:135;;;;;;;;17429:9;17439:1;17429:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17422:19;;:4;:19;17414:28;;;;;;;;17470:4;17452:15;:22;;;;17342:139;:::o;5011:26::-;;;;;;;;;;;;;:::o;26205:180::-;26275:13;26312:17;:27;26330:8;26312:27;;;;;;;;;;;;;;;;;;;;;26304:35;;26375:1;26358:19;;:5;:19;;;;26350:28;;;;;;;;26205:180;;;:::o;71042:51::-;71088:5;71042:51;:::o;66412:467::-;66488:34;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;66542:8;66488:63;;66751:17;:36;;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66743:47;;;;;;;;66855:17;66841:11;;:31;;;;;;;;;;;;;;;;;;66412:467;;:::o;22243:122::-;22299:13;22331:19;:27;22351:6;22331:27;;;;;;;;;;;;;;;;22324:34;;22243:122;;;:::o;11807:35::-;;;;:::o;6990:81::-;5537:10;;;;;;;;;;;5523:24;;:10;:24;;;:64;;;;5577:10;;;;;;;;;;;5563:24;;:10;:24;;;5523:64;:104;;;;5617:10;;;;;;;;;;;5603:24;;:10;:24;;;5523:104;5502:135;;;;;;;;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;7060:4;7051:6;;:13;;;;;;;;;;;;;;;;;;6990:81::o;26841:853::-;26902:21;;:::i;:::-;26935:18;27110:23;;:::i;:::-;27175:17;27222:19;27402:13;26956:17;26966:6;26956:9;:17::i;:::-;26935:38;;27002:1;26988:10;:15;26984:704;;;27077:1;27063:16;;;;;;;;;;;;;;;;;;;;;;;;27056:23;;;;26984:704;27150:10;27136:25;;;;;;;;;;;;;;;;;;;;;;;;27110:51;;27195:13;:11;:13::i;:::-;27175:33;;27244:1;27222:23;;27443:1;27435:9;;27430:220;27455:9;27446:5;:18;;27430:220;;;27525:6;27497:34;;:17;:24;27515:5;27497:24;;;;;;;;;;;;;;;;;;;;;:34;;;27493:143;;;27577:5;27555:6;27562:11;27555:19;;;;;;;;;;;;;;;;;:27;;;;;27604:13;;;;;;;27493:143;27466:7;;;;;;;27430:220;;;27671:6;27664:13;;26841:853;;;;;;;;;:::o;42595:1586::-;42676:7;42753:20;43068:14;43114:18;43230:16;43436:18;43575:13;43629:16;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;42776:7;42784:9;42776:18;;;;;;;;;;;;;;;;;;;;42753:41;;42882:1;42862:6;:16;;;;;;;;;;;;:21;;;;42854:30;;;;;;;;42977:27;42997:6;42977:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:19;:27::i;:::-;42969:36;;;;;;;;43085:6;:19;;;;;;;;;;;;43068:36;;;;43135:7;43143:6;43135:15;;;;;;;;;;;;;;;;;;;;43114:36;;43249:6;:17;;;;;;;;;;;;43230:36;;43298:6;:17;;;;;;;;;;;;43280:35;;:4;:15;;;;;;;;;;;;:35;;;43276:93;;;43343:4;:15;;;;;;;;;;;;43331:27;;43276:93;43457:11;;;;;;;;;;;:20;;;43478:6;:12;;;43492:4;:10;;;43530:1;43504:6;:23;;;;;;;;;;;;:27;43457:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43436:96;;43591:17;:28;43609:9;43591:28;;;;;;;;;;;;;;;;;;;;;43575:44;;43648:78;43661:9;43672:6;:19;;;;;;;;;;;;43648:78;;43705:1;43693:9;:13;43648:78;;43708:10;43720:5;43648:12;:78::i;:::-;43629:97;;43888:6;:19;;;43881:26;;;;;;;;;;;43984:15;;:17;;;;;;;;;;;;;;44081:10;:15;;:29;44097:12;;44081:29;;;;;;;;;;;;;;;;;;;;;;;;44166:8;44159:15;;42595:1586;;;;;;;;;;:::o;70671:142::-;5537:10;;;;;;;;;;;5523:24;;:10;:24;;;:64;;;;5577:10;;;;;;;;;;;5563:24;;:10;:24;;;5523:64;:104;;;;5617:10;;;;;;;;;;;5603:24;;:10;:24;;;5523:104;5502:135;;;;;;;;70736:11;;;;;;;;;;;:27;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70775:13;;;;;;;;;;;:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70671:142::o;18975:36::-;;;;;;;;;;;;;;;;;;;;:::o;11384:339::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;12465:53::-;;;;;;;;;;;;;;;;;;;;;;:::o;22790:990::-;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;22999:1;22984:17;;:3;:17;;;;22976:26;;;;;;;;23257:4;23242:20;;:3;:20;;;;23234:29;;;;;;;;23498:11;;;;;;;;;;;23483:27;;:3;:27;;;;23475:36;;;;;;;;23544:13;;;;;;;;;;;23529:29;;:3;:29;;;;23521:38;;;;;;;;23621:27;23627:10;23639:8;23621:5;:27::i;:::-;23613:36;;;;;;;;23737;23747:10;23759:3;23764:8;23737:9;:36::i;:::-;22790:990;;:::o;4879:25::-;;;;;;;;;;;;;:::o;30552:38::-;;;;:::o;19070:43::-;;;;;;;;;;;;;:::o;72106:447::-;72234:15;5435:10;;;;;;;;;;;5421:24;;:10;:24;;;5413:33;;;;;;;;71088:5;72184:16;;:38;72176:47;;;;;;;;72252:44;72265:1;72268;72271;72274:6;72290:4;72252:12;:44::i;:::-;72234:62;;72306:30;72315:7;72324:11;;;;;;;;;;;72306:8;:30::i;:::-;72347:11;;;;;;;;;;;:25;;;72386:7;72407:23;:21;:23::i;:::-;72444:1;71245:6;72502:4;72347:170;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72528:16;;:18;;;;;;;;;;;;;72106:447;;:::o;34991:207::-;35066:4;35117:17;35105:1;35094:8;:12;35086:21;;;;;;;;35137:7;35145:8;35137:17;;;;;;;;;;;;;;;;;;;;35117:37;;35171:20;35187:3;35171:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:15;:20::i;:::-;35164:27;;34991:207;;;;:::o;70985:51::-;71032:4;70985:51;:::o;20416:142::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;20534:16;20495:14;;:56;;;;;;;;;;;;;;;;;;20416:142;:::o;13564:35::-;;;;;;;;;;;;;:::o;69769:703::-;70165:20;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;69967:28;69973:10;69985:9;69967:5;:28::i;:::-;69959:37;;;;;;;;70014:25;70029:9;70014:14;:25::i;:::-;70006:34;;;;;;;;70058:43;70082:9;70093:7;70058:23;:43::i;:::-;70050:52;;;;;;;;70188:13;;;;;;;;;;;:29;;;70218:7;70188:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70165:61;;70272:12;;70257;:27;70244:9;:40;;70236:49;;;;;;;;70351:13;;;;;;;;;;;:17;;;70387:12;;70375:9;:24;70401:7;70351:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70419:46;70437:9;70419:46;;70456:7;70419:46;;:10;:46::i;:::-;69769:703;;;:::o;71361:31::-;;;;:::o;30817:39::-;;;;;;;;;;;;;:::o;40000:1958::-;41267:20;41494:18;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;40168:12;;40155:9;:25;;40147:34;;;;;;;;40239:28;40245:10;40257:9;40239:5;:28::i;:::-;40231:37;;;;;;;;41165:38;41184:7;41193:9;41165:18;:38::i;:::-;41157:47;;;;;;;;41290:7;41298:9;41290:18;;;;;;;;;;;;;;;;;;;;41267:41;;41409:23;41425:6;41409:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:15;:23::i;:::-;41401:32;;;;;;;;41515:7;41523;41515:16;;;;;;;;;;;;;;;;;;;;41494:37;;41630:21;41646:4;41630:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:15;:21::i;:::-;41622:30;;;;;;;;41728:130;41764:6;41788:9;41815:4;41837:7;41728:18;:130::i;:::-;41720:139;;;;;;;;41921:30;41932:9;41943:7;41921:10;:30::i;:::-;40000:1958;;;;:::o;28808:403::-;28894:6;;:::i;:::-;28912:16;;:::i;:::-;28966:17;28993:16;28942:13;28931:25;;;;;;;;;;;;;;;;;;;;;;;;;;;28912:44;;29074:2;29060:12;29056:3;29043:34;;29102:9;29090:21;;29131:43;29139:9;29150:8;29160:13;29131:7;:43::i;:::-;29192:12;29185:19;;28808:403;;;;;;;:::o;20967:145::-;21042:4;21096:9;21065:40;;:17;:27;21083:8;21065:27;;;;;;;;;;;;;;;;;;;;;:40;;;21058:47;;20967:145;;;;:::o;21944:123::-;22051:9;22018:20;:30;22039:8;22018:30;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;21944:123;;:::o;21346:155::-;21428:4;21485:9;21451:43;;:20;:30;21472:8;21451:30;;;;;;;;;;;;;;;;;;;;;:43;;;21444:50;;21346:155;;;;:::o;13965:758::-;14129:19;:24;14149:3;14129:24;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;14225:3;14195:17;:27;14213:8;14195:27;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;14345:1;14328:19;;:5;:19;;;;14324:317;;;14363:19;:26;14383:5;14363:26;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;14485:20;:30;14506:8;14485:30;;;;;;;;;;;;14478:37;;;;;;;;;;;14600:20;:30;14621:8;14600:30;;;;;;;;;;;;14593:37;;;;;;;;;;;14324:317;14686:30;14695:5;14702:3;14707:8;14686:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13965:758;;;:::o;35986:1169::-;36165:4;36246:7;36233:9;:20;36229:63;;;36276:5;36269:12;;;;36229:63;36377:7;36357;:16;;;;;;;;;;;;:27;;;:56;;;;36406:7;36388;:14;;;;;;;;;;;;:25;;;36357:56;36353:99;;;36436:5;36429:12;;;;36353:99;36483:9;36465:5;:14;;;;;;;;;;;;:27;;;:56;;;;36512:9;36496:5;:12;;;;;;;;;;;;:25;;;36465:56;36461:99;;;36544:5;36537:12;;;;36461:99;36714:1;36696:5;:14;;;;;;;;;;;;:19;;;:44;;;;36739:1;36719:7;:16;;;;;;;;;;;;:21;;;36696:44;36692:86;;;36763:4;36756:11;;;;36692:86;36869:7;:16;;;;;;;;;;;;36851:34;;:5;:14;;;;;;;;;;;;:34;;;:70;;;;36907:7;:14;;;;;;;;;;;;36889:32;;:5;:14;;;;;;;;;;;;:32;;;36851:70;36847:113;;;36944:5;36937:12;;;;36847:113;36989:7;:16;;;;;;;;;;;;36973:32;;:5;:12;;;;;;;;;;;;:32;;;:66;;;;37025:7;:14;;;;;;;;;;;;37009:30;;:5;:12;;;;;;;;;;;;:30;;;36973:66;36969:109;;;37062:5;37055:12;;;;36969:109;37144:4;37137:11;;35986:1169;;;;;;;:::o;32350:441::-;32437:4;32453:19;32513:17;32475;:28;32493:9;32475:28;;;;;;;;;;;;;;;;;;;;;32453:50;;32533:17;:26;32551:7;32533:26;;;;;;;;;;;;;;;;;;;;;32513:46;;32726:9;32711:24;;:11;:24;;;:72;;;;32772:11;32739:44;;:20;:29;32760:7;32739:29;;;;;;;;;;;;;;;;;;;;;:44;;;32711:72;32703:81;;32350:441;;;;;;:::o;15381:1876::-;15564:4;16148:20;16281:19;;:::i;:::-;16624;15942:9;15927:26;;15914:9;:39;15906:48;;;;;;;;15998:7;15983:24;;15972:7;:35;15964:44;;;;;;;;16056:11;16041:28;;16026:11;:43;16018:52;;;;;;;;16192:1;16178:11;:15;;;;;;;;16148:46;;16224:2;16208:13;:18;;;16204:67;;;16258:2;16242:18;;16204:67;16303:311;;;;;;;;;16330:6;16303:311;;;;16368:3;16303:311;;;;;;16404:1;16303:311;;;;;;16436:9;16303:311;;;;;;16475:7;16303:311;;;;;;16511:1;16303:311;;;;;;16541:13;16303:311;;;;;;16587:11;16303:311;;;;;16281:333;;16669:1;16646:7;:20;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;16659:6;16646:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:24;16624:46;;16857:11;16842:28;;16827:11;:43;16819:52;;;;;;;;16914:160;16933:6;16953:11;16986:6;:15;;;16978:24;;17024:6;:13;;;17016:22;;17052:6;:12;;;16914:160;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17188:33;17198:1;17201:6;17209:11;17188:9;:33::i;:::-;17239:11;17232:18;;15381:1876;;;;;;;;;;:::o;34588:177::-;34654:4;34702:1;34678:7;:20;;;:25;;;;34677:81;;;;;34744:12;34709:48;;:7;:24;;;:48;;;;34677:81;34670:88;;34588:177;;;:::o;72674:499::-;72730:7;72749:16;72934:17;72768:11;;;;;;;;;;;:32;;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72749:53;;72912:8;72896:26;;72884:8;:38;72876:47;;;;;;;;72977:1;72966:8;:12;;;;;;;;72954:8;:25;72934:45;;71182:9;73051;:31;73047:93;;;71182:9;73098:31;;73047:93;73157:9;73150:16;;72674:499;;;:::o;31720:397::-;31780:4;32057:1;32036:4;:17;;;:22;;;32035:75;;;;;32096:12;32064:45;;:4;:21;;;:45;;;;32035:75;32028:82;;31720:397;;;:::o;37332:288::-;37436:4;37456:20;37507:18;37479:7;37487:9;37479:18;;;;;;;;;;;;;;;;;;;;37456:41;;37528:7;37536;37528:16;;;;;;;;;;;;;;;;;;;;37507:37;;37561:52;37580:6;37588:9;37599:4;37605:7;37561:18;:52::i;:::-;37554:59;;37332:288;;;;;;:::o;38573:924::-;38705:18;38752:20;38726:7;38734;38726:16;;;;;;;;;;;;;;;;;;;;38705:37;;38775:7;38783:9;38775:18;;;;;;;;;;;;;;;;;;;;38752:41;;38907:7;38878:6;:19;;;:37;;;;;;;;;;;;;;;;;;38976:22;38993:4;38976:16;:22::i;:::-;39008:24;39025:6;39008:16;:24::i;:::-;39185:20;:31;39206:9;39185:31;;;;;;;;;;;;39178:38;;;;;;;;;;;39233:20;:29;39254:7;39233:29;;;;;;;;;;;;39226:36;;;;;;;;;;;39342:15;;:17;;;;;;;;;;;;;39407:83;39416:17;:28;39434:9;39416:28;;;;;;;;;;;;;;;;;;;;;39446:9;39457:7;39466:6;:23;;;;;;;;;;;;39407:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38573:924;;;;:::o;27965:565::-;28301:12;28089:170;28103:2;28095:4;:10;;28089:170;;;28180:4;28174:5;28167;28160:6;28222:2;28213:11;;;;28246:2;28238:10;;;;28115:2;28107:10;;;;28089:170;;;28337:1;28329:4;28324:2;:9;28316:3;:18;:22;28301:37;;28407:4;28403:3;28396:4;28390:5;28386:3;28460:4;28452:5;28446;28442:3;28505:7;28495:8;28492:2;28485:5;28478:6;28357:167;;;;;;:::o;33053:596::-;33306:12;33287:15;;33254:9;33264:7;:21;;;;;;;;;;;;33254:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:48;;;;;;;;;;33253:65;33219:7;:24;;;:100;;;;;;;;;;;;;;;;;;33588:2;33564:7;:21;;;;;;;;;;;;:26;;;33560:83;;;33631:1;33606:7;:21;;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33560:83;33053:596;:::o;70871:2304::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", "source": "pragma solidity 0.4.18;\n\n/**\n The following contract code, titled KittyCore, was written by Cryptokitties and published\n and retrieved from https://etherscan.io/address/0x06012c8cf97bead5deae237070f9587f8e7a266d#code.\n\n It is included in the current project for test purposes, to ensure that our collateralizer can\n handle ERC721 tokens created by the KittyCore contract.\n*/\n\n/**\n * @title KittiesOwnable\n * @dev The KittiesOwnable contract has an owner address, and provides basic authorization control\n * functions, this simplifies the implementation of \"user permissions\".\n */\ncontract KittiesOwnable {\n address public owner;\n\n\n /**\n\t * @dev The KittiesOwnable constructor sets the original `owner` of the contract to the sender\n\t * account.\n\t */\n function KittiesOwnable() {\n owner = msg.sender;\n }\n\n\n /**\n\t * @dev Throws if called by any account other than the owner.\n\t */\n modifier onlyOwner() {\n require(msg.sender == owner);\n _;\n }\n\n\n /**\n\t * @dev Allows the current owner to transfer control of the contract to a newOwner.\n\t * @param newOwner The address to transfer ownership to.\n\t */\n function transferOwnership(address newOwner) onlyOwner {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n\n}\n\n\n\n/// @title Interface for contracts conforming to ERC-721: Non-Fungible Tokens\n/// @author Dieter Shirley (https://github.com/dete)\ncontract KittiesERC721 {\n // Required methods\n function totalSupply() public view returns (uint256 total);\n function balanceOf(address _owner) public view returns (uint256 balance);\n function ownerOf(uint256 _tokenId) external view returns (address owner);\n function approve(address _to, uint256 _tokenId) external;\n function transfer(address _to, uint256 _tokenId) external;\n function transferFrom(address _from, address _to, uint256 _tokenId) external;\n\n // Events\n event Transfer(address from, address to, uint256 tokenId);\n event Approval(address owner, address approved, uint256 tokenId);\n\n // Optional\n // function name() public view returns (string name);\n // function symbol() public view returns (string symbol);\n // function tokensOfOwner(address _owner) external view returns (uint256[] tokenIds);\n // function tokenMetadata(uint256 _tokenId, string _preferredTransport) public view returns (string infoUrl);\n\n // ERC-165 Compatibility (https://github.com/ethereum/EIPs/issues/165)\n function supportsInterface(bytes4 _interfaceID) external view returns (bool);\n}\n\n\n// // Auction wrapper functions\n\n\n// Auction wrapper functions\n\n\n\n\n\n\n\n/// @title SEKRETOOOO\ncontract GeneScienceInterface {\n /// @dev simply a boolean to indicate this is the contract we expect to be\n function isGeneScience() public pure returns (bool);\n\n /// @dev given genes of kitten 1 & 2, return a genetic combination - may have a random factor\n /// @param genes1 genes of mom\n /// @param genes2 genes of sire\n /// @return the genes that are supposed to be passed down the child\n function mixGenes(uint256 genes1, uint256 genes2, uint256 targetBlock) public returns (uint256);\n}\n\n\n\n\n\n\n\n/// @title A facet of KittyCore that manages special access privileges.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyAccessControl {\n // This facet controls access control for CryptoKitties. There are four roles managed here:\n //\n // - The CEO: The CEO can reassign other roles and change the addresses of our dependent smart\n // contracts. It is also the only role that can unpause the smart contract. It is initially\n // set to the address that created the smart contract in the KittyCore constructor.\n //\n // - The CFO: The CFO can withdraw funds from KittyCore and its auction contracts.\n //\n // - The COO: The COO can release gen0 kitties to auction, and mint promo cats.\n //\n // It should be noted that these roles are distinct without overlap in their access abilities, the\n // abilities listed for each role above are exhaustive. In particular, while the CEO can assign any\n // address to any role, the CEO address itself doesn't have the ability to act in those roles. This\n // restriction is intentional so that we aren't tempted to use the CEO address frequently out of\n // convenience. The less we use an address, the less likely it is that we somehow compromise the\n // account.\n\n /// @dev Emited when contract is upgraded - See README.md for updgrade plan\n event ContractUpgrade(address newContract);\n\n // The addresses of the accounts (or contracts) that can execute actions within each roles.\n address public ceoAddress;\n address public cfoAddress;\n address public cooAddress;\n\n // @dev Keeps track whether the contract is paused. When that is true, most actions are blocked\n bool public paused = false;\n\n /// @dev Access modifier for CEO-only functionality\n modifier onlyCEO() {\n require(msg.sender == ceoAddress);\n _;\n }\n\n /// @dev Access modifier for CFO-only functionality\n modifier onlyCFO() {\n require(msg.sender == cfoAddress);\n _;\n }\n\n /// @dev Access modifier for COO-only functionality\n modifier onlyCOO() {\n require(msg.sender == cooAddress);\n _;\n }\n\n modifier onlyCLevel() {\n require(\n msg.sender == cooAddress ||\n msg.sender == ceoAddress ||\n msg.sender == cfoAddress\n );\n _;\n }\n\n /// @dev Assigns a new address to act as the CEO. Only available to the current CEO.\n /// @param _newCEO The address of the new CEO\n function setCEO(address _newCEO) external onlyCEO {\n require(_newCEO != address(0));\n\n ceoAddress = _newCEO;\n }\n\n /// @dev Assigns a new address to act as the CFO. Only available to the current CEO.\n /// @param _newCFO The address of the new CFO\n function setCFO(address _newCFO) external onlyCEO {\n require(_newCFO != address(0));\n\n cfoAddress = _newCFO;\n }\n\n /// @dev Assigns a new address to act as the COO. Only available to the current CEO.\n /// @param _newCOO The address of the new COO\n function setCOO(address _newCOO) external onlyCEO {\n require(_newCOO != address(0));\n\n cooAddress = _newCOO;\n }\n\n /*** KittiesPausable functionality adapted from OpenZeppelin ***/\n\n /// @dev Modifier to allow actions only when the contract IS NOT paused\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /// @dev Modifier to allow actions only when the contract IS paused\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /// @dev Called by any \"C-level\" role to pause the contract. Used only when\n /// a bug or exploit is detected and we need to limit damage.\n function pause() external onlyCLevel whenNotPaused {\n paused = true;\n }\n\n /// @dev Unpauses the smart contract. Can only be called by the CEO, since\n /// one reason we may pause the contract is when CFO or COO accounts are\n /// compromised.\n /// @notice This is public rather than external so it can be called by\n /// derived contracts.\n function unpause() public onlyCEO whenPaused {\n // can't unpause if contract was upgraded\n paused = false;\n }\n}\n\n\n\n\n/// @title Base contract for CryptoKitties. Holds all common structs, events and base variables.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBase is KittyAccessControl {\n /*** EVENTS ***/\n\n /// @dev The Birth event is fired whenever a new kitten comes into existence. This obviously\n /// includes any time a cat is created through the giveBirth method, but it is also called\n /// when a new gen0 cat is created.\n event Birth(address owner, uint256 kittyId, uint256 matronId, uint256 sireId, uint256 genes);\n\n /// @dev Transfer event as defined in current draft of ERC721. Emitted every time a kitten\n /// ownership is assigned, including births.\n event Transfer(address from, address to, uint256 tokenId);\n\n /*** DATA TYPES ***/\n\n /// @dev The main Kitty struct. Every cat in CryptoKitties is represented by a copy\n /// of this structure, so great care was taken to ensure that it fits neatly into\n /// exactly two 256-bit words. Note that the order of the members in this structure\n /// is important because of the byte-packing rules used by Ethereum.\n /// Ref: http://solidity.readthedocs.io/en/develop/miscellaneous.html\n struct Kitty {\n // The Kitty's genetic code is packed into these 256-bits, the format is\n // sooper-sekret! A cat's genes never change.\n uint256 genes;\n\n // The timestamp from the block when this cat came into existence.\n uint64 birthTime;\n\n // The minimum timestamp after which this cat can engage in breeding\n // activities again. This same timestamp is used for the pregnancy\n // timer (for matrons) as well as the siring cooldown.\n uint64 cooldownEndBlock;\n\n // The ID of the parents of this kitty, set to 0 for gen0 cats.\n // Note that using 32-bit unsigned integers limits us to a \"mere\"\n // 4 billion cats. This number might seem small until you realize\n // that Ethereum currently has a limit of about 500 million\n // transactions per year! So, this definitely won't be a problem\n // for several years (even as Ethereum learns to scale).\n uint32 matronId;\n uint32 sireId;\n\n // Set to the ID of the sire cat for matrons that are pregnant,\n // zero otherwise. A non-zero value here is how we know a cat\n // is pregnant. Used to retrieve the genetic material for the new\n // kitten when the birth transpires.\n uint32 siringWithId;\n\n // Set to the index in the cooldown array (see below) that represents\n // the current cooldown duration for this Kitty. This starts at zero\n // for gen0 cats, and is initialized to floor(generation/2) for others.\n // Incremented by one for each successful breeding action, regardless\n // of whether this cat is acting as matron or sire.\n uint16 cooldownIndex;\n\n // The \"generation number\" of this cat. Cats minted by the CK contract\n // for sale are called \"gen0\" and have a generation number of 0. The\n // generation number of all other cats is the larger of the two generation\n // numbers of their parents, plus one.\n // (i.e. max(matron.generation, sire.generation) + 1)\n uint16 generation;\n }\n\n /*** CONSTANTS ***/\n\n /// @dev A lookup table indicating the cooldown duration after any successful\n /// breeding action, called \"pregnancy time\" for matrons and \"siring cooldown\"\n /// for sires. Designed such that the cooldown roughly doubles each time a cat\n /// is bred, encouraging owners not to just keep breeding the same cat over\n /// and over again. Caps out at one week (a cat can breed an unbounded number\n /// of times, and the maximum cooldown is always seven days).\n uint32[14] public cooldowns = [\n uint32(1 minutes),\n uint32(2 minutes),\n uint32(5 minutes),\n uint32(10 minutes),\n uint32(30 minutes),\n uint32(1 hours),\n uint32(2 hours),\n uint32(4 hours),\n uint32(8 hours),\n uint32(16 hours),\n uint32(1 days),\n uint32(2 days),\n uint32(4 days),\n uint32(7 days)\n ];\n\n // An approximation of currently how many seconds are in between blocks.\n uint256 public secondsPerBlock = 15;\n\n /*** STORAGE ***/\n\n /// @dev An array containing the Kitty struct for all Kitties in existence. The ID\n /// of each cat is actually an index into this array. Note that ID 0 is a negacat,\n /// the unKitty, the mythical beast that is the parent of all gen0 cats. A bizarre\n /// creature that is both matron and sire... to itself! Has an invalid genetic code.\n /// In other words, cat ID 0 is invalid... ;-)\n Kitty[] kitties;\n\n /// @dev A mapping from cat IDs to the address that owns them. All cats have\n /// some valid owner address, even gen0 cats are created with a non-zero owner.\n mapping (uint256 => address) public kittyIndexToOwner;\n\n // @dev A mapping from owner address to count of tokens that address owns.\n // Used internally inside balanceOf() to resolve ownership count.\n mapping (address => uint256) ownershipTokenCount;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to call\n /// transferFrom(). Each Kitty can only have one approved address for transfer\n /// at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public kittyIndexToApproved;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to use\n /// this Kitty for siring via breedWith(). Each Kitty can only have one approved\n /// address for siring at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public sireAllowedToAddress;\n\n /// @dev The address of the ClockAuction contract that handles sales of Kitties. This\n /// same contract handles both peer-to-peer sales as well as the gen0 sales which are\n /// initiated every 15 minutes.\n SaleClockAuction public saleAuction;\n\n /// @dev The address of a custom ClockAuction subclassed contract that handles siring\n /// auctions. Needs to be separate from saleAuction because the actions taken on success\n /// after a sales and siring auction are quite different.\n SiringClockAuction public siringAuction;\n\n /// @dev Assigns ownership of a specific Kitty to an address.\n function _transfer(address _from, address _to, uint256 _tokenId) internal {\n // Since the number of kittens is capped to 2^32 we can't overflow this\n ownershipTokenCount[_to]++;\n // transfer ownership\n kittyIndexToOwner[_tokenId] = _to;\n // When creating new kittens _from is 0x0, but we can't account that address.\n if (_from != address(0)) {\n ownershipTokenCount[_from]--;\n // once the kitten is transferred also clear sire allowances\n delete sireAllowedToAddress[_tokenId];\n // clear any previously approved ownership exchange\n delete kittyIndexToApproved[_tokenId];\n }\n // Emit the transfer event.\n Transfer(_from, _to, _tokenId);\n }\n\n /// @dev An internal method that creates a new kitty and stores it. This\n /// method doesn't do any checking and should only be called when the\n /// input data is known to be valid. Will generate both a Birth event\n /// and a Transfer event.\n /// @param _matronId The kitty ID of the matron of this cat (zero for gen0)\n /// @param _sireId The kitty ID of the sire of this cat (zero for gen0)\n /// @param _generation The generation number of this cat, must be computed by caller.\n /// @param _genes The kitty's genetic code.\n /// @param _owner The inital owner of this cat, must be non-zero (except for the unKitty, ID 0)\n function _createKitty(\n uint256 _matronId,\n uint256 _sireId,\n uint256 _generation,\n uint256 _genes,\n address _owner\n )\n internal\n returns (uint)\n {\n // These requires are not strictly necessary, our calling code should make\n // sure that these conditions are never broken. However! _createKitty() is already\n // an expensive call (for storage), and it doesn't hurt to be especially careful\n // to ensure our data structures are always valid.\n require(_matronId == uint256(uint32(_matronId)));\n require(_sireId == uint256(uint32(_sireId)));\n require(_generation == uint256(uint16(_generation)));\n\n // New kitty starts with the same cooldown as parent gen/2\n uint16 cooldownIndex = uint16(_generation / 2);\n if (cooldownIndex > 13) {\n cooldownIndex = 13;\n }\n\n Kitty memory _kitty = Kitty({\n genes: _genes,\n birthTime: uint64(now),\n cooldownEndBlock: 0,\n matronId: uint32(_matronId),\n sireId: uint32(_sireId),\n siringWithId: 0,\n cooldownIndex: cooldownIndex,\n generation: uint16(_generation)\n });\n uint256 newKittenId = kitties.push(_kitty) - 1;\n\n // It's probably never going to happen, 4 billion cats is A LOT, but\n // let's just be 100% sure we never let this happen.\n require(newKittenId == uint256(uint32(newKittenId)));\n\n // emit the birth event\n Birth(\n _owner,\n newKittenId,\n uint256(_kitty.matronId),\n uint256(_kitty.sireId),\n _kitty.genes\n );\n\n // This will assign ownership, and also emit the Transfer event as\n // per ERC721 draft\n _transfer(0, _owner, newKittenId);\n\n return newKittenId;\n }\n\n // Any C-level can fix how many seconds per blocks are currently observed.\n function setSecondsPerBlock(uint256 secs) external onlyCLevel {\n require(secs < cooldowns[0]);\n secondsPerBlock = secs;\n }\n}\n\n\n\n\n\n/// @title The external contract that is responsible for generating metadata for the kitties,\n/// it has one function that will return the data as bytes.\ncontract KittiesERC721Metadata {\n /// @dev Given a token Id, returns a byte array that is supposed to be converted into string.\n function getMetadata(uint256 _tokenId, string) public view returns (bytes32[4] buffer, uint256 count) {\n if (_tokenId == 1) {\n buffer[0] = \"Hello World! :D\";\n count = 15;\n } else if (_tokenId == 2) {\n buffer[0] = \"I would definitely choose a medi\";\n buffer[1] = \"um length string.\";\n count = 49;\n } else if (_tokenId == 3) {\n buffer[0] = \"Lorem ipsum dolor sit amet, mi e\";\n buffer[1] = \"st accumsan dapibus augue lorem,\";\n buffer[2] = \" tristique vestibulum id, libero\";\n buffer[3] = \" suscipit varius sapien aliquam.\";\n count = 128;\n }\n }\n}\n\n\n/// @title The facet of the CryptoKitties core contract that manages ownership, ERC-721 (draft) compliant.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev Ref: https://github.com/ethereum/EIPs/issues/721\n/// See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyOwnership is KittyBase, KittiesERC721 {\n\n /// @notice Name and symbol of the non fungible token, as defined in ERC721.\n string public constant name = \"CryptoKitties\";\n string public constant symbol = \"CK\";\n\n // The contract that will return kitty metadata\n KittiesERC721Metadata public erc721Metadata;\n\n bytes4 constant InterfaceSignature_ERC165 =\n bytes4(keccak256('supportsInterface(bytes4)'));\n\n bytes4 constant InterfaceSignature_ERC721 =\n bytes4(keccak256('name()')) ^\n bytes4(keccak256('symbol()')) ^\n bytes4(keccak256('totalSupply()')) ^\n bytes4(keccak256('balanceOf(address)')) ^\n bytes4(keccak256('ownerOf(uint256)')) ^\n bytes4(keccak256('approve(address,uint256)')) ^\n bytes4(keccak256('transfer(address,uint256)')) ^\n bytes4(keccak256('transferFrom(address,address,uint256)')) ^\n bytes4(keccak256('tokensOfOwner(address)')) ^\n bytes4(keccak256('tokenMetadata(uint256,string)'));\n\n /// @notice Introspection interface as per ERC-165 (https://github.com/ethereum/EIPs/issues/165).\n /// Returns true for any standardized interfaces implemented by this contract. We implement\n /// ERC-165 (obviously!) and ERC-721.\n function supportsInterface(bytes4 _interfaceID) external view returns (bool)\n {\n // DEBUG ONLY\n //require((InterfaceSignature_ERC165 == 0x01ffc9a7) && (InterfaceSignature_ERC721 == 0x9a20483d));\n\n return ((_interfaceID == InterfaceSignature_ERC165) || (_interfaceID == InterfaceSignature_ERC721));\n }\n\n /// @dev Set the address of the sibling contract that tracks metadata.\n /// CEO only.\n function setMetadataAddress(address _contractAddress) public onlyCEO {\n erc721Metadata = KittiesERC721Metadata(_contractAddress);\n }\n\n // Internal utility functions: These functions all assume that their input arguments\n // are valid. We leave it to public methods to sanitize their inputs and follow\n // the required logic.\n\n /// @dev Checks if a given address is the current owner of a particular Kitty.\n /// @param _claimant the address we are validating against.\n /// @param _tokenId kitten id, only valid when > 0\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToOwner[_tokenId] == _claimant;\n }\n\n /// @dev Checks if a given address currently has transferApproval for a particular Kitty.\n /// @param _claimant the address we are confirming kitten is approved for.\n /// @param _tokenId kitten id, only valid when > 0\n function _approvedFor(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToApproved[_tokenId] == _claimant;\n }\n\n /// @dev Marks an address as being approved for transferFrom(), overwriting any previous\n /// approval. Setting _approved to address(0) clears all transfer approval.\n /// NOTE: _approve() does NOT send the Approval event. This is intentional because\n /// _approve() and transferFrom() are used together for putting Kitties on auction, and\n /// there is no value in spamming the log with Approval events in that case.\n function _approve(uint256 _tokenId, address _approved) internal {\n kittyIndexToApproved[_tokenId] = _approved;\n }\n\n /// @notice Returns the number of Kitties owned by a specific address.\n /// @param _owner The owner address to check.\n /// @dev Required for ERC-721 compliance\n function balanceOf(address _owner) public view returns (uint256 count) {\n return ownershipTokenCount[_owner];\n }\n\n /// @notice Transfers a Kitty to another address. If transferring to a smart\n /// contract be VERY CAREFUL to ensure that it is aware of ERC-721 (or\n /// CryptoKitties specifically) or your Kitty may be lost forever. Seriously.\n /// @param _to The address of the recipient, can be a user or contract.\n /// @param _tokenId The ID of the Kitty to transfer.\n /// @dev Required for ERC-721 compliance.\n function transfer(\n address _to,\n uint256 _tokenId\n )\n external\n whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Disallow transfers to the auction contracts to prevent accidental\n // misuse. Auction contracts should only take ownership of kitties\n // through the allow + transferFrom flow.\n require(_to != address(saleAuction));\n require(_to != address(siringAuction));\n\n // You can only send your own cat.\n require(_owns(msg.sender, _tokenId));\n\n // Reassign ownership, clear pending approvals, emit Transfer event.\n _transfer(msg.sender, _to, _tokenId);\n }\n\n /// @notice Grant another address the right to transfer a specific Kitty via\n /// transferFrom(). This is the preferred flow for transfering NFTs to contracts.\n /// @param _to The address to be granted transfer approval. Pass address(0) to\n /// clear all approvals.\n /// @param _tokenId The ID of the Kitty that can be transferred if this call succeeds.\n /// @dev Required for ERC-721 compliance.\n function approve(\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Only an owner can grant transfer approval.\n require(_owns(msg.sender, _tokenId));\n\n // Register the approval (replacing any previous approval).\n _approve(_tokenId, _to);\n\n // Emit approval event.\n Approval(msg.sender, _to, _tokenId);\n }\n\n /// @notice Transfer a Kitty owned by another address, for which the calling address\n /// has previously been granted transfer approval by the owner.\n /// @param _from The address that owns the Kitty to be transfered.\n /// @param _to The address that should take ownership of the Kitty. Can be any address,\n /// including the caller.\n /// @param _tokenId The ID of the Kitty to be transferred.\n /// @dev Required for ERC-721 compliance.\n function transferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Check for approval and valid ownership\n require(_approvedFor(msg.sender, _tokenId));\n require(_owns(_from, _tokenId));\n\n // Reassign ownership (also clears pending approvals and emits Transfer event).\n _transfer(_from, _to, _tokenId);\n }\n\n /// @notice Returns the total number of Kitties currently in existence.\n /// @dev Required for ERC-721 compliance.\n function totalSupply() public view returns (uint) {\n return kitties.length - 1;\n }\n\n /// @notice Returns the address currently assigned ownership of a given Kitty.\n /// @dev Required for ERC-721 compliance.\n function ownerOf(uint256 _tokenId)\n external\n view\n returns (address owner)\n {\n owner = kittyIndexToOwner[_tokenId];\n\n require(owner != address(0));\n }\n\n /// @notice Returns a list of all Kitty IDs assigned to an address.\n /// @param _owner The owner whose Kitties we are interested in.\n /// @dev This method MUST NEVER be called by smart contract code. First, it's fairly\n /// expensive (it walks the entire Kitty array looking for cats belonging to owner),\n /// but it also returns a dynamic array, which is only supported for web3 calls, and\n /// not contract-to-contract calls.\n function tokensOfOwner(address _owner) external view returns(uint256[] ownerTokens) {\n uint256 tokenCount = balanceOf(_owner);\n\n if (tokenCount == 0) {\n // Return an empty array\n return new uint256[](0);\n } else {\n uint256[] memory result = new uint256[](tokenCount);\n uint256 totalCats = totalSupply();\n uint256 resultIndex = 0;\n\n // We count on the fact that all cats have IDs starting at 1 and increasing\n // sequentially up to the totalCat count.\n uint256 catId;\n\n for (catId = 1; catId <= totalCats; catId++) {\n if (kittyIndexToOwner[catId] == _owner) {\n result[resultIndex] = catId;\n resultIndex++;\n }\n }\n\n return result;\n }\n }\n\n /// @dev Adapted from memcpy() by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _memcpy(uint _dest, uint _src, uint _len) private view {\n // Copy word-length chunks while possible\n for(; _len >= 32; _len -= 32) {\n assembly {\n mstore(_dest, mload(_src))\n }\n _dest += 32;\n _src += 32;\n }\n\n // Copy remaining bytes\n uint256 mask = 256 ** (32 - _len) - 1;\n assembly {\n let srcpart := and(mload(_src), not(mask))\n let destpart := and(mload(_dest), mask)\n mstore(_dest, or(destpart, srcpart))\n }\n }\n\n /// @dev Adapted from toString(slice) by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _toString(bytes32[4] _rawBytes, uint256 _stringLength) private view returns (string) {\n var outputString = new string(_stringLength);\n uint256 outputPtr;\n uint256 bytesPtr;\n\n assembly {\n outputPtr := add(outputString, 32)\n bytesPtr := _rawBytes\n }\n\n _memcpy(outputPtr, bytesPtr, _stringLength);\n\n return outputString;\n }\n\n /// @notice Returns a URI pointing to a metadata package for this token conforming to\n /// ERC-721 (https://github.com/ethereum/EIPs/issues/721)\n /// @param _tokenId The ID number of the Kitty whose metadata should be returned.\n function tokenMetadata(uint256 _tokenId, string _preferredTransport) external view returns (string infoUrl) {\n require(erc721Metadata != address(0));\n bytes32[4] memory buffer;\n uint256 count;\n (buffer, count) = erc721Metadata.getMetadata(_tokenId, _preferredTransport);\n\n return _toString(buffer, count);\n }\n}\n\n\n\n/// @title A facet of KittyCore that manages Kitty siring, gestation, and birth.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBreeding is KittyOwnership {\n\n /// @dev The Pregnant event is fired when two cats successfully breed and the pregnancy\n /// timer begins for the matron.\n event Pregnant(address owner, uint256 matronId, uint256 sireId, uint256 cooldownEndBlock);\n\n /// @notice The minimum payment required to use breedWithAuto(). This fee goes towards\n /// the gas cost paid by whatever calls giveBirth(), and can be dynamically updated by\n /// the COO role as the gas price changes.\n uint256 public autoBirthFee = 2 finney;\n\n // Keeps track of number of pregnant kitties.\n uint256 public pregnantKitties;\n\n /// @dev The address of the sibling contract that is used to implement the sooper-sekret\n /// genetic combination algorithm.\n GeneScienceInterface public geneScience;\n\n /// @dev Update the address of the genetic contract, can only be called by the CEO.\n /// @param _address An address of a GeneScience contract instance to be used from this point forward.\n function setGeneScienceAddress(address _address) external onlyCEO {\n GeneScienceInterface candidateContract = GeneScienceInterface(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isGeneScience());\n\n // Set the new contract address\n geneScience = candidateContract;\n }\n\n /// @dev Checks that a given kitten is able to breed. Requires that the\n /// current cooldown is finished (for sires) and also checks that there is\n /// no pending pregnancy.\n function _isReadyToBreed(Kitty _kit) internal view returns (bool) {\n // In addition to checking the cooldownEndBlock, we also need to check to see if\n // the cat has a pending birth; there can be some period of time between the end\n // of the pregnacy timer and the birth event.\n return (_kit.siringWithId == 0) && (_kit.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @dev Check if a sire has authorized breeding with this matron. True if both sire\n /// and matron have the same owner, or if the sire has given siring permission to\n /// the matron's owner (via approveSiring()).\n function _isSiringPermitted(uint256 _sireId, uint256 _matronId) internal view returns (bool) {\n address matronOwner = kittyIndexToOwner[_matronId];\n address sireOwner = kittyIndexToOwner[_sireId];\n\n // Siring is okay if they have same owner, or if the matron's owner was given\n // permission to breed with this sire.\n return (matronOwner == sireOwner || sireAllowedToAddress[_sireId] == matronOwner);\n }\n\n /// @dev Set the cooldownEndTime for the given Kitty, based on its current cooldownIndex.\n /// Also increments the cooldownIndex (unless it has hit the cap).\n /// @param _kitten A reference to the Kitty in storage which needs its timer started.\n function _triggerCooldown(Kitty storage _kitten) internal {\n // Compute an estimation of the cooldown time in blocks (based on current cooldownIndex).\n _kitten.cooldownEndBlock = uint64((cooldowns[_kitten.cooldownIndex]/secondsPerBlock) + block.number);\n\n // Increment the breeding count, clamping it at 13, which is the length of the\n // cooldowns array. We could check the array size dynamically, but hard-coding\n // this as a constant saves gas. Yay, Solidity!\n if (_kitten.cooldownIndex < 13) {\n _kitten.cooldownIndex += 1;\n }\n }\n\n /// @notice Grants approval to another user to sire with one of your Kitties.\n /// @param _addr The address that will be able to sire with your Kitty. Set to\n /// address(0) to clear all siring approvals for this Kitty.\n /// @param _sireId A Kitty that you own that _addr will now be able to sire with.\n function approveSiring(address _addr, uint256 _sireId)\n external\n whenNotPaused\n {\n require(_owns(msg.sender, _sireId));\n sireAllowedToAddress[_sireId] = _addr;\n }\n\n /// @dev Updates the minimum payment required for calling giveBirthAuto(). Can only\n /// be called by the COO address. (This fee is used to offset the gas cost incurred\n /// by the autobirth daemon).\n function setAutoBirthFee(uint256 val) external onlyCOO {\n autoBirthFee = val;\n }\n\n /// @dev Checks to see if a given Kitty is pregnant and (if so) if the gestation\n /// period has passed.\n function _isReadyToGiveBirth(Kitty _matron) private view returns (bool) {\n return (_matron.siringWithId != 0) && (_matron.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @notice Checks that a given kitten is able to breed (i.e. it is not pregnant or\n /// in the middle of a siring cooldown).\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isReadyToBreed(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n Kitty storage kit = kitties[_kittyId];\n return _isReadyToBreed(kit);\n }\n\n /// @dev Checks whether a kitty is currently pregnant.\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isPregnant(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n // A kitty is pregnant if and only if this field is set\n return kitties[_kittyId].siringWithId != 0;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair. DOES NOT\n /// check ownership permissions (that is up to the caller).\n /// @param _matron A reference to the Kitty struct of the potential matron.\n /// @param _matronId The matron's ID.\n /// @param _sire A reference to the Kitty struct of the potential sire.\n /// @param _sireId The sire's ID\n function _isValidMatingPair(\n Kitty storage _matron,\n uint256 _matronId,\n Kitty storage _sire,\n uint256 _sireId\n )\n private\n view\n returns(bool)\n {\n // A Kitty can't breed with itself!\n if (_matronId == _sireId) {\n return false;\n }\n\n // Kitties can't breed with their parents.\n if (_matron.matronId == _sireId || _matron.sireId == _sireId) {\n return false;\n }\n if (_sire.matronId == _matronId || _sire.sireId == _matronId) {\n return false;\n }\n\n // We can short circuit the sibling check (below) if either cat is\n // gen zero (has a matron ID of zero).\n if (_sire.matronId == 0 || _matron.matronId == 0) {\n return true;\n }\n\n // Kitties can't breed with full or half siblings.\n if (_sire.matronId == _matron.matronId || _sire.matronId == _matron.sireId) {\n return false;\n }\n if (_sire.sireId == _matron.matronId || _sire.sireId == _matron.sireId) {\n return false;\n }\n\n // Everything seems cool! Let's get DTF.\n return true;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair for\n /// breeding via auction (i.e. skips ownership and siring approval checks).\n function _canBreedWithViaAuction(uint256 _matronId, uint256 _sireId)\n internal\n view\n returns (bool)\n {\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId);\n }\n\n /// @notice Checks to see if two cats can breed together, including checks for\n /// ownership and siring approvals. Does NOT check that both cats are ready for\n /// breeding (i.e. breedWith could still fail until the cooldowns are finished).\n /// TODO: Shouldn't this check pregnancy and cooldowns?!?\n /// @param _matronId The ID of the proposed matron.\n /// @param _sireId The ID of the proposed sire.\n function canBreedWith(uint256 _matronId, uint256 _sireId)\n external\n view\n returns(bool)\n {\n require(_matronId > 0);\n require(_sireId > 0);\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId) &&\n _isSiringPermitted(_sireId, _matronId);\n }\n\n /// @dev Internal utility function to initiate breeding, assumes that all breeding\n /// requirements have been checked.\n function _breedWith(uint256 _matronId, uint256 _sireId) internal {\n // Grab a reference to the Kitties from storage.\n Kitty storage sire = kitties[_sireId];\n Kitty storage matron = kitties[_matronId];\n\n // Mark the matron as pregnant, keeping track of who the sire is.\n matron.siringWithId = uint32(_sireId);\n\n // Trigger the cooldown for both parents.\n _triggerCooldown(sire);\n _triggerCooldown(matron);\n\n // Clear siring permission for both parents. This may not be strictly necessary\n // but it's likely to avoid confusion!\n delete sireAllowedToAddress[_matronId];\n delete sireAllowedToAddress[_sireId];\n\n // Every time a kitty gets pregnant, counter is incremented.\n pregnantKitties++;\n\n // Emit the pregnancy event.\n Pregnant(kittyIndexToOwner[_matronId], _matronId, _sireId, matron.cooldownEndBlock);\n }\n\n /// @notice Breed a Kitty you own (as matron) with a sire that you own, or for which you\n /// have previously been given Siring approval. Will either make your cat pregnant, or will\n /// fail entirely. Requires a pre-payment of the fee given out to the first caller of giveBirth()\n /// @param _matronId The ID of the Kitty acting as matron (will end up pregnant if successful)\n /// @param _sireId The ID of the Kitty acting as sire (will begin its siring cooldown if successful)\n function breedWithAuto(uint256 _matronId, uint256 _sireId)\n external\n payable\n whenNotPaused\n {\n // Checks for payment.\n require(msg.value >= autoBirthFee);\n\n // Caller must own the matron.\n require(_owns(msg.sender, _matronId));\n\n // Neither sire nor matron are allowed to be on auction during a normal\n // breeding operation, but we don't need to check that explicitly.\n // For matron: The caller of this function can't be the owner of the matron\n // because the owner of a Kitty on auction is the auction house, and the\n // auction house will never call breedWith().\n // For sire: Similarly, a sire on auction will be owned by the auction house\n // and the act of transferring ownership will have cleared any oustanding\n // siring approval.\n // Thus we don't need to spend gas explicitly checking to see if either cat\n // is on auction.\n\n // Check that matron and sire are both owned by caller, or that the sire\n // has given siring permission to caller (i.e. matron's owner).\n // Will fail for _sireId = 0\n require(_isSiringPermitted(_sireId, _matronId));\n\n // Grab a reference to the potential matron\n Kitty storage matron = kitties[_matronId];\n\n // Make sure matron isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(matron));\n\n // Grab a reference to the potential sire\n Kitty storage sire = kitties[_sireId];\n\n // Make sure sire isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(sire));\n\n // Test that these cats are a valid mating pair.\n require(_isValidMatingPair(\n matron,\n _matronId,\n sire,\n _sireId\n ));\n\n // All checks passed, kitty gets pregnant!\n _breedWith(_matronId, _sireId);\n }\n\n /// @notice Have a pregnant Kitty give birth!\n /// @param _matronId A Kitty ready to give birth.\n /// @return The Kitty ID of the new kitten.\n /// @dev Looks at a given Kitty and, if pregnant and if the gestation period has passed,\n /// combines the genes of the two parents to create a new kitten. The new Kitty is assigned\n /// to the current owner of the matron. Upon successful completion, both the matron and the\n /// new kitten will be ready to breed again. Note that anyone can call this function (if they\n /// are willing to pay the gas!), but the new kitten always goes to the mother's owner.\n function giveBirth(uint256 _matronId)\n external\n whenNotPaused\n returns(uint256)\n {\n // Grab a reference to the matron in storage.\n Kitty storage matron = kitties[_matronId];\n\n // Check that the matron is a valid cat.\n require(matron.birthTime != 0);\n\n // Check that the matron is pregnant, and that its time has come!\n require(_isReadyToGiveBirth(matron));\n\n // Grab a reference to the sire in storage.\n uint256 sireId = matron.siringWithId;\n Kitty storage sire = kitties[sireId];\n\n // Determine the higher generation number of the two parents\n uint16 parentGen = matron.generation;\n if (sire.generation > matron.generation) {\n parentGen = sire.generation;\n }\n\n // Call the sooper-sekret gene mixing operation.\n uint256 childGenes = geneScience.mixGenes(matron.genes, sire.genes, matron.cooldownEndBlock - 1);\n\n // Make the new kitten!\n address owner = kittyIndexToOwner[_matronId];\n uint256 kittenId = _createKitty(_matronId, matron.siringWithId, parentGen + 1, childGenes, owner);\n\n // Clear the reference to sire from the matron (REQUIRED! Having siringWithId\n // set is what marks a matron as being pregnant.)\n delete matron.siringWithId;\n\n // Every time a kitty gives birth counter is decremented.\n pregnantKitties--;\n\n // Send the balance fee to the person who made birth happen.\n msg.sender.send(autoBirthFee);\n\n // return the new kitten's ID\n return kittenId;\n }\n}\n\n\n\n\n\n\n\n\n\n\n/// @title Auction Core\n/// @dev Contains models, variables, and internal methods for the auction.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuctionBase {\n\n // Represents an auction on an NFT\n struct Auction {\n // Current owner of NFT\n address seller;\n // Price (in wei) at beginning of auction\n uint128 startingPrice;\n // Price (in wei) at end of auction\n uint128 endingPrice;\n // Duration (in seconds) of auction\n uint64 duration;\n // Time when auction started\n // NOTE: 0 if this auction has been concluded\n uint64 startedAt;\n }\n\n // Reference to contract tracking NFT ownership\n KittiesERC721 public nonFungibleContract;\n\n // Cut owner takes on each auction, measured in basis points (1/100 of a percent).\n // Values 0-10,000 map to 0%-100%\n uint256 public ownerCut;\n\n // Map from token ID to their corresponding auction.\n mapping (uint256 => Auction) tokenIdToAuction;\n\n event AuctionCreated(uint256 tokenId, uint256 startingPrice, uint256 endingPrice, uint256 duration);\n event AuctionSuccessful(uint256 tokenId, uint256 totalPrice, address winner);\n event AuctionCancelled(uint256 tokenId);\n\n /// @dev Returns true if the claimant owns the token.\n /// @param _claimant - Address claiming to own the token.\n /// @param _tokenId - ID of token whose ownership to verify.\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return (nonFungibleContract.ownerOf(_tokenId) == _claimant);\n }\n\n /// @dev Escrows the NFT, assigning ownership to this contract.\n /// Throws if the escrow fails.\n /// @param _owner - Current owner address of token to escrow.\n /// @param _tokenId - ID of token whose approval to verify.\n function _escrow(address _owner, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transferFrom(_owner, this, _tokenId);\n }\n\n /// @dev Transfers an NFT owned by this contract to another address.\n /// Returns true if the transfer succeeds.\n /// @param _receiver - Address to transfer NFT to.\n /// @param _tokenId - ID of token to transfer.\n function _transfer(address _receiver, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transfer(_receiver, _tokenId);\n }\n\n /// @dev Adds an auction to the list of open auctions. Also fires the\n /// AuctionCreated event.\n /// @param _tokenId The ID of the token to be put on auction.\n /// @param _auction Auction to add.\n function _addAuction(uint256 _tokenId, Auction _auction) internal {\n // Require that all auctions have a duration of\n // at least one minute. (Keeps our math from getting hairy!)\n require(_auction.duration >= 1 minutes);\n\n tokenIdToAuction[_tokenId] = _auction;\n\n AuctionCreated(\n uint256(_tokenId),\n uint256(_auction.startingPrice),\n uint256(_auction.endingPrice),\n uint256(_auction.duration)\n );\n }\n\n /// @dev Cancels an auction unconditionally.\n function _cancelAuction(uint256 _tokenId, address _seller) internal {\n _removeAuction(_tokenId);\n _transfer(_seller, _tokenId);\n AuctionCancelled(_tokenId);\n }\n\n /// @dev Computes the price and transfers winnings.\n /// Does NOT transfer ownership of token.\n function _bid(uint256 _tokenId, uint256 _bidAmount)\n internal\n returns (uint256)\n {\n // Get a reference to the auction struct\n Auction storage auction = tokenIdToAuction[_tokenId];\n\n // Explicitly check that this auction is currently live.\n // (Because of how Ethereum mappings work, we can't just count\n // on the lookup above failing. An invalid _tokenId will just\n // return an auction object that is all zeros.)\n require(_isOnAuction(auction));\n\n // Check that the bid is greater than or equal to the current price\n uint256 price = _currentPrice(auction);\n require(_bidAmount >= price);\n\n // Grab a reference to the seller before the auction struct\n // gets deleted.\n address seller = auction.seller;\n\n // The bid is good! Remove the auction before sending the fees\n // to the sender so we can't have a reentrancy attack.\n _removeAuction(_tokenId);\n\n // Transfer proceeds to seller (if there are any!)\n if (price > 0) {\n // Calculate the auctioneer's cut.\n // (NOTE: _computeCut() is guaranteed to return a\n // value <= price, so this subtraction can't go negative.)\n uint256 auctioneerCut = _computeCut(price);\n uint256 sellerProceeds = price - auctioneerCut;\n\n // NOTE: Doing a transfer() in the middle of a complex\n // method like this is generally discouraged because of\n // reentrancy attacks and DoS attacks if the seller is\n // a contract with an invalid fallback function. We explicitly\n // guard against reentrancy attacks by removing the auction\n // before calling transfer(), and the only thing the seller\n // can DoS is the sale of their own asset! (And if it's an\n // accident, they can call cancelAuction(). )\n seller.transfer(sellerProceeds);\n }\n\n // Calculate any excess funds included with the bid. If the excess\n // is anything worth worrying about, transfer it back to bidder.\n // NOTE: We checked above that the bid amount is greater than or\n // equal to the price so this cannot underflow.\n uint256 bidExcess = _bidAmount - price;\n\n // Return the funds. Similar to the previous transfer, this is\n // not susceptible to a re-entry attack because the auction is\n // removed before any transfers occur.\n msg.sender.transfer(bidExcess);\n\n // Tell the world!\n AuctionSuccessful(_tokenId, price, msg.sender);\n\n return price;\n }\n\n /// @dev Removes an auction from the list of open auctions.\n /// @param _tokenId - ID of NFT on auction.\n function _removeAuction(uint256 _tokenId) internal {\n delete tokenIdToAuction[_tokenId];\n }\n\n /// @dev Returns true if the NFT is on auction.\n /// @param _auction - Auction to check.\n function _isOnAuction(Auction storage _auction) internal view returns (bool) {\n return (_auction.startedAt > 0);\n }\n\n /// @dev Returns current price of an NFT on auction. Broken into two\n /// functions (this one, that computes the duration from the auction\n /// structure, and the other that does the price computation) so we\n /// can easily test that the price computation works correctly.\n function _currentPrice(Auction storage _auction)\n internal\n view\n returns (uint256)\n {\n uint256 secondsPassed = 0;\n\n // A bit of insurance against negative values (or wraparound).\n // Probably not necessary (since Ethereum guarnatees that the\n // now variable doesn't ever go backwards).\n if (now > _auction.startedAt) {\n secondsPassed = now - _auction.startedAt;\n }\n\n return _computeCurrentPrice(\n _auction.startingPrice,\n _auction.endingPrice,\n _auction.duration,\n secondsPassed\n );\n }\n\n /// @dev Computes the current price of an auction. Factored out\n /// from _currentPrice so we can run extensive unit tests.\n /// When testing, make this function public and turn on\n /// `Current price computation` test suite.\n function _computeCurrentPrice(\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n uint256 _secondsPassed\n )\n internal\n pure\n returns (uint256)\n {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our public functions carefully cap the maximum values for\n // time (at 64-bits) and currency (at 128-bits). _duration is\n // also known to be non-zero (see the require() statement in\n // _addAuction())\n if (_secondsPassed >= _duration) {\n // We've reached the end of the dynamic pricing portion\n // of the auction, just return the end price.\n return _endingPrice;\n } else {\n // Starting price can be higher than ending price (and often is!), so\n // this delta can be negative.\n int256 totalPriceChange = int256(_endingPrice) - int256(_startingPrice);\n\n // This multiplication can't overflow, _secondsPassed will easily fit within\n // 64-bits, and totalPriceChange will easily fit within 128-bits, their product\n // will always fit within 256-bits.\n int256 currentPriceChange = totalPriceChange * int256(_secondsPassed) / int256(_duration);\n\n // currentPriceChange can be negative, but if so, will have a magnitude\n // less that _startingPrice. Thus, this result will always end up positive.\n int256 currentPrice = int256(_startingPrice) + currentPriceChange;\n\n return uint256(currentPrice);\n }\n }\n\n /// @dev Computes owner's cut of a sale.\n /// @param _price - Sale price of NFT.\n function _computeCut(uint256 _price) internal view returns (uint256) {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our entry functions carefully cap the maximum values for\n // currency (at 128-bits), and ownerCut <= 10000 (see the require()\n // statement in the ClockAuction constructor). The result of this\n // function is always guaranteed to be <= _price.\n return _price * ownerCut / 10000;\n }\n\n}\n\n\n\n\n\n\n\n/**\n * @title KittiesPausable\n * @dev Base contract which allows children to implement an emergency stop mechanism.\n */\ncontract KittiesPausable is KittiesOwnable {\n event Pause();\n event Unpause();\n\n bool public paused = false;\n\n\n /**\n\t * @dev modifier to allow actions only when the contract IS paused\n\t */\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /**\n\t * @dev modifier to allow actions only when the contract IS NOT paused\n\t */\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /**\n\t * @dev called by the owner to pause, triggers stopped state\n\t */\n function pause() onlyOwner whenNotPaused returns (bool) {\n paused = true;\n Pause();\n return true;\n }\n\n /**\n\t * @dev called by the owner to unpause, returns to normal state\n\t */\n function unpause() onlyOwner whenPaused returns (bool) {\n paused = false;\n Unpause();\n return true;\n }\n}\n\n\n/// @title Clock auction for non-fungible tokens.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuction is KittiesPausable, ClockAuctionBase {\n\n /// @dev The ERC-165 interface signature for ERC-721.\n /// Ref: https://github.com/ethereum/EIPs/issues/165\n /// Ref: https://github.com/ethereum/EIPs/issues/721\n bytes4 constant InterfaceSignature_ERC721 = bytes4(0x9a20483d);\n\n /// @dev Constructor creates a reference to the NFT ownership contract\n /// and verifies the owner cut is in the valid range.\n /// @param _nftAddress - address of a deployed contract implementing\n /// the Nonfungible Interface.\n /// @param _cut - percent cut the owner takes on each auction, must be\n /// between 0-10,000.\n function ClockAuction(address _nftAddress, uint256 _cut) public {\n require(_cut <= 10000);\n ownerCut = _cut;\n\n KittiesERC721 candidateContract = KittiesERC721(_nftAddress);\n require(candidateContract.supportsInterface(InterfaceSignature_ERC721));\n nonFungibleContract = candidateContract;\n }\n\n /// @dev Remove all Ether from the contract, which is the owner's cuts\n /// as well as any Ether sent directly to the contract address.\n /// Always transfers to the NFT contract, but can be called either by\n /// the owner or the NFT contract.\n function withdrawBalance() external {\n address nftAddress = address(nonFungibleContract);\n\n require(\n msg.sender == owner ||\n msg.sender == nftAddress\n );\n // We are using this boolean method to make sure that even if one fails it will still work\n bool res = nftAddress.send(this.balance);\n }\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of time to move between starting\n /// price and ending price (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n whenNotPaused\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(_owns(msg.sender, _tokenId));\n _escrow(msg.sender, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Bids on an open auction, completing the auction and transferring\n /// ownership of the NFT if enough Ether is supplied.\n /// @param _tokenId - ID of token to bid on.\n function bid(uint256 _tokenId)\n external\n payable\n whenNotPaused\n {\n // _bid will throw if the bid or funds transfer fails\n _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n }\n\n /// @dev Cancels an auction that hasn't been won yet.\n /// Returns the NFT to original owner.\n /// @notice This is a state-modifying function that can\n /// be called while the contract is paused.\n /// @param _tokenId - ID of token on auction\n function cancelAuction(uint256 _tokenId)\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n address seller = auction.seller;\n require(msg.sender == seller);\n _cancelAuction(_tokenId, seller);\n }\n\n /// @dev Cancels an auction when the contract is paused.\n /// Only the owner may do this, and NFTs are returned to\n /// the seller. This should only be used in emergencies.\n /// @param _tokenId - ID of the NFT on auction to cancel.\n function cancelAuctionWhenPaused(uint256 _tokenId)\n whenPaused\n onlyOwner\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n _cancelAuction(_tokenId, auction.seller);\n }\n\n /// @dev Returns auction info for an NFT on auction.\n /// @param _tokenId - ID of NFT on auction.\n function getAuction(uint256 _tokenId)\n external\n view\n returns\n (\n address seller,\n uint256 startingPrice,\n uint256 endingPrice,\n uint256 duration,\n uint256 startedAt\n ) {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return (\n auction.seller,\n auction.startingPrice,\n auction.endingPrice,\n auction.duration,\n auction.startedAt\n );\n }\n\n /// @dev Returns the current price of an auction.\n /// @param _tokenId - ID of the token price we are checking.\n function getCurrentPrice(uint256 _tokenId)\n external\n view\n returns (uint256)\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return _currentPrice(auction);\n }\n\n}\n\n\n/// @title Reverse auction modified for siring\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SiringClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSiringAuctionAddress() call.\n bool public isSiringClockAuction = true;\n\n // Delegate constructor\n function SiringClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction. Since this function is wrapped,\n /// require sender to be KittyCore contract.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Places a bid for siring. Requires the sender\n /// is the KittyCore contract because all bid methods\n /// should be wrapped. Also returns the kitty to the\n /// seller rather than the winner.\n function bid(uint256 _tokenId)\n external\n payable\n {\n require(msg.sender == address(nonFungibleContract));\n address seller = tokenIdToAuction[_tokenId].seller;\n // _bid checks that token ID is valid and will throw if bid fails\n _bid(_tokenId, msg.value);\n // We transfer the kitty back to the seller, the winner will get\n // the offspring\n _transfer(seller, _tokenId);\n }\n\n}\n\n\n\n\n\n/// @title Clock auction modified for sale of kitties\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SaleClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSaleAuctionAddress() call.\n bool public isSaleClockAuction = true;\n\n // Tracks last 5 sale price of gen0 kitty sales\n uint256 public gen0SaleCount;\n uint256[5] public lastGen0SalePrices;\n\n // Delegate constructor\n function SaleClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Updates lastSalePrice if seller is the nft contract\n /// Otherwise, works the same as default bid method.\n function bid(uint256 _tokenId)\n external\n payable\n {\n // _bid verifies token ID size\n address seller = tokenIdToAuction[_tokenId].seller;\n uint256 price = _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n\n // If not a gen0 auction, exit\n if (seller == address(nonFungibleContract)) {\n // Track gen0 sale prices\n lastGen0SalePrices[gen0SaleCount % 5] = price;\n gen0SaleCount++;\n }\n }\n\n function averageGen0SalePrice() external view returns (uint256) {\n uint256 sum = 0;\n for (uint256 i = 0; i < 5; i++) {\n sum += lastGen0SalePrices[i];\n }\n return sum / 5;\n }\n\n}\n\n\n/// @title Handles creating auctions for sale and siring of kitties.\n/// This wrapper of ReverseAuction exists only so that users can create\n/// auctions with only one transaction.\ncontract KittyAuction is KittyBreeding {\n\n // @notice The auction contract variables are defined in KittyBase to allow\n // us to refer to them in KittyOwnership to prevent accidental transfers.\n // `saleAuction` refers to the auction for gen0 and p2p sale of kitties.\n // `siringAuction` refers to the auction for siring rights of kitties.\n\n /// @dev Sets the reference to the sale auction.\n /// @param _address - Address of sale contract.\n function setSaleAuctionAddress(address _address) external onlyCEO {\n SaleClockAuction candidateContract = SaleClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSaleClockAuction());\n\n // Set the new contract address\n saleAuction = candidateContract;\n }\n\n /// @dev Sets the reference to the siring auction.\n /// @param _address - Address of siring contract.\n function setSiringAuctionAddress(address _address) external onlyCEO {\n SiringClockAuction candidateContract = SiringClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSiringClockAuction());\n\n // Set the new contract address\n siringAuction = candidateContract;\n }\n\n /// @dev Put a kitty up for auction.\n /// Does some ownership trickery to create auctions in one tx.\n function createSaleAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n // Ensure the kitty is not pregnant to prevent the auction\n // contract accidentally receiving ownership of the child.\n // NOTE: the kitty IS allowed to be in a cooldown.\n require(!isPregnant(_kittyId));\n _approve(_kittyId, saleAuction);\n // Sale auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n saleAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Put a kitty up for auction to be sire.\n /// Performs checks to ensure the kitty can be sired, then\n /// delegates to reverse auction.\n function createSiringAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n require(isReadyToBreed(_kittyId));\n _approve(_kittyId, siringAuction);\n // Siring auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n siringAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Completes a siring auction by bidding.\n /// Immediately breeds the winning matron with the sire on auction.\n /// @param _sireId - ID of the sire on auction.\n /// @param _matronId - ID of the matron owned by the bidder.\n function bidOnSiringAuction(\n uint256 _sireId,\n uint256 _matronId\n )\n external\n payable\n whenNotPaused\n {\n // Auction contract checks input sizes\n require(_owns(msg.sender, _matronId));\n require(isReadyToBreed(_matronId));\n require(_canBreedWithViaAuction(_matronId, _sireId));\n\n // Define the current price of the auction.\n uint256 currentPrice = siringAuction.getCurrentPrice(_sireId);\n require(msg.value >= currentPrice + autoBirthFee);\n\n // Siring auction will throw if the bid fails.\n siringAuction.bid.value(msg.value - autoBirthFee)(_sireId);\n _breedWith(uint32(_matronId), uint32(_sireId));\n }\n\n /// @dev Transfers the balance of the sale auction contract\n /// to the KittyCore contract. We use two-step withdrawal to\n /// prevent two transfer calls in the auction bid function.\n function withdrawAuctionBalances() external onlyCLevel {\n saleAuction.withdrawBalance();\n siringAuction.withdrawBalance();\n }\n}\n\n\n/// @title all functions related to creating kittens\ncontract KittyMinting is KittyAuction {\n\n // Limits the number of cats the contract owner can ever create.\n uint256 public constant PROMO_CREATION_LIMIT = 5000;\n uint256 public constant GEN0_CREATION_LIMIT = 45000;\n\n // Constants for gen0 auctions.\n uint256 public constant GEN0_STARTING_PRICE = 10 finney;\n uint256 public constant GEN0_AUCTION_DURATION = 1 days;\n\n // Counts the number of cats the contract owner has created.\n uint256 public promoCreatedCount;\n uint256 public gen0CreatedCount;\n\n /// @dev we can create promo kittens, up to a limit. Only callable by COO\n /// @param _genes the encoded genes of the kitten to be created, any value is accepted\n /// @param _owner the future owner of the created kittens. Default to contract COO\n function createPromoKitty(uint256 _genes, address _owner) external onlyCOO {\n address kittyOwner = _owner;\n if (kittyOwner == address(0)) {\n kittyOwner = cooAddress;\n }\n require(promoCreatedCount < PROMO_CREATION_LIMIT);\n\n promoCreatedCount++;\n _createKitty(0, 0, 0, _genes, kittyOwner);\n }\n\n /// @dev Creates a new gen0 kitty with the given genes and\n /// creates an auction for it.\n function createGen0Auction(uint256 _genes) external onlyCOO {\n require(gen0CreatedCount < GEN0_CREATION_LIMIT);\n\n uint256 kittyId = _createKitty(0, 0, 0, _genes, address(this));\n _approve(kittyId, saleAuction);\n\n saleAuction.createAuction(\n kittyId,\n _computeNextGen0Price(),\n 0,\n GEN0_AUCTION_DURATION,\n address(this)\n );\n\n gen0CreatedCount++;\n }\n\n /// @dev Computes the next gen0 auction starting price, given\n /// the average of the past 5 prices + 50%.\n function _computeNextGen0Price() internal view returns (uint256) {\n uint256 avePrice = saleAuction.averageGen0SalePrice();\n\n // Sanity check to ensure we don't overflow arithmetic\n require(avePrice == uint256(uint128(avePrice)));\n\n uint256 nextPrice = avePrice + (avePrice / 2);\n\n // We never auction for less than starting price\n if (nextPrice < GEN0_STARTING_PRICE) {\n nextPrice = GEN0_STARTING_PRICE;\n }\n\n return nextPrice;\n }\n}\n\n\n/// @title CryptoKitties: Collectible, breedable, and oh-so-adorable cats on the Ethereum blockchain.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev The main CryptoKitties contract, keeps track of kittens so they don't wander around and get lost.\ncontract KittyCore is KittyMinting {\n\n // This is the main CryptoKitties contract. In order to keep our code seperated into logical sections,\n // we've broken it up in two ways. First, we have several seperately-instantiated sibling contracts\n // that handle auctions and our super-top-secret genetic combination algorithm. The auctions are\n // seperate since their logic is somewhat complex and there's always a risk of subtle bugs. By keeping\n // them in their own contracts, we can upgrade them without disrupting the main contract that tracks\n // kitty ownership. The genetic combination algorithm is kept seperate so we can open-source all of\n // the rest of our code without making it _too_ easy for folks to figure out how the genetics work.\n // Don't worry, I'm sure someone will reverse engineer it soon enough!\n //\n // Secondly, we break the core contract into multiple files using inheritence, one for each major\n // facet of functionality of CK. This allows us to keep related code bundled together while still\n // avoiding a single giant file with everything in it. The breakdown is as follows:\n //\n // - KittyBase: This is where we define the most fundamental code shared throughout the core\n // functionality. This includes our main data storage, constants and data types, plus\n // internal functions for managing these items.\n //\n // - KittyAccessControl: This contract manages the various addresses and constraints for operations\n // that can be executed only by specific roles. Namely CEO, CFO and COO.\n //\n // - KittyOwnership: This provides the methods required for basic non-fungible token\n // transactions, following the draft ERC-721 spec (https://github.com/ethereum/EIPs/issues/721).\n //\n // - KittyBreeding: This file contains the methods necessary to breed cats together, including\n // keeping track of siring offers, and relies on an external genetic combination contract.\n //\n // - KittyAuctions: Here we have the public methods for auctioning or bidding on cats or siring\n // services. The actual auction functionality is handled in two sibling contracts (one\n // for sales and one for siring), while auction creation and bidding is mostly mediated\n // through this facet of the core contract.\n //\n // - KittyMinting: This final facet contains the functionality we use for creating new gen0 cats.\n // We can make up to 5000 \"promo\" cats that can be given away (especially important when\n // the community is new), and all others can only be created and then immediately put up\n // for auction via an algorithmically determined starting price. Regardless of how they\n // are created, there is a hard limit of 50k gen0 cats. After that, it's all up to the\n // community to breed, breed, breed!\n\n // Set in case the core contract is broken and an upgrade is required\n address public newContractAddress;\n\n /// @notice Creates the main CryptoKitties smart contract instance.\n function KittyCore() public {\n // Starts paused.\n paused = true;\n\n // the creator of the contract is the initial CEO\n ceoAddress = msg.sender;\n\n // the creator of the contract is also the initial COO\n cooAddress = msg.sender;\n\n // start with the mythical kitten 0 - so we don't have generation-0 parent issues\n _createKitty(0, 0, 0, uint256(-1), address(0));\n }\n\n /// @dev Used to mark the smart contract as upgraded, in case there is a serious\n /// breaking bug. This method does nothing but keep track of the new contract and\n /// emit a message indicating that the new address is set. It's up to clients of this\n /// contract to update to the new contract address in that case. (This contract will\n /// be paused indefinitely if such an upgrade takes place.)\n /// @param _v2Address new address\n function setNewAddress(address _v2Address) external onlyCEO whenPaused {\n // See README.md for updgrade plan\n newContractAddress = _v2Address;\n ContractUpgrade(_v2Address);\n }\n\n /// @notice No tipping!\n /// @dev Reject all Ether from being sent here, unless it's from one of the\n /// two auction contracts. (Hopefully, we can prevent user accidents.)\n function() external payable {\n require(\n msg.sender == address(saleAuction) ||\n msg.sender == address(siringAuction)\n );\n }\n\n /// @notice Returns all the relevant information about a specific kitty.\n /// @param _id The ID of the kitty of interest.\n function getKitty(uint256 _id)\n external\n view\n returns (\n bool isGestating,\n bool isReady,\n uint256 cooldownIndex,\n uint256 nextActionAt,\n uint256 siringWithId,\n uint256 birthTime,\n uint256 matronId,\n uint256 sireId,\n uint256 generation,\n uint256 genes\n ) {\n Kitty storage kit = kitties[_id];\n\n // if this variable is 0 then it's not gestating\n isGestating = (kit.siringWithId != 0);\n isReady = (kit.cooldownEndBlock <= block.number);\n cooldownIndex = uint256(kit.cooldownIndex);\n nextActionAt = uint256(kit.cooldownEndBlock);\n siringWithId = uint256(kit.siringWithId);\n birthTime = uint256(kit.birthTime);\n matronId = uint256(kit.matronId);\n sireId = uint256(kit.sireId);\n generation = uint256(kit.generation);\n genes = kit.genes;\n }\n\n /// @dev Override unpause so it requires all external contract addresses\n /// to be set before contract can be unpaused. Also, we can't have\n /// newContractAddress set either, because then the contract was upgraded.\n /// @notice This is public rather than external so we can call super.unpause\n /// without using an expensive CALL.\n function unpause() public onlyCEO whenPaused {\n require(saleAuction != address(0));\n require(siringAuction != address(0));\n require(geneScience != address(0));\n require(newContractAddress == address(0));\n\n // Actually unpause the contract.\n super.unpause();\n }\n\n // @dev Allows the CFO to capture the balance available to the contract.\n function withdrawBalance() external onlyCFO {\n uint256 balance = this.balance;\n // Subtract all the currently pregnant kittens we have, plus 1 of margin.\n uint256 subtractFees = (pregnantKitties + 1) * autoBirthFee;\n\n if (balance > subtractFees) {\n cfoAddress.send(balance - subtractFees);\n }\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "exportedSymbols": { "ClockAuction": [ 8872 @@ -52642,5 +52642,5 @@ export const KittyMinting = }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:47.925Z" + "updatedAt": "2018-10-09T17:45:36.305Z" } \ No newline at end of file diff --git a/artifacts/ts/KittyOwnership.ts b/artifacts/ts/KittyOwnership.ts index 3edf1b21..5fa2a40e 100644 --- a/artifacts/ts/KittyOwnership.ts +++ b/artifacts/ts/KittyOwnership.ts @@ -566,15 +566,15 @@ export const KittyOwnership = "type": "event" } ], - "bytecode": "0x60606040526000600260146101000a81548160ff0219169083151502179055506101c060405190810160405280603c63ffffffff1663ffffffff168152602001607863ffffffff1663ffffffff16815260200161012c63ffffffff1663ffffffff16815260200161025863ffffffff1663ffffffff16815260200161070863ffffffff1663ffffffff168152602001610e1063ffffffff1663ffffffff168152602001611c2063ffffffff1663ffffffff16815260200161384063ffffffff1663ffffffff16815260200161708063ffffffff1663ffffffff16815260200161e10063ffffffff1663ffffffff1681526020016201518063ffffffff1663ffffffff1681526020016202a30063ffffffff1663ffffffff1681526020016205460063ffffffff1663ffffffff16815260200162093a8063ffffffff1663ffffffff16815250600390600e620001569291906200016e565b50600f60055534156200016857600080fd5b6200024e565b82600e600701600890048101928215620002055791602002820160005b83821115620001d157835183826101000a81548163ffffffff021916908363ffffffff16021790555092602001926004016020816003010492830192600103026200018b565b8015620002035782816101000a81549063ffffffff0219169055600401602081600301049283019260010302620001d1565b505b50905062000214919062000218565b5090565b6200024b91905b808211156200024757600081816101000a81549063ffffffff0219169055506001016200021f565b5090565b90565b612169806200025e6000396000f300606060405260043610610180576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146101855780630519ce79146101df5780630560ff441461023457806306fdde03146102e4578063095ea7b3146103725780630a0f8168146103b457806318160ddd1461040957806321717ebf1461043257806323b872dd1461048757806327d7874c146104e85780632ba73c15146105215780633f4ba83a1461055a57806346116e6f1461056f578063481af3d3146105d25780634e0a3379146106355780635663896e1461066e5780635c975abb146106915780636352211e146106be57806370a08231146107215780637a7d49371461076e5780638456cb59146107975780638462151c146107ac57806395d89b411461083a5780639d6fac6f146108c8578063a45f4bfc1461090b578063a9059cbb1461096e578063b047fb50146109b0578063bc4006f514610a05578063e17b25af14610a5a578063e6cbe35114610a93575b600080fd5b341561019057600080fd5b6101c560048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050610ae8565b604051808215151515815260200191505060405180910390f35b34156101ea57600080fd5b6101f2610df9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561023f57600080fd5b61026960048080359060200190919080359060200190820180359060200191909192905050610e1f565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102a957808201518184015260208101905061028e565b50505050905090810190601f1680156102d65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156102ef57600080fd5b6102f7610f8a565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561033757808201518184015260208101905061031c565b50505050905090810190601f1680156103645780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561037d57600080fd5b6103b2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610fc3565b005b34156103bf57600080fd5b6103c7611085565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561041457600080fd5b61041c6110aa565b6040518082815260200191505060405180910390f35b341561043d57600080fd5b6104456110ba565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561049257600080fd5b6104e6600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506110e0565b005b34156104f357600080fd5b61051f600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611191565b005b341561052c57600080fd5b610558600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061126b565b005b341561056557600080fd5b61056d611346565b005b341561057a57600080fd5b61059060048080359060200190919050506113d9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156105dd57600080fd5b6105f3600480803590602001909190505061140c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561064057600080fd5b61066c600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061143f565b005b341561067957600080fd5b61068f600480803590602001909190505061151a565b005b341561069c57600080fd5b6106a461166e565b604051808215151515815260200191505060405180910390f35b34156106c957600080fd5b6106df6004808035906020019091905050611681565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561072c57600080fd5b610758600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506116fa565b6040518082815260200191505060405180910390f35b341561077957600080fd5b610781611743565b6040518082815260200191505060405180910390f35b34156107a257600080fd5b6107aa611749565b005b34156107b757600080fd5b6107e3600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061188d565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561082657808201518184015260208101905061080b565b505050509050019250505060405180910390f35b341561084557600080fd5b61084d6119c4565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561088d578082015181840152602081019050610872565b50505050905090810190601f1680156108ba5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156108d357600080fd5b6108e960048080359060200190919050506119fd565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b341561091657600080fd5b61092c6004808035906020019091905050611a2c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561097957600080fd5b6109ae600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611a5f565b005b34156109bb57600080fd5b6109c3611bd0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610a1057600080fd5b610a18611bf6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610a6557600080fd5b610a91600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611c1c565b005b3415610a9e57600080fd5b610aa6611cbb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600060405180807f737570706f727473496e74657266616365286279746573342900000000000000815250601901905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610df2575060405180807f746f6b656e4d657461646174612875696e743235362c737472696e6729000000815250601d019050604051809103902060405180807f746f6b656e734f664f776e6572286164647265737329000000000000000000008152506016019050604051809103902060405180807f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81526020017f74323536290000000000000000000000000000000000000000000000000000008152506025019050604051809103902060405180807f7472616e7366657228616464726573732c75696e7432353629000000000000008152506019019050604051809103902060405180807f617070726f766528616464726573732c75696e743235362900000000000000008152506018019050604051809103902060405180807f6f776e65724f662875696e7432353629000000000000000000000000000000008152506010019050604051809103902060405180807f62616c616e63654f6628616464726573732900000000000000000000000000008152506012019050604051809103902060405180807f746f74616c537570706c79282900000000000000000000000000000000000000815250600d019050604051809103902060405180807f73796d626f6c28290000000000000000000000000000000000000000000000008152506008019050604051809103902060405180807f6e616d6528290000000000000000000000000000000000000000000000000000815250600601905060405180910390201818181818181818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610e276120ea565b610e2f6120fe565b60008073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515610e8e57600080fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb4799f2878787600060405160a001526040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180848152602001806020018281038252848482818152602001925080828437820191505094505050505060a060405180830381600087803b1515610f4957600080fd5b6102c65a03f11515610f5a57600080fd5b505050604051806080018051906020016040528092508193505050610f7f8282611ce1565b925050509392505050565b6040805190810160405280600d81526020017f43727970746f4b6974746965730000000000000000000000000000000000000081525081565b610fcd3382611d39565b1515610fd857600080fd5b610fe28183611da5565b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160068054905003905090565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561111c57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561115757600080fd5b6111613382611dfb565b151561116c57600080fd5b6111768382611d39565b151561118157600080fd5b61118c838383611e67565b505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156111ec57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561122857600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156112c657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561130257600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156113a157600080fd5b600260149054906101000a900460ff1615156113bc57600080fd5b6000600260146101000a81548160ff021916908315150217905550565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561149a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156114d657600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806115c257506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061161a5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561162557600080fd5b60036000600e8110151561163557fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff168110151561166457600080fd5b8060058190555050565b600260149054906101000a900460ff1681565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156116f557600080fd5b919050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806117f157506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806118495750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561185457600080fd5b600260149054906101000a900460ff1615151561187057600080fd5b6001600260146101000a81548160ff021916908315150217905550565b611895612129565b600061189f612129565b60008060006118ad876116fa565b945060008514156118df5760006040518059106118c75750595b908082528060200260200182016040525095506119ba565b846040518059106118ed5750595b908082528060200260200182016040525093506119086110aa565b925060009150600190505b82811115156119b6578673ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156119a95780848381518110151561199257fe5b906020019060200201818152505081806001019250505b8080600101915050611913565b8395505b5050505050919050565b6040805190810160405280600281526020017f434b00000000000000000000000000000000000000000000000000000000000081525081565b600381600e81101515611a0c57fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff16151515611a7b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611ab757600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611af257600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611b4f57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611bac57600080fd5b611bb63382611d39565b1515611bc157600080fd5b611bcc338383611e67565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c7757600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611ce96120ea565b611cf16120ea565b60008084604051805910611d025750595b9080825280601f01601f19166020018201604052509250602083019150859050611d2d82828761209f565b82935050505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff166007600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b806009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008273ffffffffffffffffffffffffffffffffffffffff166009600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515611ffb57600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600a600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556009600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b60005b6020821015156120c757825184526020840193506020830192506020820391506120a2565b6001826020036101000a0390508019835116818551168181178652505050505050565b602060405190810160405280600081525090565b6080604051908101604052806004905b600080191681526020019060019003908161210e5790505090565b6020604051908101604052806000815250905600a165627a7a723058201657a79c569c1b3a76b7b88753d73519a63d8b4e5f5e5bfb939d5d7c7550c39f0029", - "deployedBytecode": "0x606060405260043610610180576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146101855780630519ce79146101df5780630560ff441461023457806306fdde03146102e4578063095ea7b3146103725780630a0f8168146103b457806318160ddd1461040957806321717ebf1461043257806323b872dd1461048757806327d7874c146104e85780632ba73c15146105215780633f4ba83a1461055a57806346116e6f1461056f578063481af3d3146105d25780634e0a3379146106355780635663896e1461066e5780635c975abb146106915780636352211e146106be57806370a08231146107215780637a7d49371461076e5780638456cb59146107975780638462151c146107ac57806395d89b411461083a5780639d6fac6f146108c8578063a45f4bfc1461090b578063a9059cbb1461096e578063b047fb50146109b0578063bc4006f514610a05578063e17b25af14610a5a578063e6cbe35114610a93575b600080fd5b341561019057600080fd5b6101c560048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050610ae8565b604051808215151515815260200191505060405180910390f35b34156101ea57600080fd5b6101f2610df9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561023f57600080fd5b61026960048080359060200190919080359060200190820180359060200191909192905050610e1f565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102a957808201518184015260208101905061028e565b50505050905090810190601f1680156102d65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156102ef57600080fd5b6102f7610f8a565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561033757808201518184015260208101905061031c565b50505050905090810190601f1680156103645780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561037d57600080fd5b6103b2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610fc3565b005b34156103bf57600080fd5b6103c7611085565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561041457600080fd5b61041c6110aa565b6040518082815260200191505060405180910390f35b341561043d57600080fd5b6104456110ba565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561049257600080fd5b6104e6600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506110e0565b005b34156104f357600080fd5b61051f600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611191565b005b341561052c57600080fd5b610558600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061126b565b005b341561056557600080fd5b61056d611346565b005b341561057a57600080fd5b61059060048080359060200190919050506113d9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156105dd57600080fd5b6105f3600480803590602001909190505061140c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561064057600080fd5b61066c600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061143f565b005b341561067957600080fd5b61068f600480803590602001909190505061151a565b005b341561069c57600080fd5b6106a461166e565b604051808215151515815260200191505060405180910390f35b34156106c957600080fd5b6106df6004808035906020019091905050611681565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561072c57600080fd5b610758600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506116fa565b6040518082815260200191505060405180910390f35b341561077957600080fd5b610781611743565b6040518082815260200191505060405180910390f35b34156107a257600080fd5b6107aa611749565b005b34156107b757600080fd5b6107e3600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061188d565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561082657808201518184015260208101905061080b565b505050509050019250505060405180910390f35b341561084557600080fd5b61084d6119c4565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561088d578082015181840152602081019050610872565b50505050905090810190601f1680156108ba5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156108d357600080fd5b6108e960048080359060200190919050506119fd565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b341561091657600080fd5b61092c6004808035906020019091905050611a2c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561097957600080fd5b6109ae600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611a5f565b005b34156109bb57600080fd5b6109c3611bd0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610a1057600080fd5b610a18611bf6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610a6557600080fd5b610a91600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611c1c565b005b3415610a9e57600080fd5b610aa6611cbb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600060405180807f737570706f727473496e74657266616365286279746573342900000000000000815250601901905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610df2575060405180807f746f6b656e4d657461646174612875696e743235362c737472696e6729000000815250601d019050604051809103902060405180807f746f6b656e734f664f776e6572286164647265737329000000000000000000008152506016019050604051809103902060405180807f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81526020017f74323536290000000000000000000000000000000000000000000000000000008152506025019050604051809103902060405180807f7472616e7366657228616464726573732c75696e7432353629000000000000008152506019019050604051809103902060405180807f617070726f766528616464726573732c75696e743235362900000000000000008152506018019050604051809103902060405180807f6f776e65724f662875696e7432353629000000000000000000000000000000008152506010019050604051809103902060405180807f62616c616e63654f6628616464726573732900000000000000000000000000008152506012019050604051809103902060405180807f746f74616c537570706c79282900000000000000000000000000000000000000815250600d019050604051809103902060405180807f73796d626f6c28290000000000000000000000000000000000000000000000008152506008019050604051809103902060405180807f6e616d6528290000000000000000000000000000000000000000000000000000815250600601905060405180910390201818181818181818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610e276120ea565b610e2f6120fe565b60008073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515610e8e57600080fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb4799f2878787600060405160a001526040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180848152602001806020018281038252848482818152602001925080828437820191505094505050505060a060405180830381600087803b1515610f4957600080fd5b6102c65a03f11515610f5a57600080fd5b505050604051806080018051906020016040528092508193505050610f7f8282611ce1565b925050509392505050565b6040805190810160405280600d81526020017f43727970746f4b6974746965730000000000000000000000000000000000000081525081565b610fcd3382611d39565b1515610fd857600080fd5b610fe28183611da5565b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160068054905003905090565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561111c57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561115757600080fd5b6111613382611dfb565b151561116c57600080fd5b6111768382611d39565b151561118157600080fd5b61118c838383611e67565b505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156111ec57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561122857600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156112c657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561130257600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156113a157600080fd5b600260149054906101000a900460ff1615156113bc57600080fd5b6000600260146101000a81548160ff021916908315150217905550565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561149a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156114d657600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806115c257506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061161a5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561162557600080fd5b60036000600e8110151561163557fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff168110151561166457600080fd5b8060058190555050565b600260149054906101000a900460ff1681565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156116f557600080fd5b919050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806117f157506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806118495750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561185457600080fd5b600260149054906101000a900460ff1615151561187057600080fd5b6001600260146101000a81548160ff021916908315150217905550565b611895612129565b600061189f612129565b60008060006118ad876116fa565b945060008514156118df5760006040518059106118c75750595b908082528060200260200182016040525095506119ba565b846040518059106118ed5750595b908082528060200260200182016040525093506119086110aa565b925060009150600190505b82811115156119b6578673ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156119a95780848381518110151561199257fe5b906020019060200201818152505081806001019250505b8080600101915050611913565b8395505b5050505050919050565b6040805190810160405280600281526020017f434b00000000000000000000000000000000000000000000000000000000000081525081565b600381600e81101515611a0c57fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff16151515611a7b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611ab757600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611af257600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611b4f57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611bac57600080fd5b611bb63382611d39565b1515611bc157600080fd5b611bcc338383611e67565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c7757600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611ce96120ea565b611cf16120ea565b60008084604051805910611d025750595b9080825280601f01601f19166020018201604052509250602083019150859050611d2d82828761209f565b82935050505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff166007600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b806009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008273ffffffffffffffffffffffffffffffffffffffff166009600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515611ffb57600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600a600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556009600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b60005b6020821015156120c757825184526020840193506020830192506020820391506120a2565b6001826020036101000a0390508019835116818551168181178652505050505050565b602060405190810160405280600081525090565b6080604051908101604052806004905b600080191681526020019060019003908161210e5790505090565b6020604051908101604052806000815250905600a165627a7a723058201657a79c569c1b3a76b7b88753d73519a63d8b4e5f5e5bfb939d5d7c7550c39f0029", + "bytecode": "0x60606040526000600260146101000a81548160ff0219169083151502179055506101c060405190810160405280603c63ffffffff1663ffffffff168152602001607863ffffffff1663ffffffff16815260200161012c63ffffffff1663ffffffff16815260200161025863ffffffff1663ffffffff16815260200161070863ffffffff1663ffffffff168152602001610e1063ffffffff1663ffffffff168152602001611c2063ffffffff1663ffffffff16815260200161384063ffffffff1663ffffffff16815260200161708063ffffffff1663ffffffff16815260200161e10063ffffffff1663ffffffff1681526020016201518063ffffffff1663ffffffff1681526020016202a30063ffffffff1663ffffffff1681526020016205460063ffffffff1663ffffffff16815260200162093a8063ffffffff1663ffffffff16815250600390600e620001569291906200016e565b50600f60055534156200016857600080fd5b6200024e565b82600e600701600890048101928215620002055791602002820160005b83821115620001d157835183826101000a81548163ffffffff021916908363ffffffff16021790555092602001926004016020816003010492830192600103026200018b565b8015620002035782816101000a81549063ffffffff0219169055600401602081600301049283019260010302620001d1565b505b50905062000214919062000218565b5090565b6200024b91905b808211156200024757600081816101000a81549063ffffffff0219169055506001016200021f565b5090565b90565b612169806200025e6000396000f300606060405260043610610180576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146101855780630519ce79146101df5780630560ff441461023457806306fdde03146102e4578063095ea7b3146103725780630a0f8168146103b457806318160ddd1461040957806321717ebf1461043257806323b872dd1461048757806327d7874c146104e85780632ba73c15146105215780633f4ba83a1461055a57806346116e6f1461056f578063481af3d3146105d25780634e0a3379146106355780635663896e1461066e5780635c975abb146106915780636352211e146106be57806370a08231146107215780637a7d49371461076e5780638456cb59146107975780638462151c146107ac57806395d89b411461083a5780639d6fac6f146108c8578063a45f4bfc1461090b578063a9059cbb1461096e578063b047fb50146109b0578063bc4006f514610a05578063e17b25af14610a5a578063e6cbe35114610a93575b600080fd5b341561019057600080fd5b6101c560048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050610ae8565b604051808215151515815260200191505060405180910390f35b34156101ea57600080fd5b6101f2610df9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561023f57600080fd5b61026960048080359060200190919080359060200190820180359060200191909192905050610e1f565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102a957808201518184015260208101905061028e565b50505050905090810190601f1680156102d65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156102ef57600080fd5b6102f7610f8a565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561033757808201518184015260208101905061031c565b50505050905090810190601f1680156103645780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561037d57600080fd5b6103b2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610fc3565b005b34156103bf57600080fd5b6103c7611085565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561041457600080fd5b61041c6110aa565b6040518082815260200191505060405180910390f35b341561043d57600080fd5b6104456110ba565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561049257600080fd5b6104e6600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506110e0565b005b34156104f357600080fd5b61051f600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611191565b005b341561052c57600080fd5b610558600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061126b565b005b341561056557600080fd5b61056d611346565b005b341561057a57600080fd5b61059060048080359060200190919050506113d9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156105dd57600080fd5b6105f3600480803590602001909190505061140c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561064057600080fd5b61066c600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061143f565b005b341561067957600080fd5b61068f600480803590602001909190505061151a565b005b341561069c57600080fd5b6106a461166e565b604051808215151515815260200191505060405180910390f35b34156106c957600080fd5b6106df6004808035906020019091905050611681565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561072c57600080fd5b610758600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506116fa565b6040518082815260200191505060405180910390f35b341561077957600080fd5b610781611743565b6040518082815260200191505060405180910390f35b34156107a257600080fd5b6107aa611749565b005b34156107b757600080fd5b6107e3600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061188d565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561082657808201518184015260208101905061080b565b505050509050019250505060405180910390f35b341561084557600080fd5b61084d6119c4565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561088d578082015181840152602081019050610872565b50505050905090810190601f1680156108ba5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156108d357600080fd5b6108e960048080359060200190919050506119fd565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b341561091657600080fd5b61092c6004808035906020019091905050611a2c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561097957600080fd5b6109ae600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611a5f565b005b34156109bb57600080fd5b6109c3611bd0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610a1057600080fd5b610a18611bf6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610a6557600080fd5b610a91600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611c1c565b005b3415610a9e57600080fd5b610aa6611cbb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600060405180807f737570706f727473496e74657266616365286279746573342900000000000000815250601901905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610df2575060405180807f746f6b656e4d657461646174612875696e743235362c737472696e6729000000815250601d019050604051809103902060405180807f746f6b656e734f664f776e6572286164647265737329000000000000000000008152506016019050604051809103902060405180807f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81526020017f74323536290000000000000000000000000000000000000000000000000000008152506025019050604051809103902060405180807f7472616e7366657228616464726573732c75696e7432353629000000000000008152506019019050604051809103902060405180807f617070726f766528616464726573732c75696e743235362900000000000000008152506018019050604051809103902060405180807f6f776e65724f662875696e7432353629000000000000000000000000000000008152506010019050604051809103902060405180807f62616c616e63654f6628616464726573732900000000000000000000000000008152506012019050604051809103902060405180807f746f74616c537570706c79282900000000000000000000000000000000000000815250600d019050604051809103902060405180807f73796d626f6c28290000000000000000000000000000000000000000000000008152506008019050604051809103902060405180807f6e616d6528290000000000000000000000000000000000000000000000000000815250600601905060405180910390201818181818181818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610e276120ea565b610e2f6120fe565b60008073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515610e8e57600080fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb4799f2878787600060405160a001526040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180848152602001806020018281038252848482818152602001925080828437820191505094505050505060a060405180830381600087803b1515610f4957600080fd5b6102c65a03f11515610f5a57600080fd5b505050604051806080018051906020016040528092508193505050610f7f8282611ce1565b925050509392505050565b6040805190810160405280600d81526020017f43727970746f4b6974746965730000000000000000000000000000000000000081525081565b610fcd3382611d39565b1515610fd857600080fd5b610fe28183611da5565b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160068054905003905090565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561111c57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561115757600080fd5b6111613382611dfb565b151561116c57600080fd5b6111768382611d39565b151561118157600080fd5b61118c838383611e67565b505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156111ec57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561122857600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156112c657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561130257600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156113a157600080fd5b600260149054906101000a900460ff1615156113bc57600080fd5b6000600260146101000a81548160ff021916908315150217905550565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561149a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156114d657600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806115c257506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061161a5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561162557600080fd5b60036000600e8110151561163557fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff168110151561166457600080fd5b8060058190555050565b600260149054906101000a900460ff1681565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156116f557600080fd5b919050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806117f157506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806118495750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561185457600080fd5b600260149054906101000a900460ff1615151561187057600080fd5b6001600260146101000a81548160ff021916908315150217905550565b611895612129565b600061189f612129565b60008060006118ad876116fa565b945060008514156118df5760006040518059106118c75750595b908082528060200260200182016040525095506119ba565b846040518059106118ed5750595b908082528060200260200182016040525093506119086110aa565b925060009150600190505b82811115156119b6578673ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156119a95780848381518110151561199257fe5b906020019060200201818152505081806001019250505b8080600101915050611913565b8395505b5050505050919050565b6040805190810160405280600281526020017f434b00000000000000000000000000000000000000000000000000000000000081525081565b600381600e81101515611a0c57fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff16151515611a7b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611ab757600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611af257600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611b4f57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611bac57600080fd5b611bb63382611d39565b1515611bc157600080fd5b611bcc338383611e67565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c7757600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611ce96120ea565b611cf16120ea565b60008084604051805910611d025750595b9080825280601f01601f19166020018201604052509250602083019150859050611d2d82828761209f565b82935050505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff166007600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b806009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008273ffffffffffffffffffffffffffffffffffffffff166009600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515611ffb57600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600a600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556009600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b60005b6020821015156120c757825184526020840193506020830192506020820391506120a2565b6001826020036101000a0390508019835116818551168181178652505050505050565b602060405190810160405280600081525090565b6080604051908101604052806004905b600080191681526020019060019003908161210e5790505090565b6020604051908101604052806000815250905600a165627a7a723058201cb9c25105af52f6034968cb66f70979e661f324fc8a83c5e49fbef038a11cdf0029", + "deployedBytecode": "0x606060405260043610610180576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146101855780630519ce79146101df5780630560ff441461023457806306fdde03146102e4578063095ea7b3146103725780630a0f8168146103b457806318160ddd1461040957806321717ebf1461043257806323b872dd1461048757806327d7874c146104e85780632ba73c15146105215780633f4ba83a1461055a57806346116e6f1461056f578063481af3d3146105d25780634e0a3379146106355780635663896e1461066e5780635c975abb146106915780636352211e146106be57806370a08231146107215780637a7d49371461076e5780638456cb59146107975780638462151c146107ac57806395d89b411461083a5780639d6fac6f146108c8578063a45f4bfc1461090b578063a9059cbb1461096e578063b047fb50146109b0578063bc4006f514610a05578063e17b25af14610a5a578063e6cbe35114610a93575b600080fd5b341561019057600080fd5b6101c560048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050610ae8565b604051808215151515815260200191505060405180910390f35b34156101ea57600080fd5b6101f2610df9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561023f57600080fd5b61026960048080359060200190919080359060200190820180359060200191909192905050610e1f565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102a957808201518184015260208101905061028e565b50505050905090810190601f1680156102d65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156102ef57600080fd5b6102f7610f8a565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561033757808201518184015260208101905061031c565b50505050905090810190601f1680156103645780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561037d57600080fd5b6103b2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610fc3565b005b34156103bf57600080fd5b6103c7611085565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561041457600080fd5b61041c6110aa565b6040518082815260200191505060405180910390f35b341561043d57600080fd5b6104456110ba565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561049257600080fd5b6104e6600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506110e0565b005b34156104f357600080fd5b61051f600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611191565b005b341561052c57600080fd5b610558600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061126b565b005b341561056557600080fd5b61056d611346565b005b341561057a57600080fd5b61059060048080359060200190919050506113d9565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156105dd57600080fd5b6105f3600480803590602001909190505061140c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561064057600080fd5b61066c600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061143f565b005b341561067957600080fd5b61068f600480803590602001909190505061151a565b005b341561069c57600080fd5b6106a461166e565b604051808215151515815260200191505060405180910390f35b34156106c957600080fd5b6106df6004808035906020019091905050611681565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561072c57600080fd5b610758600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506116fa565b6040518082815260200191505060405180910390f35b341561077957600080fd5b610781611743565b6040518082815260200191505060405180910390f35b34156107a257600080fd5b6107aa611749565b005b34156107b757600080fd5b6107e3600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061188d565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561082657808201518184015260208101905061080b565b505050509050019250505060405180910390f35b341561084557600080fd5b61084d6119c4565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561088d578082015181840152602081019050610872565b50505050905090810190601f1680156108ba5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156108d357600080fd5b6108e960048080359060200190919050506119fd565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b341561091657600080fd5b61092c6004808035906020019091905050611a2c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561097957600080fd5b6109ae600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611a5f565b005b34156109bb57600080fd5b6109c3611bd0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610a1057600080fd5b610a18611bf6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610a6557600080fd5b610a91600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611c1c565b005b3415610a9e57600080fd5b610aa6611cbb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b600060405180807f737570706f727473496e74657266616365286279746573342900000000000000815250601901905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610df2575060405180807f746f6b656e4d657461646174612875696e743235362c737472696e6729000000815250601d019050604051809103902060405180807f746f6b656e734f664f776e6572286164647265737329000000000000000000008152506016019050604051809103902060405180807f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81526020017f74323536290000000000000000000000000000000000000000000000000000008152506025019050604051809103902060405180807f7472616e7366657228616464726573732c75696e7432353629000000000000008152506019019050604051809103902060405180807f617070726f766528616464726573732c75696e743235362900000000000000008152506018019050604051809103902060405180807f6f776e65724f662875696e7432353629000000000000000000000000000000008152506010019050604051809103902060405180807f62616c616e63654f6628616464726573732900000000000000000000000000008152506012019050604051809103902060405180807f746f74616c537570706c79282900000000000000000000000000000000000000815250600d019050604051809103902060405180807f73796d626f6c28290000000000000000000000000000000000000000000000008152506008019050604051809103902060405180807f6e616d6528290000000000000000000000000000000000000000000000000000815250600601905060405180910390201818181818181818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610e276120ea565b610e2f6120fe565b60008073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515610e8e57600080fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb4799f2878787600060405160a001526040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180848152602001806020018281038252848482818152602001925080828437820191505094505050505060a060405180830381600087803b1515610f4957600080fd5b6102c65a03f11515610f5a57600080fd5b505050604051806080018051906020016040528092508193505050610f7f8282611ce1565b925050509392505050565b6040805190810160405280600d81526020017f43727970746f4b6974746965730000000000000000000000000000000000000081525081565b610fcd3382611d39565b1515610fd857600080fd5b610fe28183611da5565b7f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925338383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a15050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160068054905003905090565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561111c57600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561115757600080fd5b6111613382611dfb565b151561116c57600080fd5b6111768382611d39565b151561118157600080fd5b61118c838383611e67565b505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156111ec57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561122857600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156112c657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561130257600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156113a157600080fd5b600260149054906101000a900460ff1615156113bc57600080fd5b6000600260146101000a81548160ff021916908315150217905550565b600a6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60096020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561149a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156114d657600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806115c257506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061161a5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561162557600080fd5b60036000600e8110151561163557fe5b600891828204019190066004029054906101000a900463ffffffff1663ffffffff168110151561166457600080fd5b8060058190555050565b600260149054906101000a900460ff1681565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156116f557600080fd5b919050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60055481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806117f157506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806118495750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561185457600080fd5b600260149054906101000a900460ff1615151561187057600080fd5b6001600260146101000a81548160ff021916908315150217905550565b611895612129565b600061189f612129565b60008060006118ad876116fa565b945060008514156118df5760006040518059106118c75750595b908082528060200260200182016040525095506119ba565b846040518059106118ed5750595b908082528060200260200182016040525093506119086110aa565b925060009150600190505b82811115156119b6578673ffffffffffffffffffffffffffffffffffffffff166007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156119a95780848381518110151561199257fe5b906020019060200201818152505081806001019250505b8080600101915050611913565b8395505b5050505050919050565b6040805190810160405280600281526020017f434b00000000000000000000000000000000000000000000000000000000000081525081565b600381600e81101515611a0c57fe5b60089182820401919006600402915054906101000a900463ffffffff1681565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260149054906101000a900460ff16151515611a7b57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611ab757600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611af257600080fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611b4f57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611bac57600080fd5b611bb63382611d39565b1515611bc157600080fd5b611bcc338383611e67565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c7757600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611ce96120ea565b611cf16120ea565b60008084604051805910611d025750595b9080825280601f01601f19166020018201604052509250602083019150859050611d2d82828761209f565b82935050505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff166007600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b806009600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008273ffffffffffffffffffffffffffffffffffffffff166009600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515611ffb57600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600a600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556009600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390a1505050565b60005b6020821015156120c757825184526020840193506020830192506020820391506120a2565b6001826020036101000a0390508019835116818551168181178652505050505050565b602060405190810160405280600081525090565b6080604051908101604052806004905b600080191681526020019060019003908161210e5790505090565b6020604051908101604052806000815250905600a165627a7a723058201cb9c25105af52f6034968cb66f70979e661f324fc8a83c5e49fbef038a11cdf0029", "sourceMap": "18784:11020:18:-;;;5032:5;5011:26;;;;;;;;;;;;;;;;;;;;11384:339;;;;;;;;;11427:9;11384:339;;;;;;;;11450:9;11384:339;;;;;;;;11473:9;11384:339;;;;;;;;11496:10;11384:339;;;;;;;;11520:10;11384:339;;;;;;;;11544:7;11384:339;;;;;;;;11565:7;11384:339;;;;;;;;11586:7;11384:339;;;;;;;;11607:7;11384:339;;;;;;;;11628:8;11384:339;;;;;;;;11650:6;11384:339;;;;;;;;11670:6;11384:339;;;;;;;;11690:6;11384:339;;;;;;;;11710:6;11384:339;;;;;;;;;;;;;;;:::i;:::-;;11840:2;11807:35;;18784:11020;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;", "deployedSourceMap": "18784:11020:18:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19989:327;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4848:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29456:346;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18924:45:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24204:395:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4817:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25978:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13853:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25066:784;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5800:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;6346;;;;;;;;;;;;;;;;;;;;;;;;;;;;7359:126;;;;;;;;;;;;;;13283:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12965;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6073:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;17342:139;;;;;;;;;;;;;;;;;;;;;;;;;;5011:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26205:180;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22243:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11807:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6990:81;;;;;;;;;;;;;;26841:853;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;18975:36:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11384:339:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12465:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22790:990;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4879:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19070:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20416:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;13564:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19989:327;20060:4;19175:38;;;;;;;;;;;;;;;;;;;20219:41;;;:12;:41;;;;20218:90;;;;19697:42;;;;;;;;;;;;;;;;;;;19647:35;;;;;;;;;;;;;;;;;;;19582:50;;;;;;;;;;;;;;;;;;;;;;;;19529:38;;;;;;;;;;;;;;;;;;;19477:37;;;;;;;;;;;;;;;;;;;19433:29;;;;;;;;;;;;;;;;;;;19387:31;;;;;;;;;;;;;;;;;;;19346:26;;;;;;;;;;;;;;;;;;;19310:21;;;;;;;;;;;;;;;;;;;19276:19;;;;;;;;;;;;;;;;;;;19269:63;:104;:150;:194;:246;:299;:364;:414;:471;20266:41;;;:12;:41;;;;20218:90;20210:99;;19989:327;;;:::o;4848:25::-;;;;;;;;;;;;;:::o;29456:346::-;29548:14;;:::i;:::-;29621:24;;:::i;:::-;29655:13;29608:1;29582:28;;:14;;;;;;;;;;;:28;;;;29574:37;;;;;;;;29696:14;;;;;;;;;;;:26;;;29723:8;29733:19;;29696:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29678:75;;;;;;;;29771:24;29781:6;29789:5;29771:9;:24::i;:::-;29764:31;;29456:346;;;;;;;:::o;18924:45::-;;;;;;;;;;;;;;;;;;;;:::o;24204:395::-;24384:27;24390:10;24402:8;24384:5;:27::i;:::-;24376:36;;;;;;;;24491:23;24500:8;24510:3;24491:8;:23::i;:::-;24557:35;24566:10;24578:3;24583:8;24557:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24204:395;;:::o;4817:25::-;;;;;;;;;;;;;:::o;25978:92::-;26022:4;26062:1;26045:7;:14;;;;:18;26038:25;;25978:92;:::o;13853:39::-;;;;;;;;;;;;;:::o;25066:784::-;25305:1;25290:17;;:3;:17;;;;25282:26;;;;;;;;25563:4;25548:20;;:3;:20;;;;25540:29;;;;;;;;25637:34;25650:10;25662:8;25637:12;:34::i;:::-;25629:43;;;;;;;;25690:22;25696:5;25703:8;25690:5;:22::i;:::-;25682:31;;;;;;;;25812;25822:5;25829:3;25834:8;25812:9;:31::i;:::-;25066:784;;;:::o;5800:128::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;5887:1;5868:21;;:7;:21;;;;5860:30;;;;;;;;5914:7;5901:10;;:20;;;;;;;;;;;;;;;;;;5800:128;:::o;6346:::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;6433:1;6414:21;;:7;:21;;;;6406:30;;;;;;;;6460:7;6447:10;;:20;;;;;;;;;;;;;;;;;;6346:128;:::o;7359:126::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;6812:6;;;;;;;;;;;6804:15;;;;;;;;7473:5;7464:6;;:14;;;;;;;;;;;;;;;;;;7359:126::o;13283:56::-;;;;;;;;;;;;;;;;;;;;;;:::o;12965:::-;;;;;;;;;;;;;;;;;;;;;;:::o;6073:128::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;6160:1;6141:21;;:7;:21;;;;6133:30;;;;;;;;6187:7;6174:10;;:20;;;;;;;;;;;;;;;;;;6073:128;:::o;17342:139::-;5537:10;;;;;;;;;;;5523:24;;:10;:24;;;:64;;;;5577:10;;;;;;;;;;;5563:24;;:10;:24;;;5523:64;:104;;;;5617:10;;;;;;;;;;;5603:24;;:10;:24;;;5523:104;5502:135;;;;;;;;17429:9;17439:1;17429:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17422:19;;:4;:19;17414:28;;;;;;;;17470:4;17452:15;:22;;;;17342:139;:::o;5011:26::-;;;;;;;;;;;;;:::o;26205:180::-;26275:13;26312:17;:27;26330:8;26312:27;;;;;;;;;;;;;;;;;;;;;26304:35;;26375:1;26358:19;;:5;:19;;;;26350:28;;;;;;;;26205:180;;;:::o;22243:122::-;22299:13;22331:19;:27;22351:6;22331:27;;;;;;;;;;;;;;;;22324:34;;22243:122;;;:::o;11807:35::-;;;;:::o;6990:81::-;5537:10;;;;;;;;;;;5523:24;;:10;:24;;;:64;;;;5577:10;;;;;;;;;;;5563:24;;:10;:24;;;5523:64;:104;;;;5617:10;;;;;;;;;;;5603:24;;:10;:24;;;5523:104;5502:135;;;;;;;;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;7060:4;7051:6;;:13;;;;;;;;;;;;;;;;;;6990:81::o;26841:853::-;26902:21;;:::i;:::-;26935:18;27110:23;;:::i;:::-;27175:17;27222:19;27402:13;26956:17;26966:6;26956:9;:17::i;:::-;26935:38;;27002:1;26988:10;:15;26984:704;;;27077:1;27063:16;;;;;;;;;;;;;;;;;;;;;;;;27056:23;;;;26984:704;27150:10;27136:25;;;;;;;;;;;;;;;;;;;;;;;;27110:51;;27195:13;:11;:13::i;:::-;27175:33;;27244:1;27222:23;;27443:1;27435:9;;27430:220;27455:9;27446:5;:18;;27430:220;;;27525:6;27497:34;;:17;:24;27515:5;27497:24;;;;;;;;;;;;;;;;;;;;;:34;;;27493:143;;;27577:5;27555:6;27562:11;27555:19;;;;;;;;;;;;;;;;;:27;;;;;27604:13;;;;;;;27493:143;27466:7;;;;;;;27430:220;;;27671:6;27664:13;;26841:853;;;;;;;;;:::o;18975:36::-;;;;;;;;;;;;;;;;;;;;:::o;11384:339::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;12465:53::-;;;;;;;;;;;;;;;;;;;;;;:::o;22790:990::-;6671:6;;;;;;;;;;;6670:7;6662:16;;;;;;;;22999:1;22984:17;;:3;:17;;;;22976:26;;;;;;;;23257:4;23242:20;;:3;:20;;;;23234:29;;;;;;;;23498:11;;;;;;;;;;;23483:27;;:3;:27;;;;23475:36;;;;;;;;23544:13;;;;;;;;;;;23529:29;;:3;:29;;;;23521:38;;;;;;;;23621:27;23627:10;23639:8;23621:5;:27::i;:::-;23613:36;;;;;;;;23737;23747:10;23759:3;23764:8;23737:9;:36::i;:::-;22790:990;;:::o;4879:25::-;;;;;;;;;;;;;:::o;19070:43::-;;;;;;;;;;;;;:::o;20416:142::-;5151:10;;;;;;;;;;;5137:24;;:10;:24;;;5129:33;;;;;;;;20534:16;20495:14;;:56;;;;;;;;;;;;;;;;;;20416:142;:::o;13564:35::-;;;;;;;;;;;;;:::o;28808:403::-;28894:6;;:::i;:::-;28912:16;;:::i;:::-;28966:17;28993:16;28942:13;28931:25;;;;;;;;;;;;;;;;;;;;;;;;;;;28912:44;;29074:2;29060:12;29056:3;29043:34;;29102:9;29090:21;;29131:43;29139:9;29150:8;29160:13;29131:7;:43::i;:::-;29192:12;29185:19;;28808:403;;;;;;;:::o;20967:145::-;21042:4;21096:9;21065:40;;:17;:27;21083:8;21065:27;;;;;;;;;;;;;;;;;;;;;:40;;;21058:47;;20967:145;;;;:::o;21944:123::-;22051:9;22018:20;:30;22039:8;22018:30;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;21944:123;;:::o;21346:155::-;21428:4;21485:9;21451:43;;:20;:30;21472:8;21451:30;;;;;;;;;;;;;;;;;;;;;:43;;;21444:50;;21346:155;;;;:::o;13965:758::-;14129:19;:24;14149:3;14129:24;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;14225:3;14195:17;:27;14213:8;14195:27;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;14345:1;14328:19;;:5;:19;;;;14324:317;;;14363:19;:26;14383:5;14363:26;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;14485:20;:30;14506:8;14485:30;;;;;;;;;;;;14478:37;;;;;;;;;;;14600:20;:30;14621:8;14600:30;;;;;;;;;;;;14593:37;;;;;;;;;;;14324:317;14686:30;14695:5;14702:3;14707:8;14686:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13965:758;;;:::o;27965:565::-;28301:12;28089:170;28103:2;28095:4;:10;;28089:170;;;28180:4;28174:5;28167;28160:6;28222:2;28213:11;;;;28246:2;28238:10;;;;28115:2;28107:10;;;;28089:170;;;28337:1;28329:4;28324:2;:9;28316:3;:18;:22;28301:37;;28407:4;28403:3;28396:4;28390:5;28386:3;28460:4;28452:5;28446;28442:3;28505:7;28495:8;28492:2;28485:5;28478:6;28357:167;;;;;;:::o;18784:11020::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o", "source": "pragma solidity 0.4.18;\n\n/**\n The following contract code, titled KittyCore, was written by Cryptokitties and published\n and retrieved from https://etherscan.io/address/0x06012c8cf97bead5deae237070f9587f8e7a266d#code.\n\n It is included in the current project for test purposes, to ensure that our collateralizer can\n handle ERC721 tokens created by the KittyCore contract.\n*/\n\n/**\n * @title KittiesOwnable\n * @dev The KittiesOwnable contract has an owner address, and provides basic authorization control\n * functions, this simplifies the implementation of \"user permissions\".\n */\ncontract KittiesOwnable {\n address public owner;\n\n\n /**\n\t * @dev The KittiesOwnable constructor sets the original `owner` of the contract to the sender\n\t * account.\n\t */\n function KittiesOwnable() {\n owner = msg.sender;\n }\n\n\n /**\n\t * @dev Throws if called by any account other than the owner.\n\t */\n modifier onlyOwner() {\n require(msg.sender == owner);\n _;\n }\n\n\n /**\n\t * @dev Allows the current owner to transfer control of the contract to a newOwner.\n\t * @param newOwner The address to transfer ownership to.\n\t */\n function transferOwnership(address newOwner) onlyOwner {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n\n}\n\n\n\n/// @title Interface for contracts conforming to ERC-721: Non-Fungible Tokens\n/// @author Dieter Shirley (https://github.com/dete)\ncontract KittiesERC721 {\n // Required methods\n function totalSupply() public view returns (uint256 total);\n function balanceOf(address _owner) public view returns (uint256 balance);\n function ownerOf(uint256 _tokenId) external view returns (address owner);\n function approve(address _to, uint256 _tokenId) external;\n function transfer(address _to, uint256 _tokenId) external;\n function transferFrom(address _from, address _to, uint256 _tokenId) external;\n\n // Events\n event Transfer(address from, address to, uint256 tokenId);\n event Approval(address owner, address approved, uint256 tokenId);\n\n // Optional\n // function name() public view returns (string name);\n // function symbol() public view returns (string symbol);\n // function tokensOfOwner(address _owner) external view returns (uint256[] tokenIds);\n // function tokenMetadata(uint256 _tokenId, string _preferredTransport) public view returns (string infoUrl);\n\n // ERC-165 Compatibility (https://github.com/ethereum/EIPs/issues/165)\n function supportsInterface(bytes4 _interfaceID) external view returns (bool);\n}\n\n\n// // Auction wrapper functions\n\n\n// Auction wrapper functions\n\n\n\n\n\n\n\n/// @title SEKRETOOOO\ncontract GeneScienceInterface {\n /// @dev simply a boolean to indicate this is the contract we expect to be\n function isGeneScience() public pure returns (bool);\n\n /// @dev given genes of kitten 1 & 2, return a genetic combination - may have a random factor\n /// @param genes1 genes of mom\n /// @param genes2 genes of sire\n /// @return the genes that are supposed to be passed down the child\n function mixGenes(uint256 genes1, uint256 genes2, uint256 targetBlock) public returns (uint256);\n}\n\n\n\n\n\n\n\n/// @title A facet of KittyCore that manages special access privileges.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyAccessControl {\n // This facet controls access control for CryptoKitties. There are four roles managed here:\n //\n // - The CEO: The CEO can reassign other roles and change the addresses of our dependent smart\n // contracts. It is also the only role that can unpause the smart contract. It is initially\n // set to the address that created the smart contract in the KittyCore constructor.\n //\n // - The CFO: The CFO can withdraw funds from KittyCore and its auction contracts.\n //\n // - The COO: The COO can release gen0 kitties to auction, and mint promo cats.\n //\n // It should be noted that these roles are distinct without overlap in their access abilities, the\n // abilities listed for each role above are exhaustive. In particular, while the CEO can assign any\n // address to any role, the CEO address itself doesn't have the ability to act in those roles. This\n // restriction is intentional so that we aren't tempted to use the CEO address frequently out of\n // convenience. The less we use an address, the less likely it is that we somehow compromise the\n // account.\n\n /// @dev Emited when contract is upgraded - See README.md for updgrade plan\n event ContractUpgrade(address newContract);\n\n // The addresses of the accounts (or contracts) that can execute actions within each roles.\n address public ceoAddress;\n address public cfoAddress;\n address public cooAddress;\n\n // @dev Keeps track whether the contract is paused. When that is true, most actions are blocked\n bool public paused = false;\n\n /// @dev Access modifier for CEO-only functionality\n modifier onlyCEO() {\n require(msg.sender == ceoAddress);\n _;\n }\n\n /// @dev Access modifier for CFO-only functionality\n modifier onlyCFO() {\n require(msg.sender == cfoAddress);\n _;\n }\n\n /// @dev Access modifier for COO-only functionality\n modifier onlyCOO() {\n require(msg.sender == cooAddress);\n _;\n }\n\n modifier onlyCLevel() {\n require(\n msg.sender == cooAddress ||\n msg.sender == ceoAddress ||\n msg.sender == cfoAddress\n );\n _;\n }\n\n /// @dev Assigns a new address to act as the CEO. Only available to the current CEO.\n /// @param _newCEO The address of the new CEO\n function setCEO(address _newCEO) external onlyCEO {\n require(_newCEO != address(0));\n\n ceoAddress = _newCEO;\n }\n\n /// @dev Assigns a new address to act as the CFO. Only available to the current CEO.\n /// @param _newCFO The address of the new CFO\n function setCFO(address _newCFO) external onlyCEO {\n require(_newCFO != address(0));\n\n cfoAddress = _newCFO;\n }\n\n /// @dev Assigns a new address to act as the COO. Only available to the current CEO.\n /// @param _newCOO The address of the new COO\n function setCOO(address _newCOO) external onlyCEO {\n require(_newCOO != address(0));\n\n cooAddress = _newCOO;\n }\n\n /*** KittiesPausable functionality adapted from OpenZeppelin ***/\n\n /// @dev Modifier to allow actions only when the contract IS NOT paused\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /// @dev Modifier to allow actions only when the contract IS paused\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /// @dev Called by any \"C-level\" role to pause the contract. Used only when\n /// a bug or exploit is detected and we need to limit damage.\n function pause() external onlyCLevel whenNotPaused {\n paused = true;\n }\n\n /// @dev Unpauses the smart contract. Can only be called by the CEO, since\n /// one reason we may pause the contract is when CFO or COO accounts are\n /// compromised.\n /// @notice This is public rather than external so it can be called by\n /// derived contracts.\n function unpause() public onlyCEO whenPaused {\n // can't unpause if contract was upgraded\n paused = false;\n }\n}\n\n\n\n\n/// @title Base contract for CryptoKitties. Holds all common structs, events and base variables.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBase is KittyAccessControl {\n /*** EVENTS ***/\n\n /// @dev The Birth event is fired whenever a new kitten comes into existence. This obviously\n /// includes any time a cat is created through the giveBirth method, but it is also called\n /// when a new gen0 cat is created.\n event Birth(address owner, uint256 kittyId, uint256 matronId, uint256 sireId, uint256 genes);\n\n /// @dev Transfer event as defined in current draft of ERC721. Emitted every time a kitten\n /// ownership is assigned, including births.\n event Transfer(address from, address to, uint256 tokenId);\n\n /*** DATA TYPES ***/\n\n /// @dev The main Kitty struct. Every cat in CryptoKitties is represented by a copy\n /// of this structure, so great care was taken to ensure that it fits neatly into\n /// exactly two 256-bit words. Note that the order of the members in this structure\n /// is important because of the byte-packing rules used by Ethereum.\n /// Ref: http://solidity.readthedocs.io/en/develop/miscellaneous.html\n struct Kitty {\n // The Kitty's genetic code is packed into these 256-bits, the format is\n // sooper-sekret! A cat's genes never change.\n uint256 genes;\n\n // The timestamp from the block when this cat came into existence.\n uint64 birthTime;\n\n // The minimum timestamp after which this cat can engage in breeding\n // activities again. This same timestamp is used for the pregnancy\n // timer (for matrons) as well as the siring cooldown.\n uint64 cooldownEndBlock;\n\n // The ID of the parents of this kitty, set to 0 for gen0 cats.\n // Note that using 32-bit unsigned integers limits us to a \"mere\"\n // 4 billion cats. This number might seem small until you realize\n // that Ethereum currently has a limit of about 500 million\n // transactions per year! So, this definitely won't be a problem\n // for several years (even as Ethereum learns to scale).\n uint32 matronId;\n uint32 sireId;\n\n // Set to the ID of the sire cat for matrons that are pregnant,\n // zero otherwise. A non-zero value here is how we know a cat\n // is pregnant. Used to retrieve the genetic material for the new\n // kitten when the birth transpires.\n uint32 siringWithId;\n\n // Set to the index in the cooldown array (see below) that represents\n // the current cooldown duration for this Kitty. This starts at zero\n // for gen0 cats, and is initialized to floor(generation/2) for others.\n // Incremented by one for each successful breeding action, regardless\n // of whether this cat is acting as matron or sire.\n uint16 cooldownIndex;\n\n // The \"generation number\" of this cat. Cats minted by the CK contract\n // for sale are called \"gen0\" and have a generation number of 0. The\n // generation number of all other cats is the larger of the two generation\n // numbers of their parents, plus one.\n // (i.e. max(matron.generation, sire.generation) + 1)\n uint16 generation;\n }\n\n /*** CONSTANTS ***/\n\n /// @dev A lookup table indicating the cooldown duration after any successful\n /// breeding action, called \"pregnancy time\" for matrons and \"siring cooldown\"\n /// for sires. Designed such that the cooldown roughly doubles each time a cat\n /// is bred, encouraging owners not to just keep breeding the same cat over\n /// and over again. Caps out at one week (a cat can breed an unbounded number\n /// of times, and the maximum cooldown is always seven days).\n uint32[14] public cooldowns = [\n uint32(1 minutes),\n uint32(2 minutes),\n uint32(5 minutes),\n uint32(10 minutes),\n uint32(30 minutes),\n uint32(1 hours),\n uint32(2 hours),\n uint32(4 hours),\n uint32(8 hours),\n uint32(16 hours),\n uint32(1 days),\n uint32(2 days),\n uint32(4 days),\n uint32(7 days)\n ];\n\n // An approximation of currently how many seconds are in between blocks.\n uint256 public secondsPerBlock = 15;\n\n /*** STORAGE ***/\n\n /// @dev An array containing the Kitty struct for all Kitties in existence. The ID\n /// of each cat is actually an index into this array. Note that ID 0 is a negacat,\n /// the unKitty, the mythical beast that is the parent of all gen0 cats. A bizarre\n /// creature that is both matron and sire... to itself! Has an invalid genetic code.\n /// In other words, cat ID 0 is invalid... ;-)\n Kitty[] kitties;\n\n /// @dev A mapping from cat IDs to the address that owns them. All cats have\n /// some valid owner address, even gen0 cats are created with a non-zero owner.\n mapping (uint256 => address) public kittyIndexToOwner;\n\n // @dev A mapping from owner address to count of tokens that address owns.\n // Used internally inside balanceOf() to resolve ownership count.\n mapping (address => uint256) ownershipTokenCount;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to call\n /// transferFrom(). Each Kitty can only have one approved address for transfer\n /// at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public kittyIndexToApproved;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to use\n /// this Kitty for siring via breedWith(). Each Kitty can only have one approved\n /// address for siring at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public sireAllowedToAddress;\n\n /// @dev The address of the ClockAuction contract that handles sales of Kitties. This\n /// same contract handles both peer-to-peer sales as well as the gen0 sales which are\n /// initiated every 15 minutes.\n SaleClockAuction public saleAuction;\n\n /// @dev The address of a custom ClockAuction subclassed contract that handles siring\n /// auctions. Needs to be separate from saleAuction because the actions taken on success\n /// after a sales and siring auction are quite different.\n SiringClockAuction public siringAuction;\n\n /// @dev Assigns ownership of a specific Kitty to an address.\n function _transfer(address _from, address _to, uint256 _tokenId) internal {\n // Since the number of kittens is capped to 2^32 we can't overflow this\n ownershipTokenCount[_to]++;\n // transfer ownership\n kittyIndexToOwner[_tokenId] = _to;\n // When creating new kittens _from is 0x0, but we can't account that address.\n if (_from != address(0)) {\n ownershipTokenCount[_from]--;\n // once the kitten is transferred also clear sire allowances\n delete sireAllowedToAddress[_tokenId];\n // clear any previously approved ownership exchange\n delete kittyIndexToApproved[_tokenId];\n }\n // Emit the transfer event.\n Transfer(_from, _to, _tokenId);\n }\n\n /// @dev An internal method that creates a new kitty and stores it. This\n /// method doesn't do any checking and should only be called when the\n /// input data is known to be valid. Will generate both a Birth event\n /// and a Transfer event.\n /// @param _matronId The kitty ID of the matron of this cat (zero for gen0)\n /// @param _sireId The kitty ID of the sire of this cat (zero for gen0)\n /// @param _generation The generation number of this cat, must be computed by caller.\n /// @param _genes The kitty's genetic code.\n /// @param _owner The inital owner of this cat, must be non-zero (except for the unKitty, ID 0)\n function _createKitty(\n uint256 _matronId,\n uint256 _sireId,\n uint256 _generation,\n uint256 _genes,\n address _owner\n )\n internal\n returns (uint)\n {\n // These requires are not strictly necessary, our calling code should make\n // sure that these conditions are never broken. However! _createKitty() is already\n // an expensive call (for storage), and it doesn't hurt to be especially careful\n // to ensure our data structures are always valid.\n require(_matronId == uint256(uint32(_matronId)));\n require(_sireId == uint256(uint32(_sireId)));\n require(_generation == uint256(uint16(_generation)));\n\n // New kitty starts with the same cooldown as parent gen/2\n uint16 cooldownIndex = uint16(_generation / 2);\n if (cooldownIndex > 13) {\n cooldownIndex = 13;\n }\n\n Kitty memory _kitty = Kitty({\n genes: _genes,\n birthTime: uint64(now),\n cooldownEndBlock: 0,\n matronId: uint32(_matronId),\n sireId: uint32(_sireId),\n siringWithId: 0,\n cooldownIndex: cooldownIndex,\n generation: uint16(_generation)\n });\n uint256 newKittenId = kitties.push(_kitty) - 1;\n\n // It's probably never going to happen, 4 billion cats is A LOT, but\n // let's just be 100% sure we never let this happen.\n require(newKittenId == uint256(uint32(newKittenId)));\n\n // emit the birth event\n Birth(\n _owner,\n newKittenId,\n uint256(_kitty.matronId),\n uint256(_kitty.sireId),\n _kitty.genes\n );\n\n // This will assign ownership, and also emit the Transfer event as\n // per ERC721 draft\n _transfer(0, _owner, newKittenId);\n\n return newKittenId;\n }\n\n // Any C-level can fix how many seconds per blocks are currently observed.\n function setSecondsPerBlock(uint256 secs) external onlyCLevel {\n require(secs < cooldowns[0]);\n secondsPerBlock = secs;\n }\n}\n\n\n\n\n\n/// @title The external contract that is responsible for generating metadata for the kitties,\n/// it has one function that will return the data as bytes.\ncontract KittiesERC721Metadata {\n /// @dev Given a token Id, returns a byte array that is supposed to be converted into string.\n function getMetadata(uint256 _tokenId, string) public view returns (bytes32[4] buffer, uint256 count) {\n if (_tokenId == 1) {\n buffer[0] = \"Hello World! :D\";\n count = 15;\n } else if (_tokenId == 2) {\n buffer[0] = \"I would definitely choose a medi\";\n buffer[1] = \"um length string.\";\n count = 49;\n } else if (_tokenId == 3) {\n buffer[0] = \"Lorem ipsum dolor sit amet, mi e\";\n buffer[1] = \"st accumsan dapibus augue lorem,\";\n buffer[2] = \" tristique vestibulum id, libero\";\n buffer[3] = \" suscipit varius sapien aliquam.\";\n count = 128;\n }\n }\n}\n\n\n/// @title The facet of the CryptoKitties core contract that manages ownership, ERC-721 (draft) compliant.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev Ref: https://github.com/ethereum/EIPs/issues/721\n/// See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyOwnership is KittyBase, KittiesERC721 {\n\n /// @notice Name and symbol of the non fungible token, as defined in ERC721.\n string public constant name = \"CryptoKitties\";\n string public constant symbol = \"CK\";\n\n // The contract that will return kitty metadata\n KittiesERC721Metadata public erc721Metadata;\n\n bytes4 constant InterfaceSignature_ERC165 =\n bytes4(keccak256('supportsInterface(bytes4)'));\n\n bytes4 constant InterfaceSignature_ERC721 =\n bytes4(keccak256('name()')) ^\n bytes4(keccak256('symbol()')) ^\n bytes4(keccak256('totalSupply()')) ^\n bytes4(keccak256('balanceOf(address)')) ^\n bytes4(keccak256('ownerOf(uint256)')) ^\n bytes4(keccak256('approve(address,uint256)')) ^\n bytes4(keccak256('transfer(address,uint256)')) ^\n bytes4(keccak256('transferFrom(address,address,uint256)')) ^\n bytes4(keccak256('tokensOfOwner(address)')) ^\n bytes4(keccak256('tokenMetadata(uint256,string)'));\n\n /// @notice Introspection interface as per ERC-165 (https://github.com/ethereum/EIPs/issues/165).\n /// Returns true for any standardized interfaces implemented by this contract. We implement\n /// ERC-165 (obviously!) and ERC-721.\n function supportsInterface(bytes4 _interfaceID) external view returns (bool)\n {\n // DEBUG ONLY\n //require((InterfaceSignature_ERC165 == 0x01ffc9a7) && (InterfaceSignature_ERC721 == 0x9a20483d));\n\n return ((_interfaceID == InterfaceSignature_ERC165) || (_interfaceID == InterfaceSignature_ERC721));\n }\n\n /// @dev Set the address of the sibling contract that tracks metadata.\n /// CEO only.\n function setMetadataAddress(address _contractAddress) public onlyCEO {\n erc721Metadata = KittiesERC721Metadata(_contractAddress);\n }\n\n // Internal utility functions: These functions all assume that their input arguments\n // are valid. We leave it to public methods to sanitize their inputs and follow\n // the required logic.\n\n /// @dev Checks if a given address is the current owner of a particular Kitty.\n /// @param _claimant the address we are validating against.\n /// @param _tokenId kitten id, only valid when > 0\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToOwner[_tokenId] == _claimant;\n }\n\n /// @dev Checks if a given address currently has transferApproval for a particular Kitty.\n /// @param _claimant the address we are confirming kitten is approved for.\n /// @param _tokenId kitten id, only valid when > 0\n function _approvedFor(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToApproved[_tokenId] == _claimant;\n }\n\n /// @dev Marks an address as being approved for transferFrom(), overwriting any previous\n /// approval. Setting _approved to address(0) clears all transfer approval.\n /// NOTE: _approve() does NOT send the Approval event. This is intentional because\n /// _approve() and transferFrom() are used together for putting Kitties on auction, and\n /// there is no value in spamming the log with Approval events in that case.\n function _approve(uint256 _tokenId, address _approved) internal {\n kittyIndexToApproved[_tokenId] = _approved;\n }\n\n /// @notice Returns the number of Kitties owned by a specific address.\n /// @param _owner The owner address to check.\n /// @dev Required for ERC-721 compliance\n function balanceOf(address _owner) public view returns (uint256 count) {\n return ownershipTokenCount[_owner];\n }\n\n /// @notice Transfers a Kitty to another address. If transferring to a smart\n /// contract be VERY CAREFUL to ensure that it is aware of ERC-721 (or\n /// CryptoKitties specifically) or your Kitty may be lost forever. Seriously.\n /// @param _to The address of the recipient, can be a user or contract.\n /// @param _tokenId The ID of the Kitty to transfer.\n /// @dev Required for ERC-721 compliance.\n function transfer(\n address _to,\n uint256 _tokenId\n )\n external\n whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Disallow transfers to the auction contracts to prevent accidental\n // misuse. Auction contracts should only take ownership of kitties\n // through the allow + transferFrom flow.\n require(_to != address(saleAuction));\n require(_to != address(siringAuction));\n\n // You can only send your own cat.\n require(_owns(msg.sender, _tokenId));\n\n // Reassign ownership, clear pending approvals, emit Transfer event.\n _transfer(msg.sender, _to, _tokenId);\n }\n\n /// @notice Grant another address the right to transfer a specific Kitty via\n /// transferFrom(). This is the preferred flow for transfering NFTs to contracts.\n /// @param _to The address to be granted transfer approval. Pass address(0) to\n /// clear all approvals.\n /// @param _tokenId The ID of the Kitty that can be transferred if this call succeeds.\n /// @dev Required for ERC-721 compliance.\n function approve(\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Only an owner can grant transfer approval.\n require(_owns(msg.sender, _tokenId));\n\n // Register the approval (replacing any previous approval).\n _approve(_tokenId, _to);\n\n // Emit approval event.\n Approval(msg.sender, _to, _tokenId);\n }\n\n /// @notice Transfer a Kitty owned by another address, for which the calling address\n /// has previously been granted transfer approval by the owner.\n /// @param _from The address that owns the Kitty to be transfered.\n /// @param _to The address that should take ownership of the Kitty. Can be any address,\n /// including the caller.\n /// @param _tokenId The ID of the Kitty to be transferred.\n /// @dev Required for ERC-721 compliance.\n function transferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Check for approval and valid ownership\n require(_approvedFor(msg.sender, _tokenId));\n require(_owns(_from, _tokenId));\n\n // Reassign ownership (also clears pending approvals and emits Transfer event).\n _transfer(_from, _to, _tokenId);\n }\n\n /// @notice Returns the total number of Kitties currently in existence.\n /// @dev Required for ERC-721 compliance.\n function totalSupply() public view returns (uint) {\n return kitties.length - 1;\n }\n\n /// @notice Returns the address currently assigned ownership of a given Kitty.\n /// @dev Required for ERC-721 compliance.\n function ownerOf(uint256 _tokenId)\n external\n view\n returns (address owner)\n {\n owner = kittyIndexToOwner[_tokenId];\n\n require(owner != address(0));\n }\n\n /// @notice Returns a list of all Kitty IDs assigned to an address.\n /// @param _owner The owner whose Kitties we are interested in.\n /// @dev This method MUST NEVER be called by smart contract code. First, it's fairly\n /// expensive (it walks the entire Kitty array looking for cats belonging to owner),\n /// but it also returns a dynamic array, which is only supported for web3 calls, and\n /// not contract-to-contract calls.\n function tokensOfOwner(address _owner) external view returns(uint256[] ownerTokens) {\n uint256 tokenCount = balanceOf(_owner);\n\n if (tokenCount == 0) {\n // Return an empty array\n return new uint256[](0);\n } else {\n uint256[] memory result = new uint256[](tokenCount);\n uint256 totalCats = totalSupply();\n uint256 resultIndex = 0;\n\n // We count on the fact that all cats have IDs starting at 1 and increasing\n // sequentially up to the totalCat count.\n uint256 catId;\n\n for (catId = 1; catId <= totalCats; catId++) {\n if (kittyIndexToOwner[catId] == _owner) {\n result[resultIndex] = catId;\n resultIndex++;\n }\n }\n\n return result;\n }\n }\n\n /// @dev Adapted from memcpy() by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _memcpy(uint _dest, uint _src, uint _len) private view {\n // Copy word-length chunks while possible\n for(; _len >= 32; _len -= 32) {\n assembly {\n mstore(_dest, mload(_src))\n }\n _dest += 32;\n _src += 32;\n }\n\n // Copy remaining bytes\n uint256 mask = 256 ** (32 - _len) - 1;\n assembly {\n let srcpart := and(mload(_src), not(mask))\n let destpart := and(mload(_dest), mask)\n mstore(_dest, or(destpart, srcpart))\n }\n }\n\n /// @dev Adapted from toString(slice) by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _toString(bytes32[4] _rawBytes, uint256 _stringLength) private view returns (string) {\n var outputString = new string(_stringLength);\n uint256 outputPtr;\n uint256 bytesPtr;\n\n assembly {\n outputPtr := add(outputString, 32)\n bytesPtr := _rawBytes\n }\n\n _memcpy(outputPtr, bytesPtr, _stringLength);\n\n return outputString;\n }\n\n /// @notice Returns a URI pointing to a metadata package for this token conforming to\n /// ERC-721 (https://github.com/ethereum/EIPs/issues/721)\n /// @param _tokenId The ID number of the Kitty whose metadata should be returned.\n function tokenMetadata(uint256 _tokenId, string _preferredTransport) external view returns (string infoUrl) {\n require(erc721Metadata != address(0));\n bytes32[4] memory buffer;\n uint256 count;\n (buffer, count) = erc721Metadata.getMetadata(_tokenId, _preferredTransport);\n\n return _toString(buffer, count);\n }\n}\n\n\n\n/// @title A facet of KittyCore that manages Kitty siring, gestation, and birth.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBreeding is KittyOwnership {\n\n /// @dev The Pregnant event is fired when two cats successfully breed and the pregnancy\n /// timer begins for the matron.\n event Pregnant(address owner, uint256 matronId, uint256 sireId, uint256 cooldownEndBlock);\n\n /// @notice The minimum payment required to use breedWithAuto(). This fee goes towards\n /// the gas cost paid by whatever calls giveBirth(), and can be dynamically updated by\n /// the COO role as the gas price changes.\n uint256 public autoBirthFee = 2 finney;\n\n // Keeps track of number of pregnant kitties.\n uint256 public pregnantKitties;\n\n /// @dev The address of the sibling contract that is used to implement the sooper-sekret\n /// genetic combination algorithm.\n GeneScienceInterface public geneScience;\n\n /// @dev Update the address of the genetic contract, can only be called by the CEO.\n /// @param _address An address of a GeneScience contract instance to be used from this point forward.\n function setGeneScienceAddress(address _address) external onlyCEO {\n GeneScienceInterface candidateContract = GeneScienceInterface(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isGeneScience());\n\n // Set the new contract address\n geneScience = candidateContract;\n }\n\n /// @dev Checks that a given kitten is able to breed. Requires that the\n /// current cooldown is finished (for sires) and also checks that there is\n /// no pending pregnancy.\n function _isReadyToBreed(Kitty _kit) internal view returns (bool) {\n // In addition to checking the cooldownEndBlock, we also need to check to see if\n // the cat has a pending birth; there can be some period of time between the end\n // of the pregnacy timer and the birth event.\n return (_kit.siringWithId == 0) && (_kit.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @dev Check if a sire has authorized breeding with this matron. True if both sire\n /// and matron have the same owner, or if the sire has given siring permission to\n /// the matron's owner (via approveSiring()).\n function _isSiringPermitted(uint256 _sireId, uint256 _matronId) internal view returns (bool) {\n address matronOwner = kittyIndexToOwner[_matronId];\n address sireOwner = kittyIndexToOwner[_sireId];\n\n // Siring is okay if they have same owner, or if the matron's owner was given\n // permission to breed with this sire.\n return (matronOwner == sireOwner || sireAllowedToAddress[_sireId] == matronOwner);\n }\n\n /// @dev Set the cooldownEndTime for the given Kitty, based on its current cooldownIndex.\n /// Also increments the cooldownIndex (unless it has hit the cap).\n /// @param _kitten A reference to the Kitty in storage which needs its timer started.\n function _triggerCooldown(Kitty storage _kitten) internal {\n // Compute an estimation of the cooldown time in blocks (based on current cooldownIndex).\n _kitten.cooldownEndBlock = uint64((cooldowns[_kitten.cooldownIndex]/secondsPerBlock) + block.number);\n\n // Increment the breeding count, clamping it at 13, which is the length of the\n // cooldowns array. We could check the array size dynamically, but hard-coding\n // this as a constant saves gas. Yay, Solidity!\n if (_kitten.cooldownIndex < 13) {\n _kitten.cooldownIndex += 1;\n }\n }\n\n /// @notice Grants approval to another user to sire with one of your Kitties.\n /// @param _addr The address that will be able to sire with your Kitty. Set to\n /// address(0) to clear all siring approvals for this Kitty.\n /// @param _sireId A Kitty that you own that _addr will now be able to sire with.\n function approveSiring(address _addr, uint256 _sireId)\n external\n whenNotPaused\n {\n require(_owns(msg.sender, _sireId));\n sireAllowedToAddress[_sireId] = _addr;\n }\n\n /// @dev Updates the minimum payment required for calling giveBirthAuto(). Can only\n /// be called by the COO address. (This fee is used to offset the gas cost incurred\n /// by the autobirth daemon).\n function setAutoBirthFee(uint256 val) external onlyCOO {\n autoBirthFee = val;\n }\n\n /// @dev Checks to see if a given Kitty is pregnant and (if so) if the gestation\n /// period has passed.\n function _isReadyToGiveBirth(Kitty _matron) private view returns (bool) {\n return (_matron.siringWithId != 0) && (_matron.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @notice Checks that a given kitten is able to breed (i.e. it is not pregnant or\n /// in the middle of a siring cooldown).\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isReadyToBreed(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n Kitty storage kit = kitties[_kittyId];\n return _isReadyToBreed(kit);\n }\n\n /// @dev Checks whether a kitty is currently pregnant.\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isPregnant(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n // A kitty is pregnant if and only if this field is set\n return kitties[_kittyId].siringWithId != 0;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair. DOES NOT\n /// check ownership permissions (that is up to the caller).\n /// @param _matron A reference to the Kitty struct of the potential matron.\n /// @param _matronId The matron's ID.\n /// @param _sire A reference to the Kitty struct of the potential sire.\n /// @param _sireId The sire's ID\n function _isValidMatingPair(\n Kitty storage _matron,\n uint256 _matronId,\n Kitty storage _sire,\n uint256 _sireId\n )\n private\n view\n returns(bool)\n {\n // A Kitty can't breed with itself!\n if (_matronId == _sireId) {\n return false;\n }\n\n // Kitties can't breed with their parents.\n if (_matron.matronId == _sireId || _matron.sireId == _sireId) {\n return false;\n }\n if (_sire.matronId == _matronId || _sire.sireId == _matronId) {\n return false;\n }\n\n // We can short circuit the sibling check (below) if either cat is\n // gen zero (has a matron ID of zero).\n if (_sire.matronId == 0 || _matron.matronId == 0) {\n return true;\n }\n\n // Kitties can't breed with full or half siblings.\n if (_sire.matronId == _matron.matronId || _sire.matronId == _matron.sireId) {\n return false;\n }\n if (_sire.sireId == _matron.matronId || _sire.sireId == _matron.sireId) {\n return false;\n }\n\n // Everything seems cool! Let's get DTF.\n return true;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair for\n /// breeding via auction (i.e. skips ownership and siring approval checks).\n function _canBreedWithViaAuction(uint256 _matronId, uint256 _sireId)\n internal\n view\n returns (bool)\n {\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId);\n }\n\n /// @notice Checks to see if two cats can breed together, including checks for\n /// ownership and siring approvals. Does NOT check that both cats are ready for\n /// breeding (i.e. breedWith could still fail until the cooldowns are finished).\n /// TODO: Shouldn't this check pregnancy and cooldowns?!?\n /// @param _matronId The ID of the proposed matron.\n /// @param _sireId The ID of the proposed sire.\n function canBreedWith(uint256 _matronId, uint256 _sireId)\n external\n view\n returns(bool)\n {\n require(_matronId > 0);\n require(_sireId > 0);\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId) &&\n _isSiringPermitted(_sireId, _matronId);\n }\n\n /// @dev Internal utility function to initiate breeding, assumes that all breeding\n /// requirements have been checked.\n function _breedWith(uint256 _matronId, uint256 _sireId) internal {\n // Grab a reference to the Kitties from storage.\n Kitty storage sire = kitties[_sireId];\n Kitty storage matron = kitties[_matronId];\n\n // Mark the matron as pregnant, keeping track of who the sire is.\n matron.siringWithId = uint32(_sireId);\n\n // Trigger the cooldown for both parents.\n _triggerCooldown(sire);\n _triggerCooldown(matron);\n\n // Clear siring permission for both parents. This may not be strictly necessary\n // but it's likely to avoid confusion!\n delete sireAllowedToAddress[_matronId];\n delete sireAllowedToAddress[_sireId];\n\n // Every time a kitty gets pregnant, counter is incremented.\n pregnantKitties++;\n\n // Emit the pregnancy event.\n Pregnant(kittyIndexToOwner[_matronId], _matronId, _sireId, matron.cooldownEndBlock);\n }\n\n /// @notice Breed a Kitty you own (as matron) with a sire that you own, or for which you\n /// have previously been given Siring approval. Will either make your cat pregnant, or will\n /// fail entirely. Requires a pre-payment of the fee given out to the first caller of giveBirth()\n /// @param _matronId The ID of the Kitty acting as matron (will end up pregnant if successful)\n /// @param _sireId The ID of the Kitty acting as sire (will begin its siring cooldown if successful)\n function breedWithAuto(uint256 _matronId, uint256 _sireId)\n external\n payable\n whenNotPaused\n {\n // Checks for payment.\n require(msg.value >= autoBirthFee);\n\n // Caller must own the matron.\n require(_owns(msg.sender, _matronId));\n\n // Neither sire nor matron are allowed to be on auction during a normal\n // breeding operation, but we don't need to check that explicitly.\n // For matron: The caller of this function can't be the owner of the matron\n // because the owner of a Kitty on auction is the auction house, and the\n // auction house will never call breedWith().\n // For sire: Similarly, a sire on auction will be owned by the auction house\n // and the act of transferring ownership will have cleared any oustanding\n // siring approval.\n // Thus we don't need to spend gas explicitly checking to see if either cat\n // is on auction.\n\n // Check that matron and sire are both owned by caller, or that the sire\n // has given siring permission to caller (i.e. matron's owner).\n // Will fail for _sireId = 0\n require(_isSiringPermitted(_sireId, _matronId));\n\n // Grab a reference to the potential matron\n Kitty storage matron = kitties[_matronId];\n\n // Make sure matron isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(matron));\n\n // Grab a reference to the potential sire\n Kitty storage sire = kitties[_sireId];\n\n // Make sure sire isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(sire));\n\n // Test that these cats are a valid mating pair.\n require(_isValidMatingPair(\n matron,\n _matronId,\n sire,\n _sireId\n ));\n\n // All checks passed, kitty gets pregnant!\n _breedWith(_matronId, _sireId);\n }\n\n /// @notice Have a pregnant Kitty give birth!\n /// @param _matronId A Kitty ready to give birth.\n /// @return The Kitty ID of the new kitten.\n /// @dev Looks at a given Kitty and, if pregnant and if the gestation period has passed,\n /// combines the genes of the two parents to create a new kitten. The new Kitty is assigned\n /// to the current owner of the matron. Upon successful completion, both the matron and the\n /// new kitten will be ready to breed again. Note that anyone can call this function (if they\n /// are willing to pay the gas!), but the new kitten always goes to the mother's owner.\n function giveBirth(uint256 _matronId)\n external\n whenNotPaused\n returns(uint256)\n {\n // Grab a reference to the matron in storage.\n Kitty storage matron = kitties[_matronId];\n\n // Check that the matron is a valid cat.\n require(matron.birthTime != 0);\n\n // Check that the matron is pregnant, and that its time has come!\n require(_isReadyToGiveBirth(matron));\n\n // Grab a reference to the sire in storage.\n uint256 sireId = matron.siringWithId;\n Kitty storage sire = kitties[sireId];\n\n // Determine the higher generation number of the two parents\n uint16 parentGen = matron.generation;\n if (sire.generation > matron.generation) {\n parentGen = sire.generation;\n }\n\n // Call the sooper-sekret gene mixing operation.\n uint256 childGenes = geneScience.mixGenes(matron.genes, sire.genes, matron.cooldownEndBlock - 1);\n\n // Make the new kitten!\n address owner = kittyIndexToOwner[_matronId];\n uint256 kittenId = _createKitty(_matronId, matron.siringWithId, parentGen + 1, childGenes, owner);\n\n // Clear the reference to sire from the matron (REQUIRED! Having siringWithId\n // set is what marks a matron as being pregnant.)\n delete matron.siringWithId;\n\n // Every time a kitty gives birth counter is decremented.\n pregnantKitties--;\n\n // Send the balance fee to the person who made birth happen.\n msg.sender.send(autoBirthFee);\n\n // return the new kitten's ID\n return kittenId;\n }\n}\n\n\n\n\n\n\n\n\n\n\n/// @title Auction Core\n/// @dev Contains models, variables, and internal methods for the auction.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuctionBase {\n\n // Represents an auction on an NFT\n struct Auction {\n // Current owner of NFT\n address seller;\n // Price (in wei) at beginning of auction\n uint128 startingPrice;\n // Price (in wei) at end of auction\n uint128 endingPrice;\n // Duration (in seconds) of auction\n uint64 duration;\n // Time when auction started\n // NOTE: 0 if this auction has been concluded\n uint64 startedAt;\n }\n\n // Reference to contract tracking NFT ownership\n KittiesERC721 public nonFungibleContract;\n\n // Cut owner takes on each auction, measured in basis points (1/100 of a percent).\n // Values 0-10,000 map to 0%-100%\n uint256 public ownerCut;\n\n // Map from token ID to their corresponding auction.\n mapping (uint256 => Auction) tokenIdToAuction;\n\n event AuctionCreated(uint256 tokenId, uint256 startingPrice, uint256 endingPrice, uint256 duration);\n event AuctionSuccessful(uint256 tokenId, uint256 totalPrice, address winner);\n event AuctionCancelled(uint256 tokenId);\n\n /// @dev Returns true if the claimant owns the token.\n /// @param _claimant - Address claiming to own the token.\n /// @param _tokenId - ID of token whose ownership to verify.\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return (nonFungibleContract.ownerOf(_tokenId) == _claimant);\n }\n\n /// @dev Escrows the NFT, assigning ownership to this contract.\n /// Throws if the escrow fails.\n /// @param _owner - Current owner address of token to escrow.\n /// @param _tokenId - ID of token whose approval to verify.\n function _escrow(address _owner, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transferFrom(_owner, this, _tokenId);\n }\n\n /// @dev Transfers an NFT owned by this contract to another address.\n /// Returns true if the transfer succeeds.\n /// @param _receiver - Address to transfer NFT to.\n /// @param _tokenId - ID of token to transfer.\n function _transfer(address _receiver, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transfer(_receiver, _tokenId);\n }\n\n /// @dev Adds an auction to the list of open auctions. Also fires the\n /// AuctionCreated event.\n /// @param _tokenId The ID of the token to be put on auction.\n /// @param _auction Auction to add.\n function _addAuction(uint256 _tokenId, Auction _auction) internal {\n // Require that all auctions have a duration of\n // at least one minute. (Keeps our math from getting hairy!)\n require(_auction.duration >= 1 minutes);\n\n tokenIdToAuction[_tokenId] = _auction;\n\n AuctionCreated(\n uint256(_tokenId),\n uint256(_auction.startingPrice),\n uint256(_auction.endingPrice),\n uint256(_auction.duration)\n );\n }\n\n /// @dev Cancels an auction unconditionally.\n function _cancelAuction(uint256 _tokenId, address _seller) internal {\n _removeAuction(_tokenId);\n _transfer(_seller, _tokenId);\n AuctionCancelled(_tokenId);\n }\n\n /// @dev Computes the price and transfers winnings.\n /// Does NOT transfer ownership of token.\n function _bid(uint256 _tokenId, uint256 _bidAmount)\n internal\n returns (uint256)\n {\n // Get a reference to the auction struct\n Auction storage auction = tokenIdToAuction[_tokenId];\n\n // Explicitly check that this auction is currently live.\n // (Because of how Ethereum mappings work, we can't just count\n // on the lookup above failing. An invalid _tokenId will just\n // return an auction object that is all zeros.)\n require(_isOnAuction(auction));\n\n // Check that the bid is greater than or equal to the current price\n uint256 price = _currentPrice(auction);\n require(_bidAmount >= price);\n\n // Grab a reference to the seller before the auction struct\n // gets deleted.\n address seller = auction.seller;\n\n // The bid is good! Remove the auction before sending the fees\n // to the sender so we can't have a reentrancy attack.\n _removeAuction(_tokenId);\n\n // Transfer proceeds to seller (if there are any!)\n if (price > 0) {\n // Calculate the auctioneer's cut.\n // (NOTE: _computeCut() is guaranteed to return a\n // value <= price, so this subtraction can't go negative.)\n uint256 auctioneerCut = _computeCut(price);\n uint256 sellerProceeds = price - auctioneerCut;\n\n // NOTE: Doing a transfer() in the middle of a complex\n // method like this is generally discouraged because of\n // reentrancy attacks and DoS attacks if the seller is\n // a contract with an invalid fallback function. We explicitly\n // guard against reentrancy attacks by removing the auction\n // before calling transfer(), and the only thing the seller\n // can DoS is the sale of their own asset! (And if it's an\n // accident, they can call cancelAuction(). )\n seller.transfer(sellerProceeds);\n }\n\n // Calculate any excess funds included with the bid. If the excess\n // is anything worth worrying about, transfer it back to bidder.\n // NOTE: We checked above that the bid amount is greater than or\n // equal to the price so this cannot underflow.\n uint256 bidExcess = _bidAmount - price;\n\n // Return the funds. Similar to the previous transfer, this is\n // not susceptible to a re-entry attack because the auction is\n // removed before any transfers occur.\n msg.sender.transfer(bidExcess);\n\n // Tell the world!\n AuctionSuccessful(_tokenId, price, msg.sender);\n\n return price;\n }\n\n /// @dev Removes an auction from the list of open auctions.\n /// @param _tokenId - ID of NFT on auction.\n function _removeAuction(uint256 _tokenId) internal {\n delete tokenIdToAuction[_tokenId];\n }\n\n /// @dev Returns true if the NFT is on auction.\n /// @param _auction - Auction to check.\n function _isOnAuction(Auction storage _auction) internal view returns (bool) {\n return (_auction.startedAt > 0);\n }\n\n /// @dev Returns current price of an NFT on auction. Broken into two\n /// functions (this one, that computes the duration from the auction\n /// structure, and the other that does the price computation) so we\n /// can easily test that the price computation works correctly.\n function _currentPrice(Auction storage _auction)\n internal\n view\n returns (uint256)\n {\n uint256 secondsPassed = 0;\n\n // A bit of insurance against negative values (or wraparound).\n // Probably not necessary (since Ethereum guarnatees that the\n // now variable doesn't ever go backwards).\n if (now > _auction.startedAt) {\n secondsPassed = now - _auction.startedAt;\n }\n\n return _computeCurrentPrice(\n _auction.startingPrice,\n _auction.endingPrice,\n _auction.duration,\n secondsPassed\n );\n }\n\n /// @dev Computes the current price of an auction. Factored out\n /// from _currentPrice so we can run extensive unit tests.\n /// When testing, make this function public and turn on\n /// `Current price computation` test suite.\n function _computeCurrentPrice(\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n uint256 _secondsPassed\n )\n internal\n pure\n returns (uint256)\n {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our public functions carefully cap the maximum values for\n // time (at 64-bits) and currency (at 128-bits). _duration is\n // also known to be non-zero (see the require() statement in\n // _addAuction())\n if (_secondsPassed >= _duration) {\n // We've reached the end of the dynamic pricing portion\n // of the auction, just return the end price.\n return _endingPrice;\n } else {\n // Starting price can be higher than ending price (and often is!), so\n // this delta can be negative.\n int256 totalPriceChange = int256(_endingPrice) - int256(_startingPrice);\n\n // This multiplication can't overflow, _secondsPassed will easily fit within\n // 64-bits, and totalPriceChange will easily fit within 128-bits, their product\n // will always fit within 256-bits.\n int256 currentPriceChange = totalPriceChange * int256(_secondsPassed) / int256(_duration);\n\n // currentPriceChange can be negative, but if so, will have a magnitude\n // less that _startingPrice. Thus, this result will always end up positive.\n int256 currentPrice = int256(_startingPrice) + currentPriceChange;\n\n return uint256(currentPrice);\n }\n }\n\n /// @dev Computes owner's cut of a sale.\n /// @param _price - Sale price of NFT.\n function _computeCut(uint256 _price) internal view returns (uint256) {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our entry functions carefully cap the maximum values for\n // currency (at 128-bits), and ownerCut <= 10000 (see the require()\n // statement in the ClockAuction constructor). The result of this\n // function is always guaranteed to be <= _price.\n return _price * ownerCut / 10000;\n }\n\n}\n\n\n\n\n\n\n\n/**\n * @title KittiesPausable\n * @dev Base contract which allows children to implement an emergency stop mechanism.\n */\ncontract KittiesPausable is KittiesOwnable {\n event Pause();\n event Unpause();\n\n bool public paused = false;\n\n\n /**\n\t * @dev modifier to allow actions only when the contract IS paused\n\t */\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /**\n\t * @dev modifier to allow actions only when the contract IS NOT paused\n\t */\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /**\n\t * @dev called by the owner to pause, triggers stopped state\n\t */\n function pause() onlyOwner whenNotPaused returns (bool) {\n paused = true;\n Pause();\n return true;\n }\n\n /**\n\t * @dev called by the owner to unpause, returns to normal state\n\t */\n function unpause() onlyOwner whenPaused returns (bool) {\n paused = false;\n Unpause();\n return true;\n }\n}\n\n\n/// @title Clock auction for non-fungible tokens.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuction is KittiesPausable, ClockAuctionBase {\n\n /// @dev The ERC-165 interface signature for ERC-721.\n /// Ref: https://github.com/ethereum/EIPs/issues/165\n /// Ref: https://github.com/ethereum/EIPs/issues/721\n bytes4 constant InterfaceSignature_ERC721 = bytes4(0x9a20483d);\n\n /// @dev Constructor creates a reference to the NFT ownership contract\n /// and verifies the owner cut is in the valid range.\n /// @param _nftAddress - address of a deployed contract implementing\n /// the Nonfungible Interface.\n /// @param _cut - percent cut the owner takes on each auction, must be\n /// between 0-10,000.\n function ClockAuction(address _nftAddress, uint256 _cut) public {\n require(_cut <= 10000);\n ownerCut = _cut;\n\n KittiesERC721 candidateContract = KittiesERC721(_nftAddress);\n require(candidateContract.supportsInterface(InterfaceSignature_ERC721));\n nonFungibleContract = candidateContract;\n }\n\n /// @dev Remove all Ether from the contract, which is the owner's cuts\n /// as well as any Ether sent directly to the contract address.\n /// Always transfers to the NFT contract, but can be called either by\n /// the owner or the NFT contract.\n function withdrawBalance() external {\n address nftAddress = address(nonFungibleContract);\n\n require(\n msg.sender == owner ||\n msg.sender == nftAddress\n );\n // We are using this boolean method to make sure that even if one fails it will still work\n bool res = nftAddress.send(this.balance);\n }\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of time to move between starting\n /// price and ending price (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n whenNotPaused\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(_owns(msg.sender, _tokenId));\n _escrow(msg.sender, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Bids on an open auction, completing the auction and transferring\n /// ownership of the NFT if enough Ether is supplied.\n /// @param _tokenId - ID of token to bid on.\n function bid(uint256 _tokenId)\n external\n payable\n whenNotPaused\n {\n // _bid will throw if the bid or funds transfer fails\n _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n }\n\n /// @dev Cancels an auction that hasn't been won yet.\n /// Returns the NFT to original owner.\n /// @notice This is a state-modifying function that can\n /// be called while the contract is paused.\n /// @param _tokenId - ID of token on auction\n function cancelAuction(uint256 _tokenId)\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n address seller = auction.seller;\n require(msg.sender == seller);\n _cancelAuction(_tokenId, seller);\n }\n\n /// @dev Cancels an auction when the contract is paused.\n /// Only the owner may do this, and NFTs are returned to\n /// the seller. This should only be used in emergencies.\n /// @param _tokenId - ID of the NFT on auction to cancel.\n function cancelAuctionWhenPaused(uint256 _tokenId)\n whenPaused\n onlyOwner\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n _cancelAuction(_tokenId, auction.seller);\n }\n\n /// @dev Returns auction info for an NFT on auction.\n /// @param _tokenId - ID of NFT on auction.\n function getAuction(uint256 _tokenId)\n external\n view\n returns\n (\n address seller,\n uint256 startingPrice,\n uint256 endingPrice,\n uint256 duration,\n uint256 startedAt\n ) {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return (\n auction.seller,\n auction.startingPrice,\n auction.endingPrice,\n auction.duration,\n auction.startedAt\n );\n }\n\n /// @dev Returns the current price of an auction.\n /// @param _tokenId - ID of the token price we are checking.\n function getCurrentPrice(uint256 _tokenId)\n external\n view\n returns (uint256)\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return _currentPrice(auction);\n }\n\n}\n\n\n/// @title Reverse auction modified for siring\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SiringClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSiringAuctionAddress() call.\n bool public isSiringClockAuction = true;\n\n // Delegate constructor\n function SiringClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction. Since this function is wrapped,\n /// require sender to be KittyCore contract.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Places a bid for siring. Requires the sender\n /// is the KittyCore contract because all bid methods\n /// should be wrapped. Also returns the kitty to the\n /// seller rather than the winner.\n function bid(uint256 _tokenId)\n external\n payable\n {\n require(msg.sender == address(nonFungibleContract));\n address seller = tokenIdToAuction[_tokenId].seller;\n // _bid checks that token ID is valid and will throw if bid fails\n _bid(_tokenId, msg.value);\n // We transfer the kitty back to the seller, the winner will get\n // the offspring\n _transfer(seller, _tokenId);\n }\n\n}\n\n\n\n\n\n/// @title Clock auction modified for sale of kitties\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SaleClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSaleAuctionAddress() call.\n bool public isSaleClockAuction = true;\n\n // Tracks last 5 sale price of gen0 kitty sales\n uint256 public gen0SaleCount;\n uint256[5] public lastGen0SalePrices;\n\n // Delegate constructor\n function SaleClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Updates lastSalePrice if seller is the nft contract\n /// Otherwise, works the same as default bid method.\n function bid(uint256 _tokenId)\n external\n payable\n {\n // _bid verifies token ID size\n address seller = tokenIdToAuction[_tokenId].seller;\n uint256 price = _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n\n // If not a gen0 auction, exit\n if (seller == address(nonFungibleContract)) {\n // Track gen0 sale prices\n lastGen0SalePrices[gen0SaleCount % 5] = price;\n gen0SaleCount++;\n }\n }\n\n function averageGen0SalePrice() external view returns (uint256) {\n uint256 sum = 0;\n for (uint256 i = 0; i < 5; i++) {\n sum += lastGen0SalePrices[i];\n }\n return sum / 5;\n }\n\n}\n\n\n/// @title Handles creating auctions for sale and siring of kitties.\n/// This wrapper of ReverseAuction exists only so that users can create\n/// auctions with only one transaction.\ncontract KittyAuction is KittyBreeding {\n\n // @notice The auction contract variables are defined in KittyBase to allow\n // us to refer to them in KittyOwnership to prevent accidental transfers.\n // `saleAuction` refers to the auction for gen0 and p2p sale of kitties.\n // `siringAuction` refers to the auction for siring rights of kitties.\n\n /// @dev Sets the reference to the sale auction.\n /// @param _address - Address of sale contract.\n function setSaleAuctionAddress(address _address) external onlyCEO {\n SaleClockAuction candidateContract = SaleClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSaleClockAuction());\n\n // Set the new contract address\n saleAuction = candidateContract;\n }\n\n /// @dev Sets the reference to the siring auction.\n /// @param _address - Address of siring contract.\n function setSiringAuctionAddress(address _address) external onlyCEO {\n SiringClockAuction candidateContract = SiringClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSiringClockAuction());\n\n // Set the new contract address\n siringAuction = candidateContract;\n }\n\n /// @dev Put a kitty up for auction.\n /// Does some ownership trickery to create auctions in one tx.\n function createSaleAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n // Ensure the kitty is not pregnant to prevent the auction\n // contract accidentally receiving ownership of the child.\n // NOTE: the kitty IS allowed to be in a cooldown.\n require(!isPregnant(_kittyId));\n _approve(_kittyId, saleAuction);\n // Sale auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n saleAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Put a kitty up for auction to be sire.\n /// Performs checks to ensure the kitty can be sired, then\n /// delegates to reverse auction.\n function createSiringAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n require(isReadyToBreed(_kittyId));\n _approve(_kittyId, siringAuction);\n // Siring auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n siringAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Completes a siring auction by bidding.\n /// Immediately breeds the winning matron with the sire on auction.\n /// @param _sireId - ID of the sire on auction.\n /// @param _matronId - ID of the matron owned by the bidder.\n function bidOnSiringAuction(\n uint256 _sireId,\n uint256 _matronId\n )\n external\n payable\n whenNotPaused\n {\n // Auction contract checks input sizes\n require(_owns(msg.sender, _matronId));\n require(isReadyToBreed(_matronId));\n require(_canBreedWithViaAuction(_matronId, _sireId));\n\n // Define the current price of the auction.\n uint256 currentPrice = siringAuction.getCurrentPrice(_sireId);\n require(msg.value >= currentPrice + autoBirthFee);\n\n // Siring auction will throw if the bid fails.\n siringAuction.bid.value(msg.value - autoBirthFee)(_sireId);\n _breedWith(uint32(_matronId), uint32(_sireId));\n }\n\n /// @dev Transfers the balance of the sale auction contract\n /// to the KittyCore contract. We use two-step withdrawal to\n /// prevent two transfer calls in the auction bid function.\n function withdrawAuctionBalances() external onlyCLevel {\n saleAuction.withdrawBalance();\n siringAuction.withdrawBalance();\n }\n}\n\n\n/// @title all functions related to creating kittens\ncontract KittyMinting is KittyAuction {\n\n // Limits the number of cats the contract owner can ever create.\n uint256 public constant PROMO_CREATION_LIMIT = 5000;\n uint256 public constant GEN0_CREATION_LIMIT = 45000;\n\n // Constants for gen0 auctions.\n uint256 public constant GEN0_STARTING_PRICE = 10 finney;\n uint256 public constant GEN0_AUCTION_DURATION = 1 days;\n\n // Counts the number of cats the contract owner has created.\n uint256 public promoCreatedCount;\n uint256 public gen0CreatedCount;\n\n /// @dev we can create promo kittens, up to a limit. Only callable by COO\n /// @param _genes the encoded genes of the kitten to be created, any value is accepted\n /// @param _owner the future owner of the created kittens. Default to contract COO\n function createPromoKitty(uint256 _genes, address _owner) external onlyCOO {\n address kittyOwner = _owner;\n if (kittyOwner == address(0)) {\n kittyOwner = cooAddress;\n }\n require(promoCreatedCount < PROMO_CREATION_LIMIT);\n\n promoCreatedCount++;\n _createKitty(0, 0, 0, _genes, kittyOwner);\n }\n\n /// @dev Creates a new gen0 kitty with the given genes and\n /// creates an auction for it.\n function createGen0Auction(uint256 _genes) external onlyCOO {\n require(gen0CreatedCount < GEN0_CREATION_LIMIT);\n\n uint256 kittyId = _createKitty(0, 0, 0, _genes, address(this));\n _approve(kittyId, saleAuction);\n\n saleAuction.createAuction(\n kittyId,\n _computeNextGen0Price(),\n 0,\n GEN0_AUCTION_DURATION,\n address(this)\n );\n\n gen0CreatedCount++;\n }\n\n /// @dev Computes the next gen0 auction starting price, given\n /// the average of the past 5 prices + 50%.\n function _computeNextGen0Price() internal view returns (uint256) {\n uint256 avePrice = saleAuction.averageGen0SalePrice();\n\n // Sanity check to ensure we don't overflow arithmetic\n require(avePrice == uint256(uint128(avePrice)));\n\n uint256 nextPrice = avePrice + (avePrice / 2);\n\n // We never auction for less than starting price\n if (nextPrice < GEN0_STARTING_PRICE) {\n nextPrice = GEN0_STARTING_PRICE;\n }\n\n return nextPrice;\n }\n}\n\n\n/// @title CryptoKitties: Collectible, breedable, and oh-so-adorable cats on the Ethereum blockchain.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev The main CryptoKitties contract, keeps track of kittens so they don't wander around and get lost.\ncontract KittyCore is KittyMinting {\n\n // This is the main CryptoKitties contract. In order to keep our code seperated into logical sections,\n // we've broken it up in two ways. First, we have several seperately-instantiated sibling contracts\n // that handle auctions and our super-top-secret genetic combination algorithm. The auctions are\n // seperate since their logic is somewhat complex and there's always a risk of subtle bugs. By keeping\n // them in their own contracts, we can upgrade them without disrupting the main contract that tracks\n // kitty ownership. The genetic combination algorithm is kept seperate so we can open-source all of\n // the rest of our code without making it _too_ easy for folks to figure out how the genetics work.\n // Don't worry, I'm sure someone will reverse engineer it soon enough!\n //\n // Secondly, we break the core contract into multiple files using inheritence, one for each major\n // facet of functionality of CK. This allows us to keep related code bundled together while still\n // avoiding a single giant file with everything in it. The breakdown is as follows:\n //\n // - KittyBase: This is where we define the most fundamental code shared throughout the core\n // functionality. This includes our main data storage, constants and data types, plus\n // internal functions for managing these items.\n //\n // - KittyAccessControl: This contract manages the various addresses and constraints for operations\n // that can be executed only by specific roles. Namely CEO, CFO and COO.\n //\n // - KittyOwnership: This provides the methods required for basic non-fungible token\n // transactions, following the draft ERC-721 spec (https://github.com/ethereum/EIPs/issues/721).\n //\n // - KittyBreeding: This file contains the methods necessary to breed cats together, including\n // keeping track of siring offers, and relies on an external genetic combination contract.\n //\n // - KittyAuctions: Here we have the public methods for auctioning or bidding on cats or siring\n // services. The actual auction functionality is handled in two sibling contracts (one\n // for sales and one for siring), while auction creation and bidding is mostly mediated\n // through this facet of the core contract.\n //\n // - KittyMinting: This final facet contains the functionality we use for creating new gen0 cats.\n // We can make up to 5000 \"promo\" cats that can be given away (especially important when\n // the community is new), and all others can only be created and then immediately put up\n // for auction via an algorithmically determined starting price. Regardless of how they\n // are created, there is a hard limit of 50k gen0 cats. After that, it's all up to the\n // community to breed, breed, breed!\n\n // Set in case the core contract is broken and an upgrade is required\n address public newContractAddress;\n\n /// @notice Creates the main CryptoKitties smart contract instance.\n function KittyCore() public {\n // Starts paused.\n paused = true;\n\n // the creator of the contract is the initial CEO\n ceoAddress = msg.sender;\n\n // the creator of the contract is also the initial COO\n cooAddress = msg.sender;\n\n // start with the mythical kitten 0 - so we don't have generation-0 parent issues\n _createKitty(0, 0, 0, uint256(-1), address(0));\n }\n\n /// @dev Used to mark the smart contract as upgraded, in case there is a serious\n /// breaking bug. This method does nothing but keep track of the new contract and\n /// emit a message indicating that the new address is set. It's up to clients of this\n /// contract to update to the new contract address in that case. (This contract will\n /// be paused indefinitely if such an upgrade takes place.)\n /// @param _v2Address new address\n function setNewAddress(address _v2Address) external onlyCEO whenPaused {\n // See README.md for updgrade plan\n newContractAddress = _v2Address;\n ContractUpgrade(_v2Address);\n }\n\n /// @notice No tipping!\n /// @dev Reject all Ether from being sent here, unless it's from one of the\n /// two auction contracts. (Hopefully, we can prevent user accidents.)\n function() external payable {\n require(\n msg.sender == address(saleAuction) ||\n msg.sender == address(siringAuction)\n );\n }\n\n /// @notice Returns all the relevant information about a specific kitty.\n /// @param _id The ID of the kitty of interest.\n function getKitty(uint256 _id)\n external\n view\n returns (\n bool isGestating,\n bool isReady,\n uint256 cooldownIndex,\n uint256 nextActionAt,\n uint256 siringWithId,\n uint256 birthTime,\n uint256 matronId,\n uint256 sireId,\n uint256 generation,\n uint256 genes\n ) {\n Kitty storage kit = kitties[_id];\n\n // if this variable is 0 then it's not gestating\n isGestating = (kit.siringWithId != 0);\n isReady = (kit.cooldownEndBlock <= block.number);\n cooldownIndex = uint256(kit.cooldownIndex);\n nextActionAt = uint256(kit.cooldownEndBlock);\n siringWithId = uint256(kit.siringWithId);\n birthTime = uint256(kit.birthTime);\n matronId = uint256(kit.matronId);\n sireId = uint256(kit.sireId);\n generation = uint256(kit.generation);\n genes = kit.genes;\n }\n\n /// @dev Override unpause so it requires all external contract addresses\n /// to be set before contract can be unpaused. Also, we can't have\n /// newContractAddress set either, because then the contract was upgraded.\n /// @notice This is public rather than external so we can call super.unpause\n /// without using an expensive CALL.\n function unpause() public onlyCEO whenPaused {\n require(saleAuction != address(0));\n require(siringAuction != address(0));\n require(geneScience != address(0));\n require(newContractAddress == address(0));\n\n // Actually unpause the contract.\n super.unpause();\n }\n\n // @dev Allows the CFO to capture the balance available to the contract.\n function withdrawBalance() external onlyCFO {\n uint256 balance = this.balance;\n // Subtract all the currently pregnant kittens we have, plus 1 of margin.\n uint256 subtractFees = (pregnantKitties + 1) * autoBirthFee;\n\n if (balance > subtractFees) {\n cfoAddress.send(balance - subtractFees);\n }\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "exportedSymbols": { "ClockAuction": [ 8872 @@ -52206,5 +52206,5 @@ export const KittyOwnership = }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:47.947Z" + "updatedAt": "2018-10-09T17:45:36.421Z" } \ No newline at end of file diff --git a/artifacts/ts/Migrations.ts b/artifacts/ts/Migrations.ts index af803728..012e7999 100644 --- a/artifacts/ts/Migrations.ts +++ b/artifacts/ts/Migrations.ts @@ -65,15 +65,15 @@ export const Migrations = "type": "constructor" } ], - "bytecode": "0x6060604052341561000f57600080fd5b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506102db8061005e6000396000f300606060405260043610610062576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630900f01014610067578063445df0ac146100a05780638da5cb5b146100c9578063fdacd5761461011e575b600080fd5b341561007257600080fd5b61009e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610141565b005b34156100ab57600080fd5b6100b3610224565b6040518082815260200191505060405180910390f35b34156100d457600080fd5b6100dc61022a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561012957600080fd5b61013f600480803590602001909190505061024f565b005b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415610220578190508073ffffffffffffffffffffffffffffffffffffffff1663fdacd5766001546040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b151561020b57600080fd5b6102c65a03f1151561021c57600080fd5b5050505b5050565b60015481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156102ac57806001819055505b505600a165627a7a72305820c7e7b6c42b77e11556d6c62893608c94e6061da7086e349e40976d7895e94deb0029", - "deployedBytecode": "0x606060405260043610610062576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630900f01014610067578063445df0ac146100a05780638da5cb5b146100c9578063fdacd5761461011e575b600080fd5b341561007257600080fd5b61009e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610141565b005b34156100ab57600080fd5b6100b3610224565b6040518082815260200191505060405180910390f35b34156100d457600080fd5b6100dc61022a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561012957600080fd5b61013f600480803590602001909190505061024f565b005b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415610220578190508073ffffffffffffffffffffffffffffffffffffffff1663fdacd5766001546040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b151561020b57600080fd5b6102c65a03f1151561021c57600080fd5b5050505b5050565b60015481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156102ac57806001819055505b505600a165627a7a72305820c7e7b6c42b77e11556d6c62893608c94e6061da7086e349e40976d7895e94deb0029", + "bytecode": "0x6060604052341561000f57600080fd5b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506102db8061005e6000396000f300606060405260043610610062576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630900f01014610067578063445df0ac146100a05780638da5cb5b146100c9578063fdacd5761461011e575b600080fd5b341561007257600080fd5b61009e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610141565b005b34156100ab57600080fd5b6100b3610224565b6040518082815260200191505060405180910390f35b34156100d457600080fd5b6100dc61022a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561012957600080fd5b61013f600480803590602001909190505061024f565b005b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415610220578190508073ffffffffffffffffffffffffffffffffffffffff1663fdacd5766001546040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b151561020b57600080fd5b6102c65a03f1151561021c57600080fd5b5050505b5050565b60015481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156102ac57806001819055505b505600a165627a7a72305820ea9eb696e985730f91dd444a372e2e3d7d38ebd8744bc8533d4c5515c99910520029", + "deployedBytecode": "0x606060405260043610610062576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630900f01014610067578063445df0ac146100a05780638da5cb5b146100c9578063fdacd5761461011e575b600080fd5b341561007257600080fd5b61009e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610141565b005b34156100ab57600080fd5b6100b3610224565b6040518082815260200191505060405180910390f35b34156100d457600080fd5b6100dc61022a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561012957600080fd5b61013f600480803590602001909190505061024f565b005b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415610220578190508073ffffffffffffffffffffffffffffffffffffffff1663fdacd5766001546040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b151561020b57600080fd5b6102c65a03f1151561021c57600080fd5b5050505b5050565b60015481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156102ac57806001819055505b505600a165627a7a72305820ea9eb696e985730f91dd444a372e2e3d7d38ebd8744bc8533d4c5515c99910520029", "sourceMap": "26:579:9:-;;;245:64;;;;;;;;292:10;284:5;;:18;;;;;;;;;;;;;;;;;;26:579;;;;;;", "deployedSourceMap": "26:579:9:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;430:173;;;;;;;;;;;;;;;;;;;;;;;;;;;;131:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;315:109;;;;;;;;;;;;;;;;;;;;;;;;;;430:173;495:19;224:5;;;;;;;;;;;210:19;;:10;:19;;;206:26;;;528:10;495:44;;549:8;:21;;;571:24;;549:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;206:26;430:173;;:::o;131:36::-;;;;:::o;52:20::-;;;;;;;;;;;;;:::o;315:109::-;224:5;;;;;;;;;;;210:19;;:10;:19;;;206:26;;;408:9;381:24;:36;;;;206:26;315:109;:::o", "source": "pragma solidity 0.4.18;\n\n\ncontract Migrations {\n address public owner;\n\n // solhint-disable-next-line var-name-mixedcase\n uint public last_completed_migration;\n\n modifier restricted() {\n if (msg.sender == owner) _;\n }\n\n function Migrations() public {\n owner = msg.sender;\n }\n\n function setCompleted(uint completed) public restricted {\n last_completed_migration = completed;\n }\n\n function upgrade(address newAddress) public restricted {\n Migrations upgraded = Migrations(newAddress);\n upgraded.setCompleted(last_completed_migration);\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/Migrations.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/Migrations.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/Migrations.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/Migrations.sol", "exportedSymbols": { "Migrations": [ 4514 @@ -819,7 +819,7 @@ export const Migrations = "42": { "events": {}, "links": {}, - "address": "0xf44e598f6ad5115151c1c331f5b2f8b02b06bb47" + "address": "0x4c4bd0258c47645a61a55c66c40168e61dcb19b2" }, "70": { "events": {}, @@ -828,5 +828,5 @@ export const Migrations = } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:16:36.720Z" + "updatedAt": "2018-10-09T17:53:24.835Z" } \ No newline at end of file diff --git a/artifacts/ts/MintableERC721Token.ts b/artifacts/ts/MintableERC721Token.ts index 6e880591..ed2f732b 100644 --- a/artifacts/ts/MintableERC721Token.ts +++ b/artifacts/ts/MintableERC721Token.ts @@ -438,15 +438,15 @@ export const MintableERC721Token = "type": "event" } ], - "bytecode": "0x606060405234156200001057600080fd5b6040805190810160405280601381526020017f4d696e7461626c65455243373231546f6b656e000000000000000000000000008152506040805190810160405280600381526020017f4d45540000000000000000000000000000000000000000000000000000000000815250816004908051906020019062000094929190620000b6565b508060059080519060200190620000ad929190620000b6565b50505062000165565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620000f957805160ff19168380011785556200012a565b828001600101855582156200012a579182015b82811115620001295782518255916020019190600101906200010c565b5b5090506200013991906200013d565b5090565b6200016291905b808211156200015e57600081600090555060010162000144565b5090565b90565b611d7180620001756000396000f300606060405260043610610107576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a71461010c57806306fdde0314610166578063081812fc146101f4578063095ea7b31461025757806318160ddd1461029957806323b872dd146102c25780632f745c591461032357806340c10f191461037957806342842e0e146103bb5780634f558e791461041c5780634f6ccce7146104575780636352211e1461048e57806370a08231146104f157806395d89b411461053e578063a22cb465146105cc578063a9059cbb14610610578063b88d4fde14610652578063c87b56dd146106f6578063e985e9c514610792575b600080fd5b341561011757600080fd5b61014c60048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050610802565b604051808215151515815260200191505060405180910390f35b341561017157600080fd5b610179610850565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101b957808201518184015260208101905061019e565b50505050905090810190601f1680156101e65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101ff57600080fd5b61021560048080359060200190919050506108f8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561026257600080fd5b610297600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610935565b005b34156102a457600080fd5b6102ac610afb565b6040518082815260200191505060405180910390f35b34156102cd57600080fd5b610321600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610b08565b005b341561032e57600080fd5b610363600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610c1f565b6040518082815260200191505060405180910390f35b341561038457600080fd5b6103b9600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610c97565b005b34156103c657600080fd5b61041a600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610ca5565b005b341561042757600080fd5b61043d6004808035906020019091905050610cdd565b604051808215151515815260200191505060405180910390f35b341561046257600080fd5b6104786004808035906020019091905050610d4e565b6040518082815260200191505060405180910390f35b341561049957600080fd5b6104af6004808035906020019091905050610d87565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104fc57600080fd5b610528600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610e04565b6040518082815260200191505060405180910390f35b341561054957600080fd5b610551610e88565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610591578082015181840152602081019050610576565b50505050905090810190601f1680156105be5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156105d757600080fd5b61060e600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080351515906020019091905050610f30565b005b341561061b57600080fd5b610650600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061106c565b005b341561065d57600080fd5b6106f4600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190505061107b565b005b341561070157600080fd5b61071760048080359060200190919050506110ba565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561075757808201518184015260208101905061073c565b50505050905090810190601f1680156107845780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561079d57600080fd5b6107e8600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611189565b604051808215151515815260200191505060405180910390f35b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610858611cb4565b60048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156108ee5780601f106108c3576101008083540402835291602001916108ee565b820191906000526020600020905b8154815290600101906020018083116108d157829003601f168201915b5050505050905090565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061094082610d87565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561097d57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806109bd57506109bc8133611189565b5b15156109c857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166109e9836108f8565b73ffffffffffffffffffffffffffffffffffffffff16141580610a395750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b15610af657826001600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a35b505050565b6000600880549050905090565b80610b13338261121d565b1515610b1e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614151515610b5a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515610b9657600080fd5b610ba084836112b2565b610baa848361141b565b610bb48383611636565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a350505050565b6000610c2a83610e04565b82101515610c3757600080fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515610c8357fe5b906000526020600020900154905092915050565b610ca1828261170a565b5050565b80610cb0338261121d565b1515610cbb57600080fd5b610cd7848484602060405190810160405280600081525061107b565b50505050565b60008060008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b6000610d58610afb565b82101515610d6557600080fd5b600882815481101515610d7457fe5b9060005260206000209001549050919050565b60008060008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610dfb57600080fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515610e4157600080fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e90611cb4565b60058054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f265780601f10610efb57610100808354040283529160200191610f26565b820191906000526020600020905b815481529060010190602001808311610f0957829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515610f6b57600080fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b611077338383610ca5565b5050565b81611086338261121d565b151561109157600080fd5b61109c858585610b08565b6110a88585858561175e565b15156110b357600080fd5b5050505050565b6110c2611cb4565b6110cb82610cdd565b15156110d657600080fd5b600a60008381526020019081526020016000208054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561117d5780601f106111525761010080835404028352916020019161117d565b820191906000526020600020905b81548152906001019060200180831161116057829003601f168201915b50505050509050919050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60008061122983610d87565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061129857508373ffffffffffffffffffffffffffffffffffffffff16611280846108f8565b73ffffffffffffffffffffffffffffffffffffffff16145b806112a957506112a88185611189565b5b91505092915050565b8173ffffffffffffffffffffffffffffffffffffffff166112d282610d87565b73ffffffffffffffffffffffffffffffffffffffff161415156112f457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156114175760006001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a35b5050565b600080600061142a8585611934565b600760008581526020019081526020016000205492506114966001600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050611a6290919063ffffffff16565b9150600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811015156114e457fe5b906000526020600020900154905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208481548110151561153f57fe5b9060005260206000209001819055506000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110151561159c57fe5b906000526020600020900181905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054809190600190036115fd9190611cc8565b50600060076000868152602001908152602001600020819055508260076000838152602001908152602001600020819055505050505050565b60006116428383611a7b565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060010182816116d89190611cf4565b916000526020600020900160008490919091505550806007600084815260200190815260200160002081905550505050565b6117148282611bd3565b6008805490506009600083815260200190815260200160002081905550600880548060010182816117459190611cf4565b9160005260206000209001600083909190915055505050565b6000806117808573ffffffffffffffffffffffffffffffffffffffff16611c83565b151561178f576001915061192b565b8473ffffffffffffffffffffffffffffffffffffffff1663f0b9e5ba8786866000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561185a57808201518184015260208101905061183f565b50505050905090810190601f1680156118875780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15156118a757600080fd5b6102c65a03f115156118b857600080fd5b50505060405180519050905063f0b9e5ba7c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505b50949350505050565b8173ffffffffffffffffffffffffffffffffffffffff1661195482610d87565b73ffffffffffffffffffffffffffffffffffffffff1614151561197657600080fd5b6119c96001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a6290919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600080600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000828211151515611a7057fe5b818303905092915050565b600073ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515611ae857600080fd5b8160008083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611b8c6001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c9690919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611c0f57600080fd5b611c198282611636565b8173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600080823b905060008111915050919050565b6000808284019050838110151515611caa57fe5b8091505092915050565b602060405190810160405280600081525090565b815481835581811511611cef57818360005260206000209182019101611cee9190611d20565b5b505050565b815481835581811511611d1b57818360005260206000209182019101611d1a9190611d20565b5b505050565b611d4291905b80821115611d3e576000816000905550600101611d26565b5090565b905600a165627a7a72305820b14cd1499e1ebff6b2f4fb7df78f1c7923b8f66681403cfd5f3a4a11912fd1550029", - "deployedBytecode": "0x606060405260043610610107576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a71461010c57806306fdde0314610166578063081812fc146101f4578063095ea7b31461025757806318160ddd1461029957806323b872dd146102c25780632f745c591461032357806340c10f191461037957806342842e0e146103bb5780634f558e791461041c5780634f6ccce7146104575780636352211e1461048e57806370a08231146104f157806395d89b411461053e578063a22cb465146105cc578063a9059cbb14610610578063b88d4fde14610652578063c87b56dd146106f6578063e985e9c514610792575b600080fd5b341561011757600080fd5b61014c60048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050610802565b604051808215151515815260200191505060405180910390f35b341561017157600080fd5b610179610850565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101b957808201518184015260208101905061019e565b50505050905090810190601f1680156101e65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101ff57600080fd5b61021560048080359060200190919050506108f8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561026257600080fd5b610297600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610935565b005b34156102a457600080fd5b6102ac610afb565b6040518082815260200191505060405180910390f35b34156102cd57600080fd5b610321600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610b08565b005b341561032e57600080fd5b610363600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610c1f565b6040518082815260200191505060405180910390f35b341561038457600080fd5b6103b9600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610c97565b005b34156103c657600080fd5b61041a600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610ca5565b005b341561042757600080fd5b61043d6004808035906020019091905050610cdd565b604051808215151515815260200191505060405180910390f35b341561046257600080fd5b6104786004808035906020019091905050610d4e565b6040518082815260200191505060405180910390f35b341561049957600080fd5b6104af6004808035906020019091905050610d87565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104fc57600080fd5b610528600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610e04565b6040518082815260200191505060405180910390f35b341561054957600080fd5b610551610e88565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610591578082015181840152602081019050610576565b50505050905090810190601f1680156105be5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156105d757600080fd5b61060e600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080351515906020019091905050610f30565b005b341561061b57600080fd5b610650600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061106c565b005b341561065d57600080fd5b6106f4600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190505061107b565b005b341561070157600080fd5b61071760048080359060200190919050506110ba565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561075757808201518184015260208101905061073c565b50505050905090810190601f1680156107845780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561079d57600080fd5b6107e8600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611189565b604051808215151515815260200191505060405180910390f35b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610858611cb4565b60048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156108ee5780601f106108c3576101008083540402835291602001916108ee565b820191906000526020600020905b8154815290600101906020018083116108d157829003601f168201915b5050505050905090565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061094082610d87565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561097d57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806109bd57506109bc8133611189565b5b15156109c857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166109e9836108f8565b73ffffffffffffffffffffffffffffffffffffffff16141580610a395750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b15610af657826001600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a35b505050565b6000600880549050905090565b80610b13338261121d565b1515610b1e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614151515610b5a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515610b9657600080fd5b610ba084836112b2565b610baa848361141b565b610bb48383611636565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a350505050565b6000610c2a83610e04565b82101515610c3757600080fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515610c8357fe5b906000526020600020900154905092915050565b610ca1828261170a565b5050565b80610cb0338261121d565b1515610cbb57600080fd5b610cd7848484602060405190810160405280600081525061107b565b50505050565b60008060008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b6000610d58610afb565b82101515610d6557600080fd5b600882815481101515610d7457fe5b9060005260206000209001549050919050565b60008060008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610dfb57600080fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515610e4157600080fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e90611cb4565b60058054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f265780601f10610efb57610100808354040283529160200191610f26565b820191906000526020600020905b815481529060010190602001808311610f0957829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515610f6b57600080fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b611077338383610ca5565b5050565b81611086338261121d565b151561109157600080fd5b61109c858585610b08565b6110a88585858561175e565b15156110b357600080fd5b5050505050565b6110c2611cb4565b6110cb82610cdd565b15156110d657600080fd5b600a60008381526020019081526020016000208054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561117d5780601f106111525761010080835404028352916020019161117d565b820191906000526020600020905b81548152906001019060200180831161116057829003601f168201915b50505050509050919050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60008061122983610d87565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061129857508373ffffffffffffffffffffffffffffffffffffffff16611280846108f8565b73ffffffffffffffffffffffffffffffffffffffff16145b806112a957506112a88185611189565b5b91505092915050565b8173ffffffffffffffffffffffffffffffffffffffff166112d282610d87565b73ffffffffffffffffffffffffffffffffffffffff161415156112f457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156114175760006001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a35b5050565b600080600061142a8585611934565b600760008581526020019081526020016000205492506114966001600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050611a6290919063ffffffff16565b9150600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811015156114e457fe5b906000526020600020900154905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208481548110151561153f57fe5b9060005260206000209001819055506000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110151561159c57fe5b906000526020600020900181905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054809190600190036115fd9190611cc8565b50600060076000868152602001908152602001600020819055508260076000838152602001908152602001600020819055505050505050565b60006116428383611a7b565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060010182816116d89190611cf4565b916000526020600020900160008490919091505550806007600084815260200190815260200160002081905550505050565b6117148282611bd3565b6008805490506009600083815260200190815260200160002081905550600880548060010182816117459190611cf4565b9160005260206000209001600083909190915055505050565b6000806117808573ffffffffffffffffffffffffffffffffffffffff16611c83565b151561178f576001915061192b565b8473ffffffffffffffffffffffffffffffffffffffff1663f0b9e5ba8786866000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561185a57808201518184015260208101905061183f565b50505050905090810190601f1680156118875780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15156118a757600080fd5b6102c65a03f115156118b857600080fd5b50505060405180519050905063f0b9e5ba7c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505b50949350505050565b8173ffffffffffffffffffffffffffffffffffffffff1661195482610d87565b73ffffffffffffffffffffffffffffffffffffffff1614151561197657600080fd5b6119c96001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a6290919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600080600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000828211151515611a7057fe5b818303905092915050565b600073ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515611ae857600080fd5b8160008083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611b8c6001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c9690919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611c0f57600080fd5b611c198282611636565b8173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600080823b905060008111915050919050565b6000808284019050838110151515611caa57fe5b8091505092915050565b602060405190810160405280600081525090565b815481835581811511611cef57818360005260206000209182019101611cee9190611d20565b5b505050565b815481835581811511611d1b57818360005260206000209182019101611d1a9190611d20565b5b505050565b611d4291905b80821115611d3e576000816000905550600101611d26565b5090565b905600a165627a7a72305820b14cd1499e1ebff6b2f4fb7df78f1c7923b8f66681403cfd5f3a4a11912fd1550029", + "bytecode": "0x606060405234156200001057600080fd5b6040805190810160405280601381526020017f4d696e7461626c65455243373231546f6b656e000000000000000000000000008152506040805190810160405280600381526020017f4d45540000000000000000000000000000000000000000000000000000000000815250816004908051906020019062000094929190620000b6565b508060059080519060200190620000ad929190620000b6565b50505062000165565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620000f957805160ff19168380011785556200012a565b828001600101855582156200012a579182015b82811115620001295782518255916020019190600101906200010c565b5b5090506200013991906200013d565b5090565b6200016291905b808211156200015e57600081600090555060010162000144565b5090565b90565b611d7180620001756000396000f300606060405260043610610107576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a71461010c57806306fdde0314610166578063081812fc146101f4578063095ea7b31461025757806318160ddd1461029957806323b872dd146102c25780632f745c591461032357806340c10f191461037957806342842e0e146103bb5780634f558e791461041c5780634f6ccce7146104575780636352211e1461048e57806370a08231146104f157806395d89b411461053e578063a22cb465146105cc578063a9059cbb14610610578063b88d4fde14610652578063c87b56dd146106f6578063e985e9c514610792575b600080fd5b341561011757600080fd5b61014c60048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050610802565b604051808215151515815260200191505060405180910390f35b341561017157600080fd5b610179610850565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101b957808201518184015260208101905061019e565b50505050905090810190601f1680156101e65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101ff57600080fd5b61021560048080359060200190919050506108f8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561026257600080fd5b610297600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610935565b005b34156102a457600080fd5b6102ac610afb565b6040518082815260200191505060405180910390f35b34156102cd57600080fd5b610321600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610b08565b005b341561032e57600080fd5b610363600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610c1f565b6040518082815260200191505060405180910390f35b341561038457600080fd5b6103b9600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610c97565b005b34156103c657600080fd5b61041a600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610ca5565b005b341561042757600080fd5b61043d6004808035906020019091905050610cdd565b604051808215151515815260200191505060405180910390f35b341561046257600080fd5b6104786004808035906020019091905050610d4e565b6040518082815260200191505060405180910390f35b341561049957600080fd5b6104af6004808035906020019091905050610d87565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104fc57600080fd5b610528600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610e04565b6040518082815260200191505060405180910390f35b341561054957600080fd5b610551610e88565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610591578082015181840152602081019050610576565b50505050905090810190601f1680156105be5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156105d757600080fd5b61060e600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080351515906020019091905050610f30565b005b341561061b57600080fd5b610650600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061106c565b005b341561065d57600080fd5b6106f4600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190505061107b565b005b341561070157600080fd5b61071760048080359060200190919050506110ba565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561075757808201518184015260208101905061073c565b50505050905090810190601f1680156107845780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561079d57600080fd5b6107e8600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611189565b604051808215151515815260200191505060405180910390f35b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610858611cb4565b60048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156108ee5780601f106108c3576101008083540402835291602001916108ee565b820191906000526020600020905b8154815290600101906020018083116108d157829003601f168201915b5050505050905090565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061094082610d87565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561097d57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806109bd57506109bc8133611189565b5b15156109c857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166109e9836108f8565b73ffffffffffffffffffffffffffffffffffffffff16141580610a395750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b15610af657826001600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a35b505050565b6000600880549050905090565b80610b13338261121d565b1515610b1e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614151515610b5a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515610b9657600080fd5b610ba084836112b2565b610baa848361141b565b610bb48383611636565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a350505050565b6000610c2a83610e04565b82101515610c3757600080fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515610c8357fe5b906000526020600020900154905092915050565b610ca1828261170a565b5050565b80610cb0338261121d565b1515610cbb57600080fd5b610cd7848484602060405190810160405280600081525061107b565b50505050565b60008060008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b6000610d58610afb565b82101515610d6557600080fd5b600882815481101515610d7457fe5b9060005260206000209001549050919050565b60008060008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610dfb57600080fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515610e4157600080fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e90611cb4565b60058054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f265780601f10610efb57610100808354040283529160200191610f26565b820191906000526020600020905b815481529060010190602001808311610f0957829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515610f6b57600080fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b611077338383610ca5565b5050565b81611086338261121d565b151561109157600080fd5b61109c858585610b08565b6110a88585858561175e565b15156110b357600080fd5b5050505050565b6110c2611cb4565b6110cb82610cdd565b15156110d657600080fd5b600a60008381526020019081526020016000208054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561117d5780601f106111525761010080835404028352916020019161117d565b820191906000526020600020905b81548152906001019060200180831161116057829003601f168201915b50505050509050919050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60008061122983610d87565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061129857508373ffffffffffffffffffffffffffffffffffffffff16611280846108f8565b73ffffffffffffffffffffffffffffffffffffffff16145b806112a957506112a88185611189565b5b91505092915050565b8173ffffffffffffffffffffffffffffffffffffffff166112d282610d87565b73ffffffffffffffffffffffffffffffffffffffff161415156112f457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156114175760006001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a35b5050565b600080600061142a8585611934565b600760008581526020019081526020016000205492506114966001600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050611a6290919063ffffffff16565b9150600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811015156114e457fe5b906000526020600020900154905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208481548110151561153f57fe5b9060005260206000209001819055506000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110151561159c57fe5b906000526020600020900181905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054809190600190036115fd9190611cc8565b50600060076000868152602001908152602001600020819055508260076000838152602001908152602001600020819055505050505050565b60006116428383611a7b565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060010182816116d89190611cf4565b916000526020600020900160008490919091505550806007600084815260200190815260200160002081905550505050565b6117148282611bd3565b6008805490506009600083815260200190815260200160002081905550600880548060010182816117459190611cf4565b9160005260206000209001600083909190915055505050565b6000806117808573ffffffffffffffffffffffffffffffffffffffff16611c83565b151561178f576001915061192b565b8473ffffffffffffffffffffffffffffffffffffffff1663f0b9e5ba8786866000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561185a57808201518184015260208101905061183f565b50505050905090810190601f1680156118875780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15156118a757600080fd5b6102c65a03f115156118b857600080fd5b50505060405180519050905063f0b9e5ba7c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505b50949350505050565b8173ffffffffffffffffffffffffffffffffffffffff1661195482610d87565b73ffffffffffffffffffffffffffffffffffffffff1614151561197657600080fd5b6119c96001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a6290919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600080600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000828211151515611a7057fe5b818303905092915050565b600073ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515611ae857600080fd5b8160008083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611b8c6001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c9690919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611c0f57600080fd5b611c198282611636565b8173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600080823b905060008111915050919050565b6000808284019050838110151515611caa57fe5b8091505092915050565b602060405190810160405280600081525090565b815481835581811511611cef57818360005260206000209182019101611cee9190611d20565b5b505050565b815481835581811511611d1b57818360005260206000209182019101611d1a9190611d20565b5b505050565b611d4291905b80821115611d3e576000816000905550600101611d26565b5090565b905600a165627a7a723058207ea6816917c58ff763036e5a75d9579ff5daa72f6184bb234c0f45eca9abf0ed0029", + "deployedBytecode": "0x606060405260043610610107576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a71461010c57806306fdde0314610166578063081812fc146101f4578063095ea7b31461025757806318160ddd1461029957806323b872dd146102c25780632f745c591461032357806340c10f191461037957806342842e0e146103bb5780634f558e791461041c5780634f6ccce7146104575780636352211e1461048e57806370a08231146104f157806395d89b411461053e578063a22cb465146105cc578063a9059cbb14610610578063b88d4fde14610652578063c87b56dd146106f6578063e985e9c514610792575b600080fd5b341561011757600080fd5b61014c60048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050610802565b604051808215151515815260200191505060405180910390f35b341561017157600080fd5b610179610850565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101b957808201518184015260208101905061019e565b50505050905090810190601f1680156101e65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101ff57600080fd5b61021560048080359060200190919050506108f8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561026257600080fd5b610297600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610935565b005b34156102a457600080fd5b6102ac610afb565b6040518082815260200191505060405180910390f35b34156102cd57600080fd5b610321600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610b08565b005b341561032e57600080fd5b610363600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610c1f565b6040518082815260200191505060405180910390f35b341561038457600080fd5b6103b9600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610c97565b005b34156103c657600080fd5b61041a600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610ca5565b005b341561042757600080fd5b61043d6004808035906020019091905050610cdd565b604051808215151515815260200191505060405180910390f35b341561046257600080fd5b6104786004808035906020019091905050610d4e565b6040518082815260200191505060405180910390f35b341561049957600080fd5b6104af6004808035906020019091905050610d87565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104fc57600080fd5b610528600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610e04565b6040518082815260200191505060405180910390f35b341561054957600080fd5b610551610e88565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610591578082015181840152602081019050610576565b50505050905090810190601f1680156105be5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156105d757600080fd5b61060e600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080351515906020019091905050610f30565b005b341561061b57600080fd5b610650600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061106c565b005b341561065d57600080fd5b6106f4600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190505061107b565b005b341561070157600080fd5b61071760048080359060200190919050506110ba565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561075757808201518184015260208101905061073c565b50505050905090810190601f1680156107845780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561079d57600080fd5b6107e8600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611189565b604051808215151515815260200191505060405180910390f35b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610858611cb4565b60048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156108ee5780601f106108c3576101008083540402835291602001916108ee565b820191906000526020600020905b8154815290600101906020018083116108d157829003601f168201915b5050505050905090565b60006001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061094082610d87565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561097d57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806109bd57506109bc8133611189565b5b15156109c857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166109e9836108f8565b73ffffffffffffffffffffffffffffffffffffffff16141580610a395750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b15610af657826001600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a35b505050565b6000600880549050905090565b80610b13338261121d565b1515610b1e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614151515610b5a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515610b9657600080fd5b610ba084836112b2565b610baa848361141b565b610bb48383611636565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a350505050565b6000610c2a83610e04565b82101515610c3757600080fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515610c8357fe5b906000526020600020900154905092915050565b610ca1828261170a565b5050565b80610cb0338261121d565b1515610cbb57600080fd5b610cd7848484602060405190810160405280600081525061107b565b50505050565b60008060008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b6000610d58610afb565b82101515610d6557600080fd5b600882815481101515610d7457fe5b9060005260206000209001549050919050565b60008060008084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610dfb57600080fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515610e4157600080fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e90611cb4565b60058054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f265780601f10610efb57610100808354040283529160200191610f26565b820191906000526020600020905b815481529060010190602001808311610f0957829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515610f6b57600080fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b611077338383610ca5565b5050565b81611086338261121d565b151561109157600080fd5b61109c858585610b08565b6110a88585858561175e565b15156110b357600080fd5b5050505050565b6110c2611cb4565b6110cb82610cdd565b15156110d657600080fd5b600a60008381526020019081526020016000208054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561117d5780601f106111525761010080835404028352916020019161117d565b820191906000526020600020905b81548152906001019060200180831161116057829003601f168201915b50505050509050919050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60008061122983610d87565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061129857508373ffffffffffffffffffffffffffffffffffffffff16611280846108f8565b73ffffffffffffffffffffffffffffffffffffffff16145b806112a957506112a88185611189565b5b91505092915050565b8173ffffffffffffffffffffffffffffffffffffffff166112d282610d87565b73ffffffffffffffffffffffffffffffffffffffff161415156112f457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166001600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156114175760006001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a35b5050565b600080600061142a8585611934565b600760008581526020019081526020016000205492506114966001600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050611a6290919063ffffffff16565b9150600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811015156114e457fe5b906000526020600020900154905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208481548110151561153f57fe5b9060005260206000209001819055506000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110151561159c57fe5b906000526020600020900181905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054809190600190036115fd9190611cc8565b50600060076000868152602001908152602001600020819055508260076000838152602001908152602001600020819055505050505050565b60006116428383611a7b565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060010182816116d89190611cf4565b916000526020600020900160008490919091505550806007600084815260200190815260200160002081905550505050565b6117148282611bd3565b6008805490506009600083815260200190815260200160002081905550600880548060010182816117459190611cf4565b9160005260206000209001600083909190915055505050565b6000806117808573ffffffffffffffffffffffffffffffffffffffff16611c83565b151561178f576001915061192b565b8473ffffffffffffffffffffffffffffffffffffffff1663f0b9e5ba8786866000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561185a57808201518184015260208101905061183f565b50505050905090810190601f1680156118875780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15156118a757600080fd5b6102c65a03f115156118b857600080fd5b50505060405180519050905063f0b9e5ba7c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505b50949350505050565b8173ffffffffffffffffffffffffffffffffffffffff1661195482610d87565b73ffffffffffffffffffffffffffffffffffffffff1614151561197657600080fd5b6119c96001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a6290919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600080600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000828211151515611a7057fe5b818303905092915050565b600073ffffffffffffffffffffffffffffffffffffffff1660008083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515611ae857600080fd5b8160008083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611b8c6001600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c9690919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611c0f57600080fd5b611c198282611636565b8173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600080823b905060008111915050919050565b6000808284019050838110151515611caa57fe5b8091505092915050565b602060405190810160405280600081525090565b815481835581811511611cef57818360005260206000209182019101611cee9190611d20565b5b505050565b815481835581811511611d1b57818360005260206000209182019101611d1a9190611d20565b5b505050565b611d4291905b80821115611d3e576000816000905550600101611d26565b5090565b905600a165627a7a723058207ea6816917c58ff763036e5a75d9579ff5daa72f6184bb234c0f45eca9abf0ed0029", "sourceMap": "285:684:20:-;;;343:82;;;;;;;;1107:105:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1179:5;1171;:13;;;;;;;;;;;;:::i;:::-;;1200:7;1190;:17;;;;;;;;;;;;:::i;:::-;;1107:105;;285:684:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;", "deployedSourceMap": "285:684:20:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;612:176;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1303:68:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3577:111:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2998:350;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2887:87:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5042:315:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2571:177:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;431:86:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5964:154:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2445:140;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3298::50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2107:164:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1756:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1466:72:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3969:200:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;850:117:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6794:227:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1727:133:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4478:142:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;612:176:20;706:17;761:10;746:25;;:11;:25;;;;739:32;;612:176;;;:::o;1303:68:50:-;1340:6;;:::i;:::-;1361:5;1354:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1303:68;:::o;3577:111:48:-;3637:7;3659:14;:24;3674:8;3659:24;;;;;;;;;;;;;;;;;;;;;3652:31;;3577:111;;;:::o;2998:350::-;3059:13;3075:17;3083:8;3075:7;:17::i;:::-;3059:33;;3113:5;3106:12;;:3;:12;;;;3098:21;;;;;;;;3147:5;3133:19;;:10;:19;;;:58;;;;3156:35;3173:5;3180:10;3156:16;:35::i;:::-;3133:58;3125:67;;;;;;;;3236:1;3203:35;;:21;3215:8;3203:11;:21::i;:::-;:35;;;;:56;;;;3257:1;3242:17;;:3;:17;;;;3203:56;3199:145;;;3296:3;3269:14;:24;3284:8;3269:24;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;3323:3;3307:30;;3316:5;3307:30;;;3328:8;3307:30;;;;;;;;;;;;;;;;;;3199:145;2998:350;;;:::o;2887:87:50:-;2931:7;2953:9;:16;;;;2946:23;;2887:87;:::o;5042:315:48:-;5129:8;1516:39;1534:10;1546:8;1516:17;:39::i;:::-;1508:48;;;;;;;;5170:1;5153:19;;:5;:19;;;;5145:28;;;;;;;;5202:1;5187:17;;:3;:17;;;;5179:26;;;;;;;;5212:30;5226:5;5233:8;5212:13;:30::i;:::-;5248:32;5264:5;5271:8;5248:15;:32::i;:::-;5286:25;5297:3;5302:8;5286:10;:25::i;:::-;5338:3;5322:30;;5331:5;5322:30;;;5343:8;5322:30;;;;;;;;;;;;;;;;;;5042:315;;;;:::o;2571:177:50:-;2653:7;2685:17;2695:6;2685:9;:17::i;:::-;2676:6;:26;2668:35;;;;;;;;2716:11;:19;2728:6;2716:19;;;;;;;;;;;;;;;2736:6;2716:27;;;;;;;;;;;;;;;;;;;2709:34;;2571:177;;;;:::o;431:86:20:-;490:20;496:3;501:8;490:5;:20::i;:::-;431:86;;:::o;5964:154:48:-;6055:8;1516:39;1534:10;1546:8;1516:17;:39::i;:::-;1508:48;;;;;;;;6071:42;6088:5;6095:3;6100:8;6071:42;;;;;;;;;;;;;:16;:42::i;:::-;5964:154;;;;:::o;2445:140::-;2500:4;2512:13;2528:10;:20;2539:8;2528:20;;;;;;;;;;;;;;;;;;;;;2512:36;;2578:1;2561:19;;:5;:19;;;;2554:26;;2445:140;;;;:::o;3298::50:-;3357:7;3389:13;:11;:13::i;:::-;3380:6;:22;3372:31;;;;;;;;3416:9;3426:6;3416:17;;;;;;;;;;;;;;;;;;;3409:24;;3298:140;;;:::o;2107:164:48:-;2163:7;2178:13;2194:10;:20;2205:8;2194:20;;;;;;;;;;;;;;;;;;;;;2178:36;;2245:1;2228:19;;:5;:19;;;;2220:28;;;;;;;;2261:5;2254:12;;2107:164;;;;:::o;1756:142::-;1812:7;1853:1;1835:20;;:6;:20;;;;1827:29;;;;;;;;1869:16;:24;1886:6;1869:24;;;;;;;;;;;;;;;;1862:31;;1756:142;;;:::o;1466:72:50:-;1505:6;;:::i;:::-;1526:7;1519:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1466:72;:::o;3969:200:48:-;4053:10;4046:17;;:3;:17;;;;4038:26;;;;;;;;4107:9;4070:17;:29;4088:10;4070:29;;;;;;;;;;;;;;;:34;4100:3;4070:34;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;4149:3;4122:42;;4137:10;4122:42;;;4154:9;4122:42;;;;;;;;;;;;;;;;;;;;;;3969:200;;:::o;850:117:20:-;917:43;934:10;946:3;951:8;917:16;:43::i;:::-;850:117;;:::o;6794:227:48:-;6898:8;1516:39;1534:10;1546:8;1516:17;:39::i;:::-;1508:48;;;;;;;;6914:34;6927:5;6934:3;6939:8;6914:12;:34::i;:::-;6962:53;6987:5;6994:3;6999:8;7009:5;6962:24;:53::i;:::-;6954:62;;;;;;;;6794:227;;;;;:::o;1727:133:50:-;1784:6;;:::i;:::-;1806:16;1813:8;1806:6;:16::i;:::-;1798:25;;;;;;;;1836:9;:19;1846:8;1836:19;;;;;;;;;;;1829:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1727:133;;;:::o;4478:142:48:-;4560:4;4579:17;:25;4597:6;4579:25;;;;;;;;;;;;;;;:36;4605:9;4579:36;;;;;;;;;;;;;;;;;;;;;;;;;4572:43;;4478:142;;;;:::o;7368:240::-;7454:4;7466:13;7482:17;7490:8;7482:7;:17::i;:::-;7466:33;;7524:5;7512:17;;:8;:17;;;:54;;;;7558:8;7533:33;;:21;7545:8;7533:11;:21::i;:::-;:33;;;7512:54;:91;;;;7570:33;7587:5;7594:8;7570:16;:33::i;:::-;7512:91;7505:98;;7368:240;;;;;:::o;8653:260::-;8754:6;8733:27;;:17;8741:8;8733:7;:17::i;:::-;:27;;;8725:36;;;;;;;;8807:1;8771:38;;:14;:24;8786:8;8771:24;;;;;;;;;;;;;;;;;;;;;:38;;;;8767:142;;;8854:1;8819:14;:24;8834:8;8819:24;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;8889:1;8864:38;;8873:6;8864:38;;;8893:8;8864:38;;;;;;;;;;;;;;;;;;8767:142;8653:260;;:::o;4198:856:50:-;4316:18;4369:22;4432:17;4271:38;4293:5;4300:8;4271:21;:38::i;:::-;4337:16;:26;4354:8;4337:26;;;;;;;;;;;;4316:47;;4394:32;4424:1;4394:11;:18;4406:5;4394:18;;;;;;;;;;;;;;;:25;;;;:29;;:32;;;;:::i;:::-;4369:57;;4452:11;:18;4464:5;4452:18;;;;;;;;;;;;;;;4471:14;4452:34;;;;;;;;;;;;;;;;;;;4432:54;;4526:9;4493:11;:18;4505:5;4493:18;;;;;;;;;;;;;;;4512:10;4493:30;;;;;;;;;;;;;;;;;;:42;;;;4578:1;4541:11;:18;4553:5;4541:18;;;;;;;;;;;;;;;4560:14;4541:34;;;;;;;;;;;;;;;;;;:38;;;;4940:11;:18;4952:5;4940:18;;;;;;;;;;;;;;;:27;;;;;;;;;;;;:::i;:::-;;5002:1;4973:16;:26;4990:8;4973:26;;;;;;;;;;;:30;;;;5039:10;5009:16;:27;5026:9;5009:27;;;;;;;;;;;:40;;;;4198:856;;;;;:::o;3697:226::-;3800:14;3763:31;3780:3;3785:8;3763:16;:31::i;:::-;3817:11;:16;3829:3;3817:16;;;;;;;;;;;;;;;:23;;;;3800:40;;3846:11;:16;3858:3;3846:16;;;;;;;;;;;;;;;:31;;;;;;;;;;;:::i;:::-;;;;;;;;;;3868:8;3846:31;;;;;;;3912:6;3883:16;:26;3900:8;3883:26;;;;;;;;;;;:35;;;;3697:226;;;:::o;5315:176::-;5376:26;5388:3;5393:8;5376:11;:26::i;:::-;5440:9;:16;;;;5413:14;:24;5428:8;5413:24;;;;;;;;;;;:43;;;;5462:9;:24;;;;;;;;;;;:::i;:::-;;;;;;;;;;5477:8;5462:24;;;;;;;5315:176;;:::o;10368:298:48:-;10479:4;10545:13;10496:16;:3;:14;;;:16::i;:::-;10495:17;10491:49;;;10529:4;10522:11;;;;10491:49;10576:3;10561:36;;;10598:5;10605:8;10615:5;10561:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10545:76:48;;605:10;10645:15;;10635:25;;;:6;:25;;;;10627:34;;10368:298;;;;;;;;:::o;9651:214::-;9753:5;9732:26;;:17;9740:8;9732:7;:17::i;:::-;:26;;;9724:35;;;;;;;;9791:30;9819:1;9791:16;:23;9808:5;9791:23;;;;;;;;;;;;;;;;:27;;:30;;;;:::i;:::-;9765:16;:23;9782:5;9765:23;;;;;;;;;;;;;;;:56;;;;9858:1;9827:10;:20;9838:8;9827:20;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;9651:214;;:::o;835:110:38:-;893:7;920:1;915;:6;;908:14;;;;;;939:1;935;:5;928:12;;835:110;;;;:::o;9172:204:48:-;9278:1;9246:34;;:10;:20;9257:8;9246:20;;;;;;;;;;;;;;;;;;;;;:34;;;9238:43;;;;;;;;9310:3;9287:10;:20;9298:8;9287:20;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;9343:28;9369:1;9343:16;:21;9360:3;9343:21;;;;;;;;;;;;;;;;:25;;:28;;;;:::i;:::-;9319:16;:21;9336:3;9319:21;;;;;;;;;;;;;;;:52;;;;9172:204;;:::o;7857:164::-;7941:1;7926:17;;:3;:17;;;;7918:26;;;;;;;;7950:25;7961:3;7966:8;7950:10;:25::i;:::-;8002:3;7981:35;;7998:1;7981:35;;;8007:8;7981:35;;;;;;;;;;;;;;;;;;7857:164;;:::o;451:150:36:-;508:4;520:12;569:4;557:11;549:25;;595:1;588:4;:8;581:15;;451:150;;;;:::o;1007:129:38:-;1065:7;1080:9;1096:1;1092;:5;1080:17;;1115:1;1110;:6;;1103:14;;;;;;1130:1;1123:8;;1007:129;;;;;:::o;285:684:20:-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", "source": "pragma solidity 0.4.18;\n\nimport \"zeppelin-solidity/contracts/token/ERC721/ERC721Token.sol\";\nimport \"../ERC165.sol\";\n\n/**\n * This implementation of the ERC721 standard allows us to deploy a test ERC721 contract and mint\n * non-fungible tokens that we can use in a test environment.\n */\ncontract MintableERC721Token is ERC721Token, ERC165 {\n function MintableERC721Token() public ERC721Token(\"MintableERC721Token\", \"MET\") {}\n\n function mint(address _to, uint _tokenId) public {\n _mint(_to, _tokenId);\n }\n\n /**\n * ERC165 interface.\n * Returns true for ERC721, false otherwise\n */\n function supportsInterface(bytes4 interfaceID)\n external\n view\n returns (bool _isSupported)\n {\n return interfaceID == 0x80ac58cd; // ERC721\n }\n\n /**\n * Support deprecated ERC721 method\n */\n function transfer(address _to, uint _tokenId) public\n {\n safeTransferFrom(msg.sender, _to, _tokenId);\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/MintableERC721Token.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/MintableERC721Token.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/MintableERC721Token.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/MintableERC721Token.sol", "exportedSymbols": { "MintableERC721Token": [ 9992 @@ -484,7 +484,7 @@ export const MintableERC721Token = { "attributes": { "SourceUnit": 3551, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/ERC165.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/ERC165.sol", "file": "../ERC165.sol", "scope": 9993, "symbolAliases": [ @@ -1237,7 +1237,7 @@ export const MintableERC721Token = "42": { "events": {}, "links": {}, - "address": "0x1db2f4774e0b0c84047a97e6c129abe7f9ed0d18" + "address": "0x67b0b219faf38b7a862c480213b2860e645c264f" }, "70": { "events": {}, @@ -1246,5 +1246,5 @@ export const MintableERC721Token = } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:16:13.730Z" + "updatedAt": "2018-10-09T17:53:04.860Z" } \ No newline at end of file diff --git a/artifacts/ts/MintableToken.ts b/artifacts/ts/MintableToken.ts index bb1adbc7..3c52cb0d 100644 --- a/artifacts/ts/MintableToken.ts +++ b/artifacts/ts/MintableToken.ts @@ -1665,5 +1665,5 @@ export const MintableToken = }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:48.049Z" + "updatedAt": "2018-10-09T17:45:35.471Z" } \ No newline at end of file diff --git a/artifacts/ts/MockCollateralizedTermsContract.ts b/artifacts/ts/MockCollateralizedTermsContract.ts index bdb7af6d..bb38fd09 100644 --- a/artifacts/ts/MockCollateralizedTermsContract.ts +++ b/artifacts/ts/MockCollateralizedTermsContract.ts @@ -342,15 +342,15 @@ export const MockCollateralizedTermsContract = "type": "function" } ], - "bytecode": "0x6060604052341561000f57600080fd5b6117398061001e6000396000f3006060604052600436106100e6576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a896a1146100eb57806304aa85fa1461012657806306e9d7cd1461014b578063131018581461017b5780632762dd8c146102015780635f0280ba1461023c5780636dcea718146102e15780637f8601a11461034657806380da20d4146103eb578063977a5e641461046257806399114d84146104c0578063b433022f14610504578063c45d83ef14610534578063c73e02b014610592578063d826f88f146105cb578063ed3c7d40146105e0575b600080fd5b34156100f657600080fd5b610110600480803560001916906020019091905050610607565b6040518082815260200191505060405180910390f35b341561013157600080fd5b6101496004808035151590602001909190505061062c565b005b341561015657600080fd5b610179600480803560001916906020019091908035906020019091905050610686565b005b341561018657600080fd5b6101e3600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091908035600019169060200190919050506106aa565b60405180826000191660001916815260200191505060405180910390f35b341561020c57600080fd5b610226600480803560001916906020019091905050610739565b6040518082815260200191505060405180910390f35b341561024757600080fd5b6102c760048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061075e565b604051808215151515815260200191505060405180910390f35b34156102ec57600080fd5b610344600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506108e8565b005b341561035157600080fd5b6103d160048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506109c2565b604051808215151515815260200191505060405180910390f35b34156103f657600080fd5b610460600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080356000191690602001909190803560001916906020019091905050610afc565b005b341561046d57600080fd5b6104a660048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610c26565b604051808215151515815260200191505060405180910390f35b34156104cb57600080fd5b6104ee600480803560001916906020019091908035906020019091905050610d7b565b6040518082815260200191505060405180910390f35b341561050f57600080fd5b610532600480803560001916906020019091908035906020019091905050610e18565b005b341561053f57600080fd5b61057860048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610e3c565b604051808215151515815260200191505060405180910390f35b341561059d57600080fd5b6105c9600480803560001916906020019091908035906020019091908035906020019091905050610ee5565b005b34156105d657600080fd5b6105de610fca565b005b34156105eb57600080fd5b6106056004808035600019169060200190919050506112c1565b005b6000600360008360001916600019168152602001908152602001600020549050919050565b6106836040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525060006001028361067957600060010261067e565b600180025b610afc565b50565b80600360008460001916600019168152602001908152602001600020819055505050565b60006001836040518082805190602001908083835b6020831015156106e457805182526020820191506020810190506020830392506106bf565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b6000600760008360001916600019168152602001908152602001600020549050919050565b600061088d6040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525087878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401955050505050506040518091039020611331565b60018002600019166108d86040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525060006001026106aa565b6000191614905095945050505050565b60008390508073ffffffffffffffffffffffffffffffffffffffff1663649404bd84846000604051602001526040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b15156109a057600080fd5b6102c65a03f115156109b157600080fd5b505050604051805190505050505050565b6000610af16040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525087878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140195505050505050604051809103902061146a565b905095945050505050565b6000836040518082805190602001908083835b602083101515610b345780518252602082019150602081019050602083039250610b0f565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281610b799190611644565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b602083101515610bcd5780518252602082019150602081019050602083039250610ba8565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b6000610cc76040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525084846040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040518091039020611331565b6001800260001916610d6e6040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525085856040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019250505060405180910390206106aa565b6000191614905092915050565b600080600080600091505b6005821015610de05760056000876000191660001916815260200190815260200160002082600581101515610db757fe5b01549050848111158015610dca57508281115b15610dd3578092505b8180600101925050610d86565b600460008760001916600019168152602001908152602001600020600084815260200190815260200160002054935050505092915050565b80600760008460001916600019168152602001908152602001600020819055505050565b6000610edd6040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525084846040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140192505050604051809103902061146a565b905092915050565b6000806004600086600019166000191681526020019081526020016000206000858152602001908152602001600020541415610f93576006600085600019166000191681526020019081526020016000205490508260056000866000191660001916815260200190815260200160002082600581101515610f6257fe5b0181905550600660008560001916600019168152602001908152602001600020600081548092919060010191905055505b8160046000866000191660001916815260200190815260200160002060008581526020019081526020016000208190555050505050565b6000610fd4611670565b600080600093505b600a8410156112bb57610fed611506565b84600a81101515610ffa57fe5b60200201519250600083511415156112ae57600091505b6000836040518082805190602001908083835b6020831015156110495780518252602082019150602081019050602083039250611024565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015611236576000836040518082805190602001908083835b6020831015156110bf578051825260208201915060208101905060208303925061109a565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020828154811015156110ff57fe5b90600052602060002090015490506002836040518082805190602001908083835b6020831015156111455780518252602082019150602081019050602083039250611120565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b6020831015156111d957805182526020820191506020810190506020830392506111b4565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050611011565b6000836040518082805190602001908083835b60208310151561126e5780518252602082019150602081019050602083039250611249565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006112ad9190611684565b5b8380600101945050610fdc565b50505050565b60008090505b600581101561130c576000600560008460001916600019168152602001908152602001600020826005811015156112fa57fe5b018190555080806001019150506112c7565b6000600660008460001916600019168152602001908152602001600020819055505050565b60016002836040518082805190602001908083835b60208310151561136b5780518252602082019150602081019050602083039250611346565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b60208310151561140657805182526020820191506020810190506020830392506113e1565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020805480600101828161144b9190611644565b9160005260206000209001600083909190915090600019169055505050565b60006002836040518082805190602001908083835b6020831015156114a4578051825260208201915060208101905060208303925061147f565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b61150e6116a5565b610140604051908101604052806040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525081526020016040805190810160405280601181526020017f72656769737465725465726d53746172740000000000000000000000000000008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b81548183558181151161166b5781836000526020600020918201910161166a91906116d4565b5b505050565b602060405190810160405280600081525090565b50805460008255906000526020600020908101906116a291906116d4565b50565b61014060405190810160405280600a905b6116be6116f9565b8152602001906001900390816116b65790505090565b6116f691905b808211156116f25760008160009055506001016116da565b5090565b90565b6020604051908101604052806000815250905600a165627a7a723058202e19f86cb1f1d650392a03abbae08539ee4b1d9b92b6dbada3b2aea4ea42b26c0029", - "deployedBytecode": "0x6060604052600436106100e6576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a896a1146100eb57806304aa85fa1461012657806306e9d7cd1461014b578063131018581461017b5780632762dd8c146102015780635f0280ba1461023c5780636dcea718146102e15780637f8601a11461034657806380da20d4146103eb578063977a5e641461046257806399114d84146104c0578063b433022f14610504578063c45d83ef14610534578063c73e02b014610592578063d826f88f146105cb578063ed3c7d40146105e0575b600080fd5b34156100f657600080fd5b610110600480803560001916906020019091905050610607565b6040518082815260200191505060405180910390f35b341561013157600080fd5b6101496004808035151590602001909190505061062c565b005b341561015657600080fd5b610179600480803560001916906020019091908035906020019091905050610686565b005b341561018657600080fd5b6101e3600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091908035600019169060200190919050506106aa565b60405180826000191660001916815260200191505060405180910390f35b341561020c57600080fd5b610226600480803560001916906020019091905050610739565b6040518082815260200191505060405180910390f35b341561024757600080fd5b6102c760048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061075e565b604051808215151515815260200191505060405180910390f35b34156102ec57600080fd5b610344600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506108e8565b005b341561035157600080fd5b6103d160048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506109c2565b604051808215151515815260200191505060405180910390f35b34156103f657600080fd5b610460600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080356000191690602001909190803560001916906020019091905050610afc565b005b341561046d57600080fd5b6104a660048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610c26565b604051808215151515815260200191505060405180910390f35b34156104cb57600080fd5b6104ee600480803560001916906020019091908035906020019091905050610d7b565b6040518082815260200191505060405180910390f35b341561050f57600080fd5b610532600480803560001916906020019091908035906020019091905050610e18565b005b341561053f57600080fd5b61057860048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610e3c565b604051808215151515815260200191505060405180910390f35b341561059d57600080fd5b6105c9600480803560001916906020019091908035906020019091908035906020019091905050610ee5565b005b34156105d657600080fd5b6105de610fca565b005b34156105eb57600080fd5b6106056004808035600019169060200190919050506112c1565b005b6000600360008360001916600019168152602001908152602001600020549050919050565b6106836040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525060006001028361067957600060010261067e565b600180025b610afc565b50565b80600360008460001916600019168152602001908152602001600020819055505050565b60006001836040518082805190602001908083835b6020831015156106e457805182526020820191506020810190506020830392506106bf565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b6000600760008360001916600019168152602001908152602001600020549050919050565b600061088d6040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525087878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401955050505050506040518091039020611331565b60018002600019166108d86040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525060006001026106aa565b6000191614905095945050505050565b60008390508073ffffffffffffffffffffffffffffffffffffffff1663649404bd84846000604051602001526040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b15156109a057600080fd5b6102c65a03f115156109b157600080fd5b505050604051805190505050505050565b6000610af16040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525087878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140195505050505050604051809103902061146a565b905095945050505050565b6000836040518082805190602001908083835b602083101515610b345780518252602082019150602081019050602083039250610b0f565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281610b799190611644565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b602083101515610bcd5780518252602082019150602081019050602083039250610ba8565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b6000610cc76040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525084846040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040518091039020611331565b6001800260001916610d6e6040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525085856040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019250505060405180910390206106aa565b6000191614905092915050565b600080600080600091505b6005821015610de05760056000876000191660001916815260200190815260200160002082600581101515610db757fe5b01549050848111158015610dca57508281115b15610dd3578092505b8180600101925050610d86565b600460008760001916600019168152602001908152602001600020600084815260200190815260200160002054935050505092915050565b80600760008460001916600019168152602001908152602001600020819055505050565b6000610edd6040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525084846040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140192505050604051809103902061146a565b905092915050565b6000806004600086600019166000191681526020019081526020016000206000858152602001908152602001600020541415610f93576006600085600019166000191681526020019081526020016000205490508260056000866000191660001916815260200190815260200160002082600581101515610f6257fe5b0181905550600660008560001916600019168152602001908152602001600020600081548092919060010191905055505b8160046000866000191660001916815260200190815260200160002060008581526020019081526020016000208190555050505050565b6000610fd4611670565b600080600093505b600a8410156112bb57610fed611506565b84600a81101515610ffa57fe5b60200201519250600083511415156112ae57600091505b6000836040518082805190602001908083835b6020831015156110495780518252602082019150602081019050602083039250611024565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015611236576000836040518082805190602001908083835b6020831015156110bf578051825260208201915060208101905060208303925061109a565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020828154811015156110ff57fe5b90600052602060002090015490506002836040518082805190602001908083835b6020831015156111455780518252602082019150602081019050602083039250611120565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b6020831015156111d957805182526020820191506020810190506020830392506111b4565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050611011565b6000836040518082805190602001908083835b60208310151561126e5780518252602082019150602081019050602083039250611249565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006112ad9190611684565b5b8380600101945050610fdc565b50505050565b60008090505b600581101561130c576000600560008460001916600019168152602001908152602001600020826005811015156112fa57fe5b018190555080806001019150506112c7565b6000600660008460001916600019168152602001908152602001600020819055505050565b60016002836040518082805190602001908083835b60208310151561136b5780518252602082019150602081019050602083039250611346565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b60208310151561140657805182526020820191506020810190506020830392506113e1565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020805480600101828161144b9190611644565b9160005260206000209001600083909190915090600019169055505050565b60006002836040518082805190602001908083835b6020831015156114a4578051825260208201915060208101905060208303925061147f565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b61150e6116a5565b610140604051908101604052806040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525081526020016040805190810160405280601181526020017f72656769737465725465726d53746172740000000000000000000000000000008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b81548183558181151161166b5781836000526020600020918201910161166a91906116d4565b5b505050565b602060405190810160405280600081525090565b50805460008255906000526020600020908101906116a291906116d4565b50565b61014060405190810160405280600a905b6116be6116f9565b8152602001906001900390816116b65790505090565b6116f691905b808211156116f25760008160009055506001016116da565b5090565b90565b6020604051908101604052806000815250905600a165627a7a723058202e19f86cb1f1d650392a03abbae08539ee4b1d9b92b6dbada3b2aea4ea42b26c0029", + "bytecode": "0x6060604052341561000f57600080fd5b6117398061001e6000396000f3006060604052600436106100e6576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a896a1146100eb57806304aa85fa1461012657806306e9d7cd1461014b578063131018581461017b5780632762dd8c146102015780635f0280ba1461023c5780636dcea718146102e15780637f8601a11461034657806380da20d4146103eb578063977a5e641461046257806399114d84146104c0578063b433022f14610504578063c45d83ef14610534578063c73e02b014610592578063d826f88f146105cb578063ed3c7d40146105e0575b600080fd5b34156100f657600080fd5b610110600480803560001916906020019091905050610607565b6040518082815260200191505060405180910390f35b341561013157600080fd5b6101496004808035151590602001909190505061062c565b005b341561015657600080fd5b610179600480803560001916906020019091908035906020019091905050610686565b005b341561018657600080fd5b6101e3600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091908035600019169060200190919050506106aa565b60405180826000191660001916815260200191505060405180910390f35b341561020c57600080fd5b610226600480803560001916906020019091905050610739565b6040518082815260200191505060405180910390f35b341561024757600080fd5b6102c760048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061075e565b604051808215151515815260200191505060405180910390f35b34156102ec57600080fd5b610344600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506108e8565b005b341561035157600080fd5b6103d160048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506109c2565b604051808215151515815260200191505060405180910390f35b34156103f657600080fd5b610460600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080356000191690602001909190803560001916906020019091905050610afc565b005b341561046d57600080fd5b6104a660048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610c26565b604051808215151515815260200191505060405180910390f35b34156104cb57600080fd5b6104ee600480803560001916906020019091908035906020019091905050610d7b565b6040518082815260200191505060405180910390f35b341561050f57600080fd5b610532600480803560001916906020019091908035906020019091905050610e18565b005b341561053f57600080fd5b61057860048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610e3c565b604051808215151515815260200191505060405180910390f35b341561059d57600080fd5b6105c9600480803560001916906020019091908035906020019091908035906020019091905050610ee5565b005b34156105d657600080fd5b6105de610fca565b005b34156105eb57600080fd5b6106056004808035600019169060200190919050506112c1565b005b6000600360008360001916600019168152602001908152602001600020549050919050565b6106836040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525060006001028361067957600060010261067e565b600180025b610afc565b50565b80600360008460001916600019168152602001908152602001600020819055505050565b60006001836040518082805190602001908083835b6020831015156106e457805182526020820191506020810190506020830392506106bf565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b6000600760008360001916600019168152602001908152602001600020549050919050565b600061088d6040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525087878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401955050505050506040518091039020611331565b60018002600019166108d86040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525060006001026106aa565b6000191614905095945050505050565b60008390508073ffffffffffffffffffffffffffffffffffffffff1663649404bd84846000604051602001526040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b15156109a057600080fd5b6102c65a03f115156109b157600080fd5b505050604051805190505050505050565b6000610af16040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525087878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140195505050505050604051809103902061146a565b905095945050505050565b6000836040518082805190602001908083835b602083101515610b345780518252602082019150602081019050602083039250610b0f565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281610b799190611644565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b602083101515610bcd5780518252602082019150602081019050602083039250610ba8565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b6000610cc76040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525084846040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040518091039020611331565b6001800260001916610d6e6040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525085856040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019250505060405180910390206106aa565b6000191614905092915050565b600080600080600091505b6005821015610de05760056000876000191660001916815260200190815260200160002082600581101515610db757fe5b01549050848111158015610dca57508281115b15610dd3578092505b8180600101925050610d86565b600460008760001916600019168152602001908152602001600020600084815260200190815260200160002054935050505092915050565b80600760008460001916600019168152602001908152602001600020819055505050565b6000610edd6040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525084846040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140192505050604051809103902061146a565b905092915050565b6000806004600086600019166000191681526020019081526020016000206000858152602001908152602001600020541415610f93576006600085600019166000191681526020019081526020016000205490508260056000866000191660001916815260200190815260200160002082600581101515610f6257fe5b0181905550600660008560001916600019168152602001908152602001600020600081548092919060010191905055505b8160046000866000191660001916815260200190815260200160002060008581526020019081526020016000208190555050505050565b6000610fd4611670565b600080600093505b600a8410156112bb57610fed611506565b84600a81101515610ffa57fe5b60200201519250600083511415156112ae57600091505b6000836040518082805190602001908083835b6020831015156110495780518252602082019150602081019050602083039250611024565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015611236576000836040518082805190602001908083835b6020831015156110bf578051825260208201915060208101905060208303925061109a565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020828154811015156110ff57fe5b90600052602060002090015490506002836040518082805190602001908083835b6020831015156111455780518252602082019150602081019050602083039250611120565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b6020831015156111d957805182526020820191506020810190506020830392506111b4565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050611011565b6000836040518082805190602001908083835b60208310151561126e5780518252602082019150602081019050602083039250611249565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006112ad9190611684565b5b8380600101945050610fdc565b50505050565b60008090505b600581101561130c576000600560008460001916600019168152602001908152602001600020826005811015156112fa57fe5b018190555080806001019150506112c7565b6000600660008460001916600019168152602001908152602001600020819055505050565b60016002836040518082805190602001908083835b60208310151561136b5780518252602082019150602081019050602083039250611346565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b60208310151561140657805182526020820191506020810190506020830392506113e1565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020805480600101828161144b9190611644565b9160005260206000209001600083909190915090600019169055505050565b60006002836040518082805190602001908083835b6020831015156114a4578051825260208201915060208101905060208303925061147f565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b61150e6116a5565b610140604051908101604052806040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525081526020016040805190810160405280601181526020017f72656769737465725465726d53746172740000000000000000000000000000008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b81548183558181151161166b5781836000526020600020918201910161166a91906116d4565b5b505050565b602060405190810160405280600081525090565b50805460008255906000526020600020908101906116a291906116d4565b50565b61014060405190810160405280600a905b6116be6116f9565b8152602001906001900390816116b65790505090565b6116f691905b808211156116f25760008160009055506001016116da565b5090565b90565b6020604051908101604052806000815250905600a165627a7a723058204d4a42366ffe718c7c0132f03d9a37572c3b87d50179cb19a289775d2405c1500029", + "deployedBytecode": "0x6060604052600436106100e6576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a896a1146100eb57806304aa85fa1461012657806306e9d7cd1461014b578063131018581461017b5780632762dd8c146102015780635f0280ba1461023c5780636dcea718146102e15780637f8601a11461034657806380da20d4146103eb578063977a5e641461046257806399114d84146104c0578063b433022f14610504578063c45d83ef14610534578063c73e02b014610592578063d826f88f146105cb578063ed3c7d40146105e0575b600080fd5b34156100f657600080fd5b610110600480803560001916906020019091905050610607565b6040518082815260200191505060405180910390f35b341561013157600080fd5b6101496004808035151590602001909190505061062c565b005b341561015657600080fd5b610179600480803560001916906020019091908035906020019091905050610686565b005b341561018657600080fd5b6101e3600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091908035600019169060200190919050506106aa565b60405180826000191660001916815260200191505060405180910390f35b341561020c57600080fd5b610226600480803560001916906020019091905050610739565b6040518082815260200191505060405180910390f35b341561024757600080fd5b6102c760048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061075e565b604051808215151515815260200191505060405180910390f35b34156102ec57600080fd5b610344600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506108e8565b005b341561035157600080fd5b6103d160048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506109c2565b604051808215151515815260200191505060405180910390f35b34156103f657600080fd5b610460600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080356000191690602001909190803560001916906020019091905050610afc565b005b341561046d57600080fd5b6104a660048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610c26565b604051808215151515815260200191505060405180910390f35b34156104cb57600080fd5b6104ee600480803560001916906020019091908035906020019091905050610d7b565b6040518082815260200191505060405180910390f35b341561050f57600080fd5b610532600480803560001916906020019091908035906020019091905050610e18565b005b341561053f57600080fd5b61057860048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610e3c565b604051808215151515815260200191505060405180910390f35b341561059d57600080fd5b6105c9600480803560001916906020019091908035906020019091908035906020019091905050610ee5565b005b34156105d657600080fd5b6105de610fca565b005b34156105eb57600080fd5b6106056004808035600019169060200190919050506112c1565b005b6000600360008360001916600019168152602001908152602001600020549050919050565b6106836040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525060006001028361067957600060010261067e565b600180025b610afc565b50565b80600360008460001916600019168152602001908152602001600020819055505050565b60006001836040518082805190602001908083835b6020831015156106e457805182526020820191506020810190506020830392506106bf565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b6000600760008360001916600019168152602001908152602001600020549050919050565b600061088d6040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525087878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401955050505050506040518091039020611331565b60018002600019166108d86040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525060006001026106aa565b6000191614905095945050505050565b60008390508073ffffffffffffffffffffffffffffffffffffffff1663649404bd84846000604051602001526040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b15156109a057600080fd5b6102c65a03f115156109b157600080fd5b505050604051805190505050505050565b6000610af16040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525087878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140195505050505050604051809103902061146a565b905095945050505050565b6000836040518082805190602001908083835b602083101515610b345780518252602082019150602081019050602083039250610b0f565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281610b799190611644565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b602083101515610bcd5780518252602082019150602081019050602083039250610ba8565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b6000610cc76040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525084846040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040518091039020611331565b6001800260001916610d6e6040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525085856040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019250505060405180910390206106aa565b6000191614905092915050565b600080600080600091505b6005821015610de05760056000876000191660001916815260200190815260200160002082600581101515610db757fe5b01549050848111158015610dca57508281115b15610dd3578092505b8180600101925050610d86565b600460008760001916600019168152602001908152602001600020600084815260200190815260200160002054935050505092915050565b80600760008460001916600019168152602001908152602001600020819055505050565b6000610edd6040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525084846040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140192505050604051809103902061146a565b905092915050565b6000806004600086600019166000191681526020019081526020016000206000858152602001908152602001600020541415610f93576006600085600019166000191681526020019081526020016000205490508260056000866000191660001916815260200190815260200160002082600581101515610f6257fe5b0181905550600660008560001916600019168152602001908152602001600020600081548092919060010191905055505b8160046000866000191660001916815260200190815260200160002060008581526020019081526020016000208190555050505050565b6000610fd4611670565b600080600093505b600a8410156112bb57610fed611506565b84600a81101515610ffa57fe5b60200201519250600083511415156112ae57600091505b6000836040518082805190602001908083835b6020831015156110495780518252602082019150602081019050602083039250611024565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015611236576000836040518082805190602001908083835b6020831015156110bf578051825260208201915060208101905060208303925061109a565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020828154811015156110ff57fe5b90600052602060002090015490506002836040518082805190602001908083835b6020831015156111455780518252602082019150602081019050602083039250611120565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b6020831015156111d957805182526020820191506020810190506020830392506111b4565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050611011565b6000836040518082805190602001908083835b60208310151561126e5780518252602082019150602081019050602083039250611249565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006112ad9190611684565b5b8380600101945050610fdc565b50505050565b60008090505b600581101561130c576000600560008460001916600019168152602001908152602001600020826005811015156112fa57fe5b018190555080806001019150506112c7565b6000600660008460001916600019168152602001908152602001600020819055505050565b60016002836040518082805190602001908083835b60208310151561136b5780518252602082019150602081019050602083039250611346565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b60208310151561140657805182526020820191506020810190506020830392506113e1565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020805480600101828161144b9190611644565b9160005260206000209001600083909190915090600019169055505050565b60006002836040518082805190602001908083835b6020831015156114a4578051825260208201915060208101905060208303925061147f565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b61150e6116a5565b610140604051908101604052806040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525081526020016040805190810160405280601181526020017f72656769737465725465726d53746172740000000000000000000000000000008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b81548183558181151161166b5781836000526020600020918201910161166a91906116d4565b5b505050565b602060405190810160405280600081525090565b50805460008255906000526020600020908101906116a291906116d4565b50565b61014060405190810160405280600a905b6116be6116f9565b8152602001906001900390816116b65790505090565b6116f691905b808211156116f25760008160009055506001016116da565b5090565b90565b6020604051908101604052806000815250905600a165627a7a723058204d4a42366ffe718c7c0132f03d9a37572c3b87d50179cb19a289775d2405c1500029", "sourceMap": "675:5832:22:-;;;;;;;;;;;;;;;;;", "deployedSourceMap": "675:5832:22:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3019:158;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3183:187;;;;;;;;;;;;;;;;;;;;;;;;;;;;4937:156;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1294:217:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4250:161:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1571:551;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5990:320;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3376:493;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1018:270:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3875:369:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2128:885;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4765:166;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4417:267;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5099:671;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1517:610:23;;;;;;;;;;;;;;5776:208:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3019:158;3115:7;3145:12;:25;3158:11;3145:25;;;;;;;;;;;;;;;;;;3138:32;;3019:158;;;:::o;3183:187::-;3268:95;;;;;;;;;;;;;;;;;;;697:1:23;689:10;;3329:7:22;:33;;3360:1;3352:10;;3329:33;;;3347:1;3339:10;;3329:33;3268:15;:95::i;:::-;3183:187;:::o;4937:156::-;5080:6;5052:12;:25;5065:11;5052:25;;;;;;;;;;;;;;;;;:34;;;;4937:156;;:::o;1294:217:23:-;1411:24;1458:17;1476:12;1458:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1458:46:23;1490:13;1458:46;;;;;;;;;;;;;;;;;;1451:53;;1294:217;;;;:::o;4250:161:22:-;4345:7;4375:16;:29;4392:11;4375:29;;;;;;;;;;;;;;;;;;4368:36;;4250:161;;;:::o;1571:551::-;1778:13;1807:213;;;;;;;;;;;;;;;;;;;1878:11;1907:5;1930:11;1959:16;1993:12;1851:168;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1807:22;:213::i;:::-;2113:1;2105:10;;2038:77;;;:63;;;;;;;;;;;;;;;;;;;697:1:23;689:10;;2038:18:22;:63::i;:::-;:77;;;;2031:84;;1571:551;;;;;;;:::o;5990:320::-;6144:29;6191:15;6144:63;;6218:14;:28;;;6260:12;6286:7;6218:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5990:320;;;;:::o;3376:493::-;3609:14;3646:216;;;;;;;;;;;;;;;;;;;3720:11;3749:5;3772:11;3801:16;3835:12;3693:168;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3646:25;:216::i;:::-;3639:223;;3376:493;;;;;;;:::o;1018:270:23:-;1155:22;1178:12;1155:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1155:56:23;;;;;;;;;;;:::i;:::-;;;;;;;;;;1197:13;1155:56;;;;;;;;;;;;1270:11;1221:17;1239:12;1221:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1221:46:23;1253:13;1221:46;;;;;;;;;;;;;;;;;:60;;;;;;;1018:270;;;:::o;3875:369:22:-;3993:16;4025:75;;;;;;;;;;;;;;;;;;;4079:11;4092:6;4069:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4025:22;:75::i;:::-;4235:1;4227:10;;4118:119;;;:105;;;;;;;;;;;;;;;;;;;4193:11;4206:6;4183:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4118:18;:105::i;:::-;:119;;;;4111:126;;3875:369;;;;:::o;2128:885::-;2270:7;2293:33;2548:6;2586:21;2557:1;2548:10;;2543:311;2564:1;2560;:5;2543:311;;;2610:25;:38;2636:11;2610:38;;;;;;;;;;;;;;;;;2649:1;2610:41;;;;;;;;;;;2586:65;;2690:9;2670:16;:29;;:92;;;;;2734:28;2715:16;:47;2670:92;2666:178;;;2813:16;2782:47;;2666:178;2567:3;;;;;;;2543:311;;;2933:30;:43;2964:11;2933:43;;;;;;;;;;;;;;;;;:73;2977:28;2933:73;;;;;;;;;;;;2926:80;;2128:885;;;;;;;:::o;4765:166::-;4915:9;4883:16;:29;4900:11;4883:29;;;;;;;;;;;;;;;;;:41;;;;4765:166;;:::o;4417:267::-;4561:15;4599:78;;;;;;;;;;;;;;;;;;;4656:11;4669:6;4646:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4599:25;:78::i;:::-;4592:85;;4417:267;;;;:::o;5099:671::-;5451:39;5434:1;5376:30;:43;5407:11;5376:43;;;;;;;;;;;;;;;;;:54;5420:9;5376:54;;;;;;;;;;;;:59;5372:318;;;5493:22;:35;5516:11;5493:35;;;;;;;;;;;;;;;;;;5451:77;;5619:9;5542:25;:38;5568:11;5542:38;;;;;;;;;;;;;;;;;5581:34;5542:74;;;;;;;;;;:86;;;;5642:22;:35;5665:11;5642:35;;;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;5372:318;5757:6;5700:30;:43;5731:11;5700:43;;;;;;;;;;;;;;;;;:54;5744:9;5700:54;;;;;;;;;;;:63;;;;5099:671;;;;:::o;1517:610:23:-;1556:6;1595:26;;:::i;:::-;1719:6;1807:21;1565:1;1556:10;;1551:570;1572:2;1568:1;:6;1551:570;;;1624:17;:15;:17::i;:::-;1642:1;1624:20;;;;;;;;;;;;;1595:49;;1693:1;1669:12;1663:26;:31;;1659:452;;;1728:1;1719:10;;1714:321;1735:22;1758:12;1735:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1735:43:23;;;;1731:1;:47;1714:321;;;1831:22;1854:12;1831:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1868:1:23;1831:39;;;;;;;;;;;;;;;;;;;1807:63;;1899:13;1913:12;1899:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1899:42:23;1927:13;1899:42;;;;;;;;;;;;;;;;;;1892:49;;;;;;;;;;;1970:17;1988:12;1970:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1970:46:23;2002:13;1970:46;;;;;;;;;;;;;;;;;1963:53;;;1780:3;;;;;;;1714:321;;;2060:22;2083:12;2060:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;;2053:43:23;;;;:::i;:::-;1659:452;1576:3;;;;;;;1551:570;;;1517:610;;;;:::o;5776:208:22:-;5834:6;5843:1;5834:10;;5829:99;5850:1;5846;:5;5829:99;;;5916:1;5872:25;:38;5898:11;5872:38;;;;;;;;;;;;;;;;;5911:1;5872:41;;;;;;;;;;:45;;;;5853:3;;;;;;;5829:99;;;5976:1;5938:22;:35;5961:11;5938:35;;;;;;;;;;;;;;;;;:39;;;;5776:208;;:::o;2133:202:23:-;2267:4;2231:13;2245:12;2231:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2231:33:23;2259:4;2231:33;;;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;2281:22;2304:12;2281:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2281:47:23;;;;;;;;;;;:::i;:::-;;;;;;;;;;2323:4;2281:47;;;;;;;;;;;;2133:202;;:::o;2341:194::-;2458:14;2495:13;2509:12;2495:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2495:33:23;2523:4;2495:33;;;;;;;;;;;;;;;;;;;;;;;;;;;2488:40;;2341:194;;;;:::o;6316:189:22:-;6377:24;;:::i;:::-;6417:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6316:189;:::o;675:5832::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\nimport \"./MockContract.sol\";\nimport \"../../Collateralizer.sol\";\n\n\ncontract MockCollateralizedTermsContract is MockContract {\n using SafeMath for uint;\n\n // Maps from agreementId's to the amount repaid to date\n mapping (bytes32 => uint) internal amountRepaid;\n // Maps from agreementId's to a mapping of timestamps to the expected\n // value repaid at said timestamp\n mapping (bytes32 => mapping (uint => uint)) internal expectedValueRepaidAtTimestamp;\n // Maps from agreementId's to a list of timestamps at which\n // repayments are expected (used primarily for resetting our mocks)\n mapping (bytes32 => uint[5]) internal expectedRepaymentSchedule;\n // Maps from agreementId's to the number of repayment dates\n // expected for that agreement\n mapping (bytes32 => uint) internal numRepaymentTimestamps;\n // Maps from agreementId's to the mocked term end timestamp\n mapping (bytes32 => uint) internal termEndTimestamp;\n\n function registerRepayment(\n bytes32 agreementId,\n address payer,\n address beneficiary,\n uint unitsOfRepayment,\n address tokenAddress\n )\n public\n returns (bool _success)\n {\n functionCalledWithArgs(\"registerRepayment\", keccak256(\n agreementId,\n payer,\n beneficiary,\n unitsOfRepayment,\n tokenAddress\n ));\n\n return getMockReturnValue(\"registerRepayment\", DEFAULT_SIGNATURE_ARGS) == bytes32(1);\n }\n\n function getExpectedRepaymentValue(\n bytes32 agreementId,\n uint256 timestamp\n )\n public\n view\n returns (uint256)\n {\n uint latestDueDateBeforeTimestamp;\n\n // Iterate over each mocked repayment timestamp associated with the\n // agreement ID and find the LATEST timestamp that is BEFORE\n // the timestamp specified in the functiom arguments\n for (uint i = 0; i < 5; i++) {\n uint dueDateTimestamp = expectedRepaymentSchedule[agreementId][i];\n\n if (dueDateTimestamp <= timestamp &&\n dueDateTimestamp > latestDueDateBeforeTimestamp) {\n latestDueDateBeforeTimestamp = dueDateTimestamp;\n }\n }\n\n // Return the expected value repaid at said timestamp\n return expectedValueRepaidAtTimestamp[agreementId][latestDueDateBeforeTimestamp];\n }\n\n function getValueRepaidToDate(bytes32 agreementId)\n public\n view\n returns (uint256)\n {\n return amountRepaid[agreementId];\n }\n\n function mockRegisterRepaymentReturnValue(bool success)\n public\n {\n mockReturnValue(\"registerRepayment\", DEFAULT_SIGNATURE_ARGS, success ? bytes32(1) : bytes32(0));\n }\n\n function wasRegisterRepaymentCalledWith(\n bytes32 agreementId,\n address payer,\n address beneficiary,\n uint unitsOfRepayment,\n address tokenAddress\n )\n public\n view\n returns (bool wasCalled)\n {\n return wasFunctionCalledWithArgs(\"registerRepayment\", keccak256(\n agreementId,\n payer,\n beneficiary,\n unitsOfRepayment,\n tokenAddress\n ));\n }\n\n function registerTermStart(\n bytes32 agreementId,\n address debtor\n )\n public\n returns (bool _registered)\n {\n functionCalledWithArgs(\"registerTermStart\", keccak256(agreementId, debtor));\n\n return getMockReturnValue(\n \"registerTermStart\",\n keccak256(agreementId, debtor)\n ) == bytes32(1);\n }\n\n function getTermEndTimestamp(bytes32 agreementId)\n public\n view\n returns (uint256)\n {\n return termEndTimestamp[agreementId];\n }\n\n function wasRegisterTermStartCalledWith(\n bytes32 agreementId,\n address debtor\n )\n public\n view\n returns (bool _wasCalled)\n {\n return wasFunctionCalledWithArgs(\"registerTermStart\", keccak256(agreementId, debtor));\n }\n\n /* Dummy functionality used to mock behavior for testing purposes. */\n\n function mockTermEndTimestamp(\n bytes32 agreementId,\n uint timestamp\n )\n public\n {\n termEndTimestamp[agreementId] = timestamp;\n }\n\n function mockDummyValueRepaid(\n bytes32 agreementId,\n uint amount\n )\n public\n {\n amountRepaid[agreementId] = amount;\n }\n\n function mockExpectedRepaymentValue(\n bytes32 agreementId,\n uint timestamp,\n uint amount\n )\n public\n {\n // If timestamp is not mocked already, append it to list of repayment timestamps\n // associated with agreementId\n if (expectedValueRepaidAtTimestamp[agreementId][timestamp] == 0) {\n uint numRepaymentTimestampsForAgreement = numRepaymentTimestamps[agreementId];\n expectedRepaymentSchedule[agreementId][numRepaymentTimestampsForAgreement] = timestamp;\n numRepaymentTimestamps[agreementId]++;\n }\n\n expectedValueRepaidAtTimestamp[agreementId][timestamp] = amount;\n }\n\n function reset(bytes32 agreementId) public {\n for (uint i = 0; i < 5; i++) {\n expectedRepaymentSchedule[agreementId][i] = 0;\n }\n\n numRepaymentTimestamps[agreementId] = 0;\n }\n\n function mockCallCollateralize(\n address _collateralizer,\n bytes32 _agreementId,\n address _debtor\n )\n public\n {\n Collateralizer collateralizer = Collateralizer(_collateralizer);\n\n collateralizer.collateralize(\n _agreementId,\n _debtor\n );\n }\n\n function getFunctionList()\n internal\n returns (string[10] functionNames)\n {\n return [\"registerRepayment\", \"registerTermStart\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\"];\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockCollateralizedTermsContract.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockCollateralizedTermsContract.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockCollateralizedTermsContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockCollateralizedTermsContract.sol", "exportedSymbols": { "MockCollateralizedTermsContract": [ 10507 @@ -373,7 +373,7 @@ export const MockCollateralizedTermsContract = { "attributes": { "SourceUnit": 10693, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockContract.sol", "file": "./MockContract.sol", "scope": 10508, "symbolAliases": [ @@ -388,7 +388,7 @@ export const MockCollateralizedTermsContract = { "attributes": { "SourceUnit": 615, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/Collateralizer.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/Collateralizer.sol", "file": "../../Collateralizer.sol", "scope": 10508, "symbolAliases": [ @@ -5723,7 +5723,7 @@ export const MockCollateralizedTermsContract = "42": { "events": {}, "links": {}, - "address": "0xa125dc548b8b163b53d6b88f890766370b2350bd" + "address": "0x67d4984f33adaa13b879dc532a49bc7a46140353" }, "70": { "events": {}, @@ -5732,5 +5732,5 @@ export const MockCollateralizedTermsContract = } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:13:01.039Z" + "updatedAt": "2018-10-09T17:50:01.318Z" } \ No newline at end of file diff --git a/artifacts/ts/MockContract.ts b/artifacts/ts/MockContract.ts index 0615097c..fab4bd8b 100644 --- a/artifacts/ts/MockContract.ts +++ b/artifacts/ts/MockContract.ts @@ -62,10 +62,10 @@ export const MockContract = "sourceMap": "", "deployedSourceMap": "", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\n\ncontract MockContract {\n bytes32 internal constant DEFAULT_SIGNATURE_ARGS = bytes32(0);\n\n // We use bytes32 as our generic base type from and to which we cast all other types\n mapping (string => bytes32[]) internal functionCallSignatures;\n mapping (string => mapping (bytes32 => bytes32)) internal mockedReturnValue;\n mapping (string => mapping (bytes32 => bool)) internal functionCalls;\n\n function mockReturnValue(\n string functionName,\n bytes32 argsSignature,\n bytes32 returnValue\n ) public {\n functionCallSignatures[functionName].push(argsSignature);\n mockedReturnValue[functionName][argsSignature] = returnValue;\n }\n\n function getMockReturnValue(string functionName, bytes32 argsSignature)\n public\n view\n returns (bytes32 _mockReturnValue)\n {\n return mockedReturnValue[functionName][argsSignature];\n }\n\n function reset() public {\n for (uint i = 0; i < 10; i++) {\n string memory functionName = getFunctionList()[i];\n\n if (bytes(functionName).length != 0) {\n for (uint j = 0; j < functionCallSignatures[functionName].length; j++) {\n bytes32 callSignature = functionCallSignatures[functionName][j];\n delete functionCalls[functionName][callSignature];\n delete mockedReturnValue[functionName][callSignature];\n }\n\n delete functionCallSignatures[functionName];\n }\n }\n }\n\n function functionCalledWithArgs(string functionName, bytes32 args)\n internal\n {\n functionCalls[functionName][args] = true;\n functionCallSignatures[functionName].push(args);\n }\n\n function wasFunctionCalledWithArgs(string functionName, bytes32 args)\n internal\n view\n returns (bool wasCalled)\n {\n return functionCalls[functionName][args];\n }\n\n function getFunctionList() internal returns (string[10] functionNames);\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockContract.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockContract.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockContract.sol", "exportedSymbols": { "MockContract": [ 10692 @@ -2544,5 +2544,5 @@ export const MockContract = }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:47.986Z" + "updatedAt": "2018-10-09T17:45:35.500Z" } \ No newline at end of file diff --git a/artifacts/ts/MockDebtKernel.ts b/artifacts/ts/MockDebtKernel.ts index 0bafebbf..53aa465d 100644 --- a/artifacts/ts/MockDebtKernel.ts +++ b/artifacts/ts/MockDebtKernel.ts @@ -157,15 +157,15 @@ export const MockDebtKernel = "type": "function" } ], - "bytecode": "0x6060604052341561000f57600080fd5b6111118061001e6000396000f300606060405260043610610078576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063131018581461007d57806380da20d414610103578063a0144d311461017a578063c2d96de9146101a1578063d826f88f146102fb578063e6488fc914610310575b600080fd5b341561008857600080fd5b6100e5600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080356000191690602001909190505061046e565b60405180826000191660001916815260200191505060405180910390f35b341561010e57600080fd5b610178600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091908035600019169060200190919050506104fd565b005b341561018557600080fd5b61019f600480803560001916906020019091905050610627565b005b34156101ac57600080fd5b6102e1600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908060c001906006806020026040519081016040528092919082600660200280828437820191505050505091908061010001906008806020026040519081016040528092919082600860200280828437820191505050505091908060200190600180602002604051908101604052809291908260016020028082843782019150505050509190806060019060038060200260405190810160405280929190826003602002808284378201915050505050919080606001906003806020026040519081016040528092919082600360200280828437820191505050505091908060600190600380602002604051908101604052809291908260036020028082843782019150505050509190505061066e565b604051808215151515815260200191505060405180910390f35b341561030657600080fd5b61030e610831565b005b341561031b57600080fd5b610450600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908060c0019060068060200260405190810160405280929190826006602002808284378201915050505050919080610100019060088060200260405190810160405280929190826008602002808284378201915050505050919080602001906001806020026040519081016040528092919082600160200280828437820191505050505091908060600190600380602002604051908101604052809291908260036020028082843782019150505050509190806060019060038060200260405190810160405280929190826003602002808284378201915050505050919080606001906003806020026040519081016040528092919082600360200280828437820191505050505091905050610b28565b60405180826000191660001916815260200191505060405180910390f35b60006001836040518082805190602001908083835b6020831015156104a85780518252602082019150602081019050602083039250610483565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b6000836040518082805190602001908083835b6020831015156105355780518252602082019150602081019050602083039250610510565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020805480600101828161057a919061101c565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b6020831015156105ce57805182526020820191506020810190506020830392506105a9565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b61066b6040805190810160405280600d81526020017f66696c6c446562744f72646572000000000000000000000000000000000000008152506000600102836104fd565b50565b60008088888888888888604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140187600660200280838360005b838110156106e45780820151818401526020810190506106c9565b5050505090500186600860200280838360005b838110156107125780820151818401526020810190506106f7565b5050505090500185600160200280838360005b83811015610740578082015181840152602081019050610725565b5050505090500184600360200280838360005b8381101561076e578082015181840152602081019050610753565b5050505090500183600360200280838360005b8381101561079c578082015181840152602081019050610781565b5050505090500182600360200280838360005b838110156107ca5780820151818401526020810190506107af565b50505050905001975050505050505050604051809103902090506108236040805190810160405280600d81526020017f66696c6c446562744f726465720000000000000000000000000000000000000081525082610d2e565b915050979650505050505050565b600061083b611048565b600080600093505b600a841015610b2257610854610dca565b84600a8110151561086157fe5b6020020151925060008351141515610b1557600091505b6000836040518082805190602001908083835b6020831015156108b0578051825260208201915060208101905060208303925061088b565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015610a9d576000836040518082805190602001908083835b6020831015156109265780518252602082019150602081019050602083039250610901565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208281548110151561096657fe5b90600052602060002090015490506002836040518082805190602001908083835b6020831015156109ac5780518252602082019150602081019050602083039250610987565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b602083101515610a405780518252602082019150602081019050602083039250610a1b565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050610878565b6000836040518082805190602001908083835b602083101515610ad55780518252602082019150602081019050602083039250610ab0565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000610b14919061105c565b5b8380600101945050610843565b50505050565b60008088888888888888604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140187600660200280838360005b83811015610b9e578082015181840152602081019050610b83565b5050505090500186600860200280838360005b83811015610bcc578082015181840152602081019050610bb1565b5050505090500185600160200280838360005b83811015610bfa578082015181840152602081019050610bdf565b5050505090500184600360200280838360005b83811015610c28578082015181840152602081019050610c0d565b5050505090500183600360200280838360005b83811015610c56578082015181840152602081019050610c3b565b5050505090500182600360200280838360005b83811015610c84578082015181840152602081019050610c69565b5050505090500197505050505050505060405180910390209050610cdd6040805190810160405280600d81526020017f66696c6c446562744f726465720000000000000000000000000000000000000081525082610ee3565b610d206040805190810160405280600d81526020017f66696c6c446562744f7264657200000000000000000000000000000000000000815250600060010261046e565b915050979650505050505050565b60006002836040518082805190602001908083835b602083101515610d685780518252602082019150602081019050602083039250610d43565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b610dd261107d565b610140604051908101604052806040805190810160405280600d81526020017f66696c6c446562744f7264657200000000000000000000000000000000000000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b60016002836040518082805190602001908083835b602083101515610f1d5780518252602082019150602081019050602083039250610ef8565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b602083101515610fb85780518252602082019150602081019050602083039250610f93565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281610ffd919061101c565b9160005260206000209001600083909190915090600019169055505050565b8154818355818115116110435781836000526020600020918201910161104291906110ac565b5b505050565b602060405190810160405280600081525090565b508054600082559060005260206000209081019061107a91906110ac565b50565b61014060405190810160405280600a905b6110966110d1565b81526020019060019003908161108e5790505090565b6110ce91905b808211156110ca5760008160009055506001016110b2565b5090565b90565b6020604051908101604052806000815250905600a165627a7a72305820cf63d5c22cf55fa54d57ddcd64f26b2f2aad598996f4f7629434f2aa601c9ed70029", - "deployedBytecode": "0x606060405260043610610078576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063131018581461007d57806380da20d414610103578063a0144d311461017a578063c2d96de9146101a1578063d826f88f146102fb578063e6488fc914610310575b600080fd5b341561008857600080fd5b6100e5600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080356000191690602001909190505061046e565b60405180826000191660001916815260200191505060405180910390f35b341561010e57600080fd5b610178600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091908035600019169060200190919050506104fd565b005b341561018557600080fd5b61019f600480803560001916906020019091905050610627565b005b34156101ac57600080fd5b6102e1600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908060c001906006806020026040519081016040528092919082600660200280828437820191505050505091908061010001906008806020026040519081016040528092919082600860200280828437820191505050505091908060200190600180602002604051908101604052809291908260016020028082843782019150505050509190806060019060038060200260405190810160405280929190826003602002808284378201915050505050919080606001906003806020026040519081016040528092919082600360200280828437820191505050505091908060600190600380602002604051908101604052809291908260036020028082843782019150505050509190505061066e565b604051808215151515815260200191505060405180910390f35b341561030657600080fd5b61030e610831565b005b341561031b57600080fd5b610450600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908060c0019060068060200260405190810160405280929190826006602002808284378201915050505050919080610100019060088060200260405190810160405280929190826008602002808284378201915050505050919080602001906001806020026040519081016040528092919082600160200280828437820191505050505091908060600190600380602002604051908101604052809291908260036020028082843782019150505050509190806060019060038060200260405190810160405280929190826003602002808284378201915050505050919080606001906003806020026040519081016040528092919082600360200280828437820191505050505091905050610b28565b60405180826000191660001916815260200191505060405180910390f35b60006001836040518082805190602001908083835b6020831015156104a85780518252602082019150602081019050602083039250610483565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b6000836040518082805190602001908083835b6020831015156105355780518252602082019150602081019050602083039250610510565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020805480600101828161057a919061101c565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b6020831015156105ce57805182526020820191506020810190506020830392506105a9565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b61066b6040805190810160405280600d81526020017f66696c6c446562744f72646572000000000000000000000000000000000000008152506000600102836104fd565b50565b60008088888888888888604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140187600660200280838360005b838110156106e45780820151818401526020810190506106c9565b5050505090500186600860200280838360005b838110156107125780820151818401526020810190506106f7565b5050505090500185600160200280838360005b83811015610740578082015181840152602081019050610725565b5050505090500184600360200280838360005b8381101561076e578082015181840152602081019050610753565b5050505090500183600360200280838360005b8381101561079c578082015181840152602081019050610781565b5050505090500182600360200280838360005b838110156107ca5780820151818401526020810190506107af565b50505050905001975050505050505050604051809103902090506108236040805190810160405280600d81526020017f66696c6c446562744f726465720000000000000000000000000000000000000081525082610d2e565b915050979650505050505050565b600061083b611048565b600080600093505b600a841015610b2257610854610dca565b84600a8110151561086157fe5b6020020151925060008351141515610b1557600091505b6000836040518082805190602001908083835b6020831015156108b0578051825260208201915060208101905060208303925061088b565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015610a9d576000836040518082805190602001908083835b6020831015156109265780518252602082019150602081019050602083039250610901565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208281548110151561096657fe5b90600052602060002090015490506002836040518082805190602001908083835b6020831015156109ac5780518252602082019150602081019050602083039250610987565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b602083101515610a405780518252602082019150602081019050602083039250610a1b565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050610878565b6000836040518082805190602001908083835b602083101515610ad55780518252602082019150602081019050602083039250610ab0565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000610b14919061105c565b5b8380600101945050610843565b50505050565b60008088888888888888604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140187600660200280838360005b83811015610b9e578082015181840152602081019050610b83565b5050505090500186600860200280838360005b83811015610bcc578082015181840152602081019050610bb1565b5050505090500185600160200280838360005b83811015610bfa578082015181840152602081019050610bdf565b5050505090500184600360200280838360005b83811015610c28578082015181840152602081019050610c0d565b5050505090500183600360200280838360005b83811015610c56578082015181840152602081019050610c3b565b5050505090500182600360200280838360005b83811015610c84578082015181840152602081019050610c69565b5050505090500197505050505050505060405180910390209050610cdd6040805190810160405280600d81526020017f66696c6c446562744f726465720000000000000000000000000000000000000081525082610ee3565b610d206040805190810160405280600d81526020017f66696c6c446562744f7264657200000000000000000000000000000000000000815250600060010261046e565b915050979650505050505050565b60006002836040518082805190602001908083835b602083101515610d685780518252602082019150602081019050602083039250610d43565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b610dd261107d565b610140604051908101604052806040805190810160405280600d81526020017f66696c6c446562744f7264657200000000000000000000000000000000000000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b60016002836040518082805190602001908083835b602083101515610f1d5780518252602082019150602081019050602083039250610ef8565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b602083101515610fb85780518252602082019150602081019050602083039250610f93565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281610ffd919061101c565b9160005260206000209001600083909190915090600019169055505050565b8154818355818115116110435781836000526020600020918201910161104291906110ac565b5b505050565b602060405190810160405280600081525090565b508054600082559060005260206000209081019061107a91906110ac565b50565b61014060405190810160405280600a905b6110966110d1565b81526020019060019003908161108e5790505090565b6110ce91905b808211156110ca5760008160009055506001016110b2565b5090565b90565b6020604051908101604052806000815250905600a165627a7a72305820cf63d5c22cf55fa54d57ddcd64f26b2f2aad598996f4f7629434f2aa601c9ed70029", + "bytecode": "0x6060604052341561000f57600080fd5b6111118061001e6000396000f300606060405260043610610078576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063131018581461007d57806380da20d414610103578063a0144d311461017a578063c2d96de9146101a1578063d826f88f146102fb578063e6488fc914610310575b600080fd5b341561008857600080fd5b6100e5600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080356000191690602001909190505061046e565b60405180826000191660001916815260200191505060405180910390f35b341561010e57600080fd5b610178600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091908035600019169060200190919050506104fd565b005b341561018557600080fd5b61019f600480803560001916906020019091905050610627565b005b34156101ac57600080fd5b6102e1600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908060c001906006806020026040519081016040528092919082600660200280828437820191505050505091908061010001906008806020026040519081016040528092919082600860200280828437820191505050505091908060200190600180602002604051908101604052809291908260016020028082843782019150505050509190806060019060038060200260405190810160405280929190826003602002808284378201915050505050919080606001906003806020026040519081016040528092919082600360200280828437820191505050505091908060600190600380602002604051908101604052809291908260036020028082843782019150505050509190505061066e565b604051808215151515815260200191505060405180910390f35b341561030657600080fd5b61030e610831565b005b341561031b57600080fd5b610450600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908060c0019060068060200260405190810160405280929190826006602002808284378201915050505050919080610100019060088060200260405190810160405280929190826008602002808284378201915050505050919080602001906001806020026040519081016040528092919082600160200280828437820191505050505091908060600190600380602002604051908101604052809291908260036020028082843782019150505050509190806060019060038060200260405190810160405280929190826003602002808284378201915050505050919080606001906003806020026040519081016040528092919082600360200280828437820191505050505091905050610b28565b60405180826000191660001916815260200191505060405180910390f35b60006001836040518082805190602001908083835b6020831015156104a85780518252602082019150602081019050602083039250610483565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b6000836040518082805190602001908083835b6020831015156105355780518252602082019150602081019050602083039250610510565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020805480600101828161057a919061101c565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b6020831015156105ce57805182526020820191506020810190506020830392506105a9565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b61066b6040805190810160405280600d81526020017f66696c6c446562744f72646572000000000000000000000000000000000000008152506000600102836104fd565b50565b60008088888888888888604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140187600660200280838360005b838110156106e45780820151818401526020810190506106c9565b5050505090500186600860200280838360005b838110156107125780820151818401526020810190506106f7565b5050505090500185600160200280838360005b83811015610740578082015181840152602081019050610725565b5050505090500184600360200280838360005b8381101561076e578082015181840152602081019050610753565b5050505090500183600360200280838360005b8381101561079c578082015181840152602081019050610781565b5050505090500182600360200280838360005b838110156107ca5780820151818401526020810190506107af565b50505050905001975050505050505050604051809103902090506108236040805190810160405280600d81526020017f66696c6c446562744f726465720000000000000000000000000000000000000081525082610d2e565b915050979650505050505050565b600061083b611048565b600080600093505b600a841015610b2257610854610dca565b84600a8110151561086157fe5b6020020151925060008351141515610b1557600091505b6000836040518082805190602001908083835b6020831015156108b0578051825260208201915060208101905060208303925061088b565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015610a9d576000836040518082805190602001908083835b6020831015156109265780518252602082019150602081019050602083039250610901565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208281548110151561096657fe5b90600052602060002090015490506002836040518082805190602001908083835b6020831015156109ac5780518252602082019150602081019050602083039250610987565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b602083101515610a405780518252602082019150602081019050602083039250610a1b565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050610878565b6000836040518082805190602001908083835b602083101515610ad55780518252602082019150602081019050602083039250610ab0565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000610b14919061105c565b5b8380600101945050610843565b50505050565b60008088888888888888604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140187600660200280838360005b83811015610b9e578082015181840152602081019050610b83565b5050505090500186600860200280838360005b83811015610bcc578082015181840152602081019050610bb1565b5050505090500185600160200280838360005b83811015610bfa578082015181840152602081019050610bdf565b5050505090500184600360200280838360005b83811015610c28578082015181840152602081019050610c0d565b5050505090500183600360200280838360005b83811015610c56578082015181840152602081019050610c3b565b5050505090500182600360200280838360005b83811015610c84578082015181840152602081019050610c69565b5050505090500197505050505050505060405180910390209050610cdd6040805190810160405280600d81526020017f66696c6c446562744f726465720000000000000000000000000000000000000081525082610ee3565b610d206040805190810160405280600d81526020017f66696c6c446562744f7264657200000000000000000000000000000000000000815250600060010261046e565b915050979650505050505050565b60006002836040518082805190602001908083835b602083101515610d685780518252602082019150602081019050602083039250610d43565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b610dd261107d565b610140604051908101604052806040805190810160405280600d81526020017f66696c6c446562744f7264657200000000000000000000000000000000000000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b60016002836040518082805190602001908083835b602083101515610f1d5780518252602082019150602081019050602083039250610ef8565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b602083101515610fb85780518252602082019150602081019050602083039250610f93565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281610ffd919061101c565b9160005260206000209001600083909190915090600019169055505050565b8154818355818115116110435781836000526020600020918201910161104291906110ac565b5b505050565b602060405190810160405280600081525090565b508054600082559060005260206000209081019061107a91906110ac565b50565b61014060405190810160405280600a905b6110966110d1565b81526020019060019003908161108e5790505090565b6110ce91905b808211156110ca5760008160009055506001016110b2565b5090565b90565b6020604051908101604052806000815250905600a165627a7a723058208851299aa2ea4bf3e6a4df06bafff421b5bbf52499b820e0e1d7297b0459c8100029", + "deployedBytecode": "0x606060405260043610610078576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063131018581461007d57806380da20d414610103578063a0144d311461017a578063c2d96de9146101a1578063d826f88f146102fb578063e6488fc914610310575b600080fd5b341561008857600080fd5b6100e5600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080356000191690602001909190505061046e565b60405180826000191660001916815260200191505060405180910390f35b341561010e57600080fd5b610178600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091908035600019169060200190919050506104fd565b005b341561018557600080fd5b61019f600480803560001916906020019091905050610627565b005b34156101ac57600080fd5b6102e1600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908060c001906006806020026040519081016040528092919082600660200280828437820191505050505091908061010001906008806020026040519081016040528092919082600860200280828437820191505050505091908060200190600180602002604051908101604052809291908260016020028082843782019150505050509190806060019060038060200260405190810160405280929190826003602002808284378201915050505050919080606001906003806020026040519081016040528092919082600360200280828437820191505050505091908060600190600380602002604051908101604052809291908260036020028082843782019150505050509190505061066e565b604051808215151515815260200191505060405180910390f35b341561030657600080fd5b61030e610831565b005b341561031b57600080fd5b610450600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908060c0019060068060200260405190810160405280929190826006602002808284378201915050505050919080610100019060088060200260405190810160405280929190826008602002808284378201915050505050919080602001906001806020026040519081016040528092919082600160200280828437820191505050505091908060600190600380602002604051908101604052809291908260036020028082843782019150505050509190806060019060038060200260405190810160405280929190826003602002808284378201915050505050919080606001906003806020026040519081016040528092919082600360200280828437820191505050505091905050610b28565b60405180826000191660001916815260200191505060405180910390f35b60006001836040518082805190602001908083835b6020831015156104a85780518252602082019150602081019050602083039250610483565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b6000836040518082805190602001908083835b6020831015156105355780518252602082019150602081019050602083039250610510565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020805480600101828161057a919061101c565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b6020831015156105ce57805182526020820191506020810190506020830392506105a9565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b61066b6040805190810160405280600d81526020017f66696c6c446562744f72646572000000000000000000000000000000000000008152506000600102836104fd565b50565b60008088888888888888604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140187600660200280838360005b838110156106e45780820151818401526020810190506106c9565b5050505090500186600860200280838360005b838110156107125780820151818401526020810190506106f7565b5050505090500185600160200280838360005b83811015610740578082015181840152602081019050610725565b5050505090500184600360200280838360005b8381101561076e578082015181840152602081019050610753565b5050505090500183600360200280838360005b8381101561079c578082015181840152602081019050610781565b5050505090500182600360200280838360005b838110156107ca5780820151818401526020810190506107af565b50505050905001975050505050505050604051809103902090506108236040805190810160405280600d81526020017f66696c6c446562744f726465720000000000000000000000000000000000000081525082610d2e565b915050979650505050505050565b600061083b611048565b600080600093505b600a841015610b2257610854610dca565b84600a8110151561086157fe5b6020020151925060008351141515610b1557600091505b6000836040518082805190602001908083835b6020831015156108b0578051825260208201915060208101905060208303925061088b565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015610a9d576000836040518082805190602001908083835b6020831015156109265780518252602082019150602081019050602083039250610901565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208281548110151561096657fe5b90600052602060002090015490506002836040518082805190602001908083835b6020831015156109ac5780518252602082019150602081019050602083039250610987565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b602083101515610a405780518252602082019150602081019050602083039250610a1b565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050610878565b6000836040518082805190602001908083835b602083101515610ad55780518252602082019150602081019050602083039250610ab0565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000610b14919061105c565b5b8380600101945050610843565b50505050565b60008088888888888888604051808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140187600660200280838360005b83811015610b9e578082015181840152602081019050610b83565b5050505090500186600860200280838360005b83811015610bcc578082015181840152602081019050610bb1565b5050505090500185600160200280838360005b83811015610bfa578082015181840152602081019050610bdf565b5050505090500184600360200280838360005b83811015610c28578082015181840152602081019050610c0d565b5050505090500183600360200280838360005b83811015610c56578082015181840152602081019050610c3b565b5050505090500182600360200280838360005b83811015610c84578082015181840152602081019050610c69565b5050505090500197505050505050505060405180910390209050610cdd6040805190810160405280600d81526020017f66696c6c446562744f726465720000000000000000000000000000000000000081525082610ee3565b610d206040805190810160405280600d81526020017f66696c6c446562744f7264657200000000000000000000000000000000000000815250600060010261046e565b915050979650505050505050565b60006002836040518082805190602001908083835b602083101515610d685780518252602082019150602081019050602083039250610d43565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b610dd261107d565b610140604051908101604052806040805190810160405280600d81526020017f66696c6c446562744f7264657200000000000000000000000000000000000000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b60016002836040518082805190602001908083835b602083101515610f1d5780518252602082019150602081019050602083039250610ef8565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b602083101515610fb85780518252602082019150602081019050602083039250610f93565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281610ffd919061101c565b9160005260206000209001600083909190915090600019169055505050565b8154818355818115116110435781836000526020600020918201910161104291906110ac565b5b505050565b602060405190810160405280600081525090565b508054600082559060005260206000209081019061107a91906110ac565b50565b61014060405190810160405280600a905b6110966110d1565b81526020019060019003908161108e5790505090565b6110ce91905b808211156110ca5760008160009055506001016110b2565b5090565b90565b6020604051908101604052806000815250905600a165627a7a723058208851299aa2ea4bf3e6a4df06bafff421b5bbf52499b820e0e1d7297b0459c8100029", "sourceMap": "640:1847:24:-;;;;;;;;;;;;;;;;;", "deployedSourceMap": "640:1847:24:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1294:217:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1018:270;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;687:168:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1547:634;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1517:610:23;;;;;;;;;;;;;;861:680:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1294:217:23;1411:24;1458:17;1476:12;1458:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1458:46:23;1490:13;1458:46;;;;;;;;;;;;;;;;;;1451:53;;1294:217;;;;:::o;1018:270::-;1155:22;1178:12;1155:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1155:56:23;;;;;;;;;;;:::i;:::-;;;;;;;;;;1197:13;1155:56;;;;;;;;;;;;1270:11;1221:17;1239:12;1221:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1221:46:23;1253:13;1221:46;;;;;;;;;;;;;;;;;:60;;;;;;;1018:270;;;:::o;687:168:24:-;769:79;;;;;;;;;;;;;;;;;;;697:1:23;689:10;;834:12:24;769:15;:79::i;:::-;687:168;:::o;1547:634::-;1851:14;1881:21;1928:8;1950:14;1978:11;2003:12;2029:11;2054;2079;1905:195;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;23:1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;23:1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;23:1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;23:1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;23:1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;1881:219:24;;2117:57;;;;;;;;;;;;;;;;;;;2160:13;2117:25;:57::i;:::-;2110:64;;1547:634;;;;;;;;;;:::o;1517:610:23:-;1556:6;1595:26;;:::i;:::-;1719:6;1807:21;1565:1;1556:10;;1551:570;1572:2;1568:1;:6;1551:570;;;1624:17;:15;:17::i;:::-;1642:1;1624:20;;;;;;;;;;;;;1595:49;;1693:1;1669:12;1663:26;:31;;1659:452;;;1728:1;1719:10;;1714:321;1735:22;1758:12;1735:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1735:43:23;;;;1731:1;:47;1714:321;;;1831:22;1854:12;1831:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1868:1:23;1831:39;;;;;;;;;;;;;;;;;;;1807:63;;1899:13;1913:12;1899:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1899:42:23;1927:13;1899:42;;;;;;;;;;;;;;;;;;1892:49;;;;;;;;;;;1970:17;1988:12;1970:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1970:46:23;2002:13;1970:46;;;;;;;;;;;;;;;;;1963:53;;;1780:3;;;;;;;1714:321;;;2060:22;2083:12;2060:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;;2053:43:23;;;;:::i;:::-;1659:452;1576:3;;;;;;;1551:570;;;1517:610;;;;:::o;861:680:24:-;1139:20;1175:21;1222:8;1244:14;1272:11;1297:12;1323:11;1348;1373;1199:195;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;23:1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;23:1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;23:1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;23:1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;23:1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;1175:219:24;;1404:54;;;;;;;;;;;;;;;;;;;1444:13;1404:22;:54::i;:::-;1475:59;;;;;;;;;;;;;;;;;;;697:1:23;689:10;;1475:18:24;:59::i;:::-;1468:66;;861:680;;;;;;;;;;:::o;2341:194:23:-;2458:14;2495:13;2509:12;2495:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2495:33:23;2523:4;2495:33;;;;;;;;;;;;;;;;;;;;;;;;;;;2488:40;;2341:194;;;;:::o;2187:298:24:-;2248:24;;:::i;:::-;2288:190;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2187:298;:::o;2133:202:23:-;2267:4;2231:13;2245:12;2231:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2231:33:23;2259:4;2231:33;;;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;2281:22;2304:12;2281:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2281:47:23;;;;;;;;;;;:::i;:::-;;;;;;;;;;2323:4;2281:47;;;;;;;;;;;;2133:202;;:::o;640:1847:24:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\nimport \"./MockContract.sol\";\n\n\ncontract MockDebtKernel is MockContract {\n\n function mockCreateReturnValue(bytes32 _agreementId)\n public\n {\n mockReturnValue(\"fillDebtOrder\", DEFAULT_SIGNATURE_ARGS, bytes32(_agreementId));\n }\n\n function fillDebtOrder(\n address creditor,\n address[6] orderAddresses,\n uint[8] orderValues,\n bytes32[1] orderBytes32,\n uint8[3] signaturesV,\n bytes32[3] signaturesR,\n bytes32[3] signaturesS\n )\n public\n returns (bytes32 _agreementId)\n {\n bytes32 argsSignature = keccak256(\n creditor,\n orderAddresses,\n orderValues,\n orderBytes32,\n signaturesV,\n signaturesR,\n signaturesS\n );\n functionCalledWithArgs(\"fillDebtOrder\", argsSignature);\n return getMockReturnValue(\"fillDebtOrder\", DEFAULT_SIGNATURE_ARGS);\n }\n\n function wasFillDebtOrderCalledWith(\n address creditor,\n address[6] orderAddresses,\n uint[8] orderValues,\n bytes32[1] orderBytes32,\n uint8[3] signaturesV,\n bytes32[3] signaturesR,\n bytes32[3] signaturesS\n )\n public\n view\n returns (bool wasCalled)\n {\n bytes32 argsSignature = keccak256(\n creditor,\n orderAddresses,\n orderValues,\n orderBytes32,\n signaturesV,\n signaturesR,\n signaturesS\n );\n return wasFunctionCalledWithArgs(\"fillDebtOrder\", argsSignature);\n }\n\n function getFunctionList()\n internal\n returns (string[10] functionNames)\n {\n return [\n \"fillDebtOrder\",\n \"\",\n \"\",\n \"\",\n \"\",\n \"\",\n \"\",\n \"\",\n \"\",\n \"\"\n ];\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockDebtKernel.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockDebtKernel.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockDebtKernel.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockDebtKernel.sol", "exportedSymbols": { "MockDebtKernel": [ 10835 @@ -188,7 +188,7 @@ export const MockDebtKernel = { "attributes": { "SourceUnit": 10693, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockContract.sol", "file": "./MockContract.sol", "scope": 10836, "symbolAliases": [ @@ -2231,5 +2231,5 @@ export const MockDebtKernel = }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:48.018Z" + "updatedAt": "2018-10-09T17:45:35.497Z" } \ No newline at end of file diff --git a/artifacts/ts/MockDebtRegistry.ts b/artifacts/ts/MockDebtRegistry.ts index bd2e0af6..a9dffa8b 100644 --- a/artifacts/ts/MockDebtRegistry.ts +++ b/artifacts/ts/MockDebtRegistry.ts @@ -436,15 +436,15 @@ export const MockDebtRegistry = "type": "function" } ], - "bytecode": "0x6060604052341561000f57600080fd5b611be98061001e6000396000f300606060405260043610610112576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063131018581461011757806318d2efef1461019d578063212e5da1146101e3578063314a522e146102cf5780635969549e146103125780636be39bda146103585780636ea5f93a146103ce57806380da20d4146104025780638dc8a7b2146104795780639758af1e146104a95780639feff4cc146104e8578063a1bc7ef01461050f578063b4045ae914610541578063ba20dda414610594578063cf9df5eb146105fb578063d69dbf63146106eb578063d826f88f14610726578063f0450a5c1461073b578063f6a6189614610781578063f6f494c9146107df575b600080fd5b341561012257600080fd5b61017f600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091905050610846565b60405180826000191660001916815260200191505060405180910390f35b34156101a857600080fd5b6101e160048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506108d5565b005b34156101ee57600080fd5b6102b5600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803560001916906020019091908035906020019091905050610932565b604051808215151515815260200191505060405180910390f35b34156102da57600080fd5b6102f4600480803560001916906020019091905050610afd565b60405180826000191660001916815260200191505060405180910390f35b341561031d57600080fd5b61035660048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b45565b005b341561036357600080fd5b61037d600480803560001916906020019091905050610bf2565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182600019166000191681526020019250505060405180910390f35b34156103d957600080fd5b61040060048080356000191690602001909190803560001916906020019091905050610c80565b005b341561040d57600080fd5b610477600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080356000191690602001909190803560001916906020019091905050610cc4565b005b341561048457600080fd5b6104a7600480803560001916906020019091908035906020019091905050610dee565b005b34156104b457600080fd5b6104ce600480803560001916906020019091905050610e35565b604051808215151515815260200191505060405180910390f35b34156104f357600080fd5b61050d600480803560001916906020019091905050610e9e565b005b341561051a57600080fd5b61053f6004808035600019169060200190919080351515906020019091905050610ee5565b005b341561054c57600080fd5b61059260048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803560001916906020019091905050610f3c565b005b341561059f57600080fd5b6105b9600480803560001916906020019091905050610fda565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561060657600080fd5b6106cd600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803560001916906020019091908035906020019091905050611026565b60405180826000191660001916815260200191505060405180910390f35b34156106f657600080fd5b610710600480803560001916906020019091905050611249565b6040518082815260200191505060405180910390f35b341561073157600080fd5b610739611295565b005b341561074657600080fd5b61077f60048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061158c565b005b341561078c57600080fd5b6107c560048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506115e9565b604051808215151515815260200191505060405180910390f35b34156107ea57600080fd5b610804600480803560001916906020019091905050611692565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60006001836040518082805190602001908083835b602083101515610880578051825260208201915060208101905060208303925061085b565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b61092e6040805190810160405280601081526020017f6765745465726d73436f6e747261637400000000000000000000000000000000815250838373ffffffffffffffffffffffffffffffffffffffff16600102610cc4565b5050565b6000610aef6040805190810160405280600681526020017f696e7365727400000000000000000000000000000000000000000000000000008152508a8a8a8a8a8a8a8a604051808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140183600019166000191681526020018281526020019850505050505050505060405180910390206116de565b905098975050505050505050565b6000610b3e6040805190810160405280601a81526020017f6765745465726d73436f6e7472616374506172616d657465727300000000000081525083610846565b9050919050565b610be46040805190810160405280601181526020017f6d6f6469667942656e656669636961727900000000000000000000000000000081525083836040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140192505050604051809103902061177a565b610bee828261158c565b5050565b600080610c346040805190810160405280601681526020017f6765745465726d735f7465726d73436f6e74726163740000000000000000000081525084610846565b60019004610c776040805190810160405280602081526020017f6765745465726d735f7465726d73436f6e7472616374506172616d657465727381525085610846565b91509150915091565b610cc06040805190810160405280601a81526020017f6765745465726d73436f6e7472616374506172616d65746572730000000000008152508383610cc4565b5050565b6000836040518082805190602001908083835b602083101515610cfc5780518252602082019150602081019050602083039250610cd7565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281610d419190611af4565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b602083101515610d955780518252602082019150602081019050602083039250610d70565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b610e316040805190810160405280601981526020017f67657449737375616e6365426c6f636b54696d657374616d70000000000000008152508383600102610cc4565b5050565b600080610e776040805190810160405280600e81526020017f646f6573456e747279457869737400000000000000000000000000000000000081525084610846565b9050600060010260001916816000191614610e93576001610e96565b60005b915050919050565b610ee26040805190810160405280600681526020017f696e736572740000000000000000000000000000000000000000000000000000815250600060010283610cc4565b50565b610f386040805190810160405280600e81526020017f646f6573456e74727945786973740000000000000000000000000000000000008152508383610f2e576000600102610f33565b600180025b610cc4565b5050565b610f956040805190810160405280601681526020017f6765745465726d735f7465726d73436f6e747261637400000000000000000000815250848473ffffffffffffffffffffffffffffffffffffffff16600102610cc4565b610fd56040805190810160405280602081526020017f6765745465726d735f7465726d73436f6e7472616374506172616d65746572738152508483610cc4565b505050565b600061101b6040805190810160405280600e81526020017f67657442656e656669636961727900000000000000000000000000000000000081525083610846565b600190049050919050565b60008060008a8a8a8a8a8a8a8a604051808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401836000191660001916815260200182815260200198505050505050505050604051809103902091506111e96040805190810160405280600681526020017f696e7365727400000000000000000000000000000000000000000000000000008152508361177a565b61122c6040805190810160405280600681526020017f696e7365727400000000000000000000000000000000000000000000000000008152506000600102610846565b9050611238818b61158c565b809250505098975050505050505050565b600061128a6040805190810160405280601981526020017f67657449737375616e6365426c6f636b54696d657374616d700000000000000081525083610846565b600190049050919050565b600061129f611b20565b600080600093505b600a841015611586576112b86118b3565b84600a811015156112c557fe5b602002015192506000835114151561157957600091505b6000836040518082805190602001908083835b60208310151561131457805182526020820191506020810190506020830392506112ef565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015611501576000836040518082805190602001908083835b60208310151561138a5780518252602082019150602081019050602083039250611365565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020828154811015156113ca57fe5b90600052602060002090015490506002836040518082805190602001908083835b60208310151561141057805182526020820191506020810190506020830392506113eb565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b6020831015156114a4578051825260208201915060208101905060208303925061147f565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600082600019166000191681526020019081526020016000206000905581806001019250506112dc565b6000836040518082805190602001908083835b6020831015156115395780518252602082019150602081019050602083039250611514565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006115789190611b34565b5b83806001019450506112a7565b50505050565b6115e56040805190810160405280600e81526020017f67657442656e6566696369617279000000000000000000000000000000000000815250838373ffffffffffffffffffffffffffffffffffffffff16600102610cc4565b5050565b600061168a6040805190810160405280601181526020017f6d6f6469667942656e656669636961727900000000000000000000000000000081525084846040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019250505060405180910390206116de565b905092915050565b60006116d36040805190810160405280601081526020017f6765745465726d73436f6e74726163740000000000000000000000000000000081525083610846565b600190049050919050565b60006002836040518082805190602001908083835b60208310151561171857805182526020820191506020810190506020830392506116f3565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b60016002836040518082805190602001908083835b6020831015156117b4578051825260208201915060208101905060208303925061178f565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b60208310151561184f578051825260208201915060208101905060208303925061182a565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816118949190611af4565b9160005260206000209001600083909190915090600019169055505050565b6118bb611b55565b610140604051908101604052806040805190810160405280600681526020017f696e73657274000000000000000000000000000000000000000000000000000081525081526020016040805190810160405280601181526020017f6d6f6469667942656e656669636961727900000000000000000000000000000081525081526020016040805190810160405280600e81526020017f67657442656e656669636961727900000000000000000000000000000000000081525081526020016040805190810160405280601681526020017f6765745465726d735f7465726d73436f6e74726163740000000000000000000081525081526020016040805190810160405280602081526020017f6765745465726d735f7465726d73436f6e7472616374506172616d657465727381525081526020016040805190810160405280601081526020017f6765745465726d73436f6e74726163740000000000000000000000000000000081525081526020016040805190810160405280601a81526020017f6765745465726d73436f6e7472616374506172616d657465727300000000000081525081526020016040805190810160405280601981526020017f67657449737375616e6365426c6f636b54696d657374616d700000000000000081525081526020016040805190810160405280600e81526020017f646f6573456e747279457869737400000000000000000000000000000000000081525081526020016020604051908101604052806000815250815250905090565b815481835581811511611b1b57818360005260206000209182019101611b1a9190611b84565b5b505050565b602060405190810160405280600081525090565b5080546000825590600052602060002090810190611b529190611b84565b50565b61014060405190810160405280600a905b611b6e611ba9565b815260200190600190039081611b665790505090565b611ba691905b80821115611ba2576000816000905550600101611b8a565b5090565b90565b6020604051908101604052806000815250905600a165627a7a72305820d5442d020f4b87def34d11e5cbdab2f23191b3955aea8493145530a5c92c62420029", - "deployedBytecode": "0x606060405260043610610112576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063131018581461011757806318d2efef1461019d578063212e5da1146101e3578063314a522e146102cf5780635969549e146103125780636be39bda146103585780636ea5f93a146103ce57806380da20d4146104025780638dc8a7b2146104795780639758af1e146104a95780639feff4cc146104e8578063a1bc7ef01461050f578063b4045ae914610541578063ba20dda414610594578063cf9df5eb146105fb578063d69dbf63146106eb578063d826f88f14610726578063f0450a5c1461073b578063f6a6189614610781578063f6f494c9146107df575b600080fd5b341561012257600080fd5b61017f600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091905050610846565b60405180826000191660001916815260200191505060405180910390f35b34156101a857600080fd5b6101e160048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506108d5565b005b34156101ee57600080fd5b6102b5600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803560001916906020019091908035906020019091905050610932565b604051808215151515815260200191505060405180910390f35b34156102da57600080fd5b6102f4600480803560001916906020019091905050610afd565b60405180826000191660001916815260200191505060405180910390f35b341561031d57600080fd5b61035660048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b45565b005b341561036357600080fd5b61037d600480803560001916906020019091905050610bf2565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182600019166000191681526020019250505060405180910390f35b34156103d957600080fd5b61040060048080356000191690602001909190803560001916906020019091905050610c80565b005b341561040d57600080fd5b610477600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080356000191690602001909190803560001916906020019091905050610cc4565b005b341561048457600080fd5b6104a7600480803560001916906020019091908035906020019091905050610dee565b005b34156104b457600080fd5b6104ce600480803560001916906020019091905050610e35565b604051808215151515815260200191505060405180910390f35b34156104f357600080fd5b61050d600480803560001916906020019091905050610e9e565b005b341561051a57600080fd5b61053f6004808035600019169060200190919080351515906020019091905050610ee5565b005b341561054c57600080fd5b61059260048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803560001916906020019091905050610f3c565b005b341561059f57600080fd5b6105b9600480803560001916906020019091905050610fda565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561060657600080fd5b6106cd600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803560001916906020019091908035906020019091905050611026565b60405180826000191660001916815260200191505060405180910390f35b34156106f657600080fd5b610710600480803560001916906020019091905050611249565b6040518082815260200191505060405180910390f35b341561073157600080fd5b610739611295565b005b341561074657600080fd5b61077f60048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061158c565b005b341561078c57600080fd5b6107c560048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506115e9565b604051808215151515815260200191505060405180910390f35b34156107ea57600080fd5b610804600480803560001916906020019091905050611692565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60006001836040518082805190602001908083835b602083101515610880578051825260208201915060208101905060208303925061085b565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b61092e6040805190810160405280601081526020017f6765745465726d73436f6e747261637400000000000000000000000000000000815250838373ffffffffffffffffffffffffffffffffffffffff16600102610cc4565b5050565b6000610aef6040805190810160405280600681526020017f696e7365727400000000000000000000000000000000000000000000000000008152508a8a8a8a8a8a8a8a604051808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140183600019166000191681526020018281526020019850505050505050505060405180910390206116de565b905098975050505050505050565b6000610b3e6040805190810160405280601a81526020017f6765745465726d73436f6e7472616374506172616d657465727300000000000081525083610846565b9050919050565b610be46040805190810160405280601181526020017f6d6f6469667942656e656669636961727900000000000000000000000000000081525083836040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140192505050604051809103902061177a565b610bee828261158c565b5050565b600080610c346040805190810160405280601681526020017f6765745465726d735f7465726d73436f6e74726163740000000000000000000081525084610846565b60019004610c776040805190810160405280602081526020017f6765745465726d735f7465726d73436f6e7472616374506172616d657465727381525085610846565b91509150915091565b610cc06040805190810160405280601a81526020017f6765745465726d73436f6e7472616374506172616d65746572730000000000008152508383610cc4565b5050565b6000836040518082805190602001908083835b602083101515610cfc5780518252602082019150602081019050602083039250610cd7565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281610d419190611af4565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b602083101515610d955780518252602082019150602081019050602083039250610d70565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b610e316040805190810160405280601981526020017f67657449737375616e6365426c6f636b54696d657374616d70000000000000008152508383600102610cc4565b5050565b600080610e776040805190810160405280600e81526020017f646f6573456e747279457869737400000000000000000000000000000000000081525084610846565b9050600060010260001916816000191614610e93576001610e96565b60005b915050919050565b610ee26040805190810160405280600681526020017f696e736572740000000000000000000000000000000000000000000000000000815250600060010283610cc4565b50565b610f386040805190810160405280600e81526020017f646f6573456e74727945786973740000000000000000000000000000000000008152508383610f2e576000600102610f33565b600180025b610cc4565b5050565b610f956040805190810160405280601681526020017f6765745465726d735f7465726d73436f6e747261637400000000000000000000815250848473ffffffffffffffffffffffffffffffffffffffff16600102610cc4565b610fd56040805190810160405280602081526020017f6765745465726d735f7465726d73436f6e7472616374506172616d65746572738152508483610cc4565b505050565b600061101b6040805190810160405280600e81526020017f67657442656e656669636961727900000000000000000000000000000000000081525083610846565b600190049050919050565b60008060008a8a8a8a8a8a8a8a604051808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401836000191660001916815260200182815260200198505050505050505050604051809103902091506111e96040805190810160405280600681526020017f696e7365727400000000000000000000000000000000000000000000000000008152508361177a565b61122c6040805190810160405280600681526020017f696e7365727400000000000000000000000000000000000000000000000000008152506000600102610846565b9050611238818b61158c565b809250505098975050505050505050565b600061128a6040805190810160405280601981526020017f67657449737375616e6365426c6f636b54696d657374616d700000000000000081525083610846565b600190049050919050565b600061129f611b20565b600080600093505b600a841015611586576112b86118b3565b84600a811015156112c557fe5b602002015192506000835114151561157957600091505b6000836040518082805190602001908083835b60208310151561131457805182526020820191506020810190506020830392506112ef565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015611501576000836040518082805190602001908083835b60208310151561138a5780518252602082019150602081019050602083039250611365565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020828154811015156113ca57fe5b90600052602060002090015490506002836040518082805190602001908083835b60208310151561141057805182526020820191506020810190506020830392506113eb565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b6020831015156114a4578051825260208201915060208101905060208303925061147f565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600082600019166000191681526020019081526020016000206000905581806001019250506112dc565b6000836040518082805190602001908083835b6020831015156115395780518252602082019150602081019050602083039250611514565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006115789190611b34565b5b83806001019450506112a7565b50505050565b6115e56040805190810160405280600e81526020017f67657442656e6566696369617279000000000000000000000000000000000000815250838373ffffffffffffffffffffffffffffffffffffffff16600102610cc4565b5050565b600061168a6040805190810160405280601181526020017f6d6f6469667942656e656669636961727900000000000000000000000000000081525084846040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019250505060405180910390206116de565b905092915050565b60006116d36040805190810160405280601081526020017f6765745465726d73436f6e74726163740000000000000000000000000000000081525083610846565b600190049050919050565b60006002836040518082805190602001908083835b60208310151561171857805182526020820191506020810190506020830392506116f3565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b60016002836040518082805190602001908083835b6020831015156117b4578051825260208201915060208101905060208303925061178f565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b60208310151561184f578051825260208201915060208101905060208303925061182a565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816118949190611af4565b9160005260206000209001600083909190915090600019169055505050565b6118bb611b55565b610140604051908101604052806040805190810160405280600681526020017f696e73657274000000000000000000000000000000000000000000000000000081525081526020016040805190810160405280601181526020017f6d6f6469667942656e656669636961727900000000000000000000000000000081525081526020016040805190810160405280600e81526020017f67657442656e656669636961727900000000000000000000000000000000000081525081526020016040805190810160405280601681526020017f6765745465726d735f7465726d73436f6e74726163740000000000000000000081525081526020016040805190810160405280602081526020017f6765745465726d735f7465726d73436f6e7472616374506172616d657465727381525081526020016040805190810160405280601081526020017f6765745465726d73436f6e74726163740000000000000000000000000000000081525081526020016040805190810160405280601a81526020017f6765745465726d73436f6e7472616374506172616d657465727300000000000081525081526020016040805190810160405280601981526020017f67657449737375616e6365426c6f636b54696d657374616d700000000000000081525081526020016040805190810160405280600e81526020017f646f6573456e747279457869737400000000000000000000000000000000000081525081526020016020604051908101604052806000815250815250905090565b815481835581811511611b1b57818360005260206000209182019101611b1a9190611b84565b5b505050565b602060405190810160405280600081525090565b5080546000825590600052602060002090810190611b529190611b84565b50565b61014060405190810160405280600a905b611b6e611ba9565b815260200190600190039081611b665790505090565b611ba691905b80821115611ba2576000816000905550600101611b8a565b5090565b90565b6020604051908101604052806000815250905600a165627a7a72305820d5442d020f4b87def34d11e5cbdab2f23191b3955aea8493145530a5c92c62420029", + "bytecode": "0x6060604052341561000f57600080fd5b611be98061001e6000396000f300606060405260043610610112576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063131018581461011757806318d2efef1461019d578063212e5da1146101e3578063314a522e146102cf5780635969549e146103125780636be39bda146103585780636ea5f93a146103ce57806380da20d4146104025780638dc8a7b2146104795780639758af1e146104a95780639feff4cc146104e8578063a1bc7ef01461050f578063b4045ae914610541578063ba20dda414610594578063cf9df5eb146105fb578063d69dbf63146106eb578063d826f88f14610726578063f0450a5c1461073b578063f6a6189614610781578063f6f494c9146107df575b600080fd5b341561012257600080fd5b61017f600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091905050610846565b60405180826000191660001916815260200191505060405180910390f35b34156101a857600080fd5b6101e160048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506108d5565b005b34156101ee57600080fd5b6102b5600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803560001916906020019091908035906020019091905050610932565b604051808215151515815260200191505060405180910390f35b34156102da57600080fd5b6102f4600480803560001916906020019091905050610afd565b60405180826000191660001916815260200191505060405180910390f35b341561031d57600080fd5b61035660048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b45565b005b341561036357600080fd5b61037d600480803560001916906020019091905050610bf2565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182600019166000191681526020019250505060405180910390f35b34156103d957600080fd5b61040060048080356000191690602001909190803560001916906020019091905050610c80565b005b341561040d57600080fd5b610477600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080356000191690602001909190803560001916906020019091905050610cc4565b005b341561048457600080fd5b6104a7600480803560001916906020019091908035906020019091905050610dee565b005b34156104b457600080fd5b6104ce600480803560001916906020019091905050610e35565b604051808215151515815260200191505060405180910390f35b34156104f357600080fd5b61050d600480803560001916906020019091905050610e9e565b005b341561051a57600080fd5b61053f6004808035600019169060200190919080351515906020019091905050610ee5565b005b341561054c57600080fd5b61059260048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803560001916906020019091905050610f3c565b005b341561059f57600080fd5b6105b9600480803560001916906020019091905050610fda565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561060657600080fd5b6106cd600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803560001916906020019091908035906020019091905050611026565b60405180826000191660001916815260200191505060405180910390f35b34156106f657600080fd5b610710600480803560001916906020019091905050611249565b6040518082815260200191505060405180910390f35b341561073157600080fd5b610739611295565b005b341561074657600080fd5b61077f60048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061158c565b005b341561078c57600080fd5b6107c560048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506115e9565b604051808215151515815260200191505060405180910390f35b34156107ea57600080fd5b610804600480803560001916906020019091905050611692565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60006001836040518082805190602001908083835b602083101515610880578051825260208201915060208101905060208303925061085b565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b61092e6040805190810160405280601081526020017f6765745465726d73436f6e747261637400000000000000000000000000000000815250838373ffffffffffffffffffffffffffffffffffffffff16600102610cc4565b5050565b6000610aef6040805190810160405280600681526020017f696e7365727400000000000000000000000000000000000000000000000000008152508a8a8a8a8a8a8a8a604051808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140183600019166000191681526020018281526020019850505050505050505060405180910390206116de565b905098975050505050505050565b6000610b3e6040805190810160405280601a81526020017f6765745465726d73436f6e7472616374506172616d657465727300000000000081525083610846565b9050919050565b610be46040805190810160405280601181526020017f6d6f6469667942656e656669636961727900000000000000000000000000000081525083836040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140192505050604051809103902061177a565b610bee828261158c565b5050565b600080610c346040805190810160405280601681526020017f6765745465726d735f7465726d73436f6e74726163740000000000000000000081525084610846565b60019004610c776040805190810160405280602081526020017f6765745465726d735f7465726d73436f6e7472616374506172616d657465727381525085610846565b91509150915091565b610cc06040805190810160405280601a81526020017f6765745465726d73436f6e7472616374506172616d65746572730000000000008152508383610cc4565b5050565b6000836040518082805190602001908083835b602083101515610cfc5780518252602082019150602081019050602083039250610cd7565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281610d419190611af4565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b602083101515610d955780518252602082019150602081019050602083039250610d70565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b610e316040805190810160405280601981526020017f67657449737375616e6365426c6f636b54696d657374616d70000000000000008152508383600102610cc4565b5050565b600080610e776040805190810160405280600e81526020017f646f6573456e747279457869737400000000000000000000000000000000000081525084610846565b9050600060010260001916816000191614610e93576001610e96565b60005b915050919050565b610ee26040805190810160405280600681526020017f696e736572740000000000000000000000000000000000000000000000000000815250600060010283610cc4565b50565b610f386040805190810160405280600e81526020017f646f6573456e74727945786973740000000000000000000000000000000000008152508383610f2e576000600102610f33565b600180025b610cc4565b5050565b610f956040805190810160405280601681526020017f6765745465726d735f7465726d73436f6e747261637400000000000000000000815250848473ffffffffffffffffffffffffffffffffffffffff16600102610cc4565b610fd56040805190810160405280602081526020017f6765745465726d735f7465726d73436f6e7472616374506172616d65746572738152508483610cc4565b505050565b600061101b6040805190810160405280600e81526020017f67657442656e656669636961727900000000000000000000000000000000000081525083610846565b600190049050919050565b60008060008a8a8a8a8a8a8a8a604051808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401836000191660001916815260200182815260200198505050505050505050604051809103902091506111e96040805190810160405280600681526020017f696e7365727400000000000000000000000000000000000000000000000000008152508361177a565b61122c6040805190810160405280600681526020017f696e7365727400000000000000000000000000000000000000000000000000008152506000600102610846565b9050611238818b61158c565b809250505098975050505050505050565b600061128a6040805190810160405280601981526020017f67657449737375616e6365426c6f636b54696d657374616d700000000000000081525083610846565b600190049050919050565b600061129f611b20565b600080600093505b600a841015611586576112b86118b3565b84600a811015156112c557fe5b602002015192506000835114151561157957600091505b6000836040518082805190602001908083835b60208310151561131457805182526020820191506020810190506020830392506112ef565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015611501576000836040518082805190602001908083835b60208310151561138a5780518252602082019150602081019050602083039250611365565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020828154811015156113ca57fe5b90600052602060002090015490506002836040518082805190602001908083835b60208310151561141057805182526020820191506020810190506020830392506113eb565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b6020831015156114a4578051825260208201915060208101905060208303925061147f565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600082600019166000191681526020019081526020016000206000905581806001019250506112dc565b6000836040518082805190602001908083835b6020831015156115395780518252602082019150602081019050602083039250611514565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006115789190611b34565b5b83806001019450506112a7565b50505050565b6115e56040805190810160405280600e81526020017f67657442656e6566696369617279000000000000000000000000000000000000815250838373ffffffffffffffffffffffffffffffffffffffff16600102610cc4565b5050565b600061168a6040805190810160405280601181526020017f6d6f6469667942656e656669636961727900000000000000000000000000000081525084846040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019250505060405180910390206116de565b905092915050565b60006116d36040805190810160405280601081526020017f6765745465726d73436f6e74726163740000000000000000000000000000000081525083610846565b600190049050919050565b60006002836040518082805190602001908083835b60208310151561171857805182526020820191506020810190506020830392506116f3565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b60016002836040518082805190602001908083835b6020831015156117b4578051825260208201915060208101905060208303925061178f565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b60208310151561184f578051825260208201915060208101905060208303925061182a565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816118949190611af4565b9160005260206000209001600083909190915090600019169055505050565b6118bb611b55565b610140604051908101604052806040805190810160405280600681526020017f696e73657274000000000000000000000000000000000000000000000000000081525081526020016040805190810160405280601181526020017f6d6f6469667942656e656669636961727900000000000000000000000000000081525081526020016040805190810160405280600e81526020017f67657442656e656669636961727900000000000000000000000000000000000081525081526020016040805190810160405280601681526020017f6765745465726d735f7465726d73436f6e74726163740000000000000000000081525081526020016040805190810160405280602081526020017f6765745465726d735f7465726d73436f6e7472616374506172616d657465727381525081526020016040805190810160405280601081526020017f6765745465726d73436f6e74726163740000000000000000000000000000000081525081526020016040805190810160405280601a81526020017f6765745465726d73436f6e7472616374506172616d657465727300000000000081525081526020016040805190810160405280601981526020017f67657449737375616e6365426c6f636b54696d657374616d700000000000000081525081526020016040805190810160405280600e81526020017f646f6573456e747279457869737400000000000000000000000000000000000081525081526020016020604051908101604052806000815250815250905090565b815481835581811511611b1b57818360005260206000209182019101611b1a9190611b84565b5b505050565b602060405190810160405280600081525090565b5080546000825590600052602060002090810190611b529190611b84565b50565b61014060405190810160405280600a905b611b6e611ba9565b815260200190600190039081611b665790505090565b611ba691905b80821115611ba2576000816000905550600101611b8a565b5090565b90565b6020604051908101604052806000815250905600a165627a7a723058201e90a79a26f6c096d1731ffbf61a123ab6cc589c7ae0e98f1465c95a181984960029", + "deployedBytecode": "0x606060405260043610610112576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063131018581461011757806318d2efef1461019d578063212e5da1146101e3578063314a522e146102cf5780635969549e146103125780636be39bda146103585780636ea5f93a146103ce57806380da20d4146104025780638dc8a7b2146104795780639758af1e146104a95780639feff4cc146104e8578063a1bc7ef01461050f578063b4045ae914610541578063ba20dda414610594578063cf9df5eb146105fb578063d69dbf63146106eb578063d826f88f14610726578063f0450a5c1461073b578063f6a6189614610781578063f6f494c9146107df575b600080fd5b341561012257600080fd5b61017f600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091905050610846565b60405180826000191660001916815260200191505060405180910390f35b34156101a857600080fd5b6101e160048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506108d5565b005b34156101ee57600080fd5b6102b5600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803560001916906020019091908035906020019091905050610932565b604051808215151515815260200191505060405180910390f35b34156102da57600080fd5b6102f4600480803560001916906020019091905050610afd565b60405180826000191660001916815260200191505060405180910390f35b341561031d57600080fd5b61035660048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b45565b005b341561036357600080fd5b61037d600480803560001916906020019091905050610bf2565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182600019166000191681526020019250505060405180910390f35b34156103d957600080fd5b61040060048080356000191690602001909190803560001916906020019091905050610c80565b005b341561040d57600080fd5b610477600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080356000191690602001909190803560001916906020019091905050610cc4565b005b341561048457600080fd5b6104a7600480803560001916906020019091908035906020019091905050610dee565b005b34156104b457600080fd5b6104ce600480803560001916906020019091905050610e35565b604051808215151515815260200191505060405180910390f35b34156104f357600080fd5b61050d600480803560001916906020019091905050610e9e565b005b341561051a57600080fd5b61053f6004808035600019169060200190919080351515906020019091905050610ee5565b005b341561054c57600080fd5b61059260048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803560001916906020019091905050610f3c565b005b341561059f57600080fd5b6105b9600480803560001916906020019091905050610fda565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561060657600080fd5b6106cd600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803560001916906020019091908035906020019091905050611026565b60405180826000191660001916815260200191505060405180910390f35b34156106f657600080fd5b610710600480803560001916906020019091905050611249565b6040518082815260200191505060405180910390f35b341561073157600080fd5b610739611295565b005b341561074657600080fd5b61077f60048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061158c565b005b341561078c57600080fd5b6107c560048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506115e9565b604051808215151515815260200191505060405180910390f35b34156107ea57600080fd5b610804600480803560001916906020019091905050611692565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60006001836040518082805190602001908083835b602083101515610880578051825260208201915060208101905060208303925061085b565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b61092e6040805190810160405280601081526020017f6765745465726d73436f6e747261637400000000000000000000000000000000815250838373ffffffffffffffffffffffffffffffffffffffff16600102610cc4565b5050565b6000610aef6040805190810160405280600681526020017f696e7365727400000000000000000000000000000000000000000000000000008152508a8a8a8a8a8a8a8a604051808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140183600019166000191681526020018281526020019850505050505050505060405180910390206116de565b905098975050505050505050565b6000610b3e6040805190810160405280601a81526020017f6765745465726d73436f6e7472616374506172616d657465727300000000000081525083610846565b9050919050565b610be46040805190810160405280601181526020017f6d6f6469667942656e656669636961727900000000000000000000000000000081525083836040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140192505050604051809103902061177a565b610bee828261158c565b5050565b600080610c346040805190810160405280601681526020017f6765745465726d735f7465726d73436f6e74726163740000000000000000000081525084610846565b60019004610c776040805190810160405280602081526020017f6765745465726d735f7465726d73436f6e7472616374506172616d657465727381525085610846565b91509150915091565b610cc06040805190810160405280601a81526020017f6765745465726d73436f6e7472616374506172616d65746572730000000000008152508383610cc4565b5050565b6000836040518082805190602001908083835b602083101515610cfc5780518252602082019150602081019050602083039250610cd7565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281610d419190611af4565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b602083101515610d955780518252602082019150602081019050602083039250610d70565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b610e316040805190810160405280601981526020017f67657449737375616e6365426c6f636b54696d657374616d70000000000000008152508383600102610cc4565b5050565b600080610e776040805190810160405280600e81526020017f646f6573456e747279457869737400000000000000000000000000000000000081525084610846565b9050600060010260001916816000191614610e93576001610e96565b60005b915050919050565b610ee26040805190810160405280600681526020017f696e736572740000000000000000000000000000000000000000000000000000815250600060010283610cc4565b50565b610f386040805190810160405280600e81526020017f646f6573456e74727945786973740000000000000000000000000000000000008152508383610f2e576000600102610f33565b600180025b610cc4565b5050565b610f956040805190810160405280601681526020017f6765745465726d735f7465726d73436f6e747261637400000000000000000000815250848473ffffffffffffffffffffffffffffffffffffffff16600102610cc4565b610fd56040805190810160405280602081526020017f6765745465726d735f7465726d73436f6e7472616374506172616d65746572738152508483610cc4565b505050565b600061101b6040805190810160405280600e81526020017f67657442656e656669636961727900000000000000000000000000000000000081525083610846565b600190049050919050565b60008060008a8a8a8a8a8a8a8a604051808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401836000191660001916815260200182815260200198505050505050505050604051809103902091506111e96040805190810160405280600681526020017f696e7365727400000000000000000000000000000000000000000000000000008152508361177a565b61122c6040805190810160405280600681526020017f696e7365727400000000000000000000000000000000000000000000000000008152506000600102610846565b9050611238818b61158c565b809250505098975050505050505050565b600061128a6040805190810160405280601981526020017f67657449737375616e6365426c6f636b54696d657374616d700000000000000081525083610846565b600190049050919050565b600061129f611b20565b600080600093505b600a841015611586576112b86118b3565b84600a811015156112c557fe5b602002015192506000835114151561157957600091505b6000836040518082805190602001908083835b60208310151561131457805182526020820191506020810190506020830392506112ef565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015611501576000836040518082805190602001908083835b60208310151561138a5780518252602082019150602081019050602083039250611365565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020828154811015156113ca57fe5b90600052602060002090015490506002836040518082805190602001908083835b60208310151561141057805182526020820191506020810190506020830392506113eb565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b6020831015156114a4578051825260208201915060208101905060208303925061147f565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600082600019166000191681526020019081526020016000206000905581806001019250506112dc565b6000836040518082805190602001908083835b6020831015156115395780518252602082019150602081019050602083039250611514565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006115789190611b34565b5b83806001019450506112a7565b50505050565b6115e56040805190810160405280600e81526020017f67657442656e6566696369617279000000000000000000000000000000000000815250838373ffffffffffffffffffffffffffffffffffffffff16600102610cc4565b5050565b600061168a6040805190810160405280601181526020017f6d6f6469667942656e656669636961727900000000000000000000000000000081525084846040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019250505060405180910390206116de565b905092915050565b60006116d36040805190810160405280601081526020017f6765745465726d73436f6e74726163740000000000000000000000000000000081525083610846565b600190049050919050565b60006002836040518082805190602001908083835b60208310151561171857805182526020820191506020810190506020830392506116f3565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b60016002836040518082805190602001908083835b6020831015156117b4578051825260208201915060208101905060208303925061178f565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b60208310151561184f578051825260208201915060208101905060208303925061182a565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816118949190611af4565b9160005260206000209001600083909190915090600019169055505050565b6118bb611b55565b610140604051908101604052806040805190810160405280600681526020017f696e73657274000000000000000000000000000000000000000000000000000081525081526020016040805190810160405280601181526020017f6d6f6469667942656e656669636961727900000000000000000000000000000081525081526020016040805190810160405280600e81526020017f67657442656e656669636961727900000000000000000000000000000000000081525081526020016040805190810160405280601681526020017f6765745465726d735f7465726d73436f6e74726163740000000000000000000081525081526020016040805190810160405280602081526020017f6765745465726d735f7465726d73436f6e7472616374506172616d657465727381525081526020016040805190810160405280601081526020017f6765745465726d73436f6e74726163740000000000000000000000000000000081525081526020016040805190810160405280601a81526020017f6765745465726d73436f6e7472616374506172616d657465727300000000000081525081526020016040805190810160405280601981526020017f67657449737375616e6365426c6f636b54696d657374616d700000000000000081525081526020016040805190810160405280600e81526020017f646f6573456e747279457869737400000000000000000000000000000000000081525081526020016020604051908101604052806000815250815250905090565b815481835581811511611b1b57818360005260206000209182019101611b1a9190611b84565b5b505050565b602060405190810160405280600081525090565b5080546000825590600052602060002090810190611b529190611b84565b50565b61014060405190810160405280600a905b611b6e611ba9565b815260200190600190039081611b665790505090565b611ba691905b80821115611ba2576000816000905550600101611b8a565b5090565b90565b6020604051908101604052806000815250905600a165627a7a723058201e90a79a26f6c096d1731ffbf61a123ab6cc589c7ae0e98f1465c95a181984960029", "sourceMap": "640:5492:25:-;;;;;;;;;;;;;;;;;", "deployedSourceMap": "640:5492:25:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1294:217:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4525:218:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4749:639;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4112:200;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1534:275;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2759:341;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4318:201;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1018:270:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3895:211:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2023:220;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2421:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2249:166;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3106:356;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1815:202;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;688:840;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3678:211;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1517:610:23;;;;;;;;;;;;;;2565:188:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5394:273;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3468:204;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1294:217:23;1411:24;1458:17;1476:12;1458:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1458:46:23;1490:13;1458:46;;;;;;;;;;;;;;;;;;1451:53;;1294:217;;;;:::o;4525:218:25:-;4664:72;;;;;;;;;;;;;;;;;;;4700:11;4721:13;4713:22;;;;4664:15;:72::i;:::-;4525:218;;:::o;4749:639::-;5071:15;5109:272;;;;;;;;;;;;;;;;;;;5168:8;5190:12;5216:7;5237:12;5263:22;5299:14;5327:24;5365:5;5145:235;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5109:25;:272::i;:::-;5102:279;;4749:639;;;;;;;;;;:::o;4112:200::-;4214:7;4244:61;;;;;;;;;;;;;;;;;;;4293:11;4244:18;:61::i;:::-;4237:68;;4112:200;;;:::o;1534:275::-;1635:95;;;;;;;;;;;;;;;;;;;1701:11;1714:14;1691:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1635:22;:95::i;:::-;1741:61;1774:11;1787:14;1741:32;:61::i;:::-;1534:275;;:::o;2759:341::-;2843:22;2867:32;2944:57;;;;;;;;;;;;;;;;;;;2989:11;2944:18;:57::i;:::-;2936:66;;;3016:67;;;;;;;;;;;;;;;;;;;3071:11;3016:18;:67::i;:::-;2915:178;;;;2759:341;;;:::o;4318:201::-;4446:66;;;;;;;;;;;;;;;;;;;4492:11;4505:6;4446:15;:66::i;:::-;4318:201;;:::o;1018:270:23:-;1155:22;1178:12;1155:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1155:56:23;;;;;;;;;;;:::i;:::-;;;;;;;;;;1197:13;1155:56;;;;;;;;;;;;1270:11;1221:17;1239:12;1221:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1221:46:23;1253:13;1221:46;;;;;;;;;;;;;;;;;:60;;;;;;;1018:270;;;:::o;3895:211:25:-;4022:77;;;;;;;;;;;;;;;;;;;4067:11;4088:9;4080:18;;4022:15;:77::i;:::-;3895:211;;:::o;2023:220::-;2084:4;2100:23;2126:49;;;;;;;;;;;;;;;;;;;2163:11;2126:18;:49::i;:::-;2100:75;;2219:1;2211:10;;2192:29;;;:15;:29;;;;:44;;2232:4;2192:44;;;2224:5;2192:44;2185:51;;2023:220;;;;:::o;2421:138::-;2490:62;;;;;;;;;;;;;;;;;;;697:1:23;689:10;;2540:11:25;2490:15;:62::i;:::-;2421:138;:::o;2249:166::-;2328:80;;;;;;;;;;;;;;;;;;;2362:11;2375:6;:32;;2405:1;2397:10;;2375:32;;;2392:1;2384:10;;2375:32;2328:15;:80::i;:::-;2249:166;;:::o;3106:356::-;3278:78;;;;;;;;;;;;;;;;;;;3320:11;3341:13;3333:22;;;;3278:15;:78::i;:::-;3366:89;;;;;;;;;;;;;;;;;;;3418:11;3431:23;3366:15;:89::i;:::-;3106:356;;;:::o;1815:202::-;1905:24;1960:49;;;;;;;;;;;;;;;;;;;1997:11;1960:18;:49::i;:::-;1952:58;;;1945:65;;1815:202;;;:::o;688:840::-;984:20;1020:21;1348:19;1067:8;1089:12;1115:7;1136:12;1162:22;1198:14;1226:24;1264:5;1044:235;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1020:259;;1290:47;;;;;;;;;;;;;;;;;;;1323:13;1290:22;:47::i;:::-;1370:52;;;;;;;;;;;;;;;;;;;697:1:23;689:10;;1370:18:25;:52::i;:::-;1348:74;;1433:59;1466:11;1479:12;1433:32;:59::i;:::-;1510:11;1503:18;;688:840;;;;;;;;;;;;:::o;3678:211::-;3779:14;3821:60;;;;;;;;;;;;;;;;;;;3869:11;3821:18;:60::i;:::-;3816:66;;;3809:73;;3678:211;;;:::o;1517:610:23:-;1556:6;1595:26;;:::i;:::-;1719:6;1807:21;1565:1;1556:10;;1551:570;1572:2;1568:1;:6;1551:570;;;1624:17;:15;:17::i;:::-;1642:1;1624:20;;;;;;;;;;;;;1595:49;;1693:1;1669:12;1663:26;:31;;1659:452;;;1728:1;1719:10;;1714:321;1735:22;1758:12;1735:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1735:43:23;;;;1731:1;:47;1714:321;;;1831:22;1854:12;1831:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1868:1:23;1831:39;;;;;;;;;;;;;;;;;;;1807:63;;1899:13;1913:12;1899:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1899:42:23;1927:13;1899:42;;;;;;;;;;;;;;;;;;1892:49;;;;;;;;;;;1970:17;1988:12;1970:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1970:46:23;2002:13;1970:46;;;;;;;;;;;;;;;;;1963:53;;;1780:3;;;;;;;1714:321;;;2060:22;2083:12;2060:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;;2053:43:23;;;;:::i;:::-;1659:452;1576:3;;;;;;;1551:570;;;1517:610;;;;:::o;2565:188:25:-;2678:68;;;;;;;;;;;;;;;;;;;2712:11;2733;2725:20;;;;2678:15;:68::i;:::-;2565:188;;:::o;5394:273::-;5524:15;5562:98;;;;;;;;;;;;;;;;;;;5631:11;5644:14;5621:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5562:25;:98::i;:::-;5555:105;;5394:273;;;;:::o;3468:204::-;3560:22;3613:51;;;;;;;;;;;;;;;;;;;3652:11;3613:18;:51::i;:::-;3605:60;;;3598:67;;3468:204;;;:::o;2341:194:23:-;2458:14;2495:13;2509:12;2495:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2495:33:23;2523:4;2495:33;;;;;;;;;;;;;;;;;;;;;;;;;;;2488:40;;2341:194;;;;:::o;2133:202::-;2267:4;2231:13;2245:12;2231:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2231:33:23;2259:4;2231:33;;;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;2281:22;2304:12;2281:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2281:47:23;;;;;;;;;;;:::i;:::-;;;;;;;;;;2323:4;2281:47;;;;;;;;;;;;2133:202;;:::o;5673:457:25:-;5734:24;;:::i;:::-;5774:349;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5673:457;:::o;640:5492::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\nimport \"./MockContract.sol\";\n\n\ncontract MockDebtRegistry is MockContract {\n function insert(\n address _version,\n address _beneficiary,\n address _debtor,\n address _underwriter,\n uint _underwriterRiskRating,\n address _termsContract,\n bytes32 _termsContractParameters,\n uint _salt\n )\n public\n returns (bytes32 _agreementId)\n {\n bytes32 argsSignature = keccak256(\n _version,\n _beneficiary,\n _debtor,\n _underwriter,\n _underwriterRiskRating,\n _termsContract,\n _termsContractParameters,\n _salt\n );\n\n functionCalledWithArgs(\"insert\", argsSignature);\n\n bytes32 agreementId = getMockReturnValue(\"insert\", DEFAULT_SIGNATURE_ARGS);\n\n mockGetBeneficiaryReturnValueFor(agreementId, _beneficiary);\n\n return agreementId;\n }\n\n function modifyBeneficiary(bytes32 agreementId, address newBeneficiary)\n public\n {\n functionCalledWithArgs(\"modifyBeneficiary\",\n keccak256(agreementId, newBeneficiary));\n\n mockGetBeneficiaryReturnValueFor(agreementId, newBeneficiary);\n }\n\n function getBeneficiary(bytes32 agreementId)\n public\n view\n returns (address _mockBeneficiary)\n {\n return address(getMockReturnValue(\"getBeneficiary\", agreementId));\n }\n\n function doesEntryExist(bytes32 agreementId) public returns (bool) {\n bytes32 mockReturnValue = getMockReturnValue(\"doesEntryExist\", agreementId);\n return mockReturnValue == bytes32(0) ? false : true;\n }\n\n function mockDoesEntryExist(bytes32 agreementId, bool exists) public {\n mockReturnValue(\"doesEntryExist\", agreementId, exists ? bytes32(1) : bytes32(0));\n }\n\n function mockInsertReturnValue(bytes32 agreementId) public {\n mockReturnValue(\"insert\", DEFAULT_SIGNATURE_ARGS, agreementId);\n }\n\n function mockGetBeneficiaryReturnValueFor(bytes32 agreementId, address beneficiary)\n public\n {\n mockReturnValue(\"getBeneficiary\", agreementId, bytes32(beneficiary));\n }\n\n function getTerms(bytes32 agreementId)\n public\n view\n returns (address _termsContract, bytes32 _termsContractParameters)\n {\n return (\n address(getMockReturnValue(\"getTerms_termsContract\", agreementId)),\n getMockReturnValue(\"getTerms_termsContractParameters\", agreementId)\n );\n }\n\n function mockGetTermsReturnValueFor(\n bytes32 agreementId,\n address termsContract,\n bytes32 termsContractParameters\n )\n public\n {\n mockReturnValue(\"getTerms_termsContract\", agreementId, bytes32(termsContract));\n mockReturnValue(\"getTerms_termsContractParameters\", agreementId, termsContractParameters);\n }\n\n function getTermsContract(bytes32 agreementId)\n public\n view\n returns (address _termsContract)\n {\n return address(getMockReturnValue(\"getTermsContract\", agreementId));\n }\n\n function getIssuanceBlockTimestamp(bytes32 agreementId)\n public\n view\n returns (uint timestamp)\n {\n return uint(getMockReturnValue(\"getIssuanceBlockTimestamp\", agreementId));\n }\n\n function mockGetIssuanceBlockTimestamp(\n bytes32 agreementId,\n uint timestamp\n )\n public\n {\n mockReturnValue(\"getIssuanceBlockTimestamp\", agreementId, bytes32(timestamp));\n }\n\n function getTermsContractParameters(bytes32 agreementId)\n public\n view\n returns (bytes32)\n {\n return getMockReturnValue(\"getTermsContractParameters\", agreementId);\n }\n\n function mockGetTermsContractParameters(\n bytes32 agreementId,\n bytes32 params\n )\n public\n {\n mockReturnValue(\"getTermsContractParameters\", agreementId, params);\n }\n\n function mockGetTermsContractReturnValueFor(\n bytes32 agreementId,\n address termsContract\n )\n public\n {\n mockReturnValue(\"getTermsContract\", agreementId, bytes32(termsContract));\n }\n\n function wasInsertCalledWith(\n address _version,\n address _beneficiary,\n address _debtor,\n address _underwriter,\n uint _underwriterRiskRating,\n address _termsContract,\n bytes32 _termsContractParameters,\n uint _salt\n )\n public\n view\n returns (bool _wasCalled)\n {\n return wasFunctionCalledWithArgs(\"insert\", keccak256(\n _version,\n _beneficiary,\n _debtor,\n _underwriter,\n _underwriterRiskRating,\n _termsContract,\n _termsContractParameters,\n _salt\n ));\n }\n\n function wasModifyBeneficiaryCalledWith(bytes32 agreementId, address newBeneficiary)\n public\n view\n returns (bool _wasCalled)\n {\n return wasFunctionCalledWithArgs(\"modifyBeneficiary\",\n keccak256(agreementId, newBeneficiary));\n }\n\n function getFunctionList()\n internal\n returns (string[10] functionNames)\n {\n return [\n \"insert\",\n \"modifyBeneficiary\",\n \"getBeneficiary\",\n \"getTerms_termsContract\",\n \"getTerms_termsContractParameters\",\n \"getTermsContract\",\n \"getTermsContractParameters\",\n \"getIssuanceBlockTimestamp\",\n \"doesEntryExist\",\n \"\"\n ];\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockDebtRegistry.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockDebtRegistry.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockDebtRegistry.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockDebtRegistry.sol", "exportedSymbols": { "MockDebtRegistry": [ 11213 @@ -467,7 +467,7 @@ export const MockDebtRegistry = { "attributes": { "SourceUnit": 10693, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockContract.sol", "file": "./MockContract.sol", "scope": 11214, "symbolAliases": [ @@ -5997,7 +5997,7 @@ export const MockDebtRegistry = "42": { "events": {}, "links": {}, - "address": "0x14fd9ddb3cfc7a3fa9c44f910825c0d287be2e34" + "address": "0x7593f653e23985ac6371a1e2d0a681f6e5534007" }, "70": { "events": {}, @@ -6006,5 +6006,5 @@ export const MockDebtRegistry = } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:13:01.024Z" + "updatedAt": "2018-10-09T17:50:01.328Z" } \ No newline at end of file diff --git a/artifacts/ts/MockDebtToken.ts b/artifacts/ts/MockDebtToken.ts index b9763fc9..6596d7f3 100644 --- a/artifacts/ts/MockDebtToken.ts +++ b/artifacts/ts/MockDebtToken.ts @@ -323,15 +323,15 @@ export const MockDebtToken = "type": "function" } ], - "bytecode": "0x6060604052341561000f57600080fd5b6118918061001e6000396000f3006060604052600436106100db576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630e81bd9f146100e0578063131018581461013a57806313d2a2ab146101c05780634f558e79146102025780636352211e1461023d57806380da20d4146102a05780638456cb591461031757806399f105011461032c5780639c0d9c4314610414578063a9059cbb1461044d578063b742f563146104a7578063c6f5407a14610593578063d826f88f146105e4578063e18b2126146105f9578063e55f7fd51461061c575b600080fd5b34156100eb57600080fd5b610120600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610649565b604051808215151515815260200191505060405180910390f35b341561014557600080fd5b6101a2600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091908035600019169060200190919050506106ea565b60405180826000191660001916815260200191505060405180910390f35b34156101cb57600080fd5b610200600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610779565b005b341561020d57600080fd5b61022360048080359060200190919050506107eb565b604051808215151515815260200191505060405180910390f35b341561024857600080fd5b61025e600480803590602001909190505061082c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102ab57600080fd5b610315600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091908035600019169060200190919080356000191690602001909190505061087d565b005b341561032257600080fd5b61032a6109a7565b005b341561033757600080fd5b6103fe600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803560001916906020019091908035906020019091905050610a23565b6040518082815260200191505060405180910390f35b341561041f57600080fd5b61044b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610c3a565b005b341561045857600080fd5b61048d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610ccc565b604051808215151515815260200191505060405180910390f35b34156104b257600080fd5b610579600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803560001916906020019091908035906020019091905050610d6f565b604051808215151515815260200191505060405180910390f35b341561059e57600080fd5b6105ca600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610f3a565b604051808215151515815260200191505060405180910390f35b34156105ef57600080fd5b6105f7610fd2565b005b341561060457600080fd5b61061a60048080359060200190919050506112c9565b005b341561062757600080fd5b61062f611313565b604051808215151515815260200191505060405180910390f35b60006106e26040805190810160405280600881526020017f7472616e736665720000000000000000000000000000000000000000000000008152508484604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040518091039020611394565b905092915050565b60006001836040518082805190602001908083835b60208310151561072457805182526020820191506020810190506020830392506106ff565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b6107e76040805190810160405280600781526020017f6f776e65724f6600000000000000000000000000000000000000000000000000815250836040518082815260200191505060405180910390208373ffffffffffffffffffffffffffffffffffffffff1660010261087d565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff1661080d83611430565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600061083782611430565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561087557600080fd5b809050919050565b6000836040518082805190602001908083835b6020831015156108b55780518252602082019150602081019050602083039250610890565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816108fa919061179c565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b60208310151561094e5780518252602082019150602081019050602083039250610929565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b610a216040805190810160405280600581526020017f70617573650000000000000000000000000000000000000000000000000000008152506000604051808260ff167f01000000000000000000000000000000000000000000000000000000000000000281526001019150506040518091039020611491565b565b6000808989898989898989604051808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140183600019166000191681526020018281526020019850505050505050505060405180910390209050610be46040805190810160405280600681526020017f637265617465000000000000000000000000000000000000000000000000000081525082611491565b610c276040805190810160405280600681526020017f637265617465000000000000000000000000000000000000000000000000000081525060006001026106ea565b6001900491505098975050505050505050565b610cc96040805190810160405280601681526020017f616464417574686f72697a65644d696e744167656e740000000000000000000081525082604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019150506040518091039020611491565b50565b6000610d656040805190810160405280600881526020017f7472616e736665720000000000000000000000000000000000000000000000008152508484604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040518091039020611491565b6001905092915050565b6000610f2c6040805190810160405280600681526020017f63726561746500000000000000000000000000000000000000000000000000008152508a8a8a8a8a8a8a8a604051808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018360001916600019168152602001828152602001985050505050505050506040518091039020611394565b905098975050505050505050565b6000610fcb6040805190810160405280601681526020017f616464417574686f72697a65644d696e744167656e740000000000000000000081525083604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019150506040518091039020611394565b9050919050565b6000610fdc6117c8565b600080600093505b600a8410156112c357610ff56115ca565b84600a8110151561100257fe5b60200201519250600083511415156112b657600091505b6000836040518082805190602001908083835b602083101515611051578051825260208201915060208101905060208303925061102c565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054905082101561123e576000836040518082805190602001908083835b6020831015156110c757805182526020820191506020810190506020830392506110a2565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208281548110151561110757fe5b90600052602060002090015490506002836040518082805190602001908083835b60208310151561114d5780518252602082019150602081019050602083039250611128565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b6020831015156111e157805182526020820191506020810190506020830392506111bc565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050611019565b6000836040518082805190602001908083835b6020831015156112765780518252602082019150602081019050602083039250611251565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006112b591906117dc565b5b8380600101945050610fe4565b50505050565b6113106040805190810160405280600681526020017f637265617465000000000000000000000000000000000000000000000000000081525060006001028360010261087d565b50565b600061138f6040805190810160405280600581526020017f70617573650000000000000000000000000000000000000000000000000000008152506000604051808260ff167f01000000000000000000000000000000000000000000000000000000000000000281526001019150506040518091039020611394565b905090565b60006002836040518082805190602001908083835b6020831015156113ce57805182526020820191506020810190506020830392506113a9565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b60006114866040805190810160405280600781526020017f6f776e65724f6600000000000000000000000000000000000000000000000000815250836040518082815260200191505060405180910390206106ea565b600190049050919050565b60016002836040518082805190602001908083835b6020831015156114cb57805182526020820191506020810190506020830392506114a6565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b6020831015156115665780518252602082019150602081019050602083039250611541565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816115ab919061179c565b9160005260206000209001600083909190915090600019169055505050565b6115d26117fd565b610140604051908101604052806040805190810160405280600681526020017f637265617465000000000000000000000000000000000000000000000000000081525081526020016040805190810160405280600781526020017f6f776e65724f660000000000000000000000000000000000000000000000000081525081526020016040805190810160405280600881526020017f7472616e7366657200000000000000000000000000000000000000000000000081525081526020016040805190810160405280600681526020017f657869737473000000000000000000000000000000000000000000000000000081525081526020016040805190810160405280601681526020017f616464417574686f72697a65644d696e744167656e740000000000000000000081525081526020016040805190810160405280600581526020017f706175736500000000000000000000000000000000000000000000000000000081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b8154818355818115116117c3578183600052602060002091820191016117c2919061182c565b5b505050565b602060405190810160405280600081525090565b50805460008255906000526020600020908101906117fa919061182c565b50565b61014060405190810160405280600a905b611816611851565b81526020019060019003908161180e5790505090565b61184e91905b8082111561184a576000816000905550600101611832565b5090565b90565b6020604051908101604052806000815250905600a165627a7a72305820e9a591eeb6627cf9c13507bc2383976749cd8a371dc32aa5c6aeeb0ac606ef260029", - "deployedBytecode": "0x6060604052600436106100db576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630e81bd9f146100e0578063131018581461013a57806313d2a2ab146101c05780634f558e79146102025780636352211e1461023d57806380da20d4146102a05780638456cb591461031757806399f105011461032c5780639c0d9c4314610414578063a9059cbb1461044d578063b742f563146104a7578063c6f5407a14610593578063d826f88f146105e4578063e18b2126146105f9578063e55f7fd51461061c575b600080fd5b34156100eb57600080fd5b610120600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610649565b604051808215151515815260200191505060405180910390f35b341561014557600080fd5b6101a2600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091908035600019169060200190919050506106ea565b60405180826000191660001916815260200191505060405180910390f35b34156101cb57600080fd5b610200600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610779565b005b341561020d57600080fd5b61022360048080359060200190919050506107eb565b604051808215151515815260200191505060405180910390f35b341561024857600080fd5b61025e600480803590602001909190505061082c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102ab57600080fd5b610315600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091908035600019169060200190919080356000191690602001909190505061087d565b005b341561032257600080fd5b61032a6109a7565b005b341561033757600080fd5b6103fe600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803560001916906020019091908035906020019091905050610a23565b6040518082815260200191505060405180910390f35b341561041f57600080fd5b61044b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610c3a565b005b341561045857600080fd5b61048d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610ccc565b604051808215151515815260200191505060405180910390f35b34156104b257600080fd5b610579600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803560001916906020019091908035906020019091905050610d6f565b604051808215151515815260200191505060405180910390f35b341561059e57600080fd5b6105ca600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610f3a565b604051808215151515815260200191505060405180910390f35b34156105ef57600080fd5b6105f7610fd2565b005b341561060457600080fd5b61061a60048080359060200190919050506112c9565b005b341561062757600080fd5b61062f611313565b604051808215151515815260200191505060405180910390f35b60006106e26040805190810160405280600881526020017f7472616e736665720000000000000000000000000000000000000000000000008152508484604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040518091039020611394565b905092915050565b60006001836040518082805190602001908083835b60208310151561072457805182526020820191506020810190506020830392506106ff565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b6107e76040805190810160405280600781526020017f6f776e65724f6600000000000000000000000000000000000000000000000000815250836040518082815260200191505060405180910390208373ffffffffffffffffffffffffffffffffffffffff1660010261087d565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff1661080d83611430565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600061083782611430565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561087557600080fd5b809050919050565b6000836040518082805190602001908083835b6020831015156108b55780518252602082019150602081019050602083039250610890565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816108fa919061179c565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b60208310151561094e5780518252602082019150602081019050602083039250610929565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b610a216040805190810160405280600581526020017f70617573650000000000000000000000000000000000000000000000000000008152506000604051808260ff167f01000000000000000000000000000000000000000000000000000000000000000281526001019150506040518091039020611491565b565b6000808989898989898989604051808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140183600019166000191681526020018281526020019850505050505050505060405180910390209050610be46040805190810160405280600681526020017f637265617465000000000000000000000000000000000000000000000000000081525082611491565b610c276040805190810160405280600681526020017f637265617465000000000000000000000000000000000000000000000000000081525060006001026106ea565b6001900491505098975050505050505050565b610cc96040805190810160405280601681526020017f616464417574686f72697a65644d696e744167656e740000000000000000000081525082604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019150506040518091039020611491565b50565b6000610d656040805190810160405280600881526020017f7472616e736665720000000000000000000000000000000000000000000000008152508484604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040518091039020611491565b6001905092915050565b6000610f2c6040805190810160405280600681526020017f63726561746500000000000000000000000000000000000000000000000000008152508a8a8a8a8a8a8a8a604051808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018360001916600019168152602001828152602001985050505050505050506040518091039020611394565b905098975050505050505050565b6000610fcb6040805190810160405280601681526020017f616464417574686f72697a65644d696e744167656e740000000000000000000081525083604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019150506040518091039020611394565b9050919050565b6000610fdc6117c8565b600080600093505b600a8410156112c357610ff56115ca565b84600a8110151561100257fe5b60200201519250600083511415156112b657600091505b6000836040518082805190602001908083835b602083101515611051578051825260208201915060208101905060208303925061102c565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054905082101561123e576000836040518082805190602001908083835b6020831015156110c757805182526020820191506020810190506020830392506110a2565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208281548110151561110757fe5b90600052602060002090015490506002836040518082805190602001908083835b60208310151561114d5780518252602082019150602081019050602083039250611128565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b6020831015156111e157805182526020820191506020810190506020830392506111bc565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050611019565b6000836040518082805190602001908083835b6020831015156112765780518252602082019150602081019050602083039250611251565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006112b591906117dc565b5b8380600101945050610fe4565b50505050565b6113106040805190810160405280600681526020017f637265617465000000000000000000000000000000000000000000000000000081525060006001028360010261087d565b50565b600061138f6040805190810160405280600581526020017f70617573650000000000000000000000000000000000000000000000000000008152506000604051808260ff167f01000000000000000000000000000000000000000000000000000000000000000281526001019150506040518091039020611394565b905090565b60006002836040518082805190602001908083835b6020831015156113ce57805182526020820191506020810190506020830392506113a9565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b60006114866040805190810160405280600781526020017f6f776e65724f6600000000000000000000000000000000000000000000000000815250836040518082815260200191505060405180910390206106ea565b600190049050919050565b60016002836040518082805190602001908083835b6020831015156114cb57805182526020820191506020810190506020830392506114a6565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b6020831015156115665780518252602082019150602081019050602083039250611541565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816115ab919061179c565b9160005260206000209001600083909190915090600019169055505050565b6115d26117fd565b610140604051908101604052806040805190810160405280600681526020017f637265617465000000000000000000000000000000000000000000000000000081525081526020016040805190810160405280600781526020017f6f776e65724f660000000000000000000000000000000000000000000000000081525081526020016040805190810160405280600881526020017f7472616e7366657200000000000000000000000000000000000000000000000081525081526020016040805190810160405280600681526020017f657869737473000000000000000000000000000000000000000000000000000081525081526020016040805190810160405280601681526020017f616464417574686f72697a65644d696e744167656e740000000000000000000081525081526020016040805190810160405280600581526020017f706175736500000000000000000000000000000000000000000000000000000081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b8154818355818115116117c3578183600052602060002091820191016117c2919061182c565b5b505050565b602060405190810160405280600081525090565b50805460008255906000526020600020908101906117fa919061182c565b50565b61014060405190810160405280600a905b611816611851565b81526020019060019003908161180e5790505090565b61184e91905b8082111561184a576000816000905550600101611832565b5090565b90565b6020604051908101604052806000815250905600a165627a7a72305820e9a591eeb6627cf9c13507bc2383976749cd8a371dc32aa5c6aeeb0ac606ef260029", + "bytecode": "0x6060604052341561000f57600080fd5b6118918061001e6000396000f3006060604052600436106100db576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630e81bd9f146100e0578063131018581461013a57806313d2a2ab146101c05780634f558e79146102025780636352211e1461023d57806380da20d4146102a05780638456cb591461031757806399f105011461032c5780639c0d9c4314610414578063a9059cbb1461044d578063b742f563146104a7578063c6f5407a14610593578063d826f88f146105e4578063e18b2126146105f9578063e55f7fd51461061c575b600080fd5b34156100eb57600080fd5b610120600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610649565b604051808215151515815260200191505060405180910390f35b341561014557600080fd5b6101a2600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091908035600019169060200190919050506106ea565b60405180826000191660001916815260200191505060405180910390f35b34156101cb57600080fd5b610200600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610779565b005b341561020d57600080fd5b61022360048080359060200190919050506107eb565b604051808215151515815260200191505060405180910390f35b341561024857600080fd5b61025e600480803590602001909190505061082c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102ab57600080fd5b610315600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091908035600019169060200190919080356000191690602001909190505061087d565b005b341561032257600080fd5b61032a6109a7565b005b341561033757600080fd5b6103fe600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803560001916906020019091908035906020019091905050610a23565b6040518082815260200191505060405180910390f35b341561041f57600080fd5b61044b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610c3a565b005b341561045857600080fd5b61048d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610ccc565b604051808215151515815260200191505060405180910390f35b34156104b257600080fd5b610579600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803560001916906020019091908035906020019091905050610d6f565b604051808215151515815260200191505060405180910390f35b341561059e57600080fd5b6105ca600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610f3a565b604051808215151515815260200191505060405180910390f35b34156105ef57600080fd5b6105f7610fd2565b005b341561060457600080fd5b61061a60048080359060200190919050506112c9565b005b341561062757600080fd5b61062f611313565b604051808215151515815260200191505060405180910390f35b60006106e26040805190810160405280600881526020017f7472616e736665720000000000000000000000000000000000000000000000008152508484604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040518091039020611394565b905092915050565b60006001836040518082805190602001908083835b60208310151561072457805182526020820191506020810190506020830392506106ff565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b6107e76040805190810160405280600781526020017f6f776e65724f6600000000000000000000000000000000000000000000000000815250836040518082815260200191505060405180910390208373ffffffffffffffffffffffffffffffffffffffff1660010261087d565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff1661080d83611430565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600061083782611430565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561087557600080fd5b809050919050565b6000836040518082805190602001908083835b6020831015156108b55780518252602082019150602081019050602083039250610890565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816108fa919061179c565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b60208310151561094e5780518252602082019150602081019050602083039250610929565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b610a216040805190810160405280600581526020017f70617573650000000000000000000000000000000000000000000000000000008152506000604051808260ff167f01000000000000000000000000000000000000000000000000000000000000000281526001019150506040518091039020611491565b565b6000808989898989898989604051808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140183600019166000191681526020018281526020019850505050505050505060405180910390209050610be46040805190810160405280600681526020017f637265617465000000000000000000000000000000000000000000000000000081525082611491565b610c276040805190810160405280600681526020017f637265617465000000000000000000000000000000000000000000000000000081525060006001026106ea565b6001900491505098975050505050505050565b610cc96040805190810160405280601681526020017f616464417574686f72697a65644d696e744167656e740000000000000000000081525082604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019150506040518091039020611491565b50565b6000610d656040805190810160405280600881526020017f7472616e736665720000000000000000000000000000000000000000000000008152508484604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040518091039020611491565b6001905092915050565b6000610f2c6040805190810160405280600681526020017f63726561746500000000000000000000000000000000000000000000000000008152508a8a8a8a8a8a8a8a604051808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018360001916600019168152602001828152602001985050505050505050506040518091039020611394565b905098975050505050505050565b6000610fcb6040805190810160405280601681526020017f616464417574686f72697a65644d696e744167656e740000000000000000000081525083604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019150506040518091039020611394565b9050919050565b6000610fdc6117c8565b600080600093505b600a8410156112c357610ff56115ca565b84600a8110151561100257fe5b60200201519250600083511415156112b657600091505b6000836040518082805190602001908083835b602083101515611051578051825260208201915060208101905060208303925061102c565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054905082101561123e576000836040518082805190602001908083835b6020831015156110c757805182526020820191506020810190506020830392506110a2565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208281548110151561110757fe5b90600052602060002090015490506002836040518082805190602001908083835b60208310151561114d5780518252602082019150602081019050602083039250611128565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b6020831015156111e157805182526020820191506020810190506020830392506111bc565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050611019565b6000836040518082805190602001908083835b6020831015156112765780518252602082019150602081019050602083039250611251565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006112b591906117dc565b5b8380600101945050610fe4565b50505050565b6113106040805190810160405280600681526020017f637265617465000000000000000000000000000000000000000000000000000081525060006001028360010261087d565b50565b600061138f6040805190810160405280600581526020017f70617573650000000000000000000000000000000000000000000000000000008152506000604051808260ff167f01000000000000000000000000000000000000000000000000000000000000000281526001019150506040518091039020611394565b905090565b60006002836040518082805190602001908083835b6020831015156113ce57805182526020820191506020810190506020830392506113a9565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b60006114866040805190810160405280600781526020017f6f776e65724f6600000000000000000000000000000000000000000000000000815250836040518082815260200191505060405180910390206106ea565b600190049050919050565b60016002836040518082805190602001908083835b6020831015156114cb57805182526020820191506020810190506020830392506114a6565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b6020831015156115665780518252602082019150602081019050602083039250611541565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816115ab919061179c565b9160005260206000209001600083909190915090600019169055505050565b6115d26117fd565b610140604051908101604052806040805190810160405280600681526020017f637265617465000000000000000000000000000000000000000000000000000081525081526020016040805190810160405280600781526020017f6f776e65724f660000000000000000000000000000000000000000000000000081525081526020016040805190810160405280600881526020017f7472616e7366657200000000000000000000000000000000000000000000000081525081526020016040805190810160405280600681526020017f657869737473000000000000000000000000000000000000000000000000000081525081526020016040805190810160405280601681526020017f616464417574686f72697a65644d696e744167656e740000000000000000000081525081526020016040805190810160405280600581526020017f706175736500000000000000000000000000000000000000000000000000000081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b8154818355818115116117c3578183600052602060002091820191016117c2919061182c565b5b505050565b602060405190810160405280600081525090565b50805460008255906000526020600020908101906117fa919061182c565b50565b61014060405190810160405280600a905b611816611851565b81526020019060019003908161180e5790505090565b61184e91905b8082111561184a576000816000905550600101611832565b5090565b90565b6020604051908101604052806000815250905600a165627a7a72305820028ce1ac7f4a24ee72a10f6bfb6857fae9415a855e6b43a683c6766f5891a5ba0029", + "deployedBytecode": "0x6060604052600436106100db576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630e81bd9f146100e0578063131018581461013a57806313d2a2ab146101c05780634f558e79146102025780636352211e1461023d57806380da20d4146102a05780638456cb591461031757806399f105011461032c5780639c0d9c4314610414578063a9059cbb1461044d578063b742f563146104a7578063c6f5407a14610593578063d826f88f146105e4578063e18b2126146105f9578063e55f7fd51461061c575b600080fd5b34156100eb57600080fd5b610120600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610649565b604051808215151515815260200191505060405180910390f35b341561014557600080fd5b6101a2600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091908035600019169060200190919050506106ea565b60405180826000191660001916815260200191505060405180910390f35b34156101cb57600080fd5b610200600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610779565b005b341561020d57600080fd5b61022360048080359060200190919050506107eb565b604051808215151515815260200191505060405180910390f35b341561024857600080fd5b61025e600480803590602001909190505061082c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102ab57600080fd5b610315600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091908035600019169060200190919080356000191690602001909190505061087d565b005b341561032257600080fd5b61032a6109a7565b005b341561033757600080fd5b6103fe600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803560001916906020019091908035906020019091905050610a23565b6040518082815260200191505060405180910390f35b341561041f57600080fd5b61044b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610c3a565b005b341561045857600080fd5b61048d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610ccc565b604051808215151515815260200191505060405180910390f35b34156104b257600080fd5b610579600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803560001916906020019091908035906020019091905050610d6f565b604051808215151515815260200191505060405180910390f35b341561059e57600080fd5b6105ca600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610f3a565b604051808215151515815260200191505060405180910390f35b34156105ef57600080fd5b6105f7610fd2565b005b341561060457600080fd5b61061a60048080359060200190919050506112c9565b005b341561062757600080fd5b61062f611313565b604051808215151515815260200191505060405180910390f35b60006106e26040805190810160405280600881526020017f7472616e736665720000000000000000000000000000000000000000000000008152508484604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040518091039020611394565b905092915050565b60006001836040518082805190602001908083835b60208310151561072457805182526020820191506020810190506020830392506106ff565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b6107e76040805190810160405280600781526020017f6f776e65724f6600000000000000000000000000000000000000000000000000815250836040518082815260200191505060405180910390208373ffffffffffffffffffffffffffffffffffffffff1660010261087d565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff1661080d83611430565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600061083782611430565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561087557600080fd5b809050919050565b6000836040518082805190602001908083835b6020831015156108b55780518252602082019150602081019050602083039250610890565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816108fa919061179c565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b60208310151561094e5780518252602082019150602081019050602083039250610929565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b610a216040805190810160405280600581526020017f70617573650000000000000000000000000000000000000000000000000000008152506000604051808260ff167f01000000000000000000000000000000000000000000000000000000000000000281526001019150506040518091039020611491565b565b6000808989898989898989604051808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140183600019166000191681526020018281526020019850505050505050505060405180910390209050610be46040805190810160405280600681526020017f637265617465000000000000000000000000000000000000000000000000000081525082611491565b610c276040805190810160405280600681526020017f637265617465000000000000000000000000000000000000000000000000000081525060006001026106ea565b6001900491505098975050505050505050565b610cc96040805190810160405280601681526020017f616464417574686f72697a65644d696e744167656e740000000000000000000081525082604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019150506040518091039020611491565b50565b6000610d656040805190810160405280600881526020017f7472616e736665720000000000000000000000000000000000000000000000008152508484604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040518091039020611491565b6001905092915050565b6000610f2c6040805190810160405280600681526020017f63726561746500000000000000000000000000000000000000000000000000008152508a8a8a8a8a8a8a8a604051808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018360001916600019168152602001828152602001985050505050505050506040518091039020611394565b905098975050505050505050565b6000610fcb6040805190810160405280601681526020017f616464417574686f72697a65644d696e744167656e740000000000000000000081525083604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019150506040518091039020611394565b9050919050565b6000610fdc6117c8565b600080600093505b600a8410156112c357610ff56115ca565b84600a8110151561100257fe5b60200201519250600083511415156112b657600091505b6000836040518082805190602001908083835b602083101515611051578051825260208201915060208101905060208303925061102c565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054905082101561123e576000836040518082805190602001908083835b6020831015156110c757805182526020820191506020810190506020830392506110a2565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208281548110151561110757fe5b90600052602060002090015490506002836040518082805190602001908083835b60208310151561114d5780518252602082019150602081019050602083039250611128565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b6020831015156111e157805182526020820191506020810190506020830392506111bc565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050611019565b6000836040518082805190602001908083835b6020831015156112765780518252602082019150602081019050602083039250611251565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006112b591906117dc565b5b8380600101945050610fe4565b50505050565b6113106040805190810160405280600681526020017f637265617465000000000000000000000000000000000000000000000000000081525060006001028360010261087d565b50565b600061138f6040805190810160405280600581526020017f70617573650000000000000000000000000000000000000000000000000000008152506000604051808260ff167f01000000000000000000000000000000000000000000000000000000000000000281526001019150506040518091039020611394565b905090565b60006002836040518082805190602001908083835b6020831015156113ce57805182526020820191506020810190506020830392506113a9565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b60006114866040805190810160405280600781526020017f6f776e65724f6600000000000000000000000000000000000000000000000000815250836040518082815260200191505060405180910390206106ea565b600190049050919050565b60016002836040518082805190602001908083835b6020831015156114cb57805182526020820191506020810190506020830392506114a6565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b6020831015156115665780518252602082019150602081019050602083039250611541565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816115ab919061179c565b9160005260206000209001600083909190915090600019169055505050565b6115d26117fd565b610140604051908101604052806040805190810160405280600681526020017f637265617465000000000000000000000000000000000000000000000000000081525081526020016040805190810160405280600781526020017f6f776e65724f660000000000000000000000000000000000000000000000000081525081526020016040805190810160405280600881526020017f7472616e7366657200000000000000000000000000000000000000000000000081525081526020016040805190810160405280600681526020017f657869737473000000000000000000000000000000000000000000000000000081525081526020016040805190810160405280601681526020017f616464417574686f72697a65644d696e744167656e740000000000000000000081525081526020016040805190810160405280600581526020017f706175736500000000000000000000000000000000000000000000000000000081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b8154818355818115116117c3578183600052602060002091820191016117c2919061182c565b5b505050565b602060405190810160405280600081525090565b50805460008255906000526020600020908101906117fa919061182c565b50565b61014060405190810160405280600a905b611816611851565b81526020019060019003908161180e5790505090565b61184e91905b8082111561184a576000816000905550600101611832565b5090565b90565b6020604051908101604052806000815250905600a165627a7a72305820028ce1ac7f4a24ee72a10f6bfb6857fae9415a855e6b43a683c6766f5891a5ba0029", "sourceMap": "700:3580:26:-;;;;;;;;;;;;;;;;;", "deployedSourceMap": "700:3580:26:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2477:211;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1294:217:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2904:155:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3065:151;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2694:204;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1018:270:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3606:98:26;;;;;;;;;;;;;;745:725;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3222:151;;;;;;;;;;;;;;;;;;;;;;;;;;;;2276:195;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1632:638;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3379:221;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1517:610:23;;;;;;;;;;;;;;1476:150:26;;;;;;;;;;;;;;;;;;;;;;;;;;3710:164;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2477:211;2581:14;2618:63;;;;;;;;;;;;;;;;;;;2666:3;2671:8;2656:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2618:25;:63::i;:::-;2611:70;;2477:211;;;;:::o;1294:217:23:-;1411:24;1458:17;1476:12;1458:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1458:46:23;1490:13;1458:46;;;;;;;;;;;;;;;;;;1451:53;;1294:217;;;;:::o;2904:155:26:-;2988:64;;;;;;;;;;;;;;;;;;;3025:8;3015:19;;;;;;;;;;;;;;;;;;3044:6;3036:15;;;;2988;:64::i;:::-;2904:155;;:::o;3065:151::-;3141:12;3207:1;3176:33;;:19;3186:8;3176:9;:19::i;:::-;:33;;;;3169:40;;3065:151;;;:::o;2694:204::-;2771:14;2810:19;2820:8;2810:9;:19::i;:::-;2801:28;;2865:1;2847:20;;:6;:20;;;;2839:29;;;;;;;;2885:6;2878:13;;2694:204;;;:::o;1018:270:23:-;1155:22;1178:12;1155:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1155:56:23;;;;;;;;;;;:::i;:::-;;;;;;;;;;1197:13;1155:56;;;;;;;;;;;;1270:11;1221:17;1239:12;1221:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1221:46:23;1253:13;1221:46;;;;;;;;;;;;;;;;;:60;;;;;;;1018:270;;;:::o;3606:98:26:-;3652:45;;;;;;;;;;;;;;;;;;;3694:1;3684:12;;;;;;;;;;;;;;;;;;;;;;3652:22;:45::i;:::-;3606:98::o;745:725::-;1041:13;1070:21;1117:8;1139:12;1165:7;1186:12;1212:22;1248:14;1276:24;1314:5;1094:235;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1070:259;;1340:47;;;;;;;;;;;;;;;;;;;1373:13;1340:22;:47::i;:::-;1410:52;;;;;;;;;;;;;;;;;;;697:1:23;689:10;;1410:18:26;:52::i;:::-;1405:58;;;1398:65;;745:725;;;;;;;;;;;:::o;3222:151::-;3299:67;;;;;;;;;;;;;;;;;;;3358:6;3348:17;;;;;;;;;;;;;;;;;;;;;;;;3299:22;:67::i;:::-;3222:151;:::o;2276:195::-;2354:12;2382:60;;;;;;;;;;;;;;;;;;;2427:3;2432:8;2417:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2382:22;:60::i;:::-;2460:4;2453:11;;2276:195;;;;:::o;1632:638::-;1954:14;1991:272;;;;;;;;;;;;;;;;;;;2050:8;2072:12;2098:7;2119:12;2145:22;2181:14;2209:24;2247:5;2027:235;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1991:25;:272::i;:::-;1984:279;;1632:638;;;;;;;;;;:::o;3379:221::-;3485:15;3523:70;;;;;;;;;;;;;;;;;;;3585:6;3575:17;;;;;;;;;;;;;;;;;;;;;;;;3523:25;:70::i;:::-;3516:77;;3379:221;;;:::o;1517:610:23:-;1556:6;1595:26;;:::i;:::-;1719:6;1807:21;1565:1;1556:10;;1551:570;1572:2;1568:1;:6;1551:570;;;1624:17;:15;:17::i;:::-;1642:1;1624:20;;;;;;;;;;;;;1595:49;;1693:1;1669:12;1663:26;:31;;1659:452;;;1728:1;1719:10;;1714:321;1735:22;1758:12;1735:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1735:43:23;;;;1731:1;:47;1714:321;;;1831:22;1854:12;1831:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1868:1:23;1831:39;;;;;;;;;;;;;;;;;;;1807:63;;1899:13;1913:12;1899:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1899:42:23;1927:13;1899:42;;;;;;;;;;;;;;;;;;1892:49;;;;;;;;;;;1970:17;1988:12;1970:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1970:46:23;2002:13;1970:46;;;;;;;;;;;;;;;;;1963:53;;;1780:3;;;;;;;1714:321;;;2060:22;2083:12;2060:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;;2053:43:23;;;;:::i;:::-;1659:452;1576:3;;;;;;;1551:570;;;1517:610;;;;:::o;1476:150:26:-;1551:68;;;;;;;;;;;;;;;;;;;697:1:23;689:10;;1609:8:26;1601:17;;1551:15;:68::i;:::-;1476:150;:::o;3710:164::-;3781:15;3819:48;;;;;;;;;;;;;;;;;;;3864:1;3854:12;;;;;;;;;;;;;;;;;;;;;;3819:25;:48::i;:::-;3812:55;;3710:164;:::o;2341:194:23:-;2458:14;2495:13;2509:12;2495:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2495:33:23;2523:4;2495:33;;;;;;;;;;;;;;;;;;;;;;;;;;;2488:40;;2341:194;;;;:::o;3880:183:26:-;3960:14;4005:50;;;;;;;;;;;;;;;;;;;4045:8;4035:19;;;;;;;;;;;;;;;;;;4005:18;:50::i;:::-;3997:59;;;3990:66;;3880:183;;;:::o;2133:202:23:-;2267:4;2231:13;2245:12;2231:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2231:33:23;2259:4;2231:33;;;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;2281:22;2304:12;2281:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2281:47:23;;;;;;;;;;;:::i;:::-;;;;;;;;;;2323:4;2281:47;;;;;;;;;;;;2133:202;;:::o;4069:209:26:-;4130:24;;:::i;:::-;4170:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4069:209;:::o;700:3580::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\nimport \"./MockContract.sol\";\nimport \"zeppelin-solidity/contracts/token/ERC20/ERC20.sol\";\n\n\ncontract MockDebtToken is MockContract {\n function create(\n address _version,\n address _beneficiary,\n address _debtor,\n address _underwriter,\n uint _underwriterRiskRating,\n address _termsContract,\n bytes32 _termsContractParameters,\n uint _salt\n )\n public\n returns (uint _tokenId)\n {\n bytes32 argsSignature = keccak256(\n _version,\n _beneficiary,\n _debtor,\n _underwriter,\n _underwriterRiskRating,\n _termsContract,\n _termsContractParameters,\n _salt\n );\n\n functionCalledWithArgs(\"create\", argsSignature);\n\n return uint(getMockReturnValue(\"create\", DEFAULT_SIGNATURE_ARGS));\n }\n\n function mockCreateReturnValue(uint _tokenId)\n public\n {\n mockReturnValue(\"create\", DEFAULT_SIGNATURE_ARGS, bytes32(_tokenId));\n }\n\n function wasCreateCalledWith(\n address _version,\n address _beneficiary,\n address _debtor,\n address _underwriter,\n uint _underwriterRiskRating,\n address _termsContract,\n bytes32 _termsContractParameters,\n uint _salt\n )\n public\n view\n returns (bool wasCalled)\n {\n return wasFunctionCalledWithArgs(\"create\", keccak256(\n _version,\n _beneficiary,\n _debtor,\n _underwriter,\n _underwriterRiskRating,\n _termsContract,\n _termsContractParameters,\n _salt\n ));\n }\n\n function transfer(address _to, uint _tokenId)\n public\n returns (bool success)\n {\n functionCalledWithArgs(\"transfer\", keccak256(_to, _tokenId));\n\n return true;\n }\n\n function wasTransferCalledWith(address _to, uint _tokenId)\n public\n view\n returns (bool wasCalled)\n {\n return wasFunctionCalledWithArgs(\"transfer\", keccak256(_to, _tokenId));\n }\n\n function ownerOf(uint _tokenId)\n public\n view\n returns (address _owner)\n {\n _owner = _getOwner(_tokenId);\n require(_owner != address(0));\n return _owner;\n }\n\n function mockOwnerOfFor(uint _tokenId, address _owner)\n public\n {\n mockReturnValue(\"ownerOf\", keccak256(_tokenId), bytes32(_owner));\n }\n\n function exists(uint _tokenId)\n public\n view\n returns (bool _exists)\n {\n return _getOwner(_tokenId) != address(0);\n }\n\n function addAuthorizedMintAgent(address _agent)\n public\n {\n functionCalledWithArgs(\"addAuthorizedMintAgent\", keccak256(_agent));\n }\n\n function wasAddAuthorizedMintAgentCalledWith(address _agent)\n public\n view\n returns (bool _wasCalled)\n {\n return wasFunctionCalledWithArgs(\"addAuthorizedMintAgent\", keccak256(_agent));\n }\n\n function pause()\n public\n {\n functionCalledWithArgs(\"pause\", keccak256(0));\n }\n\n function wasPauseCalled()\n public\n view\n returns (bool _wasCalled)\n {\n return wasFunctionCalledWithArgs(\"pause\", keccak256(0));\n }\n\n function _getOwner(uint _tokenId)\n private\n view\n returns (address _owner)\n {\n return address(getMockReturnValue(\"ownerOf\", keccak256(_tokenId)));\n }\n\n function getFunctionList()\n internal\n returns (string[10] functionNames)\n {\n return [\"create\", \"ownerOf\", \"transfer\", \"exists\", \"addAuthorizedMintAgent\", \"pause\", \"\", \"\", \"\", \"\"];\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockDebtToken.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockDebtToken.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockDebtToken.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockDebtToken.sol", "exportedSymbols": { "MockDebtToken": [ 11502 @@ -354,7 +354,7 @@ export const MockDebtToken = { "attributes": { "SourceUnit": 10693, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockContract.sol", "file": "./MockContract.sol", "scope": 11503, "symbolAliases": [ @@ -4599,7 +4599,7 @@ export const MockDebtToken = "42": { "events": {}, "links": {}, - "address": "0x124529e78bd31b7c187b7bc69069d5cbbebceb70" + "address": "0xf655449119757b6fd26c45702718812dbbd51356" }, "70": { "events": {}, @@ -4608,5 +4608,5 @@ export const MockDebtToken = } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:13:01.030Z" + "updatedAt": "2018-10-09T17:50:01.286Z" } \ No newline at end of file diff --git a/artifacts/ts/MockERC20Token.ts b/artifacts/ts/MockERC20Token.ts index d678afe1..4879e9ed 100644 --- a/artifacts/ts/MockERC20Token.ts +++ b/artifacts/ts/MockERC20Token.ts @@ -285,15 +285,15 @@ export const MockERC20Token = "type": "function" } ], - "bytecode": "0x6060604052341561000f57600080fd5b6115458061001e6000396000f3006060604052600436106100c5576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063095ea7b3146100ca5780630e81bd9f14610124578063131018581461017e57806323b872dd1461020457806351d5d7a91461027d57806370a08231146102bf578063771a70091461030c57806380da20d414610385578063a9059cbb146103fc578063b801982014610456578063d826f88f146104b0578063dd62ed3e146104c5578063e39ff13d14610531575b600080fd5b34156100d557600080fd5b61010a600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610592565b604051808215151515815260200191505060405180910390f35b341561012f57600080fd5b610164600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610635565b604051808215151515815260200191505060405180910390f35b341561018957600080fd5b6101e6600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091905050610687565b60405180826000191660001916815260200191505060405180910390f35b341561020f57600080fd5b610263600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610716565b604051808215151515815260200191505060405180910390f35b341561028857600080fd5b6102bd600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061076c565b005b34156102ca57600080fd5b6102f6600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610803565b6040518082815260200191505060405180910390f35b341561031757600080fd5b61036b600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061089f565b604051808215151515815260200191505060405180910390f35b341561039057600080fd5b6103fa600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091908035600019169060200190919050506108f3565b005b341561040757600080fd5b61043c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610a1d565b604051808215151515815260200191505060405180910390f35b341561046157600080fd5b610496600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610a71565b604051808215151515815260200191505060405180910390f35b34156104bb57600080fd5b6104c3610b12565b005b34156104d057600080fd5b61051b600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610e09565b6040518082815260200191505060405180910390f35b341561053c57600080fd5b610590600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610ee9565b005b600061062b6040805190810160405280600781526020017f617070726f7665000000000000000000000000000000000000000000000000008152508484604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040518091039020610fc4565b6001905092915050565b600061067f6040805190810160405280600881526020017f7472616e7366657200000000000000000000000000000000000000000000000081525061067a85856110fd565b611160565b905092915050565b60006001836040518082805190602001908083835b6020831015156106c1578051825260208201915060208101905060208303925061069c565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b60006107616040805190810160405280600c81526020017f7472616e7366657246726f6d000000000000000000000000000000000000000081525061075c8686866111fc565b610fc4565b600190509392505050565b6107ff6040805190810160405280600981526020017f62616c616e63654f66000000000000000000000000000000000000000000000081525083604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019150506040518091039020836001026108f3565b5050565b60006108946040805190810160405280600981526020017f62616c616e63654f66000000000000000000000000000000000000000000000081525083604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019150506040518091039020610687565b600190049050919050565b60006108ea6040805190810160405280600c81526020017f7472616e7366657246726f6d00000000000000000000000000000000000000008152506108e58686866111fc565b611160565b90509392505050565b6000836040518082805190602001908083835b60208310151561092b5780518252602082019150602081019050602083039250610906565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816109709190611450565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b6020831015156109c4578051825260208201915060208101905060208303925061099f565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b6000610a676040805190810160405280600881526020017f7472616e73666572000000000000000000000000000000000000000000000000815250610a6285856110fd565b610fc4565b6001905092915050565b6000610b0a6040805190810160405280600781526020017f617070726f7665000000000000000000000000000000000000000000000000008152508484604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040518091039020611160565b905092915050565b6000610b1c61147c565b600080600093505b600a841015610e0357610b356112a3565b84600a81101515610b4257fe5b6020020151925060008351141515610df657600091505b6000836040518082805190602001908083835b602083101515610b915780518252602082019150602081019050602083039250610b6c565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015610d7e576000836040518082805190602001908083835b602083101515610c075780518252602082019150602081019050602083039250610be2565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902082815481101515610c4757fe5b90600052602060002090015490506002836040518082805190602001908083835b602083101515610c8d5780518252602082019150602081019050602083039250610c68565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b602083101515610d215780518252602082019150602081019050602083039250610cfc565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050610b59565b6000836040518082805190602001908083835b602083101515610db65780518252602082019150602081019050602083039250610d91565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000610df59190611490565b5b8380600101945050610b24565b50505050565b6000610edd6040805190810160405280600981526020017f616c6c6f77616e636500000000000000000000000000000000000000000000008152508484604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040518091039020610687565b60019004905092915050565b610fbf6040805190810160405280600981526020017f616c6c6f77616e636500000000000000000000000000000000000000000000008152508484604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040518091039020836001026108f3565b505050565b60016002836040518082805190602001908083835b602083101515610ffe5780518252602082019150602081019050602083039250610fd9565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b6020831015156110995780518252602082019150602081019050602083039250611074565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816110de9190611450565b9160005260206000209001600083909190915090600019169055505050565b60008282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040518091039020905092915050565b60006002836040518082805190602001908083835b60208310151561119a5780518252602082019150602081019050602083039250611175565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b6000838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018281526020019350505050604051809103902090509392505050565b6112ab6114b1565b610140604051908101604052806040805190810160405280600881526020017f7472616e7366657200000000000000000000000000000000000000000000000081525081526020016040805190810160405280600c81526020017f7472616e7366657246726f6d000000000000000000000000000000000000000081525081526020016040805190810160405280600981526020017f616c6c6f77616e6365000000000000000000000000000000000000000000000081525081526020016040805190810160405280600981526020017f62616c616e63654f66000000000000000000000000000000000000000000000081525081526020016040805190810160405280600781526020017f617070726f7665000000000000000000000000000000000000000000000000008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b8154818355818115116114775781836000526020600020918201910161147691906114e0565b5b505050565b602060405190810160405280600081525090565b50805460008255906000526020600020908101906114ae91906114e0565b50565b61014060405190810160405280600a905b6114ca611505565b8152602001906001900390816114c25790505090565b61150291905b808211156114fe5760008160009055506001016114e6565b5090565b90565b6020604051908101604052806000815250905600a165627a7a723058203243120a9ee1d87f90fb2ad2c659e9eb6e76bf3bf337b36db4011ccf7792f95f0029", - "deployedBytecode": "0x6060604052600436106100c5576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063095ea7b3146100ca5780630e81bd9f14610124578063131018581461017e57806323b872dd1461020457806351d5d7a91461027d57806370a08231146102bf578063771a70091461030c57806380da20d414610385578063a9059cbb146103fc578063b801982014610456578063d826f88f146104b0578063dd62ed3e146104c5578063e39ff13d14610531575b600080fd5b34156100d557600080fd5b61010a600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610592565b604051808215151515815260200191505060405180910390f35b341561012f57600080fd5b610164600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610635565b604051808215151515815260200191505060405180910390f35b341561018957600080fd5b6101e6600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091905050610687565b60405180826000191660001916815260200191505060405180910390f35b341561020f57600080fd5b610263600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610716565b604051808215151515815260200191505060405180910390f35b341561028857600080fd5b6102bd600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061076c565b005b34156102ca57600080fd5b6102f6600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610803565b6040518082815260200191505060405180910390f35b341561031757600080fd5b61036b600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061089f565b604051808215151515815260200191505060405180910390f35b341561039057600080fd5b6103fa600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091908035600019169060200190919050506108f3565b005b341561040757600080fd5b61043c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610a1d565b604051808215151515815260200191505060405180910390f35b341561046157600080fd5b610496600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610a71565b604051808215151515815260200191505060405180910390f35b34156104bb57600080fd5b6104c3610b12565b005b34156104d057600080fd5b61051b600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610e09565b6040518082815260200191505060405180910390f35b341561053c57600080fd5b610590600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610ee9565b005b600061062b6040805190810160405280600781526020017f617070726f7665000000000000000000000000000000000000000000000000008152508484604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040518091039020610fc4565b6001905092915050565b600061067f6040805190810160405280600881526020017f7472616e7366657200000000000000000000000000000000000000000000000081525061067a85856110fd565b611160565b905092915050565b60006001836040518082805190602001908083835b6020831015156106c1578051825260208201915060208101905060208303925061069c565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b60006107616040805190810160405280600c81526020017f7472616e7366657246726f6d000000000000000000000000000000000000000081525061075c8686866111fc565b610fc4565b600190509392505050565b6107ff6040805190810160405280600981526020017f62616c616e63654f66000000000000000000000000000000000000000000000081525083604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019150506040518091039020836001026108f3565b5050565b60006108946040805190810160405280600981526020017f62616c616e63654f66000000000000000000000000000000000000000000000081525083604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019150506040518091039020610687565b600190049050919050565b60006108ea6040805190810160405280600c81526020017f7472616e7366657246726f6d00000000000000000000000000000000000000008152506108e58686866111fc565b611160565b90509392505050565b6000836040518082805190602001908083835b60208310151561092b5780518252602082019150602081019050602083039250610906565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816109709190611450565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b6020831015156109c4578051825260208201915060208101905060208303925061099f565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b6000610a676040805190810160405280600881526020017f7472616e73666572000000000000000000000000000000000000000000000000815250610a6285856110fd565b610fc4565b6001905092915050565b6000610b0a6040805190810160405280600781526020017f617070726f7665000000000000000000000000000000000000000000000000008152508484604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040518091039020611160565b905092915050565b6000610b1c61147c565b600080600093505b600a841015610e0357610b356112a3565b84600a81101515610b4257fe5b6020020151925060008351141515610df657600091505b6000836040518082805190602001908083835b602083101515610b915780518252602082019150602081019050602083039250610b6c565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015610d7e576000836040518082805190602001908083835b602083101515610c075780518252602082019150602081019050602083039250610be2565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902082815481101515610c4757fe5b90600052602060002090015490506002836040518082805190602001908083835b602083101515610c8d5780518252602082019150602081019050602083039250610c68565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b602083101515610d215780518252602082019150602081019050602083039250610cfc565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050610b59565b6000836040518082805190602001908083835b602083101515610db65780518252602082019150602081019050602083039250610d91565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000610df59190611490565b5b8380600101945050610b24565b50505050565b6000610edd6040805190810160405280600981526020017f616c6c6f77616e636500000000000000000000000000000000000000000000008152508484604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040518091039020610687565b60019004905092915050565b610fbf6040805190810160405280600981526020017f616c6c6f77616e636500000000000000000000000000000000000000000000008152508484604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040518091039020836001026108f3565b505050565b60016002836040518082805190602001908083835b602083101515610ffe5780518252602082019150602081019050602083039250610fd9565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b6020831015156110995780518252602082019150602081019050602083039250611074565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816110de9190611450565b9160005260206000209001600083909190915090600019169055505050565b60008282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040518091039020905092915050565b60006002836040518082805190602001908083835b60208310151561119a5780518252602082019150602081019050602083039250611175565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b6000838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018281526020019350505050604051809103902090509392505050565b6112ab6114b1565b610140604051908101604052806040805190810160405280600881526020017f7472616e7366657200000000000000000000000000000000000000000000000081525081526020016040805190810160405280600c81526020017f7472616e7366657246726f6d000000000000000000000000000000000000000081525081526020016040805190810160405280600981526020017f616c6c6f77616e6365000000000000000000000000000000000000000000000081525081526020016040805190810160405280600981526020017f62616c616e63654f66000000000000000000000000000000000000000000000081525081526020016040805190810160405280600781526020017f617070726f7665000000000000000000000000000000000000000000000000008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b8154818355818115116114775781836000526020600020918201910161147691906114e0565b5b505050565b602060405190810160405280600081525090565b50805460008255906000526020600020908101906114ae91906114e0565b50565b61014060405190810160405280600a905b6114ca611505565b8152602001906001900390816114c25790505090565b61150291905b808211156114fe5760008160009055506001016114e6565b5090565b90565b6020604051908101604052806000815250905600a165627a7a723058203243120a9ee1d87f90fb2ad2c659e9eb6e76bf3bf337b36db4011ccf7792f95f0029", + "bytecode": "0x6060604052341561000f57600080fd5b6115458061001e6000396000f3006060604052600436106100c5576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063095ea7b3146100ca5780630e81bd9f14610124578063131018581461017e57806323b872dd1461020457806351d5d7a91461027d57806370a08231146102bf578063771a70091461030c57806380da20d414610385578063a9059cbb146103fc578063b801982014610456578063d826f88f146104b0578063dd62ed3e146104c5578063e39ff13d14610531575b600080fd5b34156100d557600080fd5b61010a600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610592565b604051808215151515815260200191505060405180910390f35b341561012f57600080fd5b610164600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610635565b604051808215151515815260200191505060405180910390f35b341561018957600080fd5b6101e6600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091905050610687565b60405180826000191660001916815260200191505060405180910390f35b341561020f57600080fd5b610263600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610716565b604051808215151515815260200191505060405180910390f35b341561028857600080fd5b6102bd600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061076c565b005b34156102ca57600080fd5b6102f6600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610803565b6040518082815260200191505060405180910390f35b341561031757600080fd5b61036b600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061089f565b604051808215151515815260200191505060405180910390f35b341561039057600080fd5b6103fa600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091908035600019169060200190919050506108f3565b005b341561040757600080fd5b61043c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610a1d565b604051808215151515815260200191505060405180910390f35b341561046157600080fd5b610496600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610a71565b604051808215151515815260200191505060405180910390f35b34156104bb57600080fd5b6104c3610b12565b005b34156104d057600080fd5b61051b600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610e09565b6040518082815260200191505060405180910390f35b341561053c57600080fd5b610590600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610ee9565b005b600061062b6040805190810160405280600781526020017f617070726f7665000000000000000000000000000000000000000000000000008152508484604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040518091039020610fc4565b6001905092915050565b600061067f6040805190810160405280600881526020017f7472616e7366657200000000000000000000000000000000000000000000000081525061067a85856110fd565b611160565b905092915050565b60006001836040518082805190602001908083835b6020831015156106c1578051825260208201915060208101905060208303925061069c565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b60006107616040805190810160405280600c81526020017f7472616e7366657246726f6d000000000000000000000000000000000000000081525061075c8686866111fc565b610fc4565b600190509392505050565b6107ff6040805190810160405280600981526020017f62616c616e63654f66000000000000000000000000000000000000000000000081525083604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019150506040518091039020836001026108f3565b5050565b60006108946040805190810160405280600981526020017f62616c616e63654f66000000000000000000000000000000000000000000000081525083604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019150506040518091039020610687565b600190049050919050565b60006108ea6040805190810160405280600c81526020017f7472616e7366657246726f6d00000000000000000000000000000000000000008152506108e58686866111fc565b611160565b90509392505050565b6000836040518082805190602001908083835b60208310151561092b5780518252602082019150602081019050602083039250610906565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816109709190611450565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b6020831015156109c4578051825260208201915060208101905060208303925061099f565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b6000610a676040805190810160405280600881526020017f7472616e73666572000000000000000000000000000000000000000000000000815250610a6285856110fd565b610fc4565b6001905092915050565b6000610b0a6040805190810160405280600781526020017f617070726f7665000000000000000000000000000000000000000000000000008152508484604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040518091039020611160565b905092915050565b6000610b1c61147c565b600080600093505b600a841015610e0357610b356112a3565b84600a81101515610b4257fe5b6020020151925060008351141515610df657600091505b6000836040518082805190602001908083835b602083101515610b915780518252602082019150602081019050602083039250610b6c565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015610d7e576000836040518082805190602001908083835b602083101515610c075780518252602082019150602081019050602083039250610be2565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902082815481101515610c4757fe5b90600052602060002090015490506002836040518082805190602001908083835b602083101515610c8d5780518252602082019150602081019050602083039250610c68565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b602083101515610d215780518252602082019150602081019050602083039250610cfc565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050610b59565b6000836040518082805190602001908083835b602083101515610db65780518252602082019150602081019050602083039250610d91565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000610df59190611490565b5b8380600101945050610b24565b50505050565b6000610edd6040805190810160405280600981526020017f616c6c6f77616e636500000000000000000000000000000000000000000000008152508484604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040518091039020610687565b60019004905092915050565b610fbf6040805190810160405280600981526020017f616c6c6f77616e636500000000000000000000000000000000000000000000008152508484604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040518091039020836001026108f3565b505050565b60016002836040518082805190602001908083835b602083101515610ffe5780518252602082019150602081019050602083039250610fd9565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b6020831015156110995780518252602082019150602081019050602083039250611074565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816110de9190611450565b9160005260206000209001600083909190915090600019169055505050565b60008282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040518091039020905092915050565b60006002836040518082805190602001908083835b60208310151561119a5780518252602082019150602081019050602083039250611175565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b6000838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018281526020019350505050604051809103902090509392505050565b6112ab6114b1565b610140604051908101604052806040805190810160405280600881526020017f7472616e7366657200000000000000000000000000000000000000000000000081525081526020016040805190810160405280600c81526020017f7472616e7366657246726f6d000000000000000000000000000000000000000081525081526020016040805190810160405280600981526020017f616c6c6f77616e6365000000000000000000000000000000000000000000000081525081526020016040805190810160405280600981526020017f62616c616e63654f66000000000000000000000000000000000000000000000081525081526020016040805190810160405280600781526020017f617070726f7665000000000000000000000000000000000000000000000000008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b8154818355818115116114775781836000526020600020918201910161147691906114e0565b5b505050565b602060405190810160405280600081525090565b50805460008255906000526020600020908101906114ae91906114e0565b50565b61014060405190810160405280600a905b6114ca611505565b8152602001906001900390816114c25790505090565b61150291905b808211156114fe5760008160009055506001016114e6565b5090565b90565b6020604051908101604052806000815250905600a165627a7a72305820ea49beef342ccd0dc6fb5abf2f9b3ba8250f340e67e663b88b3d0af1f776c76b0029", + "deployedBytecode": "0x6060604052600436106100c5576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063095ea7b3146100ca5780630e81bd9f14610124578063131018581461017e57806323b872dd1461020457806351d5d7a91461027d57806370a08231146102bf578063771a70091461030c57806380da20d414610385578063a9059cbb146103fc578063b801982014610456578063d826f88f146104b0578063dd62ed3e146104c5578063e39ff13d14610531575b600080fd5b34156100d557600080fd5b61010a600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610592565b604051808215151515815260200191505060405180910390f35b341561012f57600080fd5b610164600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610635565b604051808215151515815260200191505060405180910390f35b341561018957600080fd5b6101e6600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091905050610687565b60405180826000191660001916815260200191505060405180910390f35b341561020f57600080fd5b610263600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610716565b604051808215151515815260200191505060405180910390f35b341561028857600080fd5b6102bd600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061076c565b005b34156102ca57600080fd5b6102f6600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610803565b6040518082815260200191505060405180910390f35b341561031757600080fd5b61036b600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061089f565b604051808215151515815260200191505060405180910390f35b341561039057600080fd5b6103fa600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091908035600019169060200190919050506108f3565b005b341561040757600080fd5b61043c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610a1d565b604051808215151515815260200191505060405180910390f35b341561046157600080fd5b610496600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610a71565b604051808215151515815260200191505060405180910390f35b34156104bb57600080fd5b6104c3610b12565b005b34156104d057600080fd5b61051b600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610e09565b6040518082815260200191505060405180910390f35b341561053c57600080fd5b610590600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610ee9565b005b600061062b6040805190810160405280600781526020017f617070726f7665000000000000000000000000000000000000000000000000008152508484604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040518091039020610fc4565b6001905092915050565b600061067f6040805190810160405280600881526020017f7472616e7366657200000000000000000000000000000000000000000000000081525061067a85856110fd565b611160565b905092915050565b60006001836040518082805190602001908083835b6020831015156106c1578051825260208201915060208101905060208303925061069c565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b60006107616040805190810160405280600c81526020017f7472616e7366657246726f6d000000000000000000000000000000000000000081525061075c8686866111fc565b610fc4565b600190509392505050565b6107ff6040805190810160405280600981526020017f62616c616e63654f66000000000000000000000000000000000000000000000081525083604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019150506040518091039020836001026108f3565b5050565b60006108946040805190810160405280600981526020017f62616c616e63654f66000000000000000000000000000000000000000000000081525083604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019150506040518091039020610687565b600190049050919050565b60006108ea6040805190810160405280600c81526020017f7472616e7366657246726f6d00000000000000000000000000000000000000008152506108e58686866111fc565b611160565b90509392505050565b6000836040518082805190602001908083835b60208310151561092b5780518252602082019150602081019050602083039250610906565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816109709190611450565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b6020831015156109c4578051825260208201915060208101905060208303925061099f565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b6000610a676040805190810160405280600881526020017f7472616e73666572000000000000000000000000000000000000000000000000815250610a6285856110fd565b610fc4565b6001905092915050565b6000610b0a6040805190810160405280600781526020017f617070726f7665000000000000000000000000000000000000000000000000008152508484604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040518091039020611160565b905092915050565b6000610b1c61147c565b600080600093505b600a841015610e0357610b356112a3565b84600a81101515610b4257fe5b6020020151925060008351141515610df657600091505b6000836040518082805190602001908083835b602083101515610b915780518252602082019150602081019050602083039250610b6c565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015610d7e576000836040518082805190602001908083835b602083101515610c075780518252602082019150602081019050602083039250610be2565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902082815481101515610c4757fe5b90600052602060002090015490506002836040518082805190602001908083835b602083101515610c8d5780518252602082019150602081019050602083039250610c68565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b602083101515610d215780518252602082019150602081019050602083039250610cfc565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050610b59565b6000836040518082805190602001908083835b602083101515610db65780518252602082019150602081019050602083039250610d91565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000610df59190611490565b5b8380600101945050610b24565b50505050565b6000610edd6040805190810160405280600981526020017f616c6c6f77616e636500000000000000000000000000000000000000000000008152508484604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040518091039020610687565b60019004905092915050565b610fbf6040805190810160405280600981526020017f616c6c6f77616e636500000000000000000000000000000000000000000000008152508484604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040518091039020836001026108f3565b505050565b60016002836040518082805190602001908083835b602083101515610ffe5780518252602082019150602081019050602083039250610fd9565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b6020831015156110995780518252602082019150602081019050602083039250611074565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816110de9190611450565b9160005260206000209001600083909190915090600019169055505050565b60008282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040518091039020905092915050565b60006002836040518082805190602001908083835b60208310151561119a5780518252602082019150602081019050602083039250611175565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b6000838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018281526020019350505050604051809103902090509392505050565b6112ab6114b1565b610140604051908101604052806040805190810160405280600881526020017f7472616e7366657200000000000000000000000000000000000000000000000081525081526020016040805190810160405280600c81526020017f7472616e7366657246726f6d000000000000000000000000000000000000000081525081526020016040805190810160405280600981526020017f616c6c6f77616e6365000000000000000000000000000000000000000000000081525081526020016040805190810160405280600981526020017f62616c616e63654f66000000000000000000000000000000000000000000000081525081526020016040805190810160405280600781526020017f617070726f7665000000000000000000000000000000000000000000000000008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b8154818355818115116114775781836000526020600020918201910161147691906114e0565b5b505050565b602060405190810160405280600081525090565b50805460008255906000526020600020908101906114ae91906114e0565b50565b61014060405190810160405280600a905b6114ca611505565b8152602001906001900390816114c25790505090565b61150291905b808211156114fe5760008160009055506001016114e6565b5090565b90565b6020604051908101604052806000815250905600a165627a7a72305820ea49beef342ccd0dc6fb5abf2f9b3ba8250f340e67e663b88b3d0af1f776c76b0029", "sourceMap": "700:3104:27:-;;;;;;;;;;;;;;;;;", "deployedSourceMap": "700:3104:27:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2321:181;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1017:280;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1294:217:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1303:319:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2147:147;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1991:150;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1628:334;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1018:270:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;746:265:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2508:189;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1517:610:23;;;;;;;;;;;;;;2726:170:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2902:169;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2321:181;2384:13;2413:61;;;;;;;;;;;;;;;;;;;2457:3;2462:10;2447:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2413:22;:61::i;:::-;2491:4;2484:11;;2321:181;;;;:::o;1017:280::-;1142:14;1179:111;;;;;;;;;;;;;;;;;;;1217:72;1255:3;1272:7;1217:24;:72::i;:::-;1179:25;:111::i;:::-;1172:118;;1017:280;;;;:::o;1294:217:23:-;1411:24;1458:17;1476:12;1458:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1458:46:23;1490:13;1458:46;;;;;;;;;;;;;;;;;;1451:53;;1294:217;;;;:::o;1303:319:27:-;1429:13;1458:135;;;;;;;;;;;;;;;;;;;1497:95;1539:5;1558:3;1575:7;1497:28;:95::i;:::-;1458:22;:135::i;:::-;1611:4;1604:11;;1303:319;;;;;:::o;2147:147::-;2221:66;;;;;;;;;;;;;;;;;;;2260:6;2250:17;;;;;;;;;;;;;;;;;;;;;;;;2277:8;2269:17;;2221:15;:66::i;:::-;2147:147;;:::o;1991:150::-;2046:13;2083:50;;;;;;;;;;;;;;;;;;;2125:6;2115:17;;;;;;;;;;;;;;;;;;;;;;;;2083:18;:50::i;:::-;2078:56;;;2071:63;;1991:150;;;:::o;1628:334::-;1780:14;1817:138;;;;;;;;;;;;;;;;;;;1859:95;1901:5;1920:3;1937:7;1859:28;:95::i;:::-;1817:25;:138::i;:::-;1810:145;;1628:334;;;;;:::o;1018:270:23:-;1155:22;1178:12;1155:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1155:56:23;;;;;;;;;;;:::i;:::-;;;;;;;;;;1197:13;1155:56;;;;;;;;;;;;1270:11;1221:17;1239:12;1221:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1221:46:23;1253:13;1221:46;;;;;;;;;;;;;;;;;:60;;;;;;;1018:270;;;:::o;746:265:27:-;845:13;874:108;;;;;;;;;;;;;;;;;;;909:72;947:3;964:7;909:24;:72::i;:::-;874:22;:108::i;:::-;1000:4;993:11;;746:265;;;;:::o;2508:189::-;2589:14;2626:64;;;;;;;;;;;;;;;;;;;2673:3;2678:10;2663:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2626:25;:64::i;:::-;2619:71;;2508:189;;;;:::o;1517:610:23:-;1556:6;1595:26;;:::i;:::-;1719:6;1807:21;1565:1;1556:10;;1551:570;1572:2;1568:1;:6;1551:570;;;1624:17;:15;:17::i;:::-;1642:1;1624:20;;;;;;;;;;;;;1595:49;;1693:1;1669:12;1663:26;:31;;1659:452;;;1728:1;1719:10;;1714:321;1735:22;1758:12;1735:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1735:43:23;;;;1731:1;:47;1714:321;;;1831:22;1854:12;1831:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1868:1:23;1831:39;;;;;;;;;;;;;;;;;;;1807:63;;1899:13;1913:12;1899:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1899:42:23;1927:13;1899:42;;;;;;;;;;;;;;;;;;1892:49;;;;;;;;;;;1970:17;1988:12;1970:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1970:46:23;2002:13;1970:46;;;;;;;;;;;;;;;;;1963:53;;;1780:3;;;;;;;1714:321;;;2060:22;2083:12;2060:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;;2053:43:23;;;;:::i;:::-;1659:452;1576:3;;;;;;;1551:570;;;1517:610;;;;:::o;2726:170:27:-;2794:15;2833:55;;;;;;;;;;;;;;;;;;;2875:6;2883:3;2865:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2833:18;:55::i;:::-;2828:61;;;2821:68;;2726:170;;;;:::o;2902:169::-;2991:73;;;;;;;;;;;;;;;;;;;3030:6;3038:3;3020:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3052:10;3044:19;;2991:15;:73::i;:::-;2902:169;;;:::o;2133:202:23:-;2267:4;2231:13;2245:12;2231:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2231:33:23;2259:4;2231:33;;;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;2281:22;2304:12;2281:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2281:47:23;;;;;;;;;;;:::i;:::-;;;;;;;;;;2323:4;2281:47;;;;;;;;;;;;2133:202;;:::o;3077:229:27:-;3207:12;3265:3;3282:7;3242:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3235:64;;3077:229;;;;:::o;2341:194:23:-;2458:14;2495:13;2509:12;2495:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2495:33:23;2523:4;2495:33;;;;;;;;;;;;;;;;;;;;;;;;;;;2488:40;;2341:194;;;;:::o;3312:284:27:-;3469:21;3536:5;3555:3;3572:7;3513:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3506:83;;3312:284;;;;;:::o;3602:200::-;3663:24;;:::i;:::-;3703:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3602:200;:::o;700:3104::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\nimport \"./MockContract.sol\";\nimport \"zeppelin-solidity/contracts/token/ERC20/ERC20.sol\";\n\n\ncontract MockERC20Token is MockContract {\n function transfer(\n address _to,\n uint _amount\n )\n public\n returns (bool _success)\n {\n functionCalledWithArgs(\"transfer\", getTransferArgsSignature(\n _to,\n _amount\n ));\n\n return true;\n }\n\n function wasTransferCalledWith(\n address _to,\n uint _amount\n )\n public\n view\n returns (bool wasCalled)\n {\n return wasFunctionCalledWithArgs(\"transfer\", getTransferArgsSignature(\n _to,\n _amount\n ));\n }\n\n function transferFrom(\n address _from,\n address _to,\n uint _amount\n )\n public\n returns (bool _success)\n {\n functionCalledWithArgs(\"transferFrom\", getTransferFromArgsSignature(\n _from,\n _to,\n _amount\n ));\n\n return true;\n }\n\n function wasTransferFromCalledWith(\n address _from,\n address _to,\n uint _amount\n )\n public\n view\n returns (bool wasCalled)\n {\n return wasFunctionCalledWithArgs(\"transferFrom\", getTransferFromArgsSignature(\n _from,\n _to,\n _amount\n ));\n }\n\n /* `balanceOf` */\n\n function balanceOf(address _owner) public view returns(uint _balance) {\n return uint(getMockReturnValue(\"balanceOf\", keccak256(_owner)));\n }\n\n function mockBalanceOfFor(address _owner, uint _balance) public {\n mockReturnValue(\"balanceOf\", keccak256(_owner), bytes32(_balance));\n }\n\n /* `approve` */\n\n function approve(address _to, uint _allowance) public returns (bool _success)\n {\n functionCalledWithArgs(\"approve\", keccak256(_to, _allowance));\n return true;\n }\n\n function wasApproveCalledWith(address _to, uint _allowance) public view returns (bool wasCalled)\n {\n return wasFunctionCalledWithArgs(\"approve\", keccak256(_to, _allowance));\n }\n\n /* `allowance` */\n\n function allowance(address _owner, address _to) public view returns(uint _allowance) {\n return uint(getMockReturnValue(\"allowance\", keccak256(_owner, _to)));\n }\n\n function mockAllowanceFor(address _owner, address _to, uint _allowance) public {\n mockReturnValue(\"allowance\", keccak256(_owner, _to), bytes32(_allowance));\n }\n\n function getTransferArgsSignature(\n address _to,\n uint _amount\n )\n internal\n pure\n returns (bytes32 args)\n {\n return keccak256(\n _to,\n _amount\n );\n }\n\n function getTransferFromArgsSignature(\n address _from,\n address _to,\n uint _amount\n )\n internal\n pure\n returns (bytes32 argsSignature)\n {\n return keccak256(\n _from,\n _to,\n _amount\n );\n }\n\n function getFunctionList()\n internal\n returns (string[10] functionNames)\n {\n return [\"transfer\", \"transferFrom\", \"allowance\", \"balanceOf\", \"approve\", \"\", \"\", \"\", \"\", \"\"];\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockERC20Token.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockERC20Token.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockERC20Token.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockERC20Token.sol", "exportedSymbols": { "MockERC20Token": [ 11758 @@ -316,7 +316,7 @@ export const MockERC20Token = { "attributes": { "SourceUnit": 10693, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockContract.sol", "file": "./MockContract.sol", "scope": 11759, "symbolAliases": [ @@ -4017,7 +4017,7 @@ export const MockERC20Token = "42": { "events": {}, "links": {}, - "address": "0x7ac01104b3ddaf1d5ad092817b31a8442c140158" + "address": "0x80bd8dc16d0b1bee8ce941ce2fb9108177a7dc85" }, "70": { "events": {}, @@ -4026,5 +4026,5 @@ export const MockERC20Token = } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:13:01.027Z" + "updatedAt": "2018-10-09T17:50:01.281Z" } \ No newline at end of file diff --git a/artifacts/ts/MockERC721Receiver.ts b/artifacts/ts/MockERC721Receiver.ts index f6cad45b..23264bba 100644 --- a/artifacts/ts/MockERC721Receiver.ts +++ b/artifacts/ts/MockERC721Receiver.ts @@ -139,15 +139,15 @@ export const MockERC721Receiver = "type": "function" } ], - "bytecode": "0x60606040526000600360006101000a81548160ff02191690831515021790555063f0b9e5ba7c010000000000000000000000000000000000000000000000000000000002600360016101000a81548163ffffffff02191690837c010000000000000000000000000000000000000000000000000000000090040217905550341561008857600080fd5b610ed9806100976000396000f300606060405260043610610083576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806313101858146100885780632c0e70a21461010e5780636813d7871461015057806380da20d414610175578063a3e28911146101ec578063d826f88f14610289578063f0b9e5ba1461029e575b600080fd5b341561009357600080fd5b6100f0600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091905050610375565b60405180826000191660001916815260200191505060405180910390f35b341561011957600080fd5b61014e60048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050610404565b005b341561015b57600080fd5b61017360048080351515906020019091905050610442565b005b341561018057600080fd5b6101ea600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091908035600019169060200190919080356000191690602001909190505061045f565b005b34156101f757600080fd5b61026f600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610589565b604051808215151515815260200191505060405180910390f35b341561029457600080fd5b61029c610680565b005b34156102a957600080fd5b610321600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506106c0565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b60006001836040518082805190602001908083835b6020831015156103af578051825260208201915060208101905060208303925061038a565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b80600360016101000a81548163ffffffff02191690837c01000000000000000000000000000000000000000000000000000000009004021790555050565b80600360006101000a81548160ff02191690831515021790555050565b6000836040518082805190602001908083835b6020831015156104975780518252602082019150602081019050602083039250610472565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816104dc9190610de4565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b602083101515610530578051825260208201915060208101905060208303925061050b565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b60006106776040805190810160405280601081526020017f6f6e455243373231526563656976656400000000000000000000000000000000815250858585604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140183815260200182805190602001908083835b602083101515610643578051825260208201915060208101905060208303925061061e565b6001836020036101000a038019825116818451168082178552505050505050905001935050505060405180910390206107ff565b90509392505050565b61068a6000610442565b6106b663f0b9e5ba7c010000000000000000000000000000000000000000000000000000000002610404565b6106be61089b565b565b6000600360009054906101000a900460ff161515156106de57600080fd5b6107ca6040805190810160405280601081526020017f6f6e455243373231526563656976656400000000000000000000000000000000815250858585604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140183815260200182805190602001908083835b6020831015156107965780518252602082019150602081019050602083039250610771565b6001836020036101000a03801982511681845116808217855250505050505090500193505050506040518091039020610b92565b600360019054906101000a90047c01000000000000000000000000000000000000000000000000000000000290509392505050565b60006002836040518082805190602001908083835b6020831015156108395780518252602082019150602081019050602083039250610814565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b60006108a5610e10565b600080600093505b600a841015610b8c576108be610ccb565b84600a811015156108cb57fe5b6020020151925060008351141515610b7f57600091505b6000836040518082805190602001908083835b60208310151561091a57805182526020820191506020810190506020830392506108f5565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015610b07576000836040518082805190602001908083835b602083101515610990578051825260208201915060208101905060208303925061096b565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020828154811015156109d057fe5b90600052602060002090015490506002836040518082805190602001908083835b602083101515610a1657805182526020820191506020810190506020830392506109f1565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b602083101515610aaa5780518252602082019150602081019050602083039250610a85565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600082600019166000191681526020019081526020016000206000905581806001019250506108e2565b6000836040518082805190602001908083835b602083101515610b3f5780518252602082019150602081019050602083039250610b1a565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000610b7e9190610e24565b5b83806001019450506108ad565b50505050565b60016002836040518082805190602001908083835b602083101515610bcc5780518252602082019150602081019050602083039250610ba7565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b602083101515610c675780518252602082019150602081019050602083039250610c42565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281610cac9190610de4565b9160005260206000209001600083909190915090600019169055505050565b610cd3610e45565b610140604051908101604052806040805190810160405280601081526020017f6f6e455243373231526563656976656400000000000000000000000000000000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b815481835581811511610e0b57818360005260206000209182019101610e0a9190610e74565b5b505050565b602060405190810160405280600081525090565b5080546000825590600052602060002090810190610e429190610e74565b50565b61014060405190810160405280600a905b610e5e610e99565b815260200190600190039081610e565790505090565b610e9691905b80821115610e92576000816000905550600101610e7a565b5090565b90565b6020604051908101604052806000815250905600a165627a7a723058206c4752c3dec1b43bf9a8d22ae4b21030d6564673acbb10429757e00625cfca720029", - "deployedBytecode": "0x606060405260043610610083576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806313101858146100885780632c0e70a21461010e5780636813d7871461015057806380da20d414610175578063a3e28911146101ec578063d826f88f14610289578063f0b9e5ba1461029e575b600080fd5b341561009357600080fd5b6100f0600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091905050610375565b60405180826000191660001916815260200191505060405180910390f35b341561011957600080fd5b61014e60048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050610404565b005b341561015b57600080fd5b61017360048080351515906020019091905050610442565b005b341561018057600080fd5b6101ea600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091908035600019169060200190919080356000191690602001909190505061045f565b005b34156101f757600080fd5b61026f600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610589565b604051808215151515815260200191505060405180910390f35b341561029457600080fd5b61029c610680565b005b34156102a957600080fd5b610321600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506106c0565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b60006001836040518082805190602001908083835b6020831015156103af578051825260208201915060208101905060208303925061038a565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b80600360016101000a81548163ffffffff02191690837c01000000000000000000000000000000000000000000000000000000009004021790555050565b80600360006101000a81548160ff02191690831515021790555050565b6000836040518082805190602001908083835b6020831015156104975780518252602082019150602081019050602083039250610472565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816104dc9190610de4565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b602083101515610530578051825260208201915060208101905060208303925061050b565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b60006106776040805190810160405280601081526020017f6f6e455243373231526563656976656400000000000000000000000000000000815250858585604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140183815260200182805190602001908083835b602083101515610643578051825260208201915060208101905060208303925061061e565b6001836020036101000a038019825116818451168082178552505050505050905001935050505060405180910390206107ff565b90509392505050565b61068a6000610442565b6106b663f0b9e5ba7c010000000000000000000000000000000000000000000000000000000002610404565b6106be61089b565b565b6000600360009054906101000a900460ff161515156106de57600080fd5b6107ca6040805190810160405280601081526020017f6f6e455243373231526563656976656400000000000000000000000000000000815250858585604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140183815260200182805190602001908083835b6020831015156107965780518252602082019150602081019050602083039250610771565b6001836020036101000a03801982511681845116808217855250505050505090500193505050506040518091039020610b92565b600360019054906101000a90047c01000000000000000000000000000000000000000000000000000000000290509392505050565b60006002836040518082805190602001908083835b6020831015156108395780518252602082019150602081019050602083039250610814565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b60006108a5610e10565b600080600093505b600a841015610b8c576108be610ccb565b84600a811015156108cb57fe5b6020020151925060008351141515610b7f57600091505b6000836040518082805190602001908083835b60208310151561091a57805182526020820191506020810190506020830392506108f5565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015610b07576000836040518082805190602001908083835b602083101515610990578051825260208201915060208101905060208303925061096b565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020828154811015156109d057fe5b90600052602060002090015490506002836040518082805190602001908083835b602083101515610a1657805182526020820191506020810190506020830392506109f1565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b602083101515610aaa5780518252602082019150602081019050602083039250610a85565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600082600019166000191681526020019081526020016000206000905581806001019250506108e2565b6000836040518082805190602001908083835b602083101515610b3f5780518252602082019150602081019050602083039250610b1a565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000610b7e9190610e24565b5b83806001019450506108ad565b50505050565b60016002836040518082805190602001908083835b602083101515610bcc5780518252602082019150602081019050602083039250610ba7565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b602083101515610c675780518252602082019150602081019050602083039250610c42565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281610cac9190610de4565b9160005260206000209001600083909190915090600019169055505050565b610cd3610e45565b610140604051908101604052806040805190810160405280601081526020017f6f6e455243373231526563656976656400000000000000000000000000000000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b815481835581811511610e0b57818360005260206000209182019101610e0a9190610e74565b5b505050565b602060405190810160405280600081525090565b5080546000825590600052602060002090810190610e429190610e74565b50565b61014060405190810160405280600a905b610e5e610e99565b815260200190600190039081610e565790505090565b610e9691905b80821115610e92576000816000905550600101610e7a565b5090565b90565b6020604051908101604052806000815250905600a165627a7a723058206c4752c3dec1b43bf9a8d22ae4b21030d6564673acbb10429757e00625cfca720029", + "bytecode": "0x60606040526000600360006101000a81548160ff02191690831515021790555063f0b9e5ba7c010000000000000000000000000000000000000000000000000000000002600360016101000a81548163ffffffff02191690837c010000000000000000000000000000000000000000000000000000000090040217905550341561008857600080fd5b610ed9806100976000396000f300606060405260043610610083576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806313101858146100885780632c0e70a21461010e5780636813d7871461015057806380da20d414610175578063a3e28911146101ec578063d826f88f14610289578063f0b9e5ba1461029e575b600080fd5b341561009357600080fd5b6100f0600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091905050610375565b60405180826000191660001916815260200191505060405180910390f35b341561011957600080fd5b61014e60048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050610404565b005b341561015b57600080fd5b61017360048080351515906020019091905050610442565b005b341561018057600080fd5b6101ea600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091908035600019169060200190919080356000191690602001909190505061045f565b005b34156101f757600080fd5b61026f600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610589565b604051808215151515815260200191505060405180910390f35b341561029457600080fd5b61029c610680565b005b34156102a957600080fd5b610321600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506106c0565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b60006001836040518082805190602001908083835b6020831015156103af578051825260208201915060208101905060208303925061038a565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b80600360016101000a81548163ffffffff02191690837c01000000000000000000000000000000000000000000000000000000009004021790555050565b80600360006101000a81548160ff02191690831515021790555050565b6000836040518082805190602001908083835b6020831015156104975780518252602082019150602081019050602083039250610472565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816104dc9190610de4565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b602083101515610530578051825260208201915060208101905060208303925061050b565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b60006106776040805190810160405280601081526020017f6f6e455243373231526563656976656400000000000000000000000000000000815250858585604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140183815260200182805190602001908083835b602083101515610643578051825260208201915060208101905060208303925061061e565b6001836020036101000a038019825116818451168082178552505050505050905001935050505060405180910390206107ff565b90509392505050565b61068a6000610442565b6106b663f0b9e5ba7c010000000000000000000000000000000000000000000000000000000002610404565b6106be61089b565b565b6000600360009054906101000a900460ff161515156106de57600080fd5b6107ca6040805190810160405280601081526020017f6f6e455243373231526563656976656400000000000000000000000000000000815250858585604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140183815260200182805190602001908083835b6020831015156107965780518252602082019150602081019050602083039250610771565b6001836020036101000a03801982511681845116808217855250505050505090500193505050506040518091039020610b92565b600360019054906101000a90047c01000000000000000000000000000000000000000000000000000000000290509392505050565b60006002836040518082805190602001908083835b6020831015156108395780518252602082019150602081019050602083039250610814565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b60006108a5610e10565b600080600093505b600a841015610b8c576108be610ccb565b84600a811015156108cb57fe5b6020020151925060008351141515610b7f57600091505b6000836040518082805190602001908083835b60208310151561091a57805182526020820191506020810190506020830392506108f5565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015610b07576000836040518082805190602001908083835b602083101515610990578051825260208201915060208101905060208303925061096b565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020828154811015156109d057fe5b90600052602060002090015490506002836040518082805190602001908083835b602083101515610a1657805182526020820191506020810190506020830392506109f1565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b602083101515610aaa5780518252602082019150602081019050602083039250610a85565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600082600019166000191681526020019081526020016000206000905581806001019250506108e2565b6000836040518082805190602001908083835b602083101515610b3f5780518252602082019150602081019050602083039250610b1a565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000610b7e9190610e24565b5b83806001019450506108ad565b50505050565b60016002836040518082805190602001908083835b602083101515610bcc5780518252602082019150602081019050602083039250610ba7565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b602083101515610c675780518252602082019150602081019050602083039250610c42565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281610cac9190610de4565b9160005260206000209001600083909190915090600019169055505050565b610cd3610e45565b610140604051908101604052806040805190810160405280601081526020017f6f6e455243373231526563656976656400000000000000000000000000000000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b815481835581811511610e0b57818360005260206000209182019101610e0a9190610e74565b5b505050565b602060405190810160405280600081525090565b5080546000825590600052602060002090810190610e429190610e74565b50565b61014060405190810160405280600a905b610e5e610e99565b815260200190600190039081610e565790505090565b610e9691905b80821115610e92576000816000905550600101610e7a565b5090565b90565b6020604051908101604052806000815250905600a165627a7a723058203cd854cc3959e7476977747da4397aca9a46f3839717e77ca70b40eef13d3afc0029", + "deployedBytecode": "0x606060405260043610610083576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806313101858146100885780632c0e70a21461010e5780636813d7871461015057806380da20d414610175578063a3e28911146101ec578063d826f88f14610289578063f0b9e5ba1461029e575b600080fd5b341561009357600080fd5b6100f0600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091905050610375565b60405180826000191660001916815260200191505060405180910390f35b341561011957600080fd5b61014e60048080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019091905050610404565b005b341561015b57600080fd5b61017360048080351515906020019091905050610442565b005b341561018057600080fd5b6101ea600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091908035600019169060200190919080356000191690602001909190505061045f565b005b34156101f757600080fd5b61026f600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610589565b604051808215151515815260200191505060405180910390f35b341561029457600080fd5b61029c610680565b005b34156102a957600080fd5b610321600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506106c0565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b60006001836040518082805190602001908083835b6020831015156103af578051825260208201915060208101905060208303925061038a565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b80600360016101000a81548163ffffffff02191690837c01000000000000000000000000000000000000000000000000000000009004021790555050565b80600360006101000a81548160ff02191690831515021790555050565b6000836040518082805190602001908083835b6020831015156104975780518252602082019150602081019050602083039250610472565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816104dc9190610de4565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b602083101515610530578051825260208201915060208101905060208303925061050b565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b60006106776040805190810160405280601081526020017f6f6e455243373231526563656976656400000000000000000000000000000000815250858585604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140183815260200182805190602001908083835b602083101515610643578051825260208201915060208101905060208303925061061e565b6001836020036101000a038019825116818451168082178552505050505050905001935050505060405180910390206107ff565b90509392505050565b61068a6000610442565b6106b663f0b9e5ba7c010000000000000000000000000000000000000000000000000000000002610404565b6106be61089b565b565b6000600360009054906101000a900460ff161515156106de57600080fd5b6107ca6040805190810160405280601081526020017f6f6e455243373231526563656976656400000000000000000000000000000000815250858585604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140183815260200182805190602001908083835b6020831015156107965780518252602082019150602081019050602083039250610771565b6001836020036101000a03801982511681845116808217855250505050505090500193505050506040518091039020610b92565b600360019054906101000a90047c01000000000000000000000000000000000000000000000000000000000290509392505050565b60006002836040518082805190602001908083835b6020831015156108395780518252602082019150602081019050602083039250610814565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b60006108a5610e10565b600080600093505b600a841015610b8c576108be610ccb565b84600a811015156108cb57fe5b6020020151925060008351141515610b7f57600091505b6000836040518082805190602001908083835b60208310151561091a57805182526020820191506020810190506020830392506108f5565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015610b07576000836040518082805190602001908083835b602083101515610990578051825260208201915060208101905060208303925061096b565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020828154811015156109d057fe5b90600052602060002090015490506002836040518082805190602001908083835b602083101515610a1657805182526020820191506020810190506020830392506109f1565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b602083101515610aaa5780518252602082019150602081019050602083039250610a85565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600082600019166000191681526020019081526020016000206000905581806001019250506108e2565b6000836040518082805190602001908083835b602083101515610b3f5780518252602082019150602081019050602083039250610b1a565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000610b7e9190610e24565b5b83806001019450506108ad565b50505050565b60016002836040518082805190602001908083835b602083101515610bcc5780518252602082019150602081019050602083039250610ba7565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b602083101515610c675780518252602082019150602081019050602083039250610c42565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281610cac9190610de4565b9160005260206000209001600083909190915090600019169055505050565b610cd3610e45565b610140604051908101604052806040805190810160405280601081526020017f6f6e455243373231526563656976656400000000000000000000000000000000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b815481835581811511610e0b57818360005260206000209182019101610e0a9190610e74565b5b505050565b602060405190810160405280600081525090565b5080546000825590600052602060002090810190610e429190610e74565b50565b61014060405190810160405280600a905b610e5e610e99565b815260200190600190039081610e565790505090565b610e9691905b80821115610e92576000816000905550600101610e7a565b5090565b90565b6020604051908101604052806000815250905600a165627a7a723058203cd854cc3959e7476977747da4397aca9a46f3839717e77ca70b40eef13d3afc0029", "sourceMap": "709:1427:28:-;;;853:5;824:34;;;;;;;;;;;;;;;;;;;;489:10:49;894:15:28;;864:45;;;;;;;;;;;;;;;;;;;;;709:1427;;;;;;;;;;;;;;", "deployedSourceMap": "709:1427:28:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1294:217:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1019:116:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;916:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;1018:270:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1625:336:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1141:148;;;;;;;;;;;;;;1295:324;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1294:217:23;1411:24;1458:17;1476:12;1458:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1458:46:23;1490:13;1458:46;;;;;;;;;;;;;;;;;;1451:53;;1294:217;;;;:::o;1019:116:28:-;1116:12;1102:11;;:26;;;;;;;;;;;;;;;;;;;1019:116;:::o;916:97::-;993:13;978:12;;:28;;;;;;;;;;;;;;;;;;916:97;:::o;1018:270:23:-;1155:22;1178:12;1155:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1155:56:23;;;;;;;;;;;:::i;:::-;;;;;;;;;;1197:13;1155:56;;;;;;;;;;;;1270:11;1221:17;1239:12;1221:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1221:46:23;1253:13;1221:46;;;;;;;;;;;;;;;;;:60;;;;;;;1018:270;;;:::o;1625:336:28:-;1788:14;1825:129;;;;;;;;;;;;;;;;;;;1894:8;1916;1938:5;1871:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;1825:25:28;:129::i;:::-;1818:136;;1625:336;;;;;:::o;1141:148::-;1175:22;1191:5;1175:15;:22::i;:::-;1207:52;489:10:49;1243:15:28;;1207:35;:52::i;:::-;1269:13;:11;:13::i;:::-;1141:148::o;1295:324::-;1402:6;1433:12;;;;;;;;;;;1432:13;1424:22;;;;;;;;1457:126;;;;;;;;;;;;;;;;;;;1523:8;1545;1567:5;1500:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;1457:22:28;:126::i;:::-;1601:11;;;;;;;;;;;1594:18;;1295:324;;;;;:::o;2341:194:23:-;2458:14;2495:13;2509:12;2495:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2495:33:23;2523:4;2495:33;;;;;;;;;;;;;;;;;;;;;;;;;;;2488:40;;2341:194;;;;:::o;1517:610::-;1556:6;1595:26;;:::i;:::-;1719:6;1807:21;1565:1;1556:10;;1551:570;1572:2;1568:1;:6;1551:570;;;1624:17;:15;:17::i;:::-;1642:1;1624:20;;;;;;;;;;;;;1595:49;;1693:1;1669:12;1663:26;:31;;1659:452;;;1728:1;1719:10;;1714:321;1735:22;1758:12;1735:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1735:43:23;;;;1731:1;:47;1714:321;;;1831:22;1854:12;1831:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1868:1:23;1831:39;;;;;;;;;;;;;;;;;;;1807:63;;1899:13;1913:12;1899:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1899:42:23;1927:13;1899:42;;;;;;;;;;;;;;;;;;1892:49;;;;;;;;;;;1970:17;1988:12;1970:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1970:46:23;2002:13;1970:46;;;;;;;;;;;;;;;;;1963:53;;;1780:3;;;;;;;1714:321;;;2060:22;2083:12;2060:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;;2053:43:23;;;;:::i;:::-;1659:452;1576:3;;;;;;;1551:570;;;1517:610;;;;:::o;2133:202::-;2267:4;2231:13;2245:12;2231:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2231:33:23;2259:4;2231:33;;;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;2281:22;2304:12;2281:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2281:47:23;;;;;;;;;;;:::i;:::-;;;;;;;;;;2323:4;2281:47;;;;;;;;;;;;2133:202;;:::o;1967:167:28:-;2024:24;;:::i;:::-;2064:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1967:167;:::o;709:1427::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\nimport \"./MockContract.sol\";\nimport \"zeppelin-solidity/contracts/token/ERC721/ERC721Receiver.sol\";\n\ncontract MockERC721Receiver is ERC721Receiver, MockContract {\n\n // Internal state controllable via setters.\n bool internal shouldRevert = false;\n bytes4 internal returnValue = ERC721_RECEIVED;\n\n function setShouldRevert(bool _shouldRevert) public {\n shouldRevert = _shouldRevert;\n }\n\n function setReturnValueForERC721ReceivedHook(bytes4 _returnValue) public {\n returnValue = _returnValue;\n }\n\n function reset() public {\n setShouldRevert(false);\n setReturnValueForERC721ReceivedHook(ERC721_RECEIVED);\n super.reset();\n }\n\n function onERC721Received(address _address, uint256 _tokenId, bytes _data)\n public\n returns (bytes4)\n {\n require(!shouldRevert);\n\n functionCalledWithArgs(\"onERC721Received\", keccak256(\n _address,\n _tokenId,\n _data\n ));\n\n return returnValue;\n }\n\n function wasOnERC721ReceivedCalledWith(\n address _address,\n uint256 _tokenId,\n bytes _data\n )\n public\n view\n returns (bool wasCalled)\n {\n return wasFunctionCalledWithArgs(\"onERC721Received\", keccak256(\n _address,\n _tokenId,\n _data\n ));\n }\n\n function getFunctionList()\n internal\n returns (string[10] functionNames)\n {\n return [\"onERC721Received\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\"];\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockERC721Receiver.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockERC721Receiver.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockERC721Receiver.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockERC721Receiver.sol", "exportedSymbols": { "MockERC721Receiver": [ 11879 @@ -170,7 +170,7 @@ export const MockERC721Receiver = { "attributes": { "SourceUnit": 10693, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockContract.sol", "file": "./MockContract.sol", "scope": 11880, "symbolAliases": [ @@ -1845,7 +1845,7 @@ export const MockERC721Receiver = "42": { "events": {}, "links": {}, - "address": "0x00714756c11727a071c47479c0d466f937331b8e" + "address": "0xeadebe1479a642dc27a2874233e5e2b6703a0442" }, "70": { "events": {}, @@ -1854,5 +1854,5 @@ export const MockERC721Receiver = } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:13:01.020Z" + "updatedAt": "2018-10-09T17:50:01.261Z" } \ No newline at end of file diff --git a/artifacts/ts/MockERC721Token.ts b/artifacts/ts/MockERC721Token.ts index 7a091f86..f219753f 100644 --- a/artifacts/ts/MockERC721Token.ts +++ b/artifacts/ts/MockERC721Token.ts @@ -282,15 +282,15 @@ export const MockERC721Token = "type": "function" } ], - "bytecode": "0x6060604052341561000f57600080fd5b6113f68061001e6000396000f3006060604052600436106100d0576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063081812fc146100d55780630e81bd9f146101385780631051db341461019257806313101858146101bf57806313d2a2ab1461024557806323b872dd1461028757806351d5d7a9146103005780636352211e1461034257806370a08231146103a5578063771a7009146103f257806380da20d41461046b578063a9059cbb146104e2578063c97773671461053c578063d826f88f1461057e575b600080fd5b34156100e057600080fd5b6100f66004808035906020019091905050610593565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561014357600080fd5b610178600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506105f4565b604051808215151515815260200191505060405180910390f35b341561019d57600080fd5b6101a5610646565b604051808215151515815260200191505060405180910390f35b34156101ca57600080fd5b610227600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080356000191690602001909190505061064f565b60405180826000191660001916815260200191505060405180910390f35b341561025057600080fd5b610285600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506106de565b005b341561029257600080fd5b6102e6600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610750565b604051808215151515815260200191505060405180910390f35b341561030b57600080fd5b610340600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506107a6565b005b341561034d57600080fd5b610363600480803590602001909190505061083d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103b057600080fd5b6103dc600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061089e565b6040518082815260200191505060405180910390f35b34156103fd57600080fd5b610451600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061093a565b604051808215151515815260200191505060405180910390f35b341561047657600080fd5b6104e0600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091908035600019169060200190919080356000191690602001909190505061098e565b005b34156104ed57600080fd5b610522600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610ab8565b604051808215151515815260200191505060405180910390f35b341561054757600080fd5b61057c600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b0c565b005b341561058957600080fd5b610591610b7e565b005b60006105e96040805190810160405280600b81526020017f676574417070726f7665640000000000000000000000000000000000000000008152508360405180828152602001915050604051809103902061064f565b600190049050919050565b600061063e6040805190810160405280600881526020017f7472616e736665720000000000000000000000000000000000000000000000008152506106398585610e75565b610ed8565b905092915050565b60006001905090565b60006001836040518082805190602001908083835b6020831015156106895780518252602082019150602081019050602083039250610664565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b61074c6040805190810160405280600781526020017f6f776e65724f6600000000000000000000000000000000000000000000000000815250836040518082815260200191505060405180910390208373ffffffffffffffffffffffffffffffffffffffff1660010261098e565b5050565b600061079b6040805190810160405280600c81526020017f7472616e7366657246726f6d0000000000000000000000000000000000000000815250610796868686610f74565b61101b565b600190509392505050565b6108396040805190810160405280600981526020017f62616c616e63654f66000000000000000000000000000000000000000000000081525083604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140191505060405180910390208360010261098e565b5050565b60006108936040805190810160405280600781526020017f6f776e65724f66000000000000000000000000000000000000000000000000008152508360405180828152602001915050604051809103902061064f565b600190049050919050565b600061092f6040805190810160405280600981526020017f62616c616e63654f66000000000000000000000000000000000000000000000081525083604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401915050604051809103902061064f565b600190049050919050565b60006109856040805190810160405280600c81526020017f7472616e7366657246726f6d0000000000000000000000000000000000000000815250610980868686610f74565b610ed8565b90509392505050565b6000836040518082805190602001908083835b6020831015156109c657805182526020820191506020810190506020830392506109a1565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281610a0b9190611301565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b602083101515610a5f5780518252602082019150602081019050602083039250610a3a565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b6000610b026040805190810160405280600881526020017f7472616e73666572000000000000000000000000000000000000000000000000815250610afd8585610e75565b61101b565b6001905092915050565b610b7a6040805190810160405280600b81526020017f676574417070726f766564000000000000000000000000000000000000000000815250836040518082815260200191505060405180910390208373ffffffffffffffffffffffffffffffffffffffff1660010261098e565b5050565b6000610b8861132d565b600080600093505b600a841015610e6f57610ba1611154565b84600a81101515610bae57fe5b6020020151925060008351141515610e6257600091505b6000836040518082805190602001908083835b602083101515610bfd5780518252602082019150602081019050602083039250610bd8565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015610dea576000836040518082805190602001908083835b602083101515610c735780518252602082019150602081019050602083039250610c4e565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902082815481101515610cb357fe5b90600052602060002090015490506002836040518082805190602001908083835b602083101515610cf95780518252602082019150602081019050602083039250610cd4565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b602083101515610d8d5780518252602082019150602081019050602083039250610d68565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050610bc5565b6000836040518082805190602001908083835b602083101515610e225780518252602082019150602081019050602083039250610dfd565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000610e619190611341565b5b8380600101945050610b90565b50505050565b60008282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040518091039020905092915050565b60006002836040518082805190602001908083835b602083101515610f125780518252602082019150602081019050602083039250610eed565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b6000838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018281526020019350505050604051809103902090509392505050565b60016002836040518082805190602001908083835b6020831015156110555780518252602082019150602081019050602083039250611030565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b6020831015156110f057805182526020820191506020810190506020830392506110cb565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816111359190611301565b9160005260206000209001600083909190915090600019169055505050565b61115c611362565b610140604051908101604052806040805190810160405280600881526020017f7472616e7366657200000000000000000000000000000000000000000000000081525081526020016040805190810160405280600c81526020017f7472616e7366657246726f6d000000000000000000000000000000000000000081525081526020016040805190810160405280600781526020017f6f776e65724f660000000000000000000000000000000000000000000000000081525081526020016040805190810160405280600981526020017f62616c616e63654f66000000000000000000000000000000000000000000000081525081526020016040805190810160405280600b81526020017f676574417070726f7665640000000000000000000000000000000000000000008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b815481835581811511611328578183600052602060002091820191016113279190611391565b5b505050565b602060405190810160405280600081525090565b508054600082559060005260206000209081019061135f9190611391565b50565b61014060405190810160405280600a905b61137b6113b6565b8152602001906001900390816113735790505090565b6113b391905b808211156113af576000816000905550600101611397565b5090565b90565b6020604051908101604052806000815250905600a165627a7a72305820455323b5fbeeebf4323aa75c15a2c47540d0a35c5e874d31990ffd4efddce1360029", - "deployedBytecode": "0x6060604052600436106100d0576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063081812fc146100d55780630e81bd9f146101385780631051db341461019257806313101858146101bf57806313d2a2ab1461024557806323b872dd1461028757806351d5d7a9146103005780636352211e1461034257806370a08231146103a5578063771a7009146103f257806380da20d41461046b578063a9059cbb146104e2578063c97773671461053c578063d826f88f1461057e575b600080fd5b34156100e057600080fd5b6100f66004808035906020019091905050610593565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561014357600080fd5b610178600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506105f4565b604051808215151515815260200191505060405180910390f35b341561019d57600080fd5b6101a5610646565b604051808215151515815260200191505060405180910390f35b34156101ca57600080fd5b610227600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080356000191690602001909190505061064f565b60405180826000191660001916815260200191505060405180910390f35b341561025057600080fd5b610285600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506106de565b005b341561029257600080fd5b6102e6600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610750565b604051808215151515815260200191505060405180910390f35b341561030b57600080fd5b610340600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506107a6565b005b341561034d57600080fd5b610363600480803590602001909190505061083d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103b057600080fd5b6103dc600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061089e565b6040518082815260200191505060405180910390f35b34156103fd57600080fd5b610451600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061093a565b604051808215151515815260200191505060405180910390f35b341561047657600080fd5b6104e0600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091908035600019169060200190919080356000191690602001909190505061098e565b005b34156104ed57600080fd5b610522600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610ab8565b604051808215151515815260200191505060405180910390f35b341561054757600080fd5b61057c600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b0c565b005b341561058957600080fd5b610591610b7e565b005b60006105e96040805190810160405280600b81526020017f676574417070726f7665640000000000000000000000000000000000000000008152508360405180828152602001915050604051809103902061064f565b600190049050919050565b600061063e6040805190810160405280600881526020017f7472616e736665720000000000000000000000000000000000000000000000008152506106398585610e75565b610ed8565b905092915050565b60006001905090565b60006001836040518082805190602001908083835b6020831015156106895780518252602082019150602081019050602083039250610664565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b61074c6040805190810160405280600781526020017f6f776e65724f6600000000000000000000000000000000000000000000000000815250836040518082815260200191505060405180910390208373ffffffffffffffffffffffffffffffffffffffff1660010261098e565b5050565b600061079b6040805190810160405280600c81526020017f7472616e7366657246726f6d0000000000000000000000000000000000000000815250610796868686610f74565b61101b565b600190509392505050565b6108396040805190810160405280600981526020017f62616c616e63654f66000000000000000000000000000000000000000000000081525083604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140191505060405180910390208360010261098e565b5050565b60006108936040805190810160405280600781526020017f6f776e65724f66000000000000000000000000000000000000000000000000008152508360405180828152602001915050604051809103902061064f565b600190049050919050565b600061092f6040805190810160405280600981526020017f62616c616e63654f66000000000000000000000000000000000000000000000081525083604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401915050604051809103902061064f565b600190049050919050565b60006109856040805190810160405280600c81526020017f7472616e7366657246726f6d0000000000000000000000000000000000000000815250610980868686610f74565b610ed8565b90509392505050565b6000836040518082805190602001908083835b6020831015156109c657805182526020820191506020810190506020830392506109a1565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281610a0b9190611301565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b602083101515610a5f5780518252602082019150602081019050602083039250610a3a565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b6000610b026040805190810160405280600881526020017f7472616e73666572000000000000000000000000000000000000000000000000815250610afd8585610e75565b61101b565b6001905092915050565b610b7a6040805190810160405280600b81526020017f676574417070726f766564000000000000000000000000000000000000000000815250836040518082815260200191505060405180910390208373ffffffffffffffffffffffffffffffffffffffff1660010261098e565b5050565b6000610b8861132d565b600080600093505b600a841015610e6f57610ba1611154565b84600a81101515610bae57fe5b6020020151925060008351141515610e6257600091505b6000836040518082805190602001908083835b602083101515610bfd5780518252602082019150602081019050602083039250610bd8565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015610dea576000836040518082805190602001908083835b602083101515610c735780518252602082019150602081019050602083039250610c4e565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902082815481101515610cb357fe5b90600052602060002090015490506002836040518082805190602001908083835b602083101515610cf95780518252602082019150602081019050602083039250610cd4565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b602083101515610d8d5780518252602082019150602081019050602083039250610d68565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050610bc5565b6000836040518082805190602001908083835b602083101515610e225780518252602082019150602081019050602083039250610dfd565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000610e619190611341565b5b8380600101945050610b90565b50505050565b60008282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040518091039020905092915050565b60006002836040518082805190602001908083835b602083101515610f125780518252602082019150602081019050602083039250610eed565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b6000838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018281526020019350505050604051809103902090509392505050565b60016002836040518082805190602001908083835b6020831015156110555780518252602082019150602081019050602083039250611030565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b6020831015156110f057805182526020820191506020810190506020830392506110cb565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816111359190611301565b9160005260206000209001600083909190915090600019169055505050565b61115c611362565b610140604051908101604052806040805190810160405280600881526020017f7472616e7366657200000000000000000000000000000000000000000000000081525081526020016040805190810160405280600c81526020017f7472616e7366657246726f6d000000000000000000000000000000000000000081525081526020016040805190810160405280600781526020017f6f776e65724f660000000000000000000000000000000000000000000000000081525081526020016040805190810160405280600981526020017f62616c616e63654f66000000000000000000000000000000000000000000000081525081526020016040805190810160405280600b81526020017f676574417070726f7665640000000000000000000000000000000000000000008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b815481835581811511611328578183600052602060002091820191016113279190611391565b5b505050565b602060405190810160405280600081525090565b508054600082559060005260206000209081019061135f9190611391565b50565b61014060405190810160405280600a905b61137b6113b6565b8152602001906001900390816113735790505090565b6113b391905b808211156113af576000816000905550600101611397565b5090565b90565b6020604051908101604052806000815250905600a165627a7a72305820455323b5fbeeebf4323aa75c15a2c47540d0a35c5e874d31990ffd4efddce1360029", + "bytecode": "0x6060604052341561000f57600080fd5b6113f68061001e6000396000f3006060604052600436106100d0576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063081812fc146100d55780630e81bd9f146101385780631051db341461019257806313101858146101bf57806313d2a2ab1461024557806323b872dd1461028757806351d5d7a9146103005780636352211e1461034257806370a08231146103a5578063771a7009146103f257806380da20d41461046b578063a9059cbb146104e2578063c97773671461053c578063d826f88f1461057e575b600080fd5b34156100e057600080fd5b6100f66004808035906020019091905050610593565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561014357600080fd5b610178600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506105f4565b604051808215151515815260200191505060405180910390f35b341561019d57600080fd5b6101a5610646565b604051808215151515815260200191505060405180910390f35b34156101ca57600080fd5b610227600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080356000191690602001909190505061064f565b60405180826000191660001916815260200191505060405180910390f35b341561025057600080fd5b610285600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506106de565b005b341561029257600080fd5b6102e6600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610750565b604051808215151515815260200191505060405180910390f35b341561030b57600080fd5b610340600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506107a6565b005b341561034d57600080fd5b610363600480803590602001909190505061083d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103b057600080fd5b6103dc600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061089e565b6040518082815260200191505060405180910390f35b34156103fd57600080fd5b610451600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061093a565b604051808215151515815260200191505060405180910390f35b341561047657600080fd5b6104e0600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091908035600019169060200190919080356000191690602001909190505061098e565b005b34156104ed57600080fd5b610522600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610ab8565b604051808215151515815260200191505060405180910390f35b341561054757600080fd5b61057c600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b0c565b005b341561058957600080fd5b610591610b7e565b005b60006105e96040805190810160405280600b81526020017f676574417070726f7665640000000000000000000000000000000000000000008152508360405180828152602001915050604051809103902061064f565b600190049050919050565b600061063e6040805190810160405280600881526020017f7472616e736665720000000000000000000000000000000000000000000000008152506106398585610e75565b610ed8565b905092915050565b60006001905090565b60006001836040518082805190602001908083835b6020831015156106895780518252602082019150602081019050602083039250610664565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b61074c6040805190810160405280600781526020017f6f776e65724f6600000000000000000000000000000000000000000000000000815250836040518082815260200191505060405180910390208373ffffffffffffffffffffffffffffffffffffffff1660010261098e565b5050565b600061079b6040805190810160405280600c81526020017f7472616e7366657246726f6d0000000000000000000000000000000000000000815250610796868686610f74565b61101b565b600190509392505050565b6108396040805190810160405280600981526020017f62616c616e63654f66000000000000000000000000000000000000000000000081525083604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140191505060405180910390208360010261098e565b5050565b60006108936040805190810160405280600781526020017f6f776e65724f66000000000000000000000000000000000000000000000000008152508360405180828152602001915050604051809103902061064f565b600190049050919050565b600061092f6040805190810160405280600981526020017f62616c616e63654f66000000000000000000000000000000000000000000000081525083604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401915050604051809103902061064f565b600190049050919050565b60006109856040805190810160405280600c81526020017f7472616e7366657246726f6d0000000000000000000000000000000000000000815250610980868686610f74565b610ed8565b90509392505050565b6000836040518082805190602001908083835b6020831015156109c657805182526020820191506020810190506020830392506109a1565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281610a0b9190611301565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b602083101515610a5f5780518252602082019150602081019050602083039250610a3a565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b6000610b026040805190810160405280600881526020017f7472616e73666572000000000000000000000000000000000000000000000000815250610afd8585610e75565b61101b565b6001905092915050565b610b7a6040805190810160405280600b81526020017f676574417070726f766564000000000000000000000000000000000000000000815250836040518082815260200191505060405180910390208373ffffffffffffffffffffffffffffffffffffffff1660010261098e565b5050565b6000610b8861132d565b600080600093505b600a841015610e6f57610ba1611154565b84600a81101515610bae57fe5b6020020151925060008351141515610e6257600091505b6000836040518082805190602001908083835b602083101515610bfd5780518252602082019150602081019050602083039250610bd8565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015610dea576000836040518082805190602001908083835b602083101515610c735780518252602082019150602081019050602083039250610c4e565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902082815481101515610cb357fe5b90600052602060002090015490506002836040518082805190602001908083835b602083101515610cf95780518252602082019150602081019050602083039250610cd4565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b602083101515610d8d5780518252602082019150602081019050602083039250610d68565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050610bc5565b6000836040518082805190602001908083835b602083101515610e225780518252602082019150602081019050602083039250610dfd565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000610e619190611341565b5b8380600101945050610b90565b50505050565b60008282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040518091039020905092915050565b60006002836040518082805190602001908083835b602083101515610f125780518252602082019150602081019050602083039250610eed565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b6000838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018281526020019350505050604051809103902090509392505050565b60016002836040518082805190602001908083835b6020831015156110555780518252602082019150602081019050602083039250611030565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b6020831015156110f057805182526020820191506020810190506020830392506110cb565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816111359190611301565b9160005260206000209001600083909190915090600019169055505050565b61115c611362565b610140604051908101604052806040805190810160405280600881526020017f7472616e7366657200000000000000000000000000000000000000000000000081525081526020016040805190810160405280600c81526020017f7472616e7366657246726f6d000000000000000000000000000000000000000081525081526020016040805190810160405280600781526020017f6f776e65724f660000000000000000000000000000000000000000000000000081525081526020016040805190810160405280600981526020017f62616c616e63654f66000000000000000000000000000000000000000000000081525081526020016040805190810160405280600b81526020017f676574417070726f7665640000000000000000000000000000000000000000008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b815481835581811511611328578183600052602060002091820191016113279190611391565b5b505050565b602060405190810160405280600081525090565b508054600082559060005260206000209081019061135f9190611391565b50565b61014060405190810160405280600a905b61137b6113b6565b8152602001906001900390816113735790505090565b6113b391905b808211156113af576000816000905550600101611397565b5090565b90565b6020604051908101604052806000815250905600a165627a7a72305820bf4c452e0cacd255115587f0c129e41bf3da6ba427abf7f57fa663c6c6d014340029", + "deployedBytecode": "0x6060604052600436106100d0576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063081812fc146100d55780630e81bd9f146101385780631051db341461019257806313101858146101bf57806313d2a2ab1461024557806323b872dd1461028757806351d5d7a9146103005780636352211e1461034257806370a08231146103a5578063771a7009146103f257806380da20d41461046b578063a9059cbb146104e2578063c97773671461053c578063d826f88f1461057e575b600080fd5b34156100e057600080fd5b6100f66004808035906020019091905050610593565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561014357600080fd5b610178600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506105f4565b604051808215151515815260200191505060405180910390f35b341561019d57600080fd5b6101a5610646565b604051808215151515815260200191505060405180910390f35b34156101ca57600080fd5b610227600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080356000191690602001909190505061064f565b60405180826000191660001916815260200191505060405180910390f35b341561025057600080fd5b610285600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506106de565b005b341561029257600080fd5b6102e6600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610750565b604051808215151515815260200191505060405180910390f35b341561030b57600080fd5b610340600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506107a6565b005b341561034d57600080fd5b610363600480803590602001909190505061083d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103b057600080fd5b6103dc600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061089e565b6040518082815260200191505060405180910390f35b34156103fd57600080fd5b610451600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061093a565b604051808215151515815260200191505060405180910390f35b341561047657600080fd5b6104e0600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091908035600019169060200190919080356000191690602001909190505061098e565b005b34156104ed57600080fd5b610522600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610ab8565b604051808215151515815260200191505060405180910390f35b341561054757600080fd5b61057c600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b0c565b005b341561058957600080fd5b610591610b7e565b005b60006105e96040805190810160405280600b81526020017f676574417070726f7665640000000000000000000000000000000000000000008152508360405180828152602001915050604051809103902061064f565b600190049050919050565b600061063e6040805190810160405280600881526020017f7472616e736665720000000000000000000000000000000000000000000000008152506106398585610e75565b610ed8565b905092915050565b60006001905090565b60006001836040518082805190602001908083835b6020831015156106895780518252602082019150602081019050602083039250610664565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b61074c6040805190810160405280600781526020017f6f776e65724f6600000000000000000000000000000000000000000000000000815250836040518082815260200191505060405180910390208373ffffffffffffffffffffffffffffffffffffffff1660010261098e565b5050565b600061079b6040805190810160405280600c81526020017f7472616e7366657246726f6d0000000000000000000000000000000000000000815250610796868686610f74565b61101b565b600190509392505050565b6108396040805190810160405280600981526020017f62616c616e63654f66000000000000000000000000000000000000000000000081525083604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140191505060405180910390208360010261098e565b5050565b60006108936040805190810160405280600781526020017f6f776e65724f66000000000000000000000000000000000000000000000000008152508360405180828152602001915050604051809103902061064f565b600190049050919050565b600061092f6040805190810160405280600981526020017f62616c616e63654f66000000000000000000000000000000000000000000000081525083604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401915050604051809103902061064f565b600190049050919050565b60006109856040805190810160405280600c81526020017f7472616e7366657246726f6d0000000000000000000000000000000000000000815250610980868686610f74565b610ed8565b90509392505050565b6000836040518082805190602001908083835b6020831015156109c657805182526020820191506020810190506020830392506109a1565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281610a0b9190611301565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b602083101515610a5f5780518252602082019150602081019050602083039250610a3a565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b6000610b026040805190810160405280600881526020017f7472616e73666572000000000000000000000000000000000000000000000000815250610afd8585610e75565b61101b565b6001905092915050565b610b7a6040805190810160405280600b81526020017f676574417070726f766564000000000000000000000000000000000000000000815250836040518082815260200191505060405180910390208373ffffffffffffffffffffffffffffffffffffffff1660010261098e565b5050565b6000610b8861132d565b600080600093505b600a841015610e6f57610ba1611154565b84600a81101515610bae57fe5b6020020151925060008351141515610e6257600091505b6000836040518082805190602001908083835b602083101515610bfd5780518252602082019150602081019050602083039250610bd8565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015610dea576000836040518082805190602001908083835b602083101515610c735780518252602082019150602081019050602083039250610c4e565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902082815481101515610cb357fe5b90600052602060002090015490506002836040518082805190602001908083835b602083101515610cf95780518252602082019150602081019050602083039250610cd4565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b602083101515610d8d5780518252602082019150602081019050602083039250610d68565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050610bc5565b6000836040518082805190602001908083835b602083101515610e225780518252602082019150602081019050602083039250610dfd565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000610e619190611341565b5b8380600101945050610b90565b50505050565b60008282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401828152602001925050506040518091039020905092915050565b60006002836040518082805190602001908083835b602083101515610f125780518252602082019150602081019050602083039250610eed565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b6000838383604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018281526020019350505050604051809103902090509392505050565b60016002836040518082805190602001908083835b6020831015156110555780518252602082019150602081019050602083039250611030565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b6020831015156110f057805182526020820191506020810190506020830392506110cb565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816111359190611301565b9160005260206000209001600083909190915090600019169055505050565b61115c611362565b610140604051908101604052806040805190810160405280600881526020017f7472616e7366657200000000000000000000000000000000000000000000000081525081526020016040805190810160405280600c81526020017f7472616e7366657246726f6d000000000000000000000000000000000000000081525081526020016040805190810160405280600781526020017f6f776e65724f660000000000000000000000000000000000000000000000000081525081526020016040805190810160405280600981526020017f62616c616e63654f66000000000000000000000000000000000000000000000081525081526020016040805190810160405280600b81526020017f676574417070726f7665640000000000000000000000000000000000000000008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b815481835581811511611328578183600052602060002091820191016113279190611391565b5b505050565b602060405190810160405280600081525090565b508054600082559060005260206000209081019061135f9190611391565b50565b61014060405190810160405280600a905b61137b6113b6565b8152602001906001900390816113735790505090565b6113b391905b808211156113af576000816000905550600101611397565b5090565b90565b6020604051908101604052806000815250905600a165627a7a72305820bf4c452e0cacd255115587f0c129e41bf3da6ba427abf7f57fa663c6c6d014340029", "sourceMap": "640:3066:29:-;;;;;;;;;;;;;;;;;", "deployedSourceMap": "640:3066:29:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2534:163;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;960:282;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2866:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1294:217:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2385:143:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1248:321;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2074:147;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2227:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1917:151;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1575:336;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1018:270:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;687:267:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2703:157;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1517:610:23;;;;;;;;;;;;;;2534:163:29;2591:17;2635:54;;;;;;;;;;;;;;;;;;;2679:8;2669:19;;;;;;;;;;;;;;;;;;2635:18;:54::i;:::-;2627:63;;;2620:70;;2534:163;;;:::o;960:282::-;1086:14;1123:112;;;;;;;;;;;;;;;;;;;1161:73;1199:3;1216:8;1161:24;:73::i;:::-;1123:25;:112::i;:::-;1116:119;;960:282;;;;:::o;2866:101::-;2915:22;2956:4;2949:11;;2866:101;:::o;1294:217:23:-;1411:24;1458:17;1476:12;1458:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1458:46:23;1490:13;1458:46;;;;;;;;;;;;;;;;;;1451:53;;1294:217;;;;:::o;2385:143:29:-;2457:64;;;;;;;;;;;;;;;;;;;2494:8;2484:19;;;;;;;;;;;;;;;;;;2513:6;2505:15;;;;2457;:64::i;:::-;2385:143;;:::o;1248:321::-;1375:13;1404:136;;;;;;;;;;;;;;;;;;;1443:96;1485:5;1504:3;1521:8;1443:28;:96::i;:::-;1404:22;:136::i;:::-;1558:4;1551:11;;1248:321;;;;;:::o;2074:147::-;2148:66;;;;;;;;;;;;;;;;;;;2187:6;2177:17;;;;;;;;;;;;;;;;;;;;;;;;2204:8;2196:17;;2148:15;:66::i;:::-;2074:147;;:::o;2227:152::-;2280:14;2321:50;;;;;;;;;;;;;;;;;;;2361:8;2351:19;;;;;;;;;;;;;;;;;;2321:18;:50::i;:::-;2313:59;;;2306:66;;2227:152;;;:::o;1917:151::-;1973:13;2010:50;;;;;;;;;;;;;;;;;;;2052:6;2042:17;;;;;;;;;;;;;;;;;;;;;;;;2010:18;:50::i;:::-;2005:56;;;1998:63;;1917:151;;;:::o;1575:336::-;1728:14;1765:139;;;;;;;;;;;;;;;;;;;1807:96;1849:5;1868:3;1885:8;1807:28;:96::i;:::-;1765:25;:139::i;:::-;1758:146;;1575:336;;;;;:::o;1018:270:23:-;1155:22;1178:12;1155:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1155:56:23;;;;;;;;;;;:::i;:::-;;;;;;;;;;1197:13;1155:56;;;;;;;;;;;;1270:11;1221:17;1239:12;1221:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1221:46:23;1253:13;1221:46;;;;;;;;;;;;;;;;;:60;;;;;;;1018:270;;;:::o;687:267:29:-;787:13;816:109;;;;;;;;;;;;;;;;;;;851:73;889:3;906:8;851:24;:73::i;:::-;816:22;:109::i;:::-;943:4;936:11;;687:267;;;;:::o;2703:157::-;2782:71;;;;;;;;;;;;;;;;;;;2823:8;2813:19;;;;;;;;;;;;;;;;;;2842:9;2834:18;;;;2782:15;:71::i;:::-;2703:157;;:::o;1517:610:23:-;1556:6;1595:26;;:::i;:::-;1719:6;1807:21;1565:1;1556:10;;1551:570;1572:2;1568:1;:6;1551:570;;;1624:17;:15;:17::i;:::-;1642:1;1624:20;;;;;;;;;;;;;1595:49;;1693:1;1669:12;1663:26;:31;;1659:452;;;1728:1;1719:10;;1714:321;1735:22;1758:12;1735:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1735:43:23;;;;1731:1;:47;1714:321;;;1831:22;1854:12;1831:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1868:1:23;1831:39;;;;;;;;;;;;;;;;;;;1807:63;;1899:13;1913:12;1899:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1899:42:23;1927:13;1899:42;;;;;;;;;;;;;;;;;;1892:49;;;;;;;;;;;1970:17;1988:12;1970:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1970:46:23;2002:13;1970:46;;;;;;;;;;;;;;;;;1963:53;;;1780:3;;;;;;;1714:321;;;2060:22;2083:12;2060:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;;2053:43:23;;;;:::i;:::-;1659:452;1576:3;;;;;;;1551:570;;;1517:610;;;;:::o;2973:231:29:-;3104:12;3162:3;3179:8;3139:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3132:65;;2973:231;;;;:::o;2341:194:23:-;2458:14;2495:13;2509:12;2495:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2495:33:23;2523:4;2495:33;;;;;;;;;;;;;;;;;;;;;;;;;;;2488:40;;2341:194;;;;:::o;3210:286:29:-;3368:21;3435:5;3454:3;3471:8;3412:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3405:84;;3210:286;;;;;:::o;2133:202:23:-;2267:4;2231:13;2245:12;2231:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2231:33:23;2259:4;2231:33;;;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;2281:22;2304:12;2281:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2281:47:23;;;;;;;;;;;:::i;:::-;;;;;;;;;;2323:4;2281:47;;;;;;;;;;;;2133:202;;:::o;3502::29:-;3563:24;;:::i;:::-;3603:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3502:202;:::o;640:3066::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\nimport \"./MockContract.sol\";\n\n\ncontract MockERC721Token is MockContract {\n function transfer(\n address _to,\n uint _tokenId\n )\n public\n returns (bool _success)\n {\n functionCalledWithArgs(\"transfer\", getTransferArgsSignature(\n _to,\n _tokenId\n ));\n\n return true;\n }\n\n function wasTransferCalledWith(\n address _to,\n uint _tokenId\n )\n public\n view\n returns (bool wasCalled)\n {\n return wasFunctionCalledWithArgs(\"transfer\", getTransferArgsSignature(\n _to,\n _tokenId\n ));\n }\n\n function transferFrom(\n address _from,\n address _to,\n uint _tokenId\n )\n public\n returns (bool _success)\n {\n functionCalledWithArgs(\"transferFrom\", getTransferFromArgsSignature(\n _from,\n _to,\n _tokenId\n ));\n\n return true;\n }\n\n function wasTransferFromCalledWith(\n address _from,\n address _to,\n uint _tokenId\n )\n public\n view\n returns (bool wasCalled)\n {\n return wasFunctionCalledWithArgs(\"transferFrom\", getTransferFromArgsSignature(\n _from,\n _to,\n _tokenId\n ));\n }\n\n function balanceOf(address _owner) public view returns (uint _balance) {\n return uint(getMockReturnValue(\"balanceOf\", keccak256(_owner)));\n }\n\n function mockBalanceOfFor(address _owner, uint _balance) public {\n mockReturnValue(\"balanceOf\", keccak256(_owner), bytes32(_balance));\n }\n\n function ownerOf(uint _tokenId) public view returns (address _owner) {\n return address(getMockReturnValue(\"ownerOf\", keccak256(_tokenId)));\n }\n\n function mockOwnerOfFor(uint _tokenId, address _owner) public {\n mockReturnValue(\"ownerOf\", keccak256(_tokenId), bytes32(_owner));\n }\n\n function getApproved(uint _tokenId) public view returns (address _approved) {\n return address(getMockReturnValue(\"getApproved\", keccak256(_tokenId)));\n }\n\n function mockGetApprovedFor(uint _tokenId, address _approved) public {\n mockReturnValue(\"getApproved\", keccak256(_tokenId), bytes32(_approved));\n }\n\n function implementsERC721() public pure returns (bool _implementsERC721) {\n return true;\n }\n\n function getTransferArgsSignature(\n address _to,\n uint _tokenId\n )\n internal\n pure\n returns (bytes32 args)\n {\n return keccak256(\n _to,\n _tokenId\n );\n }\n\n function getTransferFromArgsSignature(\n address _from,\n address _to,\n uint _tokenId\n )\n internal\n pure\n returns (bytes32 argsSignature)\n {\n return keccak256(\n _from,\n _to,\n _tokenId\n );\n }\n\n function getFunctionList()\n internal\n returns (string[10] functionNames)\n {\n return [\"transfer\", \"transferFrom\", \"ownerOf\", \"balanceOf\", \"getApproved\", \"\", \"\", \"\", \"\", \"\"];\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockERC721Token.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockERC721Token.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockERC721Token.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockERC721Token.sol", "exportedSymbols": { "MockERC721Token": [ 12133 @@ -313,7 +313,7 @@ export const MockERC721Token = { "attributes": { "SourceUnit": 10693, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockContract.sol", "file": "./MockContract.sol", "scope": 12134, "symbolAliases": [ @@ -3995,7 +3995,7 @@ export const MockERC721Token = "42": { "events": {}, "links": {}, - "address": "0xa57d132d946d0ba4f7febd543763f18b3627dd10" + "address": "0x5ff98c9ca70a7d2fdd1107c1a80d20c5fc8a3e40" }, "70": { "events": {}, @@ -4004,5 +4004,5 @@ export const MockERC721Token = } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:13:01.014Z" + "updatedAt": "2018-10-09T17:50:01.278Z" } \ No newline at end of file diff --git a/artifacts/ts/MockTermsContract.ts b/artifacts/ts/MockTermsContract.ts index 525e64fa..aa8b8f28 100644 --- a/artifacts/ts/MockTermsContract.ts +++ b/artifacts/ts/MockTermsContract.ts @@ -246,15 +246,15 @@ export const MockTermsContract = "type": "function" } ], - "bytecode": "0x6060604052341561000f57600080fd5b6113828061001e6000396000f3006060604052600436106100af576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806304aa85fa146100b457806313101858146100d95780632762dd8c1461015f5780635f0280ba1461019a57806360a068611461023f5780637f8601a11461029057806380da20d414610335578063977a5e64146103ac578063b433022f1461040a578063c45d83ef1461043a578063d826f88f14610498575b600080fd5b34156100bf57600080fd5b6100d7600480803515159060200190919050506104ad565b005b34156100e457600080fd5b610141600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091905050610507565b60405180826000191660001916815260200191505060405180910390f35b341561016a57600080fd5b610184600480803560001916906020019091905050610596565b6040518082815260200191505060405180910390f35b34156101a557600080fd5b61022560048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506105bb565b604051808215151515815260200191505060405180910390f35b341561024a57600080fd5b61028e60048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080351515906020019091905050610745565b005b341561029b57600080fd5b61031b60048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506107fd565b604051808215151515815260200191505060405180910390f35b341561034057600080fd5b6103aa600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080356000191690602001909190803560001916906020019091905050610937565b005b34156103b757600080fd5b6103f060048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610a61565b604051808215151515815260200191505060405180910390f35b341561041557600080fd5b610438600480803560001916906020019091908035906020019091905050610bb6565b005b341561044557600080fd5b61047e60048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610bda565b604051808215151515815260200191505060405180910390f35b34156104a357600080fd5b6104ab610c83565b005b6105046040805190810160405280601181526020017f726567697374657252657061796d656e740000000000000000000000000000008152506000600102836104fa5760006001026104ff565b600180025b610937565b50565b60006001836040518082805190602001908083835b602083101515610541578051825260208201915060208101905060208303925061051c565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b6000600360008360001916600019168152602001908152602001600020549050919050565b60006106ea6040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525087878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401955050505050506040518091039020610f7a565b60018002600019166107356040805190810160405280601181526020017f726567697374657252657061796d656e740000000000000000000000000000008152506000600102610507565b6000191614905095945050505050565b6107f86040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525084846040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040518091039020836107ee5760006001026107f3565b600180025b610937565b505050565b600061092c6040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525087878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019550505050505060405180910390206110b3565b905095945050505050565b6000836040518082805190602001908083835b60208310151561096f578051825260208201915060208101905060208303925061094a565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816109b4919061128d565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b602083101515610a0857805182526020820191506020810190506020830392506109e3565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b6000610b026040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525084846040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040518091039020610f7a565b6001800260001916610ba96040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525085856040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040518091039020610507565b6000191614905092915050565b80600360008460001916600019168152602001908152602001600020819055505050565b6000610c7b6040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525084846040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019250505060405180910390206110b3565b905092915050565b6000610c8d6112b9565b600080600093505b600a841015610f7457610ca661114f565b84600a81101515610cb357fe5b6020020151925060008351141515610f6757600091505b6000836040518082805190602001908083835b602083101515610d025780518252602082019150602081019050602083039250610cdd565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015610eef576000836040518082805190602001908083835b602083101515610d785780518252602082019150602081019050602083039250610d53565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902082815481101515610db857fe5b90600052602060002090015490506002836040518082805190602001908083835b602083101515610dfe5780518252602082019150602081019050602083039250610dd9565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b602083101515610e925780518252602082019150602081019050602083039250610e6d565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050610cca565b6000836040518082805190602001908083835b602083101515610f275780518252602082019150602081019050602083039250610f02565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000610f6691906112cd565b5b8380600101945050610c95565b50505050565b60016002836040518082805190602001908083835b602083101515610fb45780518252602082019150602081019050602083039250610f8f565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b60208310151561104f578051825260208201915060208101905060208303925061102a565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281611094919061128d565b9160005260206000209001600083909190915090600019169055505050565b60006002836040518082805190602001908083835b6020831015156110ed57805182526020820191506020810190506020830392506110c8565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b6111576112ee565b610140604051908101604052806040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525081526020016040805190810160405280601181526020017f72656769737465725465726d53746172740000000000000000000000000000008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b8154818355818115116112b4578183600052602060002091820191016112b3919061131d565b5b505050565b602060405190810160405280600081525090565b50805460008255906000526020600020908101906112eb919061131d565b50565b61014060405190810160405280600a905b611307611342565b8152602001906001900390816112ff5790505090565b61133f91905b8082111561133b576000816000905550600101611323565b5090565b90565b6020604051908101604052806000815250905600a165627a7a72305820dd2f1a586a6c9b47af225787fcb9bfc4ca8e161d014496f465bd5bdaf9cd87fe0029", - "deployedBytecode": "0x6060604052600436106100af576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806304aa85fa146100b457806313101858146100d95780632762dd8c1461015f5780635f0280ba1461019a57806360a068611461023f5780637f8601a11461029057806380da20d414610335578063977a5e64146103ac578063b433022f1461040a578063c45d83ef1461043a578063d826f88f14610498575b600080fd5b34156100bf57600080fd5b6100d7600480803515159060200190919050506104ad565b005b34156100e457600080fd5b610141600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091905050610507565b60405180826000191660001916815260200191505060405180910390f35b341561016a57600080fd5b610184600480803560001916906020019091905050610596565b6040518082815260200191505060405180910390f35b34156101a557600080fd5b61022560048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506105bb565b604051808215151515815260200191505060405180910390f35b341561024a57600080fd5b61028e60048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080351515906020019091905050610745565b005b341561029b57600080fd5b61031b60048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506107fd565b604051808215151515815260200191505060405180910390f35b341561034057600080fd5b6103aa600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080356000191690602001909190803560001916906020019091905050610937565b005b34156103b757600080fd5b6103f060048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610a61565b604051808215151515815260200191505060405180910390f35b341561041557600080fd5b610438600480803560001916906020019091908035906020019091905050610bb6565b005b341561044557600080fd5b61047e60048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610bda565b604051808215151515815260200191505060405180910390f35b34156104a357600080fd5b6104ab610c83565b005b6105046040805190810160405280601181526020017f726567697374657252657061796d656e740000000000000000000000000000008152506000600102836104fa5760006001026104ff565b600180025b610937565b50565b60006001836040518082805190602001908083835b602083101515610541578051825260208201915060208101905060208303925061051c565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b6000600360008360001916600019168152602001908152602001600020549050919050565b60006106ea6040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525087878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401955050505050506040518091039020610f7a565b60018002600019166107356040805190810160405280601181526020017f726567697374657252657061796d656e740000000000000000000000000000008152506000600102610507565b6000191614905095945050505050565b6107f86040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525084846040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040518091039020836107ee5760006001026107f3565b600180025b610937565b505050565b600061092c6040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525087878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019550505050505060405180910390206110b3565b905095945050505050565b6000836040518082805190602001908083835b60208310151561096f578051825260208201915060208101905060208303925061094a565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816109b4919061128d565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b602083101515610a0857805182526020820191506020810190506020830392506109e3565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b6000610b026040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525084846040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040518091039020610f7a565b6001800260001916610ba96040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525085856040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040518091039020610507565b6000191614905092915050565b80600360008460001916600019168152602001908152602001600020819055505050565b6000610c7b6040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525084846040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019250505060405180910390206110b3565b905092915050565b6000610c8d6112b9565b600080600093505b600a841015610f7457610ca661114f565b84600a81101515610cb357fe5b6020020151925060008351141515610f6757600091505b6000836040518082805190602001908083835b602083101515610d025780518252602082019150602081019050602083039250610cdd565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015610eef576000836040518082805190602001908083835b602083101515610d785780518252602082019150602081019050602083039250610d53565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902082815481101515610db857fe5b90600052602060002090015490506002836040518082805190602001908083835b602083101515610dfe5780518252602082019150602081019050602083039250610dd9565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b602083101515610e925780518252602082019150602081019050602083039250610e6d565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050610cca565b6000836040518082805190602001908083835b602083101515610f275780518252602082019150602081019050602083039250610f02565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000610f6691906112cd565b5b8380600101945050610c95565b50505050565b60016002836040518082805190602001908083835b602083101515610fb45780518252602082019150602081019050602083039250610f8f565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b60208310151561104f578051825260208201915060208101905060208303925061102a565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281611094919061128d565b9160005260206000209001600083909190915090600019169055505050565b60006002836040518082805190602001908083835b6020831015156110ed57805182526020820191506020810190506020830392506110c8565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b6111576112ee565b610140604051908101604052806040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525081526020016040805190810160405280601181526020017f72656769737465725465726d53746172740000000000000000000000000000008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b8154818355818115116112b4578183600052602060002091820191016112b3919061131d565b5b505050565b602060405190810160405280600081525090565b50805460008255906000526020600020908101906112eb919061131d565b50565b61014060405190810160405280600a905b611307611342565b8152602001906001900390816112ff5790505090565b61133f91905b8082111561133b576000816000905550600101611323565b5090565b90565b6020604051908101604052806000815250905600a165627a7a72305820dd2f1a586a6c9b47af225787fcb9bfc4ca8e161d014496f465bd5bdaf9cd87fe0029", + "bytecode": "0x6060604052341561000f57600080fd5b6113828061001e6000396000f3006060604052600436106100af576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806304aa85fa146100b457806313101858146100d95780632762dd8c1461015f5780635f0280ba1461019a57806360a068611461023f5780637f8601a11461029057806380da20d414610335578063977a5e64146103ac578063b433022f1461040a578063c45d83ef1461043a578063d826f88f14610498575b600080fd5b34156100bf57600080fd5b6100d7600480803515159060200190919050506104ad565b005b34156100e457600080fd5b610141600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091905050610507565b60405180826000191660001916815260200191505060405180910390f35b341561016a57600080fd5b610184600480803560001916906020019091905050610596565b6040518082815260200191505060405180910390f35b34156101a557600080fd5b61022560048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506105bb565b604051808215151515815260200191505060405180910390f35b341561024a57600080fd5b61028e60048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080351515906020019091905050610745565b005b341561029b57600080fd5b61031b60048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506107fd565b604051808215151515815260200191505060405180910390f35b341561034057600080fd5b6103aa600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080356000191690602001909190803560001916906020019091905050610937565b005b34156103b757600080fd5b6103f060048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610a61565b604051808215151515815260200191505060405180910390f35b341561041557600080fd5b610438600480803560001916906020019091908035906020019091905050610bb6565b005b341561044557600080fd5b61047e60048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610bda565b604051808215151515815260200191505060405180910390f35b34156104a357600080fd5b6104ab610c83565b005b6105046040805190810160405280601181526020017f726567697374657252657061796d656e740000000000000000000000000000008152506000600102836104fa5760006001026104ff565b600180025b610937565b50565b60006001836040518082805190602001908083835b602083101515610541578051825260208201915060208101905060208303925061051c565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b6000600360008360001916600019168152602001908152602001600020549050919050565b60006106ea6040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525087878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401955050505050506040518091039020610f7a565b60018002600019166107356040805190810160405280601181526020017f726567697374657252657061796d656e740000000000000000000000000000008152506000600102610507565b6000191614905095945050505050565b6107f86040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525084846040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040518091039020836107ee5760006001026107f3565b600180025b610937565b505050565b600061092c6040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525087878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019550505050505060405180910390206110b3565b905095945050505050565b6000836040518082805190602001908083835b60208310151561096f578051825260208201915060208101905060208303925061094a565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816109b4919061128d565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b602083101515610a0857805182526020820191506020810190506020830392506109e3565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b6000610b026040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525084846040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040518091039020610f7a565b6001800260001916610ba96040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525085856040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040518091039020610507565b6000191614905092915050565b80600360008460001916600019168152602001908152602001600020819055505050565b6000610c7b6040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525084846040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019250505060405180910390206110b3565b905092915050565b6000610c8d6112b9565b600080600093505b600a841015610f7457610ca661114f565b84600a81101515610cb357fe5b6020020151925060008351141515610f6757600091505b6000836040518082805190602001908083835b602083101515610d025780518252602082019150602081019050602083039250610cdd565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015610eef576000836040518082805190602001908083835b602083101515610d785780518252602082019150602081019050602083039250610d53565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902082815481101515610db857fe5b90600052602060002090015490506002836040518082805190602001908083835b602083101515610dfe5780518252602082019150602081019050602083039250610dd9565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b602083101515610e925780518252602082019150602081019050602083039250610e6d565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050610cca565b6000836040518082805190602001908083835b602083101515610f275780518252602082019150602081019050602083039250610f02565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000610f6691906112cd565b5b8380600101945050610c95565b50505050565b60016002836040518082805190602001908083835b602083101515610fb45780518252602082019150602081019050602083039250610f8f565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b60208310151561104f578051825260208201915060208101905060208303925061102a565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281611094919061128d565b9160005260206000209001600083909190915090600019169055505050565b60006002836040518082805190602001908083835b6020831015156110ed57805182526020820191506020810190506020830392506110c8565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b6111576112ee565b610140604051908101604052806040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525081526020016040805190810160405280601181526020017f72656769737465725465726d53746172740000000000000000000000000000008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b8154818355818115116112b4578183600052602060002091820191016112b3919061131d565b5b505050565b602060405190810160405280600081525090565b50805460008255906000526020600020908101906112eb919061131d565b50565b61014060405190810160405280600a905b611307611342565b8152602001906001900390816112ff5790505090565b61133f91905b8082111561133b576000816000905550600101611323565b5090565b90565b6020604051908101604052806000815250905600a165627a7a7230582064f0c3a441aa3426a3423aabf1bd74155f24b9a2d2319f555b608732344dbacf0029", + "deployedBytecode": "0x6060604052600436106100af576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806304aa85fa146100b457806313101858146100d95780632762dd8c1461015f5780635f0280ba1461019a57806360a068611461023f5780637f8601a11461029057806380da20d414610335578063977a5e64146103ac578063b433022f1461040a578063c45d83ef1461043a578063d826f88f14610498575b600080fd5b34156100bf57600080fd5b6100d7600480803515159060200190919050506104ad565b005b34156100e457600080fd5b610141600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091905050610507565b60405180826000191660001916815260200191505060405180910390f35b341561016a57600080fd5b610184600480803560001916906020019091905050610596565b6040518082815260200191505060405180910390f35b34156101a557600080fd5b61022560048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506105bb565b604051808215151515815260200191505060405180910390f35b341561024a57600080fd5b61028e60048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080351515906020019091905050610745565b005b341561029b57600080fd5b61031b60048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506107fd565b604051808215151515815260200191505060405180910390f35b341561034057600080fd5b6103aa600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080356000191690602001909190803560001916906020019091905050610937565b005b34156103b757600080fd5b6103f060048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610a61565b604051808215151515815260200191505060405180910390f35b341561041557600080fd5b610438600480803560001916906020019091908035906020019091905050610bb6565b005b341561044557600080fd5b61047e60048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610bda565b604051808215151515815260200191505060405180910390f35b34156104a357600080fd5b6104ab610c83565b005b6105046040805190810160405280601181526020017f726567697374657252657061796d656e740000000000000000000000000000008152506000600102836104fa5760006001026104ff565b600180025b610937565b50565b60006001836040518082805190602001908083835b602083101515610541578051825260208201915060208101905060208303925061051c565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b6000600360008360001916600019168152602001908152602001600020549050919050565b60006106ea6040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525087878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401955050505050506040518091039020610f7a565b60018002600019166107356040805190810160405280601181526020017f726567697374657252657061796d656e740000000000000000000000000000008152506000600102610507565b6000191614905095945050505050565b6107f86040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525084846040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040518091039020836107ee5760006001026107f3565b600180025b610937565b505050565b600061092c6040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525087878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019550505050505060405180910390206110b3565b905095945050505050565b6000836040518082805190602001908083835b60208310151561096f578051825260208201915060208101905060208303925061094a565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816109b4919061128d565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b602083101515610a0857805182526020820191506020810190506020830392506109e3565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b6000610b026040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525084846040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040518091039020610f7a565b6001800260001916610ba96040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525085856040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401925050506040518091039020610507565b6000191614905092915050565b80600360008460001916600019168152602001908152602001600020819055505050565b6000610c7b6040805190810160405280601181526020017f72656769737465725465726d537461727400000000000000000000000000000081525084846040518083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019250505060405180910390206110b3565b905092915050565b6000610c8d6112b9565b600080600093505b600a841015610f7457610ca661114f565b84600a81101515610cb357fe5b6020020151925060008351141515610f6757600091505b6000836040518082805190602001908083835b602083101515610d025780518252602082019150602081019050602083039250610cdd565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080549050821015610eef576000836040518082805190602001908083835b602083101515610d785780518252602082019150602081019050602083039250610d53565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902082815481101515610db857fe5b90600052602060002090015490506002836040518082805190602001908083835b602083101515610dfe5780518252602082019150602081019050602083039250610dd9565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b602083101515610e925780518252602082019150602081019050602083039250610e6d565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050610cca565b6000836040518082805190602001908083835b602083101515610f275780518252602082019150602081019050602083039250610f02565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000610f6691906112cd565b5b8380600101945050610c95565b50505050565b60016002836040518082805190602001908083835b602083101515610fb45780518252602082019150602081019050602083039250610f8f565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b60208310151561104f578051825260208201915060208101905060208303925061102a565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281611094919061128d565b9160005260206000209001600083909190915090600019169055505050565b60006002836040518082805190602001908083835b6020831015156110ed57805182526020820191506020810190506020830392506110c8565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b6111576112ee565b610140604051908101604052806040805190810160405280601181526020017f726567697374657252657061796d656e7400000000000000000000000000000081525081526020016040805190810160405280601181526020017f72656769737465725465726d53746172740000000000000000000000000000008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b8154818355818115116112b4578183600052602060002091820191016112b3919061131d565b5b505050565b602060405190810160405280600081525090565b50805460008255906000526020600020908101906112eb919061131d565b50565b61014060405190810160405280600a905b611307611342565b8152602001906001900390816112ff5790505090565b61133f91905b8082111561133b576000816000905550600101611323565b5090565b90565b6020604051908101604052806000815250905600a165627a7a7230582064f0c3a441aa3426a3423aabf1bd74155f24b9a2d2319f555b608732344dbacf0029", "sourceMap": "640:2786:30:-;;;;;;;;;;;;;;;;;", "deployedSourceMap": "640:2786:30:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1344:187;;;;;;;;;;;;;;;;;;;;;;;;;;;;1294:217:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2831:147:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;811:527;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2547:278;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1697:469;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1018:270:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2172:369:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1537:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2984:245;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1517:610:23;;;;;;;;;;;;;;1344:187:30;1429:95;;;;;;;;;;;;;;;;;;;697:1:23;689:10;;1490:7:30;:33;;1521:1;1513:10;;1490:33;;;1508:1;1500:10;;1490:33;1429:15;:95::i;:::-;1344:187;:::o;1294:217:23:-;1411:24;1458:17;1476:12;1458:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1458:46:23;1490:13;1458:46;;;;;;;;;;;;;;;;;;1451:53;;1294:217;;;;:::o;2831:147:30:-;2916:7;2942:16;:29;2959:11;2942:29;;;;;;;;;;;;;;;;;;2935:36;;2831:147;;;:::o;811:527::-;1018:13;1047:189;;;;;;;;;;;;;;;;;;;1114:11;1139:5;1158:11;1183:16;1213:12;1091:144;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1047:22;:189::i;:::-;1329:1;1321:10;;1254:77;;;:63;;;;;;;;;;;;;;;;;;;697:1:23;689:10;;1254:18:30;:63::i;:::-;:77;;;;1247:84;;811:527;;;;;;;:::o;2547:278::-;2669:149;;;;;;;;;;;;;;;;;;;2741:11;2754:6;2731:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2775:7;:33;;2806:1;2798:10;;2775:33;;;2793:1;2785:10;;2775:33;2669:15;:149::i;:::-;2547:278;;;:::o;1697:469::-;1930:14;1967:192;;;;;;;;;;;;;;;;;;;2037:11;2062:5;2081:11;2106:16;2136:12;2014:144;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1967:25;:192::i;:::-;1960:199;;1697:469;;;;;;;:::o;1018:270:23:-;1155:22;1178:12;1155:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1155:56:23;;;;;;;;;;;:::i;:::-;;;;;;;;;;1197:13;1155:56;;;;;;;;;;;;1270:11;1221:17;1239:12;1221:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1221:46:23;1253:13;1221:46;;;;;;;;;;;;;;;;;:60;;;;;;;1018:270;;;:::o;2172:369:30:-;2290:16;2322:75;;;;;;;;;;;;;;;;;;;2376:11;2389:6;2366:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2322:22;:75::i;:::-;2532:1;2524:10;;2415:119;;;:105;;;;;;;;;;;;;;;;;;;2490:11;2503:6;2480:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2415:18;:105::i;:::-;:119;;;;2408:126;;2172:369;;;;:::o;1537:154::-;1675:9;1643:16;:29;1660:11;1643:29;;;;;;;;;;;;;;;;;:41;;;;1537:154;;:::o;2984:245::-;3106:15;3144:78;;;;;;;;;;;;;;;;;;;3201:11;3214:6;3191:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3144:25;:78::i;:::-;3137:85;;2984:245;;;;:::o;1517:610:23:-;1556:6;1595:26;;:::i;:::-;1719:6;1807:21;1565:1;1556:10;;1551:570;1572:2;1568:1;:6;1551:570;;;1624:17;:15;:17::i;:::-;1642:1;1624:20;;;;;;;;;;;;;1595:49;;1693:1;1669:12;1663:26;:31;;1659:452;;;1728:1;1719:10;;1714:321;1735:22;1758:12;1735:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1735:43:23;;;;1731:1;:47;1714:321;;;1831:22;1854:12;1831:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1868:1:23;1831:39;;;;;;;;;;;;;;;;;;;1807:63;;1899:13;1913:12;1899:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1899:42:23;1927:13;1899:42;;;;;;;;;;;;;;;;;;1892:49;;;;;;;;;;;1970:17;1988:12;1970:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1970:46:23;2002:13;1970:46;;;;;;;;;;;;;;;;;1963:53;;;1780:3;;;;;;;1714:321;;;2060:22;2083:12;2060:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;;2053:43:23;;;;:::i;:::-;1659:452;1576:3;;;;;;;1551:570;;;1517:610;;;;:::o;2133:202::-;2267:4;2231:13;2245:12;2231:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2231:33:23;2259:4;2231:33;;;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;2281:22;2304:12;2281:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2281:47:23;;;;;;;;;;;:::i;:::-;;;;;;;;;;2323:4;2281:47;;;;;;;;;;;;2133:202;;:::o;2341:194::-;2458:14;2495:13;2509:12;2495:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2495:33:23;2523:4;2495:33;;;;;;;;;;;;;;;;;;;;;;;;;;;2488:40;;2341:194;;;;:::o;3235:189:30:-;3296:24;;:::i;:::-;3336:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3235:189;:::o;640:2786::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\nimport \"./MockContract.sol\";\n\n\ncontract MockTermsContract is MockContract {\n // Maps from agreementId's to the mocked term end timestamp\n mapping (bytes32 => uint) internal termEndTimestamp;\n\n function registerRepayment(\n bytes32 agreementId,\n address payer,\n address beneficiary,\n uint unitsOfRepayment,\n address tokenAddress\n )\n public\n returns (bool _success)\n {\n functionCalledWithArgs(\"registerRepayment\", keccak256(\n agreementId,\n payer,\n beneficiary,\n unitsOfRepayment,\n tokenAddress\n ));\n\n return getMockReturnValue(\"registerRepayment\", DEFAULT_SIGNATURE_ARGS) == bytes32(1);\n }\n\n function mockRegisterRepaymentReturnValue(bool success)\n public\n {\n mockReturnValue(\"registerRepayment\", DEFAULT_SIGNATURE_ARGS, success ? bytes32(1) : bytes32(0));\n }\n\n function mockTermEndTimestamp(\n bytes32 agreementId,\n uint timestamp\n ) public {\n termEndTimestamp[agreementId] = timestamp;\n }\n\n function wasRegisterRepaymentCalledWith(\n bytes32 agreementId,\n address payer,\n address beneficiary,\n uint unitsOfRepayment,\n address tokenAddress\n )\n public\n view\n returns (bool wasCalled)\n {\n return wasFunctionCalledWithArgs(\"registerRepayment\", keccak256(\n agreementId,\n payer,\n beneficiary,\n unitsOfRepayment,\n tokenAddress\n ));\n }\n\n function registerTermStart(\n bytes32 agreementId,\n address debtor\n )\n public\n returns (bool _registered)\n {\n functionCalledWithArgs(\"registerTermStart\", keccak256(agreementId, debtor));\n\n return getMockReturnValue(\n \"registerTermStart\",\n keccak256(agreementId, debtor)\n ) == bytes32(1);\n }\n\n function mockRegisterTermStartReturnValue(bytes32 agreementId, address debtor, bool success)\n public\n {\n mockReturnValue(\n \"registerTermStart\",\n keccak256(agreementId, debtor),\n success ? bytes32(1) : bytes32(0)\n );\n }\n\n function getTermEndTimestamp(\n bytes32 agreementId\n ) public view returns (uint256) {\n return termEndTimestamp[agreementId];\n }\n\n function wasRegisterTermStartCalledWith(bytes32 agreementId, address debtor)\n public\n view\n returns (bool _wasCalled)\n {\n return wasFunctionCalledWithArgs(\"registerTermStart\", keccak256(agreementId, debtor));\n }\n\n function getFunctionList()\n internal\n returns (string[10] functionNames)\n {\n return [\"registerRepayment\", \"registerTermStart\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\"];\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockTermsContract.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockTermsContract.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockTermsContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockTermsContract.sol", "exportedSymbols": { "MockTermsContract": [ 12345 @@ -277,7 +277,7 @@ export const MockTermsContract = { "attributes": { "SourceUnit": 10693, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockContract.sol", "file": "./MockContract.sol", "scope": 12346, "symbolAliases": [ @@ -3395,7 +3395,7 @@ export const MockTermsContract = "42": { "events": {}, "links": {}, - "address": "0xb0f7c5054eed756d6522d60fd02cd29be8b19a96" + "address": "0x76dcdc1df7af00e87bb5dd8f600e5637053fc0e1" }, "70": { "events": {}, @@ -3404,5 +3404,5 @@ export const MockTermsContract = } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:13:01.034Z" + "updatedAt": "2018-10-09T17:50:01.274Z" } \ No newline at end of file diff --git a/artifacts/ts/MockTokenRegistry.ts b/artifacts/ts/MockTokenRegistry.ts index 023b1d21..17d58c1b 100644 --- a/artifacts/ts/MockTokenRegistry.ts +++ b/artifacts/ts/MockTokenRegistry.ts @@ -131,15 +131,15 @@ export const MockTokenRegistry = "type": "function" } ], - "bytecode": "0x6060604052341561000f57600080fd5b610c7b8061001e6000396000f300606060405260043610610083576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806313101858146100885780633550b6d91461010e5780635715c5b7146101ab57806380da20d41461020e5780639a22471514610285578063d826f88f14610301578063e1f1956414610316575b600080fd5b341561009357600080fd5b6100f0600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091905050610358565b60405180826000191660001916815260200191505060405180910390f35b341561011957600080fd5b610169600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506103e7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101b657600080fd5b6101cc6004808035906020019091905050610495565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561021957600080fd5b610283600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091908035600019169060200190919050506104f6565b005b341561029057600080fd5b6102ff600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610620565b005b341561030c57600080fd5b6103146106df565b005b341561032157600080fd5b610356600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506109d6565b005b60006001836040518082805190602001908083835b602083101515610392578051825260208201915060208101905060208303925061036d565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b600061048a6040805190810160405280601781526020017f676574546f6b656e41646472657373427953796d626f6c000000000000000000815250836040518082805190602001908083835b6020831015156104585780518252602082019150602081019050602083039250610433565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020610358565b600190049050919050565b60006104eb6040805190810160405280601681526020017f676574546f6b656e416464726573734279496e6465780000000000000000000081525083604051808281526020019150506040518091039020610358565b600190049050919050565b6000836040518082805190602001908083835b60208310151561052e5780518252602082019150602081019050602083039250610509565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816105739190610b86565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b6020831015156105c757805182526020820191506020810190506020830392506105a2565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b6106db6040805190810160405280601781526020017f676574546f6b656e41646472657373427953796d626f6c000000000000000000815250836040518082805190602001908083835b60208310151561068f578051825260208201915060208101905060208303925061066a565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390208373ffffffffffffffffffffffffffffffffffffffff166001026104f6565b5050565b60006106e9610bb2565b600080600093505b600a8410156109d057610702610a48565b84600a8110151561070f57fe5b60200201519250600083511415156109c357600091505b6000836040518082805190602001908083835b60208310151561075e5780518252602082019150602081019050602083039250610739565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054905082101561094b576000836040518082805190602001908083835b6020831015156107d457805182526020820191506020810190506020830392506107af565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208281548110151561081457fe5b90600052602060002090015490506002836040518082805190602001908083835b60208310151561085a5780518252602082019150602081019050602083039250610835565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b6020831015156108ee57805182526020820191506020810190506020830392506108c9565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050610726565b6000836040518082805190602001908083835b602083101515610983578051825260208201915060208101905060208303925061095e565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006109c29190610bc6565b5b83806001019450506106f1565b50505050565b610a446040805190810160405280601681526020017f676574546f6b656e416464726573734279496e64657800000000000000000000815250836040518082815260200191505060405180910390208373ffffffffffffffffffffffffffffffffffffffff166001026104f6565b5050565b610a50610be7565b610140604051908101604052806040805190810160405280601781526020017f676574546f6b656e41646472657373427953796d626f6c00000000000000000081525081526020016040805190810160405280601681526020017f676574546f6b656e416464726573734279496e646578000000000000000000008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b815481835581811511610bad57818360005260206000209182019101610bac9190610c16565b5b505050565b602060405190810160405280600081525090565b5080546000825590600052602060002090810190610be49190610c16565b50565b61014060405190810160405280600a905b610c00610c3b565b815260200190600190039081610bf85790505090565b610c3891905b80821115610c34576000816000905550600101610c1c565b5090565b90565b6020604051908101604052806000815250905600a165627a7a723058209cb701e32bf165977bd5586d506811cb88300142a2fa893bb1018312372e1cc50029", - "deployedBytecode": "0x606060405260043610610083576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806313101858146100885780633550b6d91461010e5780635715c5b7146101ab57806380da20d41461020e5780639a22471514610285578063d826f88f14610301578063e1f1956414610316575b600080fd5b341561009357600080fd5b6100f0600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091905050610358565b60405180826000191660001916815260200191505060405180910390f35b341561011957600080fd5b610169600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506103e7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101b657600080fd5b6101cc6004808035906020019091905050610495565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561021957600080fd5b610283600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091908035600019169060200190919050506104f6565b005b341561029057600080fd5b6102ff600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610620565b005b341561030c57600080fd5b6103146106df565b005b341561032157600080fd5b610356600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506109d6565b005b60006001836040518082805190602001908083835b602083101515610392578051825260208201915060208101905060208303925061036d565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b600061048a6040805190810160405280601781526020017f676574546f6b656e41646472657373427953796d626f6c000000000000000000815250836040518082805190602001908083835b6020831015156104585780518252602082019150602081019050602083039250610433565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020610358565b600190049050919050565b60006104eb6040805190810160405280601681526020017f676574546f6b656e416464726573734279496e6465780000000000000000000081525083604051808281526020019150506040518091039020610358565b600190049050919050565b6000836040518082805190602001908083835b60208310151561052e5780518252602082019150602081019050602083039250610509565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816105739190610b86565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b6020831015156105c757805182526020820191506020810190506020830392506105a2565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b6106db6040805190810160405280601781526020017f676574546f6b656e41646472657373427953796d626f6c000000000000000000815250836040518082805190602001908083835b60208310151561068f578051825260208201915060208101905060208303925061066a565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390208373ffffffffffffffffffffffffffffffffffffffff166001026104f6565b5050565b60006106e9610bb2565b600080600093505b600a8410156109d057610702610a48565b84600a8110151561070f57fe5b60200201519250600083511415156109c357600091505b6000836040518082805190602001908083835b60208310151561075e5780518252602082019150602081019050602083039250610739565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054905082101561094b576000836040518082805190602001908083835b6020831015156107d457805182526020820191506020810190506020830392506107af565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208281548110151561081457fe5b90600052602060002090015490506002836040518082805190602001908083835b60208310151561085a5780518252602082019150602081019050602083039250610835565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b6020831015156108ee57805182526020820191506020810190506020830392506108c9565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050610726565b6000836040518082805190602001908083835b602083101515610983578051825260208201915060208101905060208303925061095e565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006109c29190610bc6565b5b83806001019450506106f1565b50505050565b610a446040805190810160405280601681526020017f676574546f6b656e416464726573734279496e64657800000000000000000000815250836040518082815260200191505060405180910390208373ffffffffffffffffffffffffffffffffffffffff166001026104f6565b5050565b610a50610be7565b610140604051908101604052806040805190810160405280601781526020017f676574546f6b656e41646472657373427953796d626f6c00000000000000000081525081526020016040805190810160405280601681526020017f676574546f6b656e416464726573734279496e646578000000000000000000008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b815481835581811511610bad57818360005260206000209182019101610bac9190610c16565b5b505050565b602060405190810160405280600081525090565b5080546000825590600052602060002090810190610be49190610c16565b50565b61014060405190810160405280600a905b610c00610c3b565b815260200190600190039081610bf85790505090565b610c3891905b80821115610c34576000816000905550600101610c1c565b5090565b90565b6020604051908101604052806000815250905600a165627a7a723058209cb701e32bf165977bd5586d506811cb88300142a2fa893bb1018312372e1cc50029", + "bytecode": "0x6060604052341561000f57600080fd5b610c7b8061001e6000396000f300606060405260043610610083576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806313101858146100885780633550b6d91461010e5780635715c5b7146101ab57806380da20d41461020e5780639a22471514610285578063d826f88f14610301578063e1f1956414610316575b600080fd5b341561009357600080fd5b6100f0600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091905050610358565b60405180826000191660001916815260200191505060405180910390f35b341561011957600080fd5b610169600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506103e7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101b657600080fd5b6101cc6004808035906020019091905050610495565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561021957600080fd5b610283600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091908035600019169060200190919050506104f6565b005b341561029057600080fd5b6102ff600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610620565b005b341561030c57600080fd5b6103146106df565b005b341561032157600080fd5b610356600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506109d6565b005b60006001836040518082805190602001908083835b602083101515610392578051825260208201915060208101905060208303925061036d565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b600061048a6040805190810160405280601781526020017f676574546f6b656e41646472657373427953796d626f6c000000000000000000815250836040518082805190602001908083835b6020831015156104585780518252602082019150602081019050602083039250610433565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020610358565b600190049050919050565b60006104eb6040805190810160405280601681526020017f676574546f6b656e416464726573734279496e6465780000000000000000000081525083604051808281526020019150506040518091039020610358565b600190049050919050565b6000836040518082805190602001908083835b60208310151561052e5780518252602082019150602081019050602083039250610509565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816105739190610b86565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b6020831015156105c757805182526020820191506020810190506020830392506105a2565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b6106db6040805190810160405280601781526020017f676574546f6b656e41646472657373427953796d626f6c000000000000000000815250836040518082805190602001908083835b60208310151561068f578051825260208201915060208101905060208303925061066a565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390208373ffffffffffffffffffffffffffffffffffffffff166001026104f6565b5050565b60006106e9610bb2565b600080600093505b600a8410156109d057610702610a48565b84600a8110151561070f57fe5b60200201519250600083511415156109c357600091505b6000836040518082805190602001908083835b60208310151561075e5780518252602082019150602081019050602083039250610739565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054905082101561094b576000836040518082805190602001908083835b6020831015156107d457805182526020820191506020810190506020830392506107af565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208281548110151561081457fe5b90600052602060002090015490506002836040518082805190602001908083835b60208310151561085a5780518252602082019150602081019050602083039250610835565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b6020831015156108ee57805182526020820191506020810190506020830392506108c9565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050610726565b6000836040518082805190602001908083835b602083101515610983578051825260208201915060208101905060208303925061095e565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006109c29190610bc6565b5b83806001019450506106f1565b50505050565b610a446040805190810160405280601681526020017f676574546f6b656e416464726573734279496e64657800000000000000000000815250836040518082815260200191505060405180910390208373ffffffffffffffffffffffffffffffffffffffff166001026104f6565b5050565b610a50610be7565b610140604051908101604052806040805190810160405280601781526020017f676574546f6b656e41646472657373427953796d626f6c00000000000000000081525081526020016040805190810160405280601681526020017f676574546f6b656e416464726573734279496e646578000000000000000000008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b815481835581811511610bad57818360005260206000209182019101610bac9190610c16565b5b505050565b602060405190810160405280600081525090565b5080546000825590600052602060002090810190610be49190610c16565b50565b61014060405190810160405280600a905b610c00610c3b565b815260200190600190039081610bf85790505090565b610c3891905b80821115610c34576000816000905550600101610c1c565b5090565b90565b6020604051908101604052806000815250905600a165627a7a72305820d6624be7f630164703e7fe969dc32739ddfcc754d5181ff0a230d964f42c6d2c0029", + "deployedBytecode": "0x606060405260043610610083576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806313101858146100885780633550b6d91461010e5780635715c5b7146101ab57806380da20d41461020e5780639a22471514610285578063d826f88f14610301578063e1f1956414610316575b600080fd5b341561009357600080fd5b6100f0600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091905050610358565b60405180826000191660001916815260200191505060405180910390f35b341561011957600080fd5b610169600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506103e7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101b657600080fd5b6101cc6004808035906020019091905050610495565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561021957600080fd5b610283600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560001916906020019091908035600019169060200190919050506104f6565b005b341561029057600080fd5b6102ff600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610620565b005b341561030c57600080fd5b6103146106df565b005b341561032157600080fd5b610356600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506109d6565b005b60006001836040518082805190602001908083835b602083101515610392578051825260208201915060208101905060208303925061036d565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b600061048a6040805190810160405280601781526020017f676574546f6b656e41646472657373427953796d626f6c000000000000000000815250836040518082805190602001908083835b6020831015156104585780518252602082019150602081019050602083039250610433565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020610358565b600190049050919050565b60006104eb6040805190810160405280601681526020017f676574546f6b656e416464726573734279496e6465780000000000000000000081525083604051808281526020019150506040518091039020610358565b600190049050919050565b6000836040518082805190602001908083835b60208310151561052e5780518252602082019150602081019050602083039250610509565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816105739190610b86565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b6020831015156105c757805182526020820191506020810190506020830392506105a2565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b6106db6040805190810160405280601781526020017f676574546f6b656e41646472657373427953796d626f6c000000000000000000815250836040518082805190602001908083835b60208310151561068f578051825260208201915060208101905060208303925061066a565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390208373ffffffffffffffffffffffffffffffffffffffff166001026104f6565b5050565b60006106e9610bb2565b600080600093505b600a8410156109d057610702610a48565b84600a8110151561070f57fe5b60200201519250600083511415156109c357600091505b6000836040518082805190602001908083835b60208310151561075e5780518252602082019150602081019050602083039250610739565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054905082101561094b576000836040518082805190602001908083835b6020831015156107d457805182526020820191506020810190506020830392506107af565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208281548110151561081457fe5b90600052602060002090015490506002836040518082805190602001908083835b60208310151561085a5780518252602082019150602081019050602083039250610835565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b6020831015156108ee57805182526020820191506020810190506020830392506108c9565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050610726565b6000836040518082805190602001908083835b602083101515610983578051825260208201915060208101905060208303925061095e565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006109c29190610bc6565b5b83806001019450506106f1565b50505050565b610a446040805190810160405280601681526020017f676574546f6b656e416464726573734279496e64657800000000000000000000815250836040518082815260200191505060405180910390208373ffffffffffffffffffffffffffffffffffffffff166001026104f6565b5050565b610a50610be7565b610140604051908101604052806040805190810160405280601781526020017f676574546f6b656e41646472657373427953796d626f6c00000000000000000081525081526020016040805190810160405280601681526020017f676574546f6b656e416464726573734279496e646578000000000000000000008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b815481835581811511610bad57818360005260206000209182019101610bac9190610c16565b5b505050565b602060405190810160405280600081525090565b5080546000825590600052602060002090810190610be49190610c16565b50565b61014060405190810160405280600a905b610c00610c3b565b815260200190600190039081610bf85790505090565b610c3891905b80821115610c34576000816000905550600101610c1c565b5090565b90565b6020604051908101604052806000815250905600a165627a7a72305820d6624be7f630164703e7fe969dc32739ddfcc754d5181ff0a230d964f42c6d2c0029", "sourceMap": "640:1029:31:-;;;;;;;;;;;;;;;;;", "deployedSourceMap": "640:1029:31:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1294:217:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;689:203:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;898:197;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1018:270:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1101:180:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1517:610:23;;;;;;;;;;;;;;1287:174:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1294:217:23;1411:24;1458:17;1476:12;1458:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1458:46:23;1490:13;1458:46;;;;;;;;;;;;;;;;;;1451:53;;1294:217;;;;:::o;689:203:31:-;782:7;820:64;;;;;;;;;;;;;;;;;;;876:6;866:17;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;820:18:31;:64::i;:::-;812:73;;;805:80;;689:203;;;:::o;898:197::-;987:7;1025:62;;;;;;;;;;;;;;;;;;;1080:5;1070:16;;;;;;;;;;;;;;;;;;1025:18;:62::i;:::-;1017:71;;;1010:78;;898:197;;;:::o;1018:270:23:-;1155:22;1178:12;1155:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1155:56:23;;;;;;;;;;;:::i;:::-;;;;;;;;;;1197:13;1155:56;;;;;;;;;;;;1270:11;1221:17;1239:12;1221:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1221:46:23;1253:13;1221:46;;;;;;;;;;;;;;;;;:60;;;;;;;1018:270;;;:::o;1101:180:31:-;1197:77;;;;;;;;;;;;;;;;;;;1250:6;1240:17;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;1267:5:31;1259:14;;;;1197:15;:77::i;:::-;1101:180;;:::o;1517:610:23:-;1556:6;1595:26;;:::i;:::-;1719:6;1807:21;1565:1;1556:10;;1551:570;1572:2;1568:1;:6;1551:570;;;1624:17;:15;:17::i;:::-;1642:1;1624:20;;;;;;;;;;;;;1595:49;;1693:1;1669:12;1663:26;:31;;1659:452;;;1728:1;1719:10;;1714:321;1735:22;1758:12;1735:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1735:43:23;;;;1731:1;:47;1714:321;;;1831:22;1854:12;1831:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1868:1:23;1831:39;;;;;;;;;;;;;;;;;;;1807:63;;1899:13;1913:12;1899:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1899:42:23;1927:13;1899:42;;;;;;;;;;;;;;;;;;1892:49;;;;;;;;;;;1970:17;1988:12;1970:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1970:46:23;2002:13;1970:46;;;;;;;;;;;;;;;;;1963:53;;;1780:3;;;;;;;1714:321;;;2060:22;2083:12;2060:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;;2053:43:23;;;;:::i;:::-;1659:452;1576:3;;;;;;;1551:570;;;1517:610;;;;:::o;1287:174:31:-;1379:75;;;;;;;;;;;;;;;;;;;1431:5;1421:16;;;;;;;;;;;;;;;;;;1447:5;1439:14;;;;1379:15;:75::i;:::-;1287:174;;:::o;1467:200::-;1528:24;;:::i;:::-;1568:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1467:200;:::o;640:1029::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\nimport \"./MockContract.sol\";\n\n\ncontract MockTokenRegistry is MockContract {\n function getTokenAddressBySymbol(string symbol)\n public\n view\n returns (address)\n {\n return address(getMockReturnValue(\"getTokenAddressBySymbol\", keccak256(symbol)));\n }\n\n function getTokenAddressByIndex(uint index)\n public\n view\n returns (address)\n {\n return address(getMockReturnValue(\"getTokenAddressByIndex\", keccak256(index)));\n }\n\n function mockGetTokenAddressBySymbol(string symbol, address token)\n public\n {\n mockReturnValue(\"getTokenAddressBySymbol\", keccak256(symbol), bytes32(token));\n }\n\n function mockGetTokenAddressByIndex(uint index, address token)\n public\n {\n mockReturnValue(\"getTokenAddressByIndex\", keccak256(index), bytes32(token));\n }\n\n function getFunctionList()\n internal\n returns (string[10] functionNames)\n {\n return [\"getTokenAddressBySymbol\", \"getTokenAddressByIndex\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\"];\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockTokenRegistry.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockTokenRegistry.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockTokenRegistry.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockTokenRegistry.sol", "exportedSymbols": { "MockTokenRegistry": [ 12441 @@ -162,7 +162,7 @@ export const MockTokenRegistry = { "attributes": { "SourceUnit": 10693, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockContract.sol", "file": "./MockContract.sol", "scope": 12442, "symbolAliases": [ @@ -1588,7 +1588,7 @@ export const MockTokenRegistry = "42": { "events": {}, "links": {}, - "address": "0x7723ed4c29ba84d381dd389890ccb0c17cda7204" + "address": "0x8d60b63345a4394a627672aca9f0f2541057d0ba" }, "70": { "events": {}, @@ -1597,5 +1597,5 @@ export const MockTokenRegistry = } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:13:01.033Z" + "updatedAt": "2018-10-09T17:50:01.268Z" } \ No newline at end of file diff --git a/artifacts/ts/MockTokenTransferProxy.ts b/artifacts/ts/MockTokenTransferProxy.ts index 6e94419a..aae56d95 100644 --- a/artifacts/ts/MockTokenTransferProxy.ts +++ b/artifacts/ts/MockTokenTransferProxy.ts @@ -119,15 +119,15 @@ export const MockTokenTransferProxy = "type": "function" } ], - "bytecode": "0x6060604052341561000f57600080fd5b610d9b8061001e6000396000f30060606040526004361061006d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063131018581461007257806315dacbea146100f857806329f5967c1461019057806380da20d414610228578063d826f88f1461029f575b600080fd5b341561007d57600080fd5b6100da600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091908035600019169060200190919050506102b4565b60405180826000191660001916815260200191505060405180910390f35b341561010357600080fd5b610176600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610343565b604051808215151515815260200191505060405180910390f35b341561019b57600080fd5b61020e600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061046e565b604051808215151515815260200191505060405180910390f35b341561023357600080fd5b61029d600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080356000191690602001909190803560001916906020019091905050610597565b005b34156102aa57600080fd5b6102b26106c1565b005b60006001836040518082805190602001908083835b6020831015156102ee57805182526020820191506020810190506020830392506102c9565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b60006104626040805190810160405280600c81526020017f7472616e7366657246726f6d000000000000000000000000000000000000000081525086868686604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140182815260200194505050505060405180910390206109b8565b60019050949350505050565b600061058d6040805190810160405280600c81526020017f7472616e7366657246726f6d000000000000000000000000000000000000000081525086868686604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018281526020019450505050506040518091039020610af1565b9050949350505050565b6000836040518082805190602001908083835b6020831015156105cf57805182526020820191506020810190506020830392506105aa565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816106149190610ca6565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b6020831015156106685780518252602082019150602081019050602083039250610643565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b60006106cb610cd2565b600080600093505b600a8410156109b2576106e4610b8d565b84600a811015156106f157fe5b60200201519250600083511415156109a557600091505b6000836040518082805190602001908083835b602083101515610740578051825260208201915060208101905060208303925061071b565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054905082101561092d576000836040518082805190602001908083835b6020831015156107b65780518252602082019150602081019050602083039250610791565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020828154811015156107f657fe5b90600052602060002090015490506002836040518082805190602001908083835b60208310151561083c5780518252602082019150602081019050602083039250610817565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b6020831015156108d057805182526020820191506020810190506020830392506108ab565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050610708565b6000836040518082805190602001908083835b6020831015156109655780518252602082019150602081019050602083039250610940565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006109a49190610ce6565b5b83806001019450506106d3565b50505050565b60016002836040518082805190602001908083835b6020831015156109f257805182526020820191506020810190506020830392506109cd565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b602083101515610a8d5780518252602082019150602081019050602083039250610a68565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281610ad29190610ca6565b9160005260206000209001600083909190915090600019169055505050565b60006002836040518082805190602001908083835b602083101515610b2b5780518252602082019150602081019050602083039250610b06565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b610b95610d07565b610140604051908101604052806040805190810160405280600c81526020017f7472616e7366657246726f6d0000000000000000000000000000000000000000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b815481835581811511610ccd57818360005260206000209182019101610ccc9190610d36565b5b505050565b602060405190810160405280600081525090565b5080546000825590600052602060002090810190610d049190610d36565b50565b61014060405190810160405280600a905b610d20610d5b565b815260200190600190039081610d185790505090565b610d5891905b80821115610d54576000816000905550600101610d3c565b5090565b90565b6020604051908101604052806000815250905600a165627a7a72305820c914a6830543a821acf2bd660c6504fcfc6beb076fadd06cd3906389e5b568230029", - "deployedBytecode": "0x60606040526004361061006d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063131018581461007257806315dacbea146100f857806329f5967c1461019057806380da20d414610228578063d826f88f1461029f575b600080fd5b341561007d57600080fd5b6100da600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091908035600019169060200190919050506102b4565b60405180826000191660001916815260200191505060405180910390f35b341561010357600080fd5b610176600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610343565b604051808215151515815260200191505060405180910390f35b341561019b57600080fd5b61020e600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061046e565b604051808215151515815260200191505060405180910390f35b341561023357600080fd5b61029d600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080356000191690602001909190803560001916906020019091905050610597565b005b34156102aa57600080fd5b6102b26106c1565b005b60006001836040518082805190602001908083835b6020831015156102ee57805182526020820191506020810190506020830392506102c9565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b60006104626040805190810160405280600c81526020017f7472616e7366657246726f6d000000000000000000000000000000000000000081525086868686604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140182815260200194505050505060405180910390206109b8565b60019050949350505050565b600061058d6040805190810160405280600c81526020017f7472616e7366657246726f6d000000000000000000000000000000000000000081525086868686604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018281526020019450505050506040518091039020610af1565b9050949350505050565b6000836040518082805190602001908083835b6020831015156105cf57805182526020820191506020810190506020830392506105aa565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816106149190610ca6565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b6020831015156106685780518252602082019150602081019050602083039250610643565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b60006106cb610cd2565b600080600093505b600a8410156109b2576106e4610b8d565b84600a811015156106f157fe5b60200201519250600083511415156109a557600091505b6000836040518082805190602001908083835b602083101515610740578051825260208201915060208101905060208303925061071b565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054905082101561092d576000836040518082805190602001908083835b6020831015156107b65780518252602082019150602081019050602083039250610791565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020828154811015156107f657fe5b90600052602060002090015490506002836040518082805190602001908083835b60208310151561083c5780518252602082019150602081019050602083039250610817565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b6020831015156108d057805182526020820191506020810190506020830392506108ab565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050610708565b6000836040518082805190602001908083835b6020831015156109655780518252602082019150602081019050602083039250610940565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006109a49190610ce6565b5b83806001019450506106d3565b50505050565b60016002836040518082805190602001908083835b6020831015156109f257805182526020820191506020810190506020830392506109cd565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b602083101515610a8d5780518252602082019150602081019050602083039250610a68565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281610ad29190610ca6565b9160005260206000209001600083909190915090600019169055505050565b60006002836040518082805190602001908083835b602083101515610b2b5780518252602082019150602081019050602083039250610b06565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b610b95610d07565b610140604051908101604052806040805190810160405280600c81526020017f7472616e7366657246726f6d0000000000000000000000000000000000000000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b815481835581811511610ccd57818360005260206000209182019101610ccc9190610d36565b5b505050565b602060405190810160405280600081525090565b5080546000825590600052602060002090810190610d049190610d36565b50565b61014060405190810160405280600a905b610d20610d5b565b815260200190600190039081610d185790505090565b610d5891905b80821115610d54576000816000905550600101610d3c565b5090565b90565b6020604051908101604052806000815250905600a165627a7a72305820c914a6830543a821acf2bd660c6504fcfc6beb076fadd06cd3906389e5b568230029", + "bytecode": "0x6060604052341561000f57600080fd5b610d9b8061001e6000396000f30060606040526004361061006d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063131018581461007257806315dacbea146100f857806329f5967c1461019057806380da20d414610228578063d826f88f1461029f575b600080fd5b341561007d57600080fd5b6100da600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091908035600019169060200190919050506102b4565b60405180826000191660001916815260200191505060405180910390f35b341561010357600080fd5b610176600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610343565b604051808215151515815260200191505060405180910390f35b341561019b57600080fd5b61020e600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061046e565b604051808215151515815260200191505060405180910390f35b341561023357600080fd5b61029d600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080356000191690602001909190803560001916906020019091905050610597565b005b34156102aa57600080fd5b6102b26106c1565b005b60006001836040518082805190602001908083835b6020831015156102ee57805182526020820191506020810190506020830392506102c9565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b60006104626040805190810160405280600c81526020017f7472616e7366657246726f6d000000000000000000000000000000000000000081525086868686604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140182815260200194505050505060405180910390206109b8565b60019050949350505050565b600061058d6040805190810160405280600c81526020017f7472616e7366657246726f6d000000000000000000000000000000000000000081525086868686604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018281526020019450505050506040518091039020610af1565b9050949350505050565b6000836040518082805190602001908083835b6020831015156105cf57805182526020820191506020810190506020830392506105aa565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816106149190610ca6565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b6020831015156106685780518252602082019150602081019050602083039250610643565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b60006106cb610cd2565b600080600093505b600a8410156109b2576106e4610b8d565b84600a811015156106f157fe5b60200201519250600083511415156109a557600091505b6000836040518082805190602001908083835b602083101515610740578051825260208201915060208101905060208303925061071b565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054905082101561092d576000836040518082805190602001908083835b6020831015156107b65780518252602082019150602081019050602083039250610791565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020828154811015156107f657fe5b90600052602060002090015490506002836040518082805190602001908083835b60208310151561083c5780518252602082019150602081019050602083039250610817565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b6020831015156108d057805182526020820191506020810190506020830392506108ab565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050610708565b6000836040518082805190602001908083835b6020831015156109655780518252602082019150602081019050602083039250610940565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006109a49190610ce6565b5b83806001019450506106d3565b50505050565b60016002836040518082805190602001908083835b6020831015156109f257805182526020820191506020810190506020830392506109cd565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b602083101515610a8d5780518252602082019150602081019050602083039250610a68565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281610ad29190610ca6565b9160005260206000209001600083909190915090600019169055505050565b60006002836040518082805190602001908083835b602083101515610b2b5780518252602082019150602081019050602083039250610b06565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b610b95610d07565b610140604051908101604052806040805190810160405280600c81526020017f7472616e7366657246726f6d0000000000000000000000000000000000000000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b815481835581811511610ccd57818360005260206000209182019101610ccc9190610d36565b5b505050565b602060405190810160405280600081525090565b5080546000825590600052602060002090810190610d049190610d36565b50565b61014060405190810160405280600a905b610d20610d5b565b815260200190600190039081610d185790505090565b610d5891905b80821115610d54576000816000905550600101610d3c565b5090565b90565b6020604051908101604052806000815250905600a165627a7a72305820c4be82117623ab8bbec2a7b895d532488e30faa49392945c3494ce6849daa3820029", + "deployedBytecode": "0x60606040526004361061006d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063131018581461007257806315dacbea146100f857806329f5967c1461019057806380da20d414610228578063d826f88f1461029f575b600080fd5b341561007d57600080fd5b6100da600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091908035600019169060200190919050506102b4565b60405180826000191660001916815260200191505060405180910390f35b341561010357600080fd5b610176600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610343565b604051808215151515815260200191505060405180910390f35b341561019b57600080fd5b61020e600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061046e565b604051808215151515815260200191505060405180910390f35b341561023357600080fd5b61029d600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080356000191690602001909190803560001916906020019091905050610597565b005b34156102aa57600080fd5b6102b26106c1565b005b60006001836040518082805190602001908083835b6020831015156102ee57805182526020820191506020810190506020830392506102c9565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002054905092915050565b60006104626040805190810160405280600c81526020017f7472616e7366657246726f6d000000000000000000000000000000000000000081525086868686604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140182815260200194505050505060405180910390206109b8565b60019050949350505050565b600061058d6040805190810160405280600c81526020017f7472616e7366657246726f6d000000000000000000000000000000000000000081525086868686604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018281526020019450505050506040518091039020610af1565b9050949350505050565b6000836040518082805190602001908083835b6020831015156105cf57805182526020820191506020810190506020830392506105aa565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902080548060010182816106149190610ca6565b916000526020600020900160008490919091509060001916905550806001846040518082805190602001908083835b6020831015156106685780518252602082019150602081019050602083039250610643565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020600084600019166000191681526020019081526020016000208160001916905550505050565b60006106cb610cd2565b600080600093505b600a8410156109b2576106e4610b8d565b84600a811015156106f157fe5b60200201519250600083511415156109a557600091505b6000836040518082805190602001908083835b602083101515610740578051825260208201915060208101905060208303925061071b565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054905082101561092d576000836040518082805190602001908083835b6020831015156107b65780518252602082019150602081019050602083039250610791565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020828154811015156107f657fe5b90600052602060002090015490506002836040518082805190602001908083835b60208310151561083c5780518252602082019150602081019050602083039250610817565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000826000191660001916815260200190815260200160002060006101000a81549060ff02191690556001836040518082805190602001908083835b6020831015156108d057805182526020820191506020810190506020830392506108ab565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060008260001916600019168152602001908152602001600020600090558180600101925050610708565b6000836040518082805190602001908083835b6020831015156109655780518252602082019150602081019050602083039250610940565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006109a49190610ce6565b5b83806001019450506106d3565b50505050565b60016002836040518082805190602001908083835b6020831015156109f257805182526020820191506020810190506020830392506109cd565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060006101000a81548160ff0219169083151502179055506000826040518082805190602001908083835b602083101515610a8d5780518252602082019150602081019050602083039250610a68565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054806001018281610ad29190610ca6565b9160005260206000209001600083909190915090600019169055505050565b60006002836040518082805190602001908083835b602083101515610b2b5780518252602082019150602081019050602083039250610b06565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206000836000191660001916815260200190815260200160002060009054906101000a900460ff16905092915050565b610b95610d07565b610140604051908101604052806040805190810160405280600c81526020017f7472616e7366657246726f6d0000000000000000000000000000000000000000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815260200160206040519081016040528060008152508152602001602060405190810160405280600081525081526020016020604051908101604052806000815250815250905090565b815481835581811511610ccd57818360005260206000209182019101610ccc9190610d36565b5b505050565b602060405190810160405280600081525090565b5080546000825590600052602060002090810190610d049190610d36565b50565b61014060405190810160405280600a905b610d20610d5b565b815260200190600190039081610d185790505090565b610d5891905b80821115610d54576000816000905550600101610d3c565b5090565b90565b6020604051908101604052806000815250905600a165627a7a72305820c4be82117623ab8bbec2a7b895d532488e30faa49392945c3494ce6849daa3820029", "sourceMap": "640:939:32:-;;;;;;;;;;;;;;;;;", "deployedSourceMap": "640:939:32:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1294:217:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;694:344:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1044:360;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1018:270:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1517:610;;;;;;;;;;;;;;1294:217;1411:24;1458:17;1476:12;1458:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1458:46:23;1490:13;1458:46;;;;;;;;;;;;;;;;;;1451:53;;1294:217;;;;:::o;694:344:32:-;844:13;873:136;;;;;;;;;;;;;;;;;;;935:6;955:5;974:3;991:7;912:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;873:22;:136::i;:::-;1027:4;1020:11;;694:344;;;;;;:::o;1044:360::-;1220:15;1258:139;;;;;;;;;;;;;;;;;;;1323:6;1343:5;1362:3;1379:7;1300:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1258:25;:139::i;:::-;1251:146;;1044:360;;;;;;:::o;1018:270:23:-;1155:22;1178:12;1155:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1155:56:23;;;;;;;;;;;:::i;:::-;;;;;;;;;;1197:13;1155:56;;;;;;;;;;;;1270:11;1221:17;1239:12;1221:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1221:46:23;1253:13;1221:46;;;;;;;;;;;;;;;;;:60;;;;;;;1018:270;;;:::o;1517:610::-;1556:6;1595:26;;:::i;:::-;1719:6;1807:21;1565:1;1556:10;;1551:570;1572:2;1568:1;:6;1551:570;;;1624:17;:15;:17::i;:::-;1642:1;1624:20;;;;;;;;;;;;;1595:49;;1693:1;1669:12;1663:26;:31;;1659:452;;;1728:1;1719:10;;1714:321;1735:22;1758:12;1735:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1735:43:23;;;;1731:1;:47;1714:321;;;1831:22;1854:12;1831:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1868:1:23;1831:39;;;;;;;;;;;;;;;;;;;1807:63;;1899:13;1913:12;1899:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1899:42:23;1927:13;1899:42;;;;;;;;;;;;;;;;;;1892:49;;;;;;;;;;;1970:17;1988:12;1970:31;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;1970:46:23;2002:13;1970:46;;;;;;;;;;;;;;;;;1963:53;;;1780:3;;;;;;;1714:321;;;2060:22;2083:12;2060:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;;2053:43:23;;;;:::i;:::-;1659:452;1576:3;;;;;;;1551:570;;;1517:610;;;;:::o;2133:202::-;2267:4;2231:13;2245:12;2231:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2231:33:23;2259:4;2231:33;;;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;2281:22;2304:12;2281:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2281:47:23;;;;;;;;;;;:::i;:::-;;;;;;;;;;2323:4;2281:47;;;;;;;;;;;;2133:202;;:::o;2341:194::-;2458:14;2495:13;2509:12;2495:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;;;;;;2495:33:23;2523:4;2495:33;;;;;;;;;;;;;;;;;;;;;;;;;;;2488:40;;2341:194;;;;:::o;1410:167:32:-;1471:24;;:::i;:::-;1511:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1410:167;:::o;640:939::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\nimport \"./MockContract.sol\";\n\n\ncontract MockTokenTransferProxy is MockContract {\n function transferFrom(\n address _token,\n address _from,\n address _to,\n uint _amount\n )\n public\n returns (bool _success)\n {\n functionCalledWithArgs(\"transferFrom\", keccak256(\n _token,\n _from,\n _to,\n _amount\n ));\n\n return true;\n }\n\n function wasTransferFromCalledWith(\n address _token,\n address _from,\n address _to,\n uint _amount\n )\n public\n view\n returns (bool _wasCalled)\n {\n return wasFunctionCalledWithArgs(\"transferFrom\", keccak256(\n _token,\n _from,\n _to,\n _amount\n ));\n }\n\n function getFunctionList()\n internal\n returns (string[10] functionNames)\n {\n return [\"transferFrom\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\"];\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockTokenTransferProxy.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockTokenTransferProxy.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockTokenTransferProxy.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockTokenTransferProxy.sol", "exportedSymbols": { "MockTokenTransferProxy": [ 12517 @@ -150,7 +150,7 @@ export const MockTokenTransferProxy = { "attributes": { "SourceUnit": 10693, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/mocks/MockContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/mocks/MockContract.sol", "file": "./MockContract.sol", "scope": 12518, "symbolAliases": [ @@ -1236,7 +1236,7 @@ export const MockTokenTransferProxy = "42": { "events": {}, "links": {}, - "address": "0xea14749d27f5eed380dbeab1afe18d4bc174b77c" + "address": "0xe73f46c08eb3a1d218af468c6dbefbc5967bb6bd" }, "70": { "events": {}, @@ -1245,5 +1245,5 @@ export const MockTokenTransferProxy = } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:13:01.032Z" + "updatedAt": "2018-10-09T17:50:01.252Z" } \ No newline at end of file diff --git a/artifacts/ts/MultiSigWallet.ts b/artifacts/ts/MultiSigWallet.ts index f0c1b605..29e8a101 100644 --- a/artifacts/ts/MultiSigWallet.ts +++ b/artifacts/ts/MultiSigWallet.ts @@ -534,15 +534,15 @@ export const MultiSigWallet = "type": "event" } ], - "bytecode": "0x606060405234156200001057600080fd5b604051620023813803806200238183398101604052808051820191906020018051906020019091905050600082518260328211158015620000515750818111155b80156200005f575060008114155b80156200006d575060008214155b15156200007957600080fd5b600092505b8451831015620001b4576002600086858151811015156200009b57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156200012a5750600085848151811015156200010757fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1614155b15156200013657600080fd5b60016002600087868151811015156200014b57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555082806001019350506200007e565b8460039080519060200190620001cc929190620001df565b50836004819055505050505050620002b4565b8280548282559060005260206000209081019282156200025b579160200282015b828111156200025a5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019062000200565b5b5090506200026a91906200026e565b5090565b620002b191905b80821115620002ad57600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555060010162000275565b5090565b90565b6120bd80620002c46000396000f30060606040526004361061011d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063025e7c2714610177578063173825d9146101da57806320ea8d86146102135780632f54bf6e146102365780633411c81c1461028757806354741525146102e15780637065cb4814610325578063784547a71461035e5780638b51d13f146103995780639ace38c2146103d0578063a0e67e2b146104ce578063a8abe69a14610538578063b5dc40c3146105cf578063b77bf60014610647578063ba51a6df14610670578063c01a8c8414610693578063c6427474146106b6578063d74f8edd1461074f578063dc8452cd14610778578063e20056e6146107a1578063ee22610b146107f9575b6000341115610175573373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a25b005b341561018257600080fd5b610198600480803590602001909190505061081c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101e557600080fd5b610211600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061085b565b005b341561021e57600080fd5b6102346004808035906020019091905050610af7565b005b341561024157600080fd5b61026d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610c9f565b604051808215151515815260200191505060405180910390f35b341561029257600080fd5b6102c7600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610cbf565b604051808215151515815260200191505060405180910390f35b34156102ec57600080fd5b61030f600480803515159060200190919080351515906020019091905050610cee565b6040518082815260200191505060405180910390f35b341561033057600080fd5b61035c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610d80565b005b341561036957600080fd5b61037f6004808035906020019091905050610f82565b604051808215151515815260200191505060405180910390f35b34156103a457600080fd5b6103ba6004808035906020019091905050611068565b6040518082815260200191505060405180910390f35b34156103db57600080fd5b6103f16004808035906020019091905050611134565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200184815260200180602001831515151581526020018281038252848181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156104bc5780601f10610491576101008083540402835291602001916104bc565b820191906000526020600020905b81548152906001019060200180831161049f57829003601f168201915b50509550505050505060405180910390f35b34156104d957600080fd5b6104e1611190565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610524578082015181840152602081019050610509565b505050509050019250505060405180910390f35b341561054357600080fd5b610578600480803590602001909190803590602001909190803515159060200190919080351515906020019091905050611224565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156105bb5780820151818401526020810190506105a0565b505050509050019250505060405180910390f35b34156105da57600080fd5b6105f0600480803590602001909190505061138f565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610633578082015181840152602081019050610618565b505050509050019250505060405180910390f35b341561065257600080fd5b61065a6115b9565b6040518082815260200191505060405180910390f35b341561067b57600080fd5b61069160048080359060200190919050506115bf565b005b341561069e57600080fd5b6106b46004808035906020019091905050611679565b005b34156106c157600080fd5b610739600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611856565b6040518082815260200191505060405180910390f35b341561075a57600080fd5b610762611875565b6040518082815260200191505060405180910390f35b341561078357600080fd5b61078b61187a565b6040518082815260200191505060405180910390f35b34156107ac57600080fd5b6107f7600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611880565b005b341561080457600080fd5b61081a6004808035906020019091905050611b97565b005b60038181548110151561082b57fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561089757600080fd5b81600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615156108f057600080fd5b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600091505b600160038054905003821015610a78578273ffffffffffffffffffffffffffffffffffffffff1660038381548110151561098357fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610a6b5760036001600380549050038154811015156109e257fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600383815481101515610a1d57fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610a78565b818060010192505061094d565b6001600381818054905003915081610a909190611f6c565b506003805490506004541115610aaf57610aae6003805490506115bf565b5b8273ffffffffffffffffffffffffffffffffffffffff167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a2505050565b33600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610b5057600080fd5b81336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610bbb57600080fd5b8360008082815260200190815260200160002060030160009054906101000a900460ff16151515610beb57600080fd5b60006001600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550843373ffffffffffffffffffffffffffffffffffffffff167ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e960405160405180910390a35050505050565b60026020528060005260406000206000915054906101000a900460ff1681565b60016020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b600080600090505b600554811015610d7957838015610d2d575060008082815260200190815260200160002060030160009054906101000a900460ff16155b80610d605750828015610d5f575060008082815260200190815260200160002060030160009054906101000a900460ff165b5b15610d6c576001820191505b8080600101915050610cf6565b5092915050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610dba57600080fd5b80600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151515610e1457600080fd5b8160008173ffffffffffffffffffffffffffffffffffffffff1614151515610e3b57600080fd5b60016003805490500160045460328211158015610e585750818111155b8015610e65575060008114155b8015610e72575060008214155b1515610e7d57600080fd5b6001600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060038054806001018281610ee99190611f98565b9160005260206000209001600087909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508473ffffffffffffffffffffffffffffffffffffffff167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b6000806000809150600090505b60038054905081101561106057600160008581526020019081526020016000206000600383815481101515610fc057fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611040576001820191505b6004548214156110535760019250611061565b8080600101915050610f8f565b5b5050919050565b600080600090505b60038054905081101561112e576001600084815260200190815260200160002060006003838154811015156110a157fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611121576001820191505b8080600101915050611070565b50919050565b60006020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201908060030160009054906101000a900460ff16905084565b611198611fc4565b600380548060200260200160405190810160405280929190818152602001828054801561121a57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116111d0575b5050505050905090565b61122c611fd8565b611234611fd8565b60008086881115151561124657600080fd5b6005546040518059106112565750595b9080825280602002602001820160405250925060009150600090505b600554811015611312578580156112a9575060008082815260200190815260200160002060030160009054906101000a900460ff16155b806112dc57508480156112db575060008082815260200190815260200160002060030160009054906101000a900460ff165b5b15611305578083838151811015156112f057fe5b90602001906020020181815250506001820191505b8080600101915050611272565b8787036040518059106113225750595b908082528060200260200182016040525093508790505b8681101561138457828181518110151561134f57fe5b906020019060200201518489830381518110151561136957fe5b90602001906020020181815250508080600101915050611339565b505050949350505050565b611397611fc4565b61139f611fc4565b6000806003805490506040518059106113b55750595b9080825280602002602001820160405250925060009150600090505b6003805490508110156115145760016000868152602001908152602001600020600060038381548110151561140257fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156115075760038181548110151561148a57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683838151811015156114c457fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506001820191505b80806001019150506113d1565b816040518059106115225750595b90808252806020026020018201604052509350600090505b818110156115b157828181518110151561155057fe5b90602001906020020151848281518110151561156857fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050808060010191505061153a565b505050919050565b60055481565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156115f957600080fd5b60038054905081603282111580156116115750818111155b801561161e575060008114155b801561162b575060008214155b151561163657600080fd5b826004819055507fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a836040518082815260200191505060405180910390a1505050565b33600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615156116d257600080fd5b81600080600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561172e57600080fd5b82336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151561179a57600080fd5b600180600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550843373ffffffffffffffffffffffffffffffffffffffff167f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef60405160405180910390a361184f85611b97565b5050505050565b6000611863848484611e1a565b905061186e81611679565b9392505050565b603281565b60045481565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156118bc57600080fd5b82600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151561191557600080fd5b82600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151561196f57600080fd5b600092505b600380549050831015611a5a578473ffffffffffffffffffffffffffffffffffffffff166003848154811015156119a757fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611a4d57836003848154811015156119ff57fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611a5a565b8280600101935050611974565b6000600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508473ffffffffffffffffffffffffffffffffffffffff167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a28373ffffffffffffffffffffffffffffffffffffffff167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b600033600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515611bf257600080fd5b82336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515611c5d57600080fd5b8460008082815260200190815260200160002060030160009054906101000a900460ff16151515611c8d57600080fd5b611c9686610f82565b15611e1257600080878152602001908152602001600020945060018560030160006101000a81548160ff0219169083151502179055508460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168560010154866002016040518082805460018160011615610100020316600290048015611d755780601f10611d4a57610100808354040283529160200191611d75565b820191906000526020600020905b815481529060010190602001808311611d5857829003601f168201915b505091505060006040518083038185876187965a03f19250505015611dc657857f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7560405160405180910390a2611e11565b857f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923660405160405180910390a260008560030160006101000a81548160ff0219169083151502179055505b5b505050505050565b60008360008173ffffffffffffffffffffffffffffffffffffffff1614151515611e4357600080fd5b60055491506080604051908101604052808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020016000151581525060008084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101556040820151816002019080519060200190611f02929190611fec565b5060608201518160030160006101000a81548160ff0219169083151502179055509050506001600560008282540192505081905550817fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5160405160405180910390a2509392505050565b815481835581811511611f9357818360005260206000209182019101611f92919061206c565b5b505050565b815481835581811511611fbf57818360005260206000209182019101611fbe919061206c565b5b505050565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061202d57805160ff191683800117855561205b565b8280016001018555821561205b579182015b8281111561205a57825182559160200191906001019061203f565b5b509050612068919061206c565b5090565b61208e91905b8082111561208a576000816000905550600101612072565b5090565b905600a165627a7a723058202412500603ed2cf74de534bf9dfb888f8106b2323f8b944bf06f0fe0f18e62a30029", - "deployedBytecode": "0x60606040526004361061011d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063025e7c2714610177578063173825d9146101da57806320ea8d86146102135780632f54bf6e146102365780633411c81c1461028757806354741525146102e15780637065cb4814610325578063784547a71461035e5780638b51d13f146103995780639ace38c2146103d0578063a0e67e2b146104ce578063a8abe69a14610538578063b5dc40c3146105cf578063b77bf60014610647578063ba51a6df14610670578063c01a8c8414610693578063c6427474146106b6578063d74f8edd1461074f578063dc8452cd14610778578063e20056e6146107a1578063ee22610b146107f9575b6000341115610175573373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a25b005b341561018257600080fd5b610198600480803590602001909190505061081c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101e557600080fd5b610211600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061085b565b005b341561021e57600080fd5b6102346004808035906020019091905050610af7565b005b341561024157600080fd5b61026d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610c9f565b604051808215151515815260200191505060405180910390f35b341561029257600080fd5b6102c7600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610cbf565b604051808215151515815260200191505060405180910390f35b34156102ec57600080fd5b61030f600480803515159060200190919080351515906020019091905050610cee565b6040518082815260200191505060405180910390f35b341561033057600080fd5b61035c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610d80565b005b341561036957600080fd5b61037f6004808035906020019091905050610f82565b604051808215151515815260200191505060405180910390f35b34156103a457600080fd5b6103ba6004808035906020019091905050611068565b6040518082815260200191505060405180910390f35b34156103db57600080fd5b6103f16004808035906020019091905050611134565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200184815260200180602001831515151581526020018281038252848181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156104bc5780601f10610491576101008083540402835291602001916104bc565b820191906000526020600020905b81548152906001019060200180831161049f57829003601f168201915b50509550505050505060405180910390f35b34156104d957600080fd5b6104e1611190565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610524578082015181840152602081019050610509565b505050509050019250505060405180910390f35b341561054357600080fd5b610578600480803590602001909190803590602001909190803515159060200190919080351515906020019091905050611224565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156105bb5780820151818401526020810190506105a0565b505050509050019250505060405180910390f35b34156105da57600080fd5b6105f0600480803590602001909190505061138f565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610633578082015181840152602081019050610618565b505050509050019250505060405180910390f35b341561065257600080fd5b61065a6115b9565b6040518082815260200191505060405180910390f35b341561067b57600080fd5b61069160048080359060200190919050506115bf565b005b341561069e57600080fd5b6106b46004808035906020019091905050611679565b005b34156106c157600080fd5b610739600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611856565b6040518082815260200191505060405180910390f35b341561075a57600080fd5b610762611875565b6040518082815260200191505060405180910390f35b341561078357600080fd5b61078b61187a565b6040518082815260200191505060405180910390f35b34156107ac57600080fd5b6107f7600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611880565b005b341561080457600080fd5b61081a6004808035906020019091905050611b97565b005b60038181548110151561082b57fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561089757600080fd5b81600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615156108f057600080fd5b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600091505b600160038054905003821015610a78578273ffffffffffffffffffffffffffffffffffffffff1660038381548110151561098357fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610a6b5760036001600380549050038154811015156109e257fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600383815481101515610a1d57fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610a78565b818060010192505061094d565b6001600381818054905003915081610a909190611f6c565b506003805490506004541115610aaf57610aae6003805490506115bf565b5b8273ffffffffffffffffffffffffffffffffffffffff167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a2505050565b33600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610b5057600080fd5b81336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610bbb57600080fd5b8360008082815260200190815260200160002060030160009054906101000a900460ff16151515610beb57600080fd5b60006001600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550843373ffffffffffffffffffffffffffffffffffffffff167ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e960405160405180910390a35050505050565b60026020528060005260406000206000915054906101000a900460ff1681565b60016020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b600080600090505b600554811015610d7957838015610d2d575060008082815260200190815260200160002060030160009054906101000a900460ff16155b80610d605750828015610d5f575060008082815260200190815260200160002060030160009054906101000a900460ff165b5b15610d6c576001820191505b8080600101915050610cf6565b5092915050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610dba57600080fd5b80600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151515610e1457600080fd5b8160008173ffffffffffffffffffffffffffffffffffffffff1614151515610e3b57600080fd5b60016003805490500160045460328211158015610e585750818111155b8015610e65575060008114155b8015610e72575060008214155b1515610e7d57600080fd5b6001600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060038054806001018281610ee99190611f98565b9160005260206000209001600087909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508473ffffffffffffffffffffffffffffffffffffffff167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b6000806000809150600090505b60038054905081101561106057600160008581526020019081526020016000206000600383815481101515610fc057fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611040576001820191505b6004548214156110535760019250611061565b8080600101915050610f8f565b5b5050919050565b600080600090505b60038054905081101561112e576001600084815260200190815260200160002060006003838154811015156110a157fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611121576001820191505b8080600101915050611070565b50919050565b60006020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201908060030160009054906101000a900460ff16905084565b611198611fc4565b600380548060200260200160405190810160405280929190818152602001828054801561121a57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116111d0575b5050505050905090565b61122c611fd8565b611234611fd8565b60008086881115151561124657600080fd5b6005546040518059106112565750595b9080825280602002602001820160405250925060009150600090505b600554811015611312578580156112a9575060008082815260200190815260200160002060030160009054906101000a900460ff16155b806112dc57508480156112db575060008082815260200190815260200160002060030160009054906101000a900460ff165b5b15611305578083838151811015156112f057fe5b90602001906020020181815250506001820191505b8080600101915050611272565b8787036040518059106113225750595b908082528060200260200182016040525093508790505b8681101561138457828181518110151561134f57fe5b906020019060200201518489830381518110151561136957fe5b90602001906020020181815250508080600101915050611339565b505050949350505050565b611397611fc4565b61139f611fc4565b6000806003805490506040518059106113b55750595b9080825280602002602001820160405250925060009150600090505b6003805490508110156115145760016000868152602001908152602001600020600060038381548110151561140257fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156115075760038181548110151561148a57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683838151811015156114c457fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506001820191505b80806001019150506113d1565b816040518059106115225750595b90808252806020026020018201604052509350600090505b818110156115b157828181518110151561155057fe5b90602001906020020151848281518110151561156857fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050808060010191505061153a565b505050919050565b60055481565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156115f957600080fd5b60038054905081603282111580156116115750818111155b801561161e575060008114155b801561162b575060008214155b151561163657600080fd5b826004819055507fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a836040518082815260200191505060405180910390a1505050565b33600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615156116d257600080fd5b81600080600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561172e57600080fd5b82336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151561179a57600080fd5b600180600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550843373ffffffffffffffffffffffffffffffffffffffff167f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef60405160405180910390a361184f85611b97565b5050505050565b6000611863848484611e1a565b905061186e81611679565b9392505050565b603281565b60045481565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156118bc57600080fd5b82600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151561191557600080fd5b82600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151561196f57600080fd5b600092505b600380549050831015611a5a578473ffffffffffffffffffffffffffffffffffffffff166003848154811015156119a757fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611a4d57836003848154811015156119ff57fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611a5a565b8280600101935050611974565b6000600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508473ffffffffffffffffffffffffffffffffffffffff167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a28373ffffffffffffffffffffffffffffffffffffffff167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b600033600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515611bf257600080fd5b82336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515611c5d57600080fd5b8460008082815260200190815260200160002060030160009054906101000a900460ff16151515611c8d57600080fd5b611c9686610f82565b15611e1257600080878152602001908152602001600020945060018560030160006101000a81548160ff0219169083151502179055508460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168560010154866002016040518082805460018160011615610100020316600290048015611d755780601f10611d4a57610100808354040283529160200191611d75565b820191906000526020600020905b815481529060010190602001808311611d5857829003601f168201915b505091505060006040518083038185876187965a03f19250505015611dc657857f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7560405160405180910390a2611e11565b857f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923660405160405180910390a260008560030160006101000a81548160ff0219169083151502179055505b5b505050505050565b60008360008173ffffffffffffffffffffffffffffffffffffffff1614151515611e4357600080fd5b60055491506080604051908101604052808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020016000151581525060008084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101556040820151816002019080519060200190611f02929190611fec565b5060608201518160030160006101000a81548160ff0219169083151502179055509050506001600560008282540192505081905550817fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5160405160405180910390a2509392505050565b815481835581811511611f9357818360005260206000209182019101611f92919061206c565b5b505050565b815481835581811511611fbf57818360005260206000209182019101611fbe919061206c565b5b505050565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061202d57805160ff191683800117855561205b565b8280016001018555821561205b579182015b8281111561205a57825182559160200191906001019061203f565b5b509050612068919061206c565b5090565b61208e91905b8082111561208a576000816000905550600101612072565b5090565b905600a165627a7a723058202412500603ed2cf74de534bf9dfb888f8106b2323f8b944bf06f0fe0f18e62a30029", + "bytecode": "0x606060405234156200001057600080fd5b604051620023813803806200238183398101604052808051820191906020018051906020019091905050600082518260328211158015620000515750818111155b80156200005f575060008114155b80156200006d575060008214155b15156200007957600080fd5b600092505b8451831015620001b4576002600086858151811015156200009b57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156200012a5750600085848151811015156200010757fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1614155b15156200013657600080fd5b60016002600087868151811015156200014b57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555082806001019350506200007e565b8460039080519060200190620001cc929190620001df565b50836004819055505050505050620002b4565b8280548282559060005260206000209081019282156200025b579160200282015b828111156200025a5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019062000200565b5b5090506200026a91906200026e565b5090565b620002b191905b80821115620002ad57600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555060010162000275565b5090565b90565b6120bd80620002c46000396000f30060606040526004361061011d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063025e7c2714610177578063173825d9146101da57806320ea8d86146102135780632f54bf6e146102365780633411c81c1461028757806354741525146102e15780637065cb4814610325578063784547a71461035e5780638b51d13f146103995780639ace38c2146103d0578063a0e67e2b146104ce578063a8abe69a14610538578063b5dc40c3146105cf578063b77bf60014610647578063ba51a6df14610670578063c01a8c8414610693578063c6427474146106b6578063d74f8edd1461074f578063dc8452cd14610778578063e20056e6146107a1578063ee22610b146107f9575b6000341115610175573373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a25b005b341561018257600080fd5b610198600480803590602001909190505061081c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101e557600080fd5b610211600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061085b565b005b341561021e57600080fd5b6102346004808035906020019091905050610af7565b005b341561024157600080fd5b61026d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610c9f565b604051808215151515815260200191505060405180910390f35b341561029257600080fd5b6102c7600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610cbf565b604051808215151515815260200191505060405180910390f35b34156102ec57600080fd5b61030f600480803515159060200190919080351515906020019091905050610cee565b6040518082815260200191505060405180910390f35b341561033057600080fd5b61035c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610d80565b005b341561036957600080fd5b61037f6004808035906020019091905050610f82565b604051808215151515815260200191505060405180910390f35b34156103a457600080fd5b6103ba6004808035906020019091905050611068565b6040518082815260200191505060405180910390f35b34156103db57600080fd5b6103f16004808035906020019091905050611134565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200184815260200180602001831515151581526020018281038252848181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156104bc5780601f10610491576101008083540402835291602001916104bc565b820191906000526020600020905b81548152906001019060200180831161049f57829003601f168201915b50509550505050505060405180910390f35b34156104d957600080fd5b6104e1611190565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610524578082015181840152602081019050610509565b505050509050019250505060405180910390f35b341561054357600080fd5b610578600480803590602001909190803590602001909190803515159060200190919080351515906020019091905050611224565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156105bb5780820151818401526020810190506105a0565b505050509050019250505060405180910390f35b34156105da57600080fd5b6105f0600480803590602001909190505061138f565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610633578082015181840152602081019050610618565b505050509050019250505060405180910390f35b341561065257600080fd5b61065a6115b9565b6040518082815260200191505060405180910390f35b341561067b57600080fd5b61069160048080359060200190919050506115bf565b005b341561069e57600080fd5b6106b46004808035906020019091905050611679565b005b34156106c157600080fd5b610739600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611856565b6040518082815260200191505060405180910390f35b341561075a57600080fd5b610762611875565b6040518082815260200191505060405180910390f35b341561078357600080fd5b61078b61187a565b6040518082815260200191505060405180910390f35b34156107ac57600080fd5b6107f7600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611880565b005b341561080457600080fd5b61081a6004808035906020019091905050611b97565b005b60038181548110151561082b57fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561089757600080fd5b81600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615156108f057600080fd5b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600091505b600160038054905003821015610a78578273ffffffffffffffffffffffffffffffffffffffff1660038381548110151561098357fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610a6b5760036001600380549050038154811015156109e257fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600383815481101515610a1d57fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610a78565b818060010192505061094d565b6001600381818054905003915081610a909190611f6c565b506003805490506004541115610aaf57610aae6003805490506115bf565b5b8273ffffffffffffffffffffffffffffffffffffffff167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a2505050565b33600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610b5057600080fd5b81336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610bbb57600080fd5b8360008082815260200190815260200160002060030160009054906101000a900460ff16151515610beb57600080fd5b60006001600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550843373ffffffffffffffffffffffffffffffffffffffff167ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e960405160405180910390a35050505050565b60026020528060005260406000206000915054906101000a900460ff1681565b60016020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b600080600090505b600554811015610d7957838015610d2d575060008082815260200190815260200160002060030160009054906101000a900460ff16155b80610d605750828015610d5f575060008082815260200190815260200160002060030160009054906101000a900460ff165b5b15610d6c576001820191505b8080600101915050610cf6565b5092915050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610dba57600080fd5b80600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151515610e1457600080fd5b8160008173ffffffffffffffffffffffffffffffffffffffff1614151515610e3b57600080fd5b60016003805490500160045460328211158015610e585750818111155b8015610e65575060008114155b8015610e72575060008214155b1515610e7d57600080fd5b6001600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060038054806001018281610ee99190611f98565b9160005260206000209001600087909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508473ffffffffffffffffffffffffffffffffffffffff167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b6000806000809150600090505b60038054905081101561106057600160008581526020019081526020016000206000600383815481101515610fc057fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611040576001820191505b6004548214156110535760019250611061565b8080600101915050610f8f565b5b5050919050565b600080600090505b60038054905081101561112e576001600084815260200190815260200160002060006003838154811015156110a157fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611121576001820191505b8080600101915050611070565b50919050565b60006020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201908060030160009054906101000a900460ff16905084565b611198611fc4565b600380548060200260200160405190810160405280929190818152602001828054801561121a57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116111d0575b5050505050905090565b61122c611fd8565b611234611fd8565b60008086881115151561124657600080fd5b6005546040518059106112565750595b9080825280602002602001820160405250925060009150600090505b600554811015611312578580156112a9575060008082815260200190815260200160002060030160009054906101000a900460ff16155b806112dc57508480156112db575060008082815260200190815260200160002060030160009054906101000a900460ff165b5b15611305578083838151811015156112f057fe5b90602001906020020181815250506001820191505b8080600101915050611272565b8787036040518059106113225750595b908082528060200260200182016040525093508790505b8681101561138457828181518110151561134f57fe5b906020019060200201518489830381518110151561136957fe5b90602001906020020181815250508080600101915050611339565b505050949350505050565b611397611fc4565b61139f611fc4565b6000806003805490506040518059106113b55750595b9080825280602002602001820160405250925060009150600090505b6003805490508110156115145760016000868152602001908152602001600020600060038381548110151561140257fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156115075760038181548110151561148a57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683838151811015156114c457fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506001820191505b80806001019150506113d1565b816040518059106115225750595b90808252806020026020018201604052509350600090505b818110156115b157828181518110151561155057fe5b90602001906020020151848281518110151561156857fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050808060010191505061153a565b505050919050565b60055481565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156115f957600080fd5b60038054905081603282111580156116115750818111155b801561161e575060008114155b801561162b575060008214155b151561163657600080fd5b826004819055507fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a836040518082815260200191505060405180910390a1505050565b33600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615156116d257600080fd5b81600080600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561172e57600080fd5b82336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151561179a57600080fd5b600180600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550843373ffffffffffffffffffffffffffffffffffffffff167f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef60405160405180910390a361184f85611b97565b5050505050565b6000611863848484611e1a565b905061186e81611679565b9392505050565b603281565b60045481565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156118bc57600080fd5b82600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151561191557600080fd5b82600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151561196f57600080fd5b600092505b600380549050831015611a5a578473ffffffffffffffffffffffffffffffffffffffff166003848154811015156119a757fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611a4d57836003848154811015156119ff57fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611a5a565b8280600101935050611974565b6000600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508473ffffffffffffffffffffffffffffffffffffffff167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a28373ffffffffffffffffffffffffffffffffffffffff167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b600033600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515611bf257600080fd5b82336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515611c5d57600080fd5b8460008082815260200190815260200160002060030160009054906101000a900460ff16151515611c8d57600080fd5b611c9686610f82565b15611e1257600080878152602001908152602001600020945060018560030160006101000a81548160ff0219169083151502179055508460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168560010154866002016040518082805460018160011615610100020316600290048015611d755780601f10611d4a57610100808354040283529160200191611d75565b820191906000526020600020905b815481529060010190602001808311611d5857829003601f168201915b505091505060006040518083038185876187965a03f19250505015611dc657857f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7560405160405180910390a2611e11565b857f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923660405160405180910390a260008560030160006101000a81548160ff0219169083151502179055505b5b505050505050565b60008360008173ffffffffffffffffffffffffffffffffffffffff1614151515611e4357600080fd5b60055491506080604051908101604052808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020016000151581525060008084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101556040820151816002019080519060200190611f02929190611fec565b5060608201518160030160006101000a81548160ff0219169083151502179055509050506001600560008282540192505081905550817fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5160405160405180910390a2509392505050565b815481835581811511611f9357818360005260206000209182019101611f92919061206c565b5b505050565b815481835581811511611fbf57818360005260206000209182019101611fbe919061206c565b5b505050565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061202d57805160ff191683800117855561205b565b8280016001018555821561205b579182015b8281111561205a57825182559160200191906001019061203f565b5b509050612068919061206c565b5090565b61208e91905b8082111561208a576000816000905550600101612072565b5090565b905600a165627a7a7230582070f5af7e8c22aa406bc8661c8472a466fea1be1a93d078497d704d1354a032630029", + "deployedBytecode": "0x60606040526004361061011d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063025e7c2714610177578063173825d9146101da57806320ea8d86146102135780632f54bf6e146102365780633411c81c1461028757806354741525146102e15780637065cb4814610325578063784547a71461035e5780638b51d13f146103995780639ace38c2146103d0578063a0e67e2b146104ce578063a8abe69a14610538578063b5dc40c3146105cf578063b77bf60014610647578063ba51a6df14610670578063c01a8c8414610693578063c6427474146106b6578063d74f8edd1461074f578063dc8452cd14610778578063e20056e6146107a1578063ee22610b146107f9575b6000341115610175573373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a25b005b341561018257600080fd5b610198600480803590602001909190505061081c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101e557600080fd5b610211600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061085b565b005b341561021e57600080fd5b6102346004808035906020019091905050610af7565b005b341561024157600080fd5b61026d600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610c9f565b604051808215151515815260200191505060405180910390f35b341561029257600080fd5b6102c7600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610cbf565b604051808215151515815260200191505060405180910390f35b34156102ec57600080fd5b61030f600480803515159060200190919080351515906020019091905050610cee565b6040518082815260200191505060405180910390f35b341561033057600080fd5b61035c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610d80565b005b341561036957600080fd5b61037f6004808035906020019091905050610f82565b604051808215151515815260200191505060405180910390f35b34156103a457600080fd5b6103ba6004808035906020019091905050611068565b6040518082815260200191505060405180910390f35b34156103db57600080fd5b6103f16004808035906020019091905050611134565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200184815260200180602001831515151581526020018281038252848181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156104bc5780601f10610491576101008083540402835291602001916104bc565b820191906000526020600020905b81548152906001019060200180831161049f57829003601f168201915b50509550505050505060405180910390f35b34156104d957600080fd5b6104e1611190565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610524578082015181840152602081019050610509565b505050509050019250505060405180910390f35b341561054357600080fd5b610578600480803590602001909190803590602001909190803515159060200190919080351515906020019091905050611224565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156105bb5780820151818401526020810190506105a0565b505050509050019250505060405180910390f35b34156105da57600080fd5b6105f0600480803590602001909190505061138f565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610633578082015181840152602081019050610618565b505050509050019250505060405180910390f35b341561065257600080fd5b61065a6115b9565b6040518082815260200191505060405180910390f35b341561067b57600080fd5b61069160048080359060200190919050506115bf565b005b341561069e57600080fd5b6106b46004808035906020019091905050611679565b005b34156106c157600080fd5b610739600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611856565b6040518082815260200191505060405180910390f35b341561075a57600080fd5b610762611875565b6040518082815260200191505060405180910390f35b341561078357600080fd5b61078b61187a565b6040518082815260200191505060405180910390f35b34156107ac57600080fd5b6107f7600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611880565b005b341561080457600080fd5b61081a6004808035906020019091905050611b97565b005b60038181548110151561082b57fe5b90600052602060002090016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561089757600080fd5b81600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615156108f057600080fd5b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600091505b600160038054905003821015610a78578273ffffffffffffffffffffffffffffffffffffffff1660038381548110151561098357fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610a6b5760036001600380549050038154811015156109e257fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600383815481101515610a1d57fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610a78565b818060010192505061094d565b6001600381818054905003915081610a909190611f6c565b506003805490506004541115610aaf57610aae6003805490506115bf565b5b8273ffffffffffffffffffffffffffffffffffffffff167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a2505050565b33600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610b5057600080fd5b81336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610bbb57600080fd5b8360008082815260200190815260200160002060030160009054906101000a900460ff16151515610beb57600080fd5b60006001600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550843373ffffffffffffffffffffffffffffffffffffffff167ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e960405160405180910390a35050505050565b60026020528060005260406000206000915054906101000a900460ff1681565b60016020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b600080600090505b600554811015610d7957838015610d2d575060008082815260200190815260200160002060030160009054906101000a900460ff16155b80610d605750828015610d5f575060008082815260200190815260200160002060030160009054906101000a900460ff165b5b15610d6c576001820191505b8080600101915050610cf6565b5092915050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610dba57600080fd5b80600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151515610e1457600080fd5b8160008173ffffffffffffffffffffffffffffffffffffffff1614151515610e3b57600080fd5b60016003805490500160045460328211158015610e585750818111155b8015610e65575060008114155b8015610e72575060008214155b1515610e7d57600080fd5b6001600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060038054806001018281610ee99190611f98565b9160005260206000209001600087909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508473ffffffffffffffffffffffffffffffffffffffff167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b6000806000809150600090505b60038054905081101561106057600160008581526020019081526020016000206000600383815481101515610fc057fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611040576001820191505b6004548214156110535760019250611061565b8080600101915050610f8f565b5b5050919050565b600080600090505b60038054905081101561112e576001600084815260200190815260200160002060006003838154811015156110a157fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611121576001820191505b8080600101915050611070565b50919050565b60006020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201908060030160009054906101000a900460ff16905084565b611198611fc4565b600380548060200260200160405190810160405280929190818152602001828054801561121a57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116111d0575b5050505050905090565b61122c611fd8565b611234611fd8565b60008086881115151561124657600080fd5b6005546040518059106112565750595b9080825280602002602001820160405250925060009150600090505b600554811015611312578580156112a9575060008082815260200190815260200160002060030160009054906101000a900460ff16155b806112dc57508480156112db575060008082815260200190815260200160002060030160009054906101000a900460ff165b5b15611305578083838151811015156112f057fe5b90602001906020020181815250506001820191505b8080600101915050611272565b8787036040518059106113225750595b908082528060200260200182016040525093508790505b8681101561138457828181518110151561134f57fe5b906020019060200201518489830381518110151561136957fe5b90602001906020020181815250508080600101915050611339565b505050949350505050565b611397611fc4565b61139f611fc4565b6000806003805490506040518059106113b55750595b9080825280602002602001820160405250925060009150600090505b6003805490508110156115145760016000868152602001908152602001600020600060038381548110151561140257fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156115075760038181548110151561148a57fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683838151811015156114c457fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506001820191505b80806001019150506113d1565b816040518059106115225750595b90808252806020026020018201604052509350600090505b818110156115b157828181518110151561155057fe5b90602001906020020151848281518110151561156857fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050808060010191505061153a565b505050919050565b60055481565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156115f957600080fd5b60038054905081603282111580156116115750818111155b801561161e575060008114155b801561162b575060008214155b151561163657600080fd5b826004819055507fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a836040518082815260200191505060405180910390a1505050565b33600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615156116d257600080fd5b81600080600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561172e57600080fd5b82336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151561179a57600080fd5b600180600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550843373ffffffffffffffffffffffffffffffffffffffff167f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef60405160405180910390a361184f85611b97565b5050505050565b6000611863848484611e1a565b905061186e81611679565b9392505050565b603281565b60045481565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156118bc57600080fd5b82600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151561191557600080fd5b82600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151561196f57600080fd5b600092505b600380549050831015611a5a578473ffffffffffffffffffffffffffffffffffffffff166003848154811015156119a757fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611a4d57836003848154811015156119ff57fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611a5a565b8280600101935050611974565b6000600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508473ffffffffffffffffffffffffffffffffffffffff167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a28373ffffffffffffffffffffffffffffffffffffffff167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b600033600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515611bf257600080fd5b82336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515611c5d57600080fd5b8460008082815260200190815260200160002060030160009054906101000a900460ff16151515611c8d57600080fd5b611c9686610f82565b15611e1257600080878152602001908152602001600020945060018560030160006101000a81548160ff0219169083151502179055508460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168560010154866002016040518082805460018160011615610100020316600290048015611d755780601f10611d4a57610100808354040283529160200191611d75565b820191906000526020600020905b815481529060010190602001808311611d5857829003601f168201915b505091505060006040518083038185876187965a03f19250505015611dc657857f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7560405160405180910390a2611e11565b857f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923660405160405180910390a260008560030160006101000a81548160ff0219169083151502179055505b5b505050505050565b60008360008173ffffffffffffffffffffffffffffffffffffffff1614151515611e4357600080fd5b60055491506080604051908101604052808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020016000151581525060008084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101556040820151816002019080519060200190611f02929190611fec565b5060608201518160030160006101000a81548160ff0219169083151502179055509050506001600560008282540192505081905550817fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5160405160405180910390a2509392505050565b815481835581811511611f9357818360005260206000209182019101611f92919061206c565b5b505050565b815481835581811511611fbf57818360005260206000209182019101611fbe919061206c565b5b505050565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061202d57805160ff191683800117855561205b565b8280016001018555821561205b579182015b8281111561205a57825182559160200191906001019061203f565b5b509050612068919061206c565b5090565b61208e91905b8082111561208a576000816000905550600101612072565b5090565b905600a165627a7a7230582070f5af7e8c22aa406bc8661c8472a466fea1be1a93d078497d704d1354a032630029", "sourceMap": "186:11348:35:-;;;2830:353;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2975:6;2929:7;:14;2945:9;819:2;2253:10;:29;;:68;;;;;2311:10;2298:9;:23;;2253:68;:98;;;;;2350:1;2337:9;:14;;2253:98;:129;;;;;2381:1;2367:10;:15;;2253:129;2245:138;;;;;;;;2982:1;2975:8;;2970:151;2987:7;:14;2985:1;:16;2970:151;;;3031:7;:19;3039:7;3047:1;3039:10;;;;;;;;;;;;;;;;;;3031:19;;;;;;;;;;;;;;;;;;;;;;;;;3030:20;:39;;;;;3068:1;3054:7;3062:1;3054:10;;;;;;;;;;;;;;;;;;:15;;;;3030:39;3022:48;;;;;;;;3106:4;3084:7;:19;3092:7;3100:1;3092:10;;;;;;;;;;;;;;;;;;3084:19;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;3003:3;;;;;;;2970:151;;;3139:7;3130:6;:16;;;;;;;;;;;;:::i;:::-;;3167:9;3156:8;:20;;;;2830:353;;;;;186:11348;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;", "deployedSourceMap": "186:11348:35:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2535:1;2523:9;:13;2519:61;;;2558:10;2550:30;;;2570:9;2550:30;;;;;;;;;;;;;;;;;;2519:61;186:11348;1030:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3710:460;;;;;;;;;;;;;;;;;;;;;;;;;;;;6276:291;;;;;;;;;;;;;;;;;;;;;;;;;;984:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;914:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9221:315;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3310:277;;;;;;;;;;;;;;;;;;;;;;;;;;;;7397:333;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8711:248;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;859:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9620:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;10830:702:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;9910:571:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;1085:28:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4992:207;;;;;;;;;;;;;;;;;;;;;;;;;;5808:344;;;;;;;;;;;;;;;;;;;;;;;;;;5458:244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;780:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1059:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4372:449;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6681:565;;;;;;;;;;;;;;;;;;;;;;;;;;1030:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3710:460::-;3858:6;1339:4;1317:27;;:10;:27;;;1309:36;;;;;;;;3800:5;1523:7;:14;1531:5;1523:14;;;;;;;;;;;;;;;;;;;;;;;;;1515:23;;;;;;;;3838:5;3821:7;:14;3829:5;3821:14;;;;;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;3865:1;3858:8;;3853:170;3886:1;3870:6;:13;;;;:17;3868:1;:19;3853:170;;;3923:5;3910:18;;:6;3917:1;3910:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;:18;;;3906:117;;;3960:6;3983:1;3967:6;:13;;;;:17;3960:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;3948:6;3955:1;3948:9;;;;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;4003:5;;3906:117;3889:3;;;;;;;3853:170;;;4049:1;4032:6;:18;;;;;;;;;;;;;;:::i;:::-;;4075:6;:13;;;;4064:8;;:24;4060:74;;;4102:32;4120:6;:13;;;;4102:17;:32::i;:::-;4060:74;4157:5;4144:19;;;;;;;;;;;;1355:1;3710:460;;:::o;6276:291::-;6359:10;1523:7;:14;1531:5;1523:14;;;;;;;;;;;;;;;;;;;;;;;;;1515:23;;;;;;;;6389:13;6404:10;1768:13;:28;1782:13;1768:28;;;;;;;;;;;:35;1797:5;1768:35;;;;;;;;;;;;;;;;;;;;;;;;;1760:44;;;;;;;;6436:13;2024:12;:27;2037:13;2024:27;;;;;;;;;;;:36;;;;;;;;;;;;2023:37;2015:46;;;;;;;;6508:5;6465:13;:28;6479:13;6465:28;;;;;;;;;;;:40;6494:10;6465:40;;;;;;;;;;;;;;;;:48;;;;;;;;;;;;;;;;;;6546:13;6534:10;6523:37;;;;;;;;;;;;1814:1;1548;;6276:291;;:::o;984:40::-;;;;;;;;;;;;;;;;;;;;;;:::o;914:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;9221:315::-;9324:10;9355:6;9362:1;9355:8;;9350:179;9367:16;;9365:1;:18;9350:179;;;9409:7;:36;;;;;9421:12;:15;9434:1;9421:15;;;;;;;;;;;:24;;;;;;;;;;;;9420:25;9409:36;:92;;;;9465:8;:36;;;;;9477:12;:15;9490:1;9477:15;;;;;;;;;;;:24;;;;;;;;;;;;9465:36;9409:92;9402:127;;;9528:1;9519:10;;;;9402:127;9385:3;;;;;;;9350:179;;;9221:315;;;;;:::o;3310:277::-;1339:4;1317:27;;:10;:27;;;1309:36;;;;;;;;3403:5;1430:7;:14;1438:5;1430:14;;;;;;;;;;;;;;;;;;;;;;;;;1429:15;1421:24;;;;;;;;3426:5;2150:1;2138:8;:13;;;;2130:22;;;;;;;;3474:1;3458:6;:13;;;;:17;3477:8;;819:2;2253:10;:29;;:68;;;;;2311:10;2298:9;:23;;2253:68;:98;;;;;2350:1;2337:9;:14;;2253:98;:129;;;;;2381:1;2367:10;:15;;2253:129;2245:138;;;;;;;;3518:4;3501:7;:14;3509:5;3501:14;;;;;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;3532:6;:18;;;;;;;;;;;:::i;:::-;;;;;;;;;;3544:5;3532:18;;;;;;;;;;;;;;;;;;;;;;;3574:5;3560:20;;;;;;;;;;;;2162:1;;1455;1355;3310:277;:::o;7397:333::-;7483:4;7503:10;7532:6;7516:1;7503:14;;7539:1;7532:8;;7527:197;7544:6;:13;;;;7542:1;:15;7527:197;;;7582:13;:28;7596:13;7582:28;;;;;;;;;;;:39;7611:6;7618:1;7611:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;7582:39;;;;;;;;;;;;;;;;;;;;;;;;;7578:71;;;7648:1;7639:10;;;;7578:71;7676:8;;7667:5;:17;7663:50;;;7709:4;7702:11;;;;7663:50;7559:3;;;;;;;7527:197;;;7397:333;;;;;;:::o;8711:248::-;8806:10;8837:6;8844:1;8837:8;;8832:120;8849:6;:13;;;;8847:1;:15;8832:120;;;8885:13;:28;8899:13;8885:28;;;;;;;;;;;:39;8914:6;8921:1;8914:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;8885:39;;;;;;;;;;;;;;;;;;;;;;;;;8881:71;;;8951:1;8942:10;;;;8881:71;8864:3;;;;;;;8832:120;;;8711:248;;;;:::o;859:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;9620:111::-;9686:9;;:::i;:::-;9718:6;9711:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9620:111;:::o;10830:702::-;10951:22;;:::i;:::-;11019:32;;:::i;:::-;11092:10;11116:6;11005:2;10997:4;:10;;10989:19;;;;;;;;11065:16;;11054:28;;;;;;;;;;;;;;;;;;;;;;;;11019:63;;11105:1;11092:14;;11139:1;11137:3;;11132:250;11144:16;;11142:1;:18;11132:250;;;11186:7;:36;;;;;11198:12;:15;11211:1;11198:15;;;;;;;;;;;:24;;;;;;;;;;;;11197:25;11186:36;:92;;;;11242:8;:36;;;;;11254:12;:15;11267:1;11254:15;;;;;;;;;;;:24;;;;;;;;;;;;11242:36;11186:92;11179:203;;;11338:1;11310:18;11329:5;11310:25;;;;;;;;;;;;;;;;;:29;;;;;11366:1;11357:10;;;;11179:203;11162:3;;;;;;;11132:250;;;11425:4;11420:2;:9;11409:21;;;;;;;;;;;;;;;;;;;;;;;;11391:39;;11447:4;11445:6;;11440:85;11455:2;11453:1;:4;11440:85;;;11504:18;11523:1;11504:21;;;;;;;;;;;;;;;;;;11476:15;11496:4;11492:1;:8;11476:25;;;;;;;;;;;;;;;;;:49;;;;;11459:3;;;;;;;11440:85;;;10830:702;;;;;;;;;:::o;9910:571::-;10001:24;;:::i;:::-;10041:34;;:::i;:::-;10116:10;10140:6;10092;:13;;;;10078:28;;;;;;;;;;;;;;;;;;;;;;;;10041:65;;10129:1;10116:14;;10163:1;10161:3;;10156:186;10168:6;:13;;;;10166:1;:15;10156:186;;;10204:13;:28;10218:13;10204:28;;;;;;;;;;;:39;10233:6;10240:1;10233:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;10204:39;;;;;;;;;;;;;;;;;;;;;;;;;10200:142;;;10290:6;10297:1;10290:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;10263:17;10281:5;10263:24;;;;;;;;;;;;;;;;;:36;;;;;;;;;;;10326:1;10317:10;;;;10200:142;10183:3;;;;;;;10156:186;;;10382:5;10368:20;;;;;;;;;;;;;;;;;;;;;;;;10351:37;;10405:1;10403:3;;10398:76;10410:5;10408:1;:7;10398:76;;;10454:17;10472:1;10454:20;;;;;;;;;;;;;;;;;;10434:14;10449:1;10434:17;;;;;;;;;;;;;;;;;:40;;;;;;;;;;;10417:3;;;;;;;10398:76;;;9910:571;;;;;;:::o;1085:28::-;;;;:::o;4992:207::-;1339:4;1317:27;;:10;:27;;;1309:36;;;;;;;;5094:6;:13;;;;5109:9;819:2;2253:10;:29;;:68;;;;;2311:10;2298:9;:23;;2253:68;:98;;;;;2350:1;2337:9;:14;;2253:98;:129;;;;;2381:1;2367:10;:15;;2253:129;2245:138;;;;;;;;5145:9;5134:8;:20;;;;5164:28;5182:9;5164:28;;;;;;;;;;;;;;;;;;1355:1;;4992:207;:::o;5808:344::-;5891:10;1523:7;:14;1531:5;1523:14;;;;;;;;;;;;;;;;;;;;;;;;;1515:23;;;;;;;;5929:13;1670:1;1627:12;:27;1640:13;1627:27;;;;;;;;;;;:39;;;;;;;;;;;;:44;;;;1619:53;;;;;;;;5965:13;5980:10;1904:13;:28;1918:13;1904:28;;;;;;;;;;;:35;1933:5;1904:35;;;;;;;;;;;;;;;;;;;;;;;;;1903:36;1895:45;;;;;;;;6049:4;6006:13;:28;6020:13;6006:28;;;;;;;;;;;:40;6035:10;6006:40;;;;;;;;;;;;;;;;:47;;;;;;;;;;;;;;;;;;6088:13;6076:10;6063:39;;;;;;;;;;;;6112:33;6131:13;6112:18;:33::i;:::-;1682:1;;1548;5808:344;;:::o;5458:244::-;5562:18;5612:40;5627:11;5640:5;5647:4;5612:14;:40::i;:::-;5596:56;;5662:33;5681:13;5662:18;:33::i;:::-;5458:244;;;;;:::o;780:41::-;819:2;780:41;:::o;1059:20::-;;;;:::o;4372:449::-;4543:6;1339:4;1317:27;;:10;:27;;;1309:36;;;;;;;;4481:5;1523:7;:14;1531:5;1523:14;;;;;;;;;;;;;;;;;;;;;;;;;1515:23;;;;;;;;4514:8;1430:7;:14;1438:5;1430:14;;;;;;;;;;;;;;;;;;;;;;;;;1429:15;1421:24;;;;;;;;4550:1;4543:8;;4538:149;4555:6;:13;;;;4553:1;:15;4538:149;;;4604:5;4591:18;;:6;4598:1;4591:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;:18;;;4587:100;;;4641:8;4629:6;4636:1;4629:9;;;;;;;;;;;;;;;;;;;:20;;;;;;;;;;;;;;;;;;4667:5;;4587:100;4570:3;;;;;;;4538:149;;;4713:5;4696:7;:14;4704:5;4696:14;;;;;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;4748:4;4728:7;:17;4736:8;4728:17;;;;;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;4775:5;4762:19;;;;;;;;;;;;4805:8;4791:23;;;;;;;;;;;;1548:1;1355;4372:449;;;:::o;6681:565::-;6916:23;6764:10;1523:7;:14;1531:5;1523:14;;;;;;;;;;;;;;;;;;;;;;;;;1515:23;;;;;;;;6794:13;6809:10;1768:13;:28;1782:13;1768:28;;;;;;;;;;;:35;1797:5;1768:35;;;;;;;;;;;;;;;;;;;;;;;;;1760:44;;;;;;;;6841:13;2024:12;:27;2037:13;2024:27;;;;;;;;;;;:36;;;;;;;;;;;;2023:37;2015:46;;;;;;;;6874:26;6886:13;6874:11;:26::i;:::-;6870:370;;;6942:12;:27;6955:13;6942:27;;;;;;;;;;;6916:53;;6998:4;6983:3;:12;;;:19;;;;;;;;;;;;;;;;;;7020:3;:15;;;;;;;;;;;;:20;;7047:3;:9;;;7058:3;:8;;7020:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7016:214;;;7095:13;7085:24;;;;;;;;;;7016:214;;;7163:13;7146:31;;;;;;;;;;7210:5;7195:3;:12;;;:20;;;;;;;;;;;;;;;;;;7016:214;6870:370;1814:1;1548;;6681:565;;;:::o;8063:451::-;8195:18;8165:11;2150:1;2138:8;:13;;;;2130:22;;;;;;;;8245:16;;8229:32;;8301:140;;;;;;;;;8340:11;8301:140;;;;;;8372:5;8301:140;;;;8397:4;8301:140;;;;8425:5;8301:140;;;;;8271:12;:27;8284:13;8271:27;;;;;;;;;;;:170;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8471:1;8451:16;;:21;;;;;;;;;;;8493:13;8482:25;;;;;;;;;;8063:451;;;;;;:::o;186:11348::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", "source": "pragma solidity 0.4.18;\n\n\n/// @title Multisignature wallet - Allows multiple parties to agree on transactions before execution.\n/// @author Stefan George - \ncontract MultiSigWallet {\n\n /*\n * Events\n */\n event Confirmation(address indexed sender, uint indexed transactionId);\n event Revocation(address indexed sender, uint indexed transactionId);\n event Submission(uint indexed transactionId);\n event Execution(uint indexed transactionId);\n event ExecutionFailure(uint indexed transactionId);\n event Deposit(address indexed sender, uint value);\n event OwnerAddition(address indexed owner);\n event OwnerRemoval(address indexed owner);\n event RequirementChange(uint required);\n\n /*\n * Constants\n */\n uint constant public MAX_OWNER_COUNT = 50;\n\n /*\n * Storage\n */\n mapping (uint => Transaction) public transactions;\n mapping (uint => mapping (address => bool)) public confirmations;\n mapping (address => bool) public isOwner;\n address[] public owners;\n uint public required;\n uint public transactionCount;\n\n struct Transaction {\n address destination;\n uint value;\n bytes data;\n bool executed;\n }\n\n /*\n * Modifiers\n */\n modifier onlyWallet() {\n require(msg.sender == address(this));\n _;\n }\n\n modifier ownerDoesNotExist(address owner) {\n require(!isOwner[owner]);\n _;\n }\n\n modifier ownerExists(address owner) {\n require(isOwner[owner]);\n _;\n }\n\n modifier transactionExists(uint transactionId) {\n require(transactions[transactionId].destination != 0);\n _;\n }\n\n modifier confirmed(uint transactionId, address owner) {\n require(confirmations[transactionId][owner]);\n _;\n }\n\n modifier notConfirmed(uint transactionId, address owner) {\n require(!confirmations[transactionId][owner]);\n _;\n }\n\n modifier notExecuted(uint transactionId) {\n require(!transactions[transactionId].executed);\n _;\n }\n\n modifier notNull(address _address) {\n require(_address != 0);\n _;\n }\n\n modifier validRequirement(uint ownerCount, uint _required) {\n require(ownerCount <= MAX_OWNER_COUNT\n && _required <= ownerCount\n && _required != 0\n && ownerCount != 0);\n _;\n }\n\n /// @dev Fallback function allows to deposit ether.\n function()\n payable\n public\n {\n if (msg.value > 0)\n Deposit(msg.sender, msg.value);\n }\n\n /*\n * Public functions\n */\n /// @dev Contract constructor sets initial owners and required number of confirmations.\n /// @param _owners List of initial owners.\n /// @param _required Number of required confirmations.\n function MultiSigWallet(address[] _owners, uint _required)\n public\n validRequirement(_owners.length, _required)\n {\n for (uint i=0; i<_owners.length; i++) {\n require(!isOwner[_owners[i]] && _owners[i] != 0);\n isOwner[_owners[i]] = true;\n }\n owners = _owners;\n required = _required;\n }\n\n /// @dev Allows to add a new owner. Transaction has to be sent by wallet.\n /// @param owner Address of new owner.\n function addOwner(address owner)\n public\n onlyWallet\n ownerDoesNotExist(owner)\n notNull(owner)\n validRequirement(owners.length + 1, required)\n {\n isOwner[owner] = true;\n owners.push(owner);\n OwnerAddition(owner);\n }\n\n /// @dev Allows to remove an owner. Transaction has to be sent by wallet.\n /// @param owner Address of owner.\n function removeOwner(address owner)\n public\n onlyWallet\n ownerExists(owner)\n {\n isOwner[owner] = false;\n for (uint i=0; i owners.length)\n changeRequirement(owners.length);\n OwnerRemoval(owner);\n }\n\n /// @dev Allows to replace an owner with a new owner. Transaction has to be sent by wallet.\n /// @param owner Address of owner to be replaced.\n /// @param newOwner Address of new owner.\n function replaceOwner(address owner, address newOwner)\n public\n onlyWallet\n ownerExists(owner)\n ownerDoesNotExist(newOwner)\n {\n for (uint i=0; i bool) authorized;\n mapping (address => uint) agentToIndex; // ensures O(1) look-up\n address[] authorizedAgents;\n }\n\n function authorize(\n Permissions storage self,\n address agent,\n string callingContext\n )\n internal\n {\n require(isNotAuthorized(self, agent));\n\n self.authorized[agent] = true;\n self.authorizedAgents.push(agent);\n self.agentToIndex[agent] = self.authorizedAgents.length - 1;\n Authorized(agent, callingContext);\n }\n\n function revokeAuthorization(\n Permissions storage self,\n address agent,\n string callingContext\n )\n internal\n {\n /* We only want to do work in the case where the agent whose\n authorization is being revoked had authorization permissions in the\n first place. */\n require(isAuthorized(self, agent));\n\n uint indexOfAgentToRevoke = self.agentToIndex[agent];\n uint indexOfAgentToMove = self.authorizedAgents.length - 1;\n address agentToMove = self.authorizedAgents[indexOfAgentToMove];\n\n // Revoke the agent's authorization.\n delete self.authorized[agent];\n\n // Remove the agent from our collection of authorized agents.\n self.authorizedAgents[indexOfAgentToRevoke] = agentToMove;\n\n // Update our indices to reflect the above changes.\n self.agentToIndex[agentToMove] = indexOfAgentToRevoke;\n delete self.agentToIndex[agent];\n\n // Clean up memory that's no longer being used.\n delete self.authorizedAgents[indexOfAgentToMove];\n self.authorizedAgents.length -= 1;\n\n AuthorizationRevoked(agent, callingContext);\n }\n\n function isAuthorized(Permissions storage self, address agent)\n internal\n view\n returns (bool)\n {\n return self.authorized[agent];\n }\n\n function isNotAuthorized(Permissions storage self, address agent)\n internal\n view\n returns (bool)\n {\n return !isAuthorized(self, agent);\n }\n\n function getAuthorizedAgents(Permissions storage self)\n internal\n view\n returns (address[])\n {\n return self.authorizedAgents;\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/libraries/PermissionsLib.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/libraries/PermissionsLib.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/libraries/PermissionsLib.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/libraries/PermissionsLib.sol", "exportedSymbols": { "PermissionEvents": [ 6067 @@ -2970,5 +2970,5 @@ export const PermissionEvents = }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:47.597Z" + "updatedAt": "2018-10-09T17:45:35.509Z" } \ No newline at end of file diff --git a/artifacts/ts/PermissionsLib.ts b/artifacts/ts/PermissionsLib.ts index c27a4ca9..c00333dd 100644 --- a/artifacts/ts/PermissionsLib.ts +++ b/artifacts/ts/PermissionsLib.ts @@ -37,15 +37,15 @@ export const PermissionsLib = "type": "event" } ], - "bytecode": "0x60606040523415600e57600080fd5b603580601b6000396000f3006060604052600080fd00a165627a7a723058200e47fa0c31932608607a96cf0ff22f799a1c7566f52b4db84a7111f7c3bcf41f0029", - "deployedBytecode": "0x6060604052600080fd00a165627a7a723058200e47fa0c31932608607a96cf0ff22f799a1c7566f52b4db84a7111f7c3bcf41f0029", + "bytecode": "0x60606040523415600e57600080fd5b603580601b6000396000f3006060604052600080fd00a165627a7a723058206768524dfe495f4cfaf16bce9455dae5cc933b71ae46e9c7bb5f52096765abe50029", + "deployedBytecode": "0x6060604052600080fd00a165627a7a723058206768524dfe495f4cfaf16bce9455dae5cc933b71ae46e9c7bb5f52096765abe50029", "sourceMap": "1157:2653:17:-;;;;;;;;;;;;;;;;;", "deployedSourceMap": "1157:2653:17:-;;;;;", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\n\n/**\n * Note(kayvon): these events are emitted by our PermissionsLib, but all contracts that\n * depend on the library must also define the events in order for web3 clients to pick them up.\n * This topic is discussed in greater detail here (under the section \"Events and Libraries\"):\n * https://blog.aragon.one/library-driven-development-in-solidity-2bebcaf88736\n */\ncontract PermissionEvents {\n event Authorized(address indexed agent, string callingContext);\n event AuthorizationRevoked(address indexed agent, string callingContext);\n}\n\n\nlibrary PermissionsLib {\n\n // TODO(kayvon): remove these events and inherit from PermissionEvents when libraries are\n // capable of inheritance.\n // See relevant github issue here: https://github.com/ethereum/solidity/issues/891\n event Authorized(address indexed agent, string callingContext);\n event AuthorizationRevoked(address indexed agent, string callingContext);\n\n struct Permissions {\n mapping (address => bool) authorized;\n mapping (address => uint) agentToIndex; // ensures O(1) look-up\n address[] authorizedAgents;\n }\n\n function authorize(\n Permissions storage self,\n address agent,\n string callingContext\n )\n internal\n {\n require(isNotAuthorized(self, agent));\n\n self.authorized[agent] = true;\n self.authorizedAgents.push(agent);\n self.agentToIndex[agent] = self.authorizedAgents.length - 1;\n Authorized(agent, callingContext);\n }\n\n function revokeAuthorization(\n Permissions storage self,\n address agent,\n string callingContext\n )\n internal\n {\n /* We only want to do work in the case where the agent whose\n authorization is being revoked had authorization permissions in the\n first place. */\n require(isAuthorized(self, agent));\n\n uint indexOfAgentToRevoke = self.agentToIndex[agent];\n uint indexOfAgentToMove = self.authorizedAgents.length - 1;\n address agentToMove = self.authorizedAgents[indexOfAgentToMove];\n\n // Revoke the agent's authorization.\n delete self.authorized[agent];\n\n // Remove the agent from our collection of authorized agents.\n self.authorizedAgents[indexOfAgentToRevoke] = agentToMove;\n\n // Update our indices to reflect the above changes.\n self.agentToIndex[agentToMove] = indexOfAgentToRevoke;\n delete self.agentToIndex[agent];\n\n // Clean up memory that's no longer being used.\n delete self.authorizedAgents[indexOfAgentToMove];\n self.authorizedAgents.length -= 1;\n\n AuthorizationRevoked(agent, callingContext);\n }\n\n function isAuthorized(Permissions storage self, address agent)\n internal\n view\n returns (bool)\n {\n return self.authorized[agent];\n }\n\n function isNotAuthorized(Permissions storage self, address agent)\n internal\n view\n returns (bool)\n {\n return !isAuthorized(self, agent);\n }\n\n function getAuthorizedAgents(Permissions storage self)\n internal\n view\n returns (address[])\n {\n return self.authorizedAgents;\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/libraries/PermissionsLib.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/libraries/PermissionsLib.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/libraries/PermissionsLib.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/libraries/PermissionsLib.sol", "exportedSymbols": { "PermissionEvents": [ 6067 @@ -2977,7 +2977,7 @@ export const PermissionsLib = "42": { "events": {}, "links": {}, - "address": "0xaa5ce701623be22ff89ae25fc1f6cc923127ca4c" + "address": "0x7852987ebd814ccb8ae63ff0ebbebaf12b8b45ab" }, "70": { "events": {}, @@ -2986,5 +2986,5 @@ export const PermissionsLib = } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:16:13.720Z" + "updatedAt": "2018-10-09T17:53:04.866Z" } \ No newline at end of file diff --git a/artifacts/ts/RepaymentRouter.ts b/artifacts/ts/RepaymentRouter.ts index 6f52bfe7..fe2c3416 100644 --- a/artifacts/ts/RepaymentRouter.ts +++ b/artifacts/ts/RepaymentRouter.ts @@ -211,15 +211,15 @@ export const RepaymentRouter = "type": "event" } ], - "bytecode": "0x606060405260008060146101000a81548160ff021916908315150217905550341561002957600080fd5b604051604080610fdb83398101604052808051906020019091908051906020019091905050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050610eba806101216000396000f30060606040526004361061008e576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630eefdbad146100935780632f866f73146100e85780633f4ba83a1461013d5780635c975abb146101525780638456cb591461017f5780638da5cb5b14610194578063f2fde38b146101e9578063ff26812514610222575b600080fd5b341561009e57600080fd5b6100a6610285565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156100f357600080fd5b6100fb6102ab565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561014857600080fd5b6101506102d1565b005b341561015d57600080fd5b61016561038f565b604051808215151515815260200191505060405180910390f35b341561018a57600080fd5b6101926103a2565b005b341561019f57600080fd5b6101a7610462565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101f457600080fd5b610220600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610487565b005b341561022d57600080fd5b61026f60048080356000191690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506105dc565b6040518082815260200191505060405180910390f35b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561032c57600080fd5b600060149054906101000a900460ff16151561034757600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b600060149054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156103fd57600080fd5b600060149054906101000a900460ff1615151561041957600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156104e257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561051e57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060008060149054906101000a900460ff161515156105fc57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415151561063857600080fd5b60008511151561064757600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639758af1e876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156106e857600080fd5b6102c65a03f115156106f957600080fd5b5050506040518051905015156107535785600019166000600281111561071b57fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009250610e85565b848473ffffffffffffffffffffffffffffffffffffffff166370a08231336000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15156107f757600080fd5b6102c65a03f1151561080857600080fd5b5050506040518051905010806109305750848473ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b151561091357600080fd5b6102c65a03f1151561092457600080fd5b50505060405180519050105b1561097f5785600019166001600281111561094757fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009250610e85565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f6f494c9876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610a2057600080fd5b6102c65a03f11515610a3157600080fd5b505050604051805190509150600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ba20dda4876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610ade57600080fd5b6102c65a03f11515610aef57600080fd5b5050506040518051905090508173ffffffffffffffffffffffffffffffffffffffff16635f0280ba87338489896000604051602001526040518663ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050602060405180830381600087803b1515610c1e57600080fd5b6102c65a03f11515610c2f57600080fd5b505050604051805190501515610c88578560001916600280811115610c5057fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009250610e85565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166315dacbea853384896000604051602001526040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050602060405180830381600087803b1515610dbd57600080fd5b6102c65a03f11515610dce57600080fd5b505050604051805190501515610de357600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1687600019167f43ea5a2b552489bf9de7c3d6ded86e3b82423e034255d06db4b388f806db50d08888604051808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a48492505b505093925050505600a165627a7a72305820ee7b0fdfba8706d47069dc4c8b5eb6c445fa373c8a75982dd71f183b2af501850029", - "deployedBytecode": "0x60606040526004361061008e576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630eefdbad146100935780632f866f73146100e85780633f4ba83a1461013d5780635c975abb146101525780638456cb591461017f5780638da5cb5b14610194578063f2fde38b146101e9578063ff26812514610222575b600080fd5b341561009e57600080fd5b6100a6610285565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156100f357600080fd5b6100fb6102ab565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561014857600080fd5b6101506102d1565b005b341561015d57600080fd5b61016561038f565b604051808215151515815260200191505060405180910390f35b341561018a57600080fd5b6101926103a2565b005b341561019f57600080fd5b6101a7610462565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101f457600080fd5b610220600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610487565b005b341561022d57600080fd5b61026f60048080356000191690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506105dc565b6040518082815260200191505060405180910390f35b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561032c57600080fd5b600060149054906101000a900460ff16151561034757600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b600060149054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156103fd57600080fd5b600060149054906101000a900460ff1615151561041957600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156104e257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561051e57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060008060149054906101000a900460ff161515156105fc57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415151561063857600080fd5b60008511151561064757600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639758af1e876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156106e857600080fd5b6102c65a03f115156106f957600080fd5b5050506040518051905015156107535785600019166000600281111561071b57fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009250610e85565b848473ffffffffffffffffffffffffffffffffffffffff166370a08231336000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15156107f757600080fd5b6102c65a03f1151561080857600080fd5b5050506040518051905010806109305750848473ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b151561091357600080fd5b6102c65a03f1151561092457600080fd5b50505060405180519050105b1561097f5785600019166001600281111561094757fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009250610e85565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f6f494c9876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610a2057600080fd5b6102c65a03f11515610a3157600080fd5b505050604051805190509150600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ba20dda4876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610ade57600080fd5b6102c65a03f11515610aef57600080fd5b5050506040518051905090508173ffffffffffffffffffffffffffffffffffffffff16635f0280ba87338489896000604051602001526040518663ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050602060405180830381600087803b1515610c1e57600080fd5b6102c65a03f11515610c2f57600080fd5b505050604051805190501515610c88578560001916600280811115610c5057fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009250610e85565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166315dacbea853384896000604051602001526040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050602060405180830381600087803b1515610dbd57600080fd5b6102c65a03f11515610dce57600080fd5b505050604051805190501515610de357600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1687600019167f43ea5a2b552489bf9de7c3d6ded86e3b82423e034255d06db4b388f806db50d08888604051808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a48492505b505093925050505600a165627a7a72305820ee7b0fdfba8706d47069dc4c8b5eb6c445fa373c8a75982dd71f183b2af501850029", + "bytecode": "0x606060405260008060146101000a81548160ff021916908315150217905550341561002957600080fd5b604051604080610fdb83398101604052808051906020019091908051906020019091905050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050610eba806101216000396000f30060606040526004361061008e576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630eefdbad146100935780632f866f73146100e85780633f4ba83a1461013d5780635c975abb146101525780638456cb591461017f5780638da5cb5b14610194578063f2fde38b146101e9578063ff26812514610222575b600080fd5b341561009e57600080fd5b6100a6610285565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156100f357600080fd5b6100fb6102ab565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561014857600080fd5b6101506102d1565b005b341561015d57600080fd5b61016561038f565b604051808215151515815260200191505060405180910390f35b341561018a57600080fd5b6101926103a2565b005b341561019f57600080fd5b6101a7610462565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101f457600080fd5b610220600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610487565b005b341561022d57600080fd5b61026f60048080356000191690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506105dc565b6040518082815260200191505060405180910390f35b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561032c57600080fd5b600060149054906101000a900460ff16151561034757600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b600060149054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156103fd57600080fd5b600060149054906101000a900460ff1615151561041957600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156104e257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561051e57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060008060149054906101000a900460ff161515156105fc57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415151561063857600080fd5b60008511151561064757600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639758af1e876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156106e857600080fd5b6102c65a03f115156106f957600080fd5b5050506040518051905015156107535785600019166000600281111561071b57fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009250610e85565b848473ffffffffffffffffffffffffffffffffffffffff166370a08231336000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15156107f757600080fd5b6102c65a03f1151561080857600080fd5b5050506040518051905010806109305750848473ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b151561091357600080fd5b6102c65a03f1151561092457600080fd5b50505060405180519050105b1561097f5785600019166001600281111561094757fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009250610e85565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f6f494c9876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610a2057600080fd5b6102c65a03f11515610a3157600080fd5b505050604051805190509150600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ba20dda4876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610ade57600080fd5b6102c65a03f11515610aef57600080fd5b5050506040518051905090508173ffffffffffffffffffffffffffffffffffffffff16635f0280ba87338489896000604051602001526040518663ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050602060405180830381600087803b1515610c1e57600080fd5b6102c65a03f11515610c2f57600080fd5b505050604051805190501515610c88578560001916600280811115610c5057fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009250610e85565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166315dacbea853384896000604051602001526040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050602060405180830381600087803b1515610dbd57600080fd5b6102c65a03f11515610dce57600080fd5b505050604051805190501515610de357600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1687600019167f43ea5a2b552489bf9de7c3d6ded86e3b82423e034255d06db4b388f806db50d08888604051808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a48492505b505093925050505600a165627a7a72305820a5f5f8b11da4685987d7b82cefa96c87871c531e62ad3e028cb997d5c80040310029", + "deployedBytecode": "0x60606040526004361061008e576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630eefdbad146100935780632f866f73146100e85780633f4ba83a1461013d5780635c975abb146101525780638456cb591461017f5780638da5cb5b14610194578063f2fde38b146101e9578063ff26812514610222575b600080fd5b341561009e57600080fd5b6100a6610285565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156100f357600080fd5b6100fb6102ab565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561014857600080fd5b6101506102d1565b005b341561015d57600080fd5b61016561038f565b604051808215151515815260200191505060405180910390f35b341561018a57600080fd5b6101926103a2565b005b341561019f57600080fd5b6101a7610462565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101f457600080fd5b610220600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610487565b005b341561022d57600080fd5b61026f60048080356000191690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506105dc565b6040518082815260200191505060405180910390f35b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561032c57600080fd5b600060149054906101000a900460ff16151561034757600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b600060149054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156103fd57600080fd5b600060149054906101000a900460ff1615151561041957600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156104e257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561051e57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060008060149054906101000a900460ff161515156105fc57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415151561063857600080fd5b60008511151561064757600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639758af1e876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156106e857600080fd5b6102c65a03f115156106f957600080fd5b5050506040518051905015156107535785600019166000600281111561071b57fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009250610e85565b848473ffffffffffffffffffffffffffffffffffffffff166370a08231336000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15156107f757600080fd5b6102c65a03f1151561080857600080fd5b5050506040518051905010806109305750848473ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b151561091357600080fd5b6102c65a03f1151561092457600080fd5b50505060405180519050105b1561097f5785600019166001600281111561094757fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009250610e85565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f6f494c9876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610a2057600080fd5b6102c65a03f11515610a3157600080fd5b505050604051805190509150600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ba20dda4876000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610ade57600080fd5b6102c65a03f11515610aef57600080fd5b5050506040518051905090508173ffffffffffffffffffffffffffffffffffffffff16635f0280ba87338489896000604051602001526040518663ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200195505050505050602060405180830381600087803b1515610c1e57600080fd5b6102c65a03f11515610c2f57600080fd5b505050604051805190501515610c88578560001916600280811115610c5057fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009250610e85565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166315dacbea853384896000604051602001526040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050602060405180830381600087803b1515610dbd57600080fd5b6102c65a03f11515610dce57600080fd5b505050604051805190501515610de357600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1687600019167f43ea5a2b552489bf9de7c3d6ded86e3b82423e034255d06db4b388f806db50d08888604051808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a48492505b505093925050505600a165627a7a72305820a5f5f8b11da4685987d7b82cefa96c87871c531e62ad3e028cb997d5c80040310029", "sourceMap": "1291:2734:10:-;;;268:5:37;247:26;;;;;;;;;;;;;;;;;;;;1936:214:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;509:10:39;501:5;;:18;;;;;;;;;;;;;;;;;;2059:13:10;2031:12;;:42;;;;;;;;;;;;;;;;;;2123:19;2083:18;;:60;;;;;;;;;;;;;;;;;;1936:214;;1291:2734;;;;;;", "deployedSourceMap": "1291:2734:10:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1372:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1334:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;833:87:37;;;;;;;;;;;;;;247:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;666:85;;;;;;;;;;;;;;238:20:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;832:169;;;;;;;;;;;;;;;;;;;;;;;;;;;;2360:1663:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1372:44;;;;;;;;;;;;;:::o;1334:32::-;;;;;;;;;;;;;:::o;833:87:37:-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;568:6:37;;;;;;;;;;;560:15;;;;;;;;895:5;886:6;;:14;;;;;;;;;;;;;;;;;;906:9;;;;;;;;;;833:87::o;247:26::-;;;;;;;;;;;;;:::o;666:85::-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;729:4;720:6;;:13;;;;;;;;;;;;;;;;;;739:7;;;;;;;;;;666:85::o;238:20:39:-;;;;;;;;;;;;;:::o;832:169::-;653:5;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;928:1;908:22;;:8;:22;;;;900:31;;;;;;;;965:8;937:37;;958:5;;;;;;;;;;;937:37;;;;;;;;;;;;988:8;980:5;;:16;;;;;;;;;;;;;;;;;;832:169;:::o;2360:1663:10:-;2518:18;3229:21;3305:19;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;2584:1:10;2560:26;;:12;:26;;;;2552:35;;;;;;;;2614:1;2605:6;:10;2597:19;;;;;;;;2668:12;;;;;;;;;;;:27;;;2696:11;2668:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2667:41;2663:157;;;2775:11;2724:63;;;2739:33;2733:40;;;;;;;;2724:63;;;;;;;;;;;;2808:1;2801:8;;;;2663:157;2969:6;2931:12;2925:29;;;2955:10;2925:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:50;:136;;;;3055:6;2997:12;2991:29;;;3021:10;3033:18;;;;;;;;;;;2991:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:70;2925:136;2921:265;;;3141:11;3077:76;;;3092:46;3086:53;;;;;;;;3077:76;;;;;;;;;;;;3174:1;3167:8;;;;2921:265;3253:12;;;;;;;;;;;:29;;;3283:11;3253:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3229:66;;3327:12;;;;;;;;;;;:27;;;3355:11;3327:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3305:62;;3396:13;3382:46;;;3442:11;3467:10;3491:11;3516:6;3536:12;3382:176;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3381:177;3377:303;;;3635:11;3574:73;;;3589:43;3583:50;;;;;;;;3574:73;;;;;;;;;;;;3668:1;3661:8;;;;3377:303;3737:18;;;;;;;;;;;:31;;;3782:12;3808:10;3832:11;3857:6;3737:136;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3729:145;;;;;;;;3958:11;3920:72;;3946:10;3920:72;;3933:11;3920:72;;;;3971:6;3979:12;3920:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;4010:6;4003:13;;429:1:37;2360:1663:10;;;;;;;:::o", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\nimport \"./DebtRegistry.sol\";\nimport \"./TermsContract.sol\";\nimport \"./TokenTransferProxy.sol\";\nimport \"zeppelin-solidity/contracts/token/ERC20/ERC20.sol\";\nimport \"zeppelin-solidity/contracts/lifecycle/Pausable.sol\";\n\n\n/**\n * The RepaymentRouter routes allowers payers to make repayments on any\n * given debt agreement in any given token by routing the payments to\n * the debt agreement's beneficiary. Additionally, the router acts\n * as a trusted oracle to the debt agreement's terms contract, informing\n * it of exactly what payments have been made in what quantity and in what token.\n *\n * Authors: Jaynti Kanani -- Github: jdkanani, Nadav Hollander -- Github: nadavhollander\n */\ncontract RepaymentRouter is Pausable {\n DebtRegistry public debtRegistry;\n TokenTransferProxy public tokenTransferProxy;\n\n enum Errors {\n DEBT_AGREEMENT_NONEXISTENT,\n PAYER_BALANCE_OR_ALLOWANCE_INSUFFICIENT,\n REPAYMENT_REJECTED_BY_TERMS_CONTRACT\n }\n\n event LogRepayment(\n bytes32 indexed _agreementId,\n address indexed _payer,\n address indexed _beneficiary,\n uint _amount,\n address _token\n );\n\n event LogError(uint8 indexed _errorId, bytes32 indexed _agreementId);\n\n /**\n * Constructor points the repayment router at the deployed registry contract.\n */\n function RepaymentRouter (address _debtRegistry, address _tokenTransferProxy) public {\n debtRegistry = DebtRegistry(_debtRegistry);\n tokenTransferProxy = TokenTransferProxy(_tokenTransferProxy);\n }\n\n /**\n * Given an agreement id, routes a repayment\n * of a given ERC20 token to the debt's current beneficiary, and reports the repayment\n * to the debt's associated terms contract.\n */\n function repay(\n bytes32 agreementId,\n uint256 amount,\n address tokenAddress\n )\n public\n whenNotPaused\n returns (uint _amountRepaid)\n {\n require(tokenAddress != address(0));\n require(amount > 0);\n\n // Ensure agreement exists.\n if (!debtRegistry.doesEntryExist(agreementId)) {\n LogError(uint8(Errors.DEBT_AGREEMENT_NONEXISTENT), agreementId);\n return 0;\n }\n\n // Check payer has sufficient balance and has granted router sufficient allowance.\n if (ERC20(tokenAddress).balanceOf(msg.sender) < amount ||\n ERC20(tokenAddress).allowance(msg.sender, tokenTransferProxy) < amount) {\n LogError(uint8(Errors.PAYER_BALANCE_OR_ALLOWANCE_INSUFFICIENT), agreementId);\n return 0;\n }\n\n // Notify terms contract\n address termsContract = debtRegistry.getTermsContract(agreementId);\n address beneficiary = debtRegistry.getBeneficiary(agreementId);\n if (!TermsContract(termsContract).registerRepayment(\n agreementId,\n msg.sender,\n beneficiary,\n amount,\n tokenAddress\n )) {\n LogError(uint8(Errors.REPAYMENT_REJECTED_BY_TERMS_CONTRACT), agreementId);\n return 0;\n }\n\n // Transfer amount to creditor\n require(tokenTransferProxy.transferFrom(\n tokenAddress,\n msg.sender,\n beneficiary,\n amount\n ));\n\n // Log event for repayment\n LogRepayment(agreementId, msg.sender, beneficiary, amount, tokenAddress);\n\n return amount;\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/RepaymentRouter.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/RepaymentRouter.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/RepaymentRouter.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/RepaymentRouter.sol", "exportedSymbols": { "RepaymentRouter": [ 4707 @@ -242,7 +242,7 @@ export const RepaymentRouter = { "attributes": { "SourceUnit": 3159, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/DebtRegistry.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/DebtRegistry.sol", "file": "./DebtRegistry.sol", "scope": 4708, "symbolAliases": [ @@ -257,7 +257,7 @@ export const RepaymentRouter = { "attributes": { "SourceUnit": 4758, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/TermsContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/TermsContract.sol", "file": "./TermsContract.sol", "scope": 4708, "symbolAliases": [ @@ -272,7 +272,7 @@ export const RepaymentRouter = { "attributes": { "SourceUnit": 5207, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/TokenTransferProxy.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/TokenTransferProxy.sol", "file": "./TokenTransferProxy.sol", "scope": 4708, "symbolAliases": [ @@ -3302,7 +3302,7 @@ export const RepaymentRouter = } }, "links": {}, - "address": "0xd2c8cf211f4753a10b145c90950add769a8a6bc2" + "address": "0x03ff589c02e794dbb55394ba86c62ba68e399688" }, "70": { "events": { @@ -3390,5 +3390,5 @@ export const RepaymentRouter = } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:15:01.333Z" + "updatedAt": "2018-10-09T17:51:53.137Z" } \ No newline at end of file diff --git a/artifacts/ts/SafeMath.ts b/artifacts/ts/SafeMath.ts index db8f2b7a..c41581f3 100644 --- a/artifacts/ts/SafeMath.ts +++ b/artifacts/ts/SafeMath.ts @@ -1344,5 +1344,5 @@ export const SafeMath = }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:48.038Z" + "updatedAt": "2018-10-09T17:45:35.450Z" } \ No newline at end of file diff --git a/artifacts/ts/SaleClockAuction.ts b/artifacts/ts/SaleClockAuction.ts index 08692e02..4df03ab8 100644 --- a/artifacts/ts/SaleClockAuction.ts +++ b/artifacts/ts/SaleClockAuction.ts @@ -385,15 +385,15 @@ export const SaleClockAuction = "type": "event" } ], - "bytecode": "0x606060405260008060146101000a81548160ff0219169083151502179055506001600460006101000a81548160ff021916908315150217905550341561004457600080fd5b6040516040806118da8339810160405280805190602001909190805190602001909190505081816000336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061271082111515156100be57600080fd5b816002819055508290508073ffffffffffffffffffffffffffffffffffffffff166301ffc9a7639a20483d7c0100000000000000000000000000000000000000000000000000000000026000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001915050602060405180830381600087803b15156101a057600080fd5b6102c65a03f115156101b157600080fd5b5050506040518051905015156101c657600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050506116bf8061021b6000396000f3006060604052600436106100fc576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806327ebe40a146101015780633f4ba83a1461015e578063454a2ab31461018b578063484eccb4146101a35780635c975abb146101da5780635fd8c7101461020757806378bd79351461021c57806383b5ff8b1461029b5780638456cb59146102c457806385b86188146102f1578063878eb3681461031e5780638a98a9cc146103415780638da5cb5b1461036a57806396b5a755146103bf578063c55d0f56146103e2578063dd1b7a0f14610419578063eac9d94c1461046e578063f2fde38b14610497575b600080fd5b341561010c57600080fd5b61015c600480803590602001909190803590602001909190803590602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506104d0565b005b341561016957600080fd5b610171610620565b604051808215151515815260200191505060405180910390f35b6101a160048080359060200190919050506106e5565b005b34156101ae57600080fd5b6101c460048080359060200190919050506107c7565b6040518082815260200191505060405180910390f35b34156101e557600080fd5b6101ed6107e1565b604051808215151515815260200191505060405180910390f35b341561021257600080fd5b61021a6107f4565b005b341561022757600080fd5b61023d60048080359060200190919050506108ff565b604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b34156102a657600080fd5b6102ae610a22565b6040518082815260200191505060405180910390f35b34156102cf57600080fd5b6102d7610a28565b604051808215151515815260200191505060405180910390f35b34156102fc57600080fd5b610304610aef565b604051808215151515815260200191505060405180910390f35b341561032957600080fd5b61033f6004808035906020019091905050610b02565b005b341561034c57600080fd5b610354610bd4565b6040518082815260200191505060405180910390f35b341561037557600080fd5b61037d610bda565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103ca57600080fd5b6103e06004808035906020019091905050610bff565b005b34156103ed57600080fd5b6104036004808035906020019091905050610c9b565b6040518082815260200191505060405180910390f35b341561042457600080fd5b61042c610cd8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561047957600080fd5b610481610cfe565b6040518082815260200191505060405180910390f35b34156104a257600080fd5b6104ce600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610d4a565b005b6104d8611615565b846fffffffffffffffffffffffffffffffff16851415156104f857600080fd5b836fffffffffffffffffffffffffffffffff168414151561051857600080fd5b8267ffffffffffffffff168314151561053057600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561058c57600080fd5b6105968287610e1f565b60a0604051908101604052808373ffffffffffffffffffffffffffffffffffffffff168152602001866fffffffffffffffffffffffffffffffff168152602001856fffffffffffffffffffffffffffffffff1681526020018467ffffffffffffffff1681526020014267ffffffffffffffff1681525090506106188682610f2f565b505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561067d57600080fd5b600060149054906101000a900460ff16151561069857600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a16001905090565b6000806003600084815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915061072b8334611114565b905061073733846112b3565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156107c2578060066005805481151561079d57fe5b066005811015156107aa57fe5b01819055506005600081548092919060010191905055505b505050565b6006816005811015156107d657fe5b016000915090505481565b600060149054906101000a900460ff1681565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806108a257508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156108ad57600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505090505050565b6000806000806000806003600088815260200190815260200160002090506109268161138f565b151561093157600080fd5b8060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a90046fffffffffffffffffffffffffffffffff168260010160109054906101000a90046fffffffffffffffffffffffffffffffff168360020160009054906101000a900467ffffffffffffffff168460020160089054906101000a900467ffffffffffffffff16836fffffffffffffffffffffffffffffffff169350826fffffffffffffffffffffffffffffffff1692508167ffffffffffffffff1691508067ffffffffffffffff169050955095509550955095505091939590929450565b60025481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a8557600080fd5b600060149054906101000a900460ff16151515610aa157600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a16001905090565b600460009054906101000a900460ff1681565b60008060149054906101000a900460ff161515610b1e57600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610b7957600080fd5b600360008381526020019081526020016000209050610b978161138f565b1515610ba257600080fd5b610bd0828260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166113bd565b5050565b60055481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600360008481526020019081526020016000209150610c208261138f565b1515610c2b57600080fd5b8160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610c8c57600080fd5b610c9683826113bd565b505050565b600080600360008481526020019081526020016000209050610cbc8161138f565b1515610cc757600080fd5b610cd08161140b565b915050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000809150600090505b6005811015610d3657600681600581101515610d2357fe5b0154820191508080600101915050610d0b565b600582811515610d4257fe5b049250505090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610da557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515610e1c57806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8330846040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1515610f1757600080fd5b6102c65a03f11515610f2857600080fd5b5050505050565b603c816060015167ffffffffffffffff1610151515610f4d57600080fd5b806003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060408201518160010160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160020160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050507fa9c8dfcda5664a5a124c713e386da27de87432d5b668e79458501eb296389ba78282602001516fffffffffffffffffffffffffffffffff1683604001516fffffffffffffffffffffffffffffffff16846060015167ffffffffffffffff166040518085815260200184815260200183815260200182815260200194505050505060405180910390a15050565b6000806000806000806000600360008a8152602001908152602001600020955061113d8661138f565b151561114857600080fd5b6111518661140b565b945084881015151561116257600080fd5b8560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169350611192896114fe565b60008511156111ec576111a4856115ba565b925082850391508373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015156111eb57600080fd5b5b84880390503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561123157600080fd5b7f4fcc30d90a842164dd58501ab874a101a3749c3d4747139cefe7c876f4ccebd2898633604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a184965050505050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b151561137757600080fd5b6102c65a03f1151561138857600080fd5b5050505050565b6000808260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16119050919050565b6113c6826114fe565b6113d081836112b3565b7f2809c7e17bf978fbc7194c0a694b638c4215e9140cacc6c38ca36010b45697df826040518082815260200191505060405180910390a15050565b600080600090508260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16421115611464578260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16420390505b6114f68360010160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168460010160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168560020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16846115d5565b915050919050565b60036000828152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160006101000a8154906fffffffffffffffffffffffffffffffff02191690556001820160106101000a8154906fffffffffffffffffffffffffffffffff02191690556002820160006101000a81549067ffffffffffffffff02191690556002820160086101000a81549067ffffffffffffffff0219169055505050565b600061271060025483028115156115cd57fe5b049050919050565b60008060008085851015156115ec5786935061160a565b8787039250858584028115156115fe57fe5b05915081880190508093505b505050949350505050565b60a060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff16815250905600a165627a7a72305820a7e0dcb0ba6b30bc244fc3a1fb1e2909ccda4306f3ad3767e9142549747f6d5b0029", - "deployedBytecode": "0x6060604052600436106100fc576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806327ebe40a146101015780633f4ba83a1461015e578063454a2ab31461018b578063484eccb4146101a35780635c975abb146101da5780635fd8c7101461020757806378bd79351461021c57806383b5ff8b1461029b5780638456cb59146102c457806385b86188146102f1578063878eb3681461031e5780638a98a9cc146103415780638da5cb5b1461036a57806396b5a755146103bf578063c55d0f56146103e2578063dd1b7a0f14610419578063eac9d94c1461046e578063f2fde38b14610497575b600080fd5b341561010c57600080fd5b61015c600480803590602001909190803590602001909190803590602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506104d0565b005b341561016957600080fd5b610171610620565b604051808215151515815260200191505060405180910390f35b6101a160048080359060200190919050506106e5565b005b34156101ae57600080fd5b6101c460048080359060200190919050506107c7565b6040518082815260200191505060405180910390f35b34156101e557600080fd5b6101ed6107e1565b604051808215151515815260200191505060405180910390f35b341561021257600080fd5b61021a6107f4565b005b341561022757600080fd5b61023d60048080359060200190919050506108ff565b604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b34156102a657600080fd5b6102ae610a22565b6040518082815260200191505060405180910390f35b34156102cf57600080fd5b6102d7610a28565b604051808215151515815260200191505060405180910390f35b34156102fc57600080fd5b610304610aef565b604051808215151515815260200191505060405180910390f35b341561032957600080fd5b61033f6004808035906020019091905050610b02565b005b341561034c57600080fd5b610354610bd4565b6040518082815260200191505060405180910390f35b341561037557600080fd5b61037d610bda565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103ca57600080fd5b6103e06004808035906020019091905050610bff565b005b34156103ed57600080fd5b6104036004808035906020019091905050610c9b565b6040518082815260200191505060405180910390f35b341561042457600080fd5b61042c610cd8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561047957600080fd5b610481610cfe565b6040518082815260200191505060405180910390f35b34156104a257600080fd5b6104ce600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610d4a565b005b6104d8611615565b846fffffffffffffffffffffffffffffffff16851415156104f857600080fd5b836fffffffffffffffffffffffffffffffff168414151561051857600080fd5b8267ffffffffffffffff168314151561053057600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561058c57600080fd5b6105968287610e1f565b60a0604051908101604052808373ffffffffffffffffffffffffffffffffffffffff168152602001866fffffffffffffffffffffffffffffffff168152602001856fffffffffffffffffffffffffffffffff1681526020018467ffffffffffffffff1681526020014267ffffffffffffffff1681525090506106188682610f2f565b505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561067d57600080fd5b600060149054906101000a900460ff16151561069857600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a16001905090565b6000806003600084815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915061072b8334611114565b905061073733846112b3565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156107c2578060066005805481151561079d57fe5b066005811015156107aa57fe5b01819055506005600081548092919060010191905055505b505050565b6006816005811015156107d657fe5b016000915090505481565b600060149054906101000a900460ff1681565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806108a257508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156108ad57600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505090505050565b6000806000806000806003600088815260200190815260200160002090506109268161138f565b151561093157600080fd5b8060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a90046fffffffffffffffffffffffffffffffff168260010160109054906101000a90046fffffffffffffffffffffffffffffffff168360020160009054906101000a900467ffffffffffffffff168460020160089054906101000a900467ffffffffffffffff16836fffffffffffffffffffffffffffffffff169350826fffffffffffffffffffffffffffffffff1692508167ffffffffffffffff1691508067ffffffffffffffff169050955095509550955095505091939590929450565b60025481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a8557600080fd5b600060149054906101000a900460ff16151515610aa157600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a16001905090565b600460009054906101000a900460ff1681565b60008060149054906101000a900460ff161515610b1e57600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610b7957600080fd5b600360008381526020019081526020016000209050610b978161138f565b1515610ba257600080fd5b610bd0828260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166113bd565b5050565b60055481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600360008481526020019081526020016000209150610c208261138f565b1515610c2b57600080fd5b8160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610c8c57600080fd5b610c9683826113bd565b505050565b600080600360008481526020019081526020016000209050610cbc8161138f565b1515610cc757600080fd5b610cd08161140b565b915050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000809150600090505b6005811015610d3657600681600581101515610d2357fe5b0154820191508080600101915050610d0b565b600582811515610d4257fe5b049250505090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610da557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515610e1c57806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8330846040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1515610f1757600080fd5b6102c65a03f11515610f2857600080fd5b5050505050565b603c816060015167ffffffffffffffff1610151515610f4d57600080fd5b806003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060408201518160010160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160020160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050507fa9c8dfcda5664a5a124c713e386da27de87432d5b668e79458501eb296389ba78282602001516fffffffffffffffffffffffffffffffff1683604001516fffffffffffffffffffffffffffffffff16846060015167ffffffffffffffff166040518085815260200184815260200183815260200182815260200194505050505060405180910390a15050565b6000806000806000806000600360008a8152602001908152602001600020955061113d8661138f565b151561114857600080fd5b6111518661140b565b945084881015151561116257600080fd5b8560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169350611192896114fe565b60008511156111ec576111a4856115ba565b925082850391508373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015156111eb57600080fd5b5b84880390503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561123157600080fd5b7f4fcc30d90a842164dd58501ab874a101a3749c3d4747139cefe7c876f4ccebd2898633604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a184965050505050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b151561137757600080fd5b6102c65a03f1151561138857600080fd5b5050505050565b6000808260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16119050919050565b6113c6826114fe565b6113d081836112b3565b7f2809c7e17bf978fbc7194c0a694b638c4215e9140cacc6c38ca36010b45697df826040518082815260200191505060405180910390a15050565b600080600090508260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16421115611464578260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16420390505b6114f68360010160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168460010160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168560020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16846115d5565b915050919050565b60036000828152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160006101000a8154906fffffffffffffffffffffffffffffffff02191690556001820160106101000a8154906fffffffffffffffffffffffffffffffff02191690556002820160006101000a81549067ffffffffffffffff02191690556002820160086101000a81549067ffffffffffffffff0219169055505050565b600061271060025483028115156115cd57fe5b049050919050565b60008060008085851015156115ec5786935061160a565b8787039250858584028115156115fe57fe5b05915081880190508093505b505050949350505050565b60a060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff16815250905600a165627a7a72305820a7e0dcb0ba6b30bc244fc3a1fb1e2909ccda4306f3ad3767e9142549747f6d5b0029", + "bytecode": "0x606060405260008060146101000a81548160ff0219169083151502179055506001600460006101000a81548160ff021916908315150217905550341561004457600080fd5b6040516040806118da8339810160405280805190602001909190805190602001909190505081816000336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061271082111515156100be57600080fd5b816002819055508290508073ffffffffffffffffffffffffffffffffffffffff166301ffc9a7639a20483d7c0100000000000000000000000000000000000000000000000000000000026000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001915050602060405180830381600087803b15156101a057600080fd5b6102c65a03f115156101b157600080fd5b5050506040518051905015156101c657600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050506116bf8061021b6000396000f3006060604052600436106100fc576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806327ebe40a146101015780633f4ba83a1461015e578063454a2ab31461018b578063484eccb4146101a35780635c975abb146101da5780635fd8c7101461020757806378bd79351461021c57806383b5ff8b1461029b5780638456cb59146102c457806385b86188146102f1578063878eb3681461031e5780638a98a9cc146103415780638da5cb5b1461036a57806396b5a755146103bf578063c55d0f56146103e2578063dd1b7a0f14610419578063eac9d94c1461046e578063f2fde38b14610497575b600080fd5b341561010c57600080fd5b61015c600480803590602001909190803590602001909190803590602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506104d0565b005b341561016957600080fd5b610171610620565b604051808215151515815260200191505060405180910390f35b6101a160048080359060200190919050506106e5565b005b34156101ae57600080fd5b6101c460048080359060200190919050506107c7565b6040518082815260200191505060405180910390f35b34156101e557600080fd5b6101ed6107e1565b604051808215151515815260200191505060405180910390f35b341561021257600080fd5b61021a6107f4565b005b341561022757600080fd5b61023d60048080359060200190919050506108ff565b604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b34156102a657600080fd5b6102ae610a22565b6040518082815260200191505060405180910390f35b34156102cf57600080fd5b6102d7610a28565b604051808215151515815260200191505060405180910390f35b34156102fc57600080fd5b610304610aef565b604051808215151515815260200191505060405180910390f35b341561032957600080fd5b61033f6004808035906020019091905050610b02565b005b341561034c57600080fd5b610354610bd4565b6040518082815260200191505060405180910390f35b341561037557600080fd5b61037d610bda565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103ca57600080fd5b6103e06004808035906020019091905050610bff565b005b34156103ed57600080fd5b6104036004808035906020019091905050610c9b565b6040518082815260200191505060405180910390f35b341561042457600080fd5b61042c610cd8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561047957600080fd5b610481610cfe565b6040518082815260200191505060405180910390f35b34156104a257600080fd5b6104ce600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610d4a565b005b6104d8611615565b846fffffffffffffffffffffffffffffffff16851415156104f857600080fd5b836fffffffffffffffffffffffffffffffff168414151561051857600080fd5b8267ffffffffffffffff168314151561053057600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561058c57600080fd5b6105968287610e1f565b60a0604051908101604052808373ffffffffffffffffffffffffffffffffffffffff168152602001866fffffffffffffffffffffffffffffffff168152602001856fffffffffffffffffffffffffffffffff1681526020018467ffffffffffffffff1681526020014267ffffffffffffffff1681525090506106188682610f2f565b505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561067d57600080fd5b600060149054906101000a900460ff16151561069857600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a16001905090565b6000806003600084815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915061072b8334611114565b905061073733846112b3565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156107c2578060066005805481151561079d57fe5b066005811015156107aa57fe5b01819055506005600081548092919060010191905055505b505050565b6006816005811015156107d657fe5b016000915090505481565b600060149054906101000a900460ff1681565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806108a257508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156108ad57600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505090505050565b6000806000806000806003600088815260200190815260200160002090506109268161138f565b151561093157600080fd5b8060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a90046fffffffffffffffffffffffffffffffff168260010160109054906101000a90046fffffffffffffffffffffffffffffffff168360020160009054906101000a900467ffffffffffffffff168460020160089054906101000a900467ffffffffffffffff16836fffffffffffffffffffffffffffffffff169350826fffffffffffffffffffffffffffffffff1692508167ffffffffffffffff1691508067ffffffffffffffff169050955095509550955095505091939590929450565b60025481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a8557600080fd5b600060149054906101000a900460ff16151515610aa157600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a16001905090565b600460009054906101000a900460ff1681565b60008060149054906101000a900460ff161515610b1e57600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610b7957600080fd5b600360008381526020019081526020016000209050610b978161138f565b1515610ba257600080fd5b610bd0828260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166113bd565b5050565b60055481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600360008481526020019081526020016000209150610c208261138f565b1515610c2b57600080fd5b8160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610c8c57600080fd5b610c9683826113bd565b505050565b600080600360008481526020019081526020016000209050610cbc8161138f565b1515610cc757600080fd5b610cd08161140b565b915050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000809150600090505b6005811015610d3657600681600581101515610d2357fe5b0154820191508080600101915050610d0b565b600582811515610d4257fe5b049250505090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610da557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515610e1c57806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8330846040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1515610f1757600080fd5b6102c65a03f11515610f2857600080fd5b5050505050565b603c816060015167ffffffffffffffff1610151515610f4d57600080fd5b806003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060408201518160010160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160020160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050507fa9c8dfcda5664a5a124c713e386da27de87432d5b668e79458501eb296389ba78282602001516fffffffffffffffffffffffffffffffff1683604001516fffffffffffffffffffffffffffffffff16846060015167ffffffffffffffff166040518085815260200184815260200183815260200182815260200194505050505060405180910390a15050565b6000806000806000806000600360008a8152602001908152602001600020955061113d8661138f565b151561114857600080fd5b6111518661140b565b945084881015151561116257600080fd5b8560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169350611192896114fe565b60008511156111ec576111a4856115ba565b925082850391508373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015156111eb57600080fd5b5b84880390503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561123157600080fd5b7f4fcc30d90a842164dd58501ab874a101a3749c3d4747139cefe7c876f4ccebd2898633604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a184965050505050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b151561137757600080fd5b6102c65a03f1151561138857600080fd5b5050505050565b6000808260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16119050919050565b6113c6826114fe565b6113d081836112b3565b7f2809c7e17bf978fbc7194c0a694b638c4215e9140cacc6c38ca36010b45697df826040518082815260200191505060405180910390a15050565b600080600090508260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16421115611464578260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16420390505b6114f68360010160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168460010160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168560020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16846115d5565b915050919050565b60036000828152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160006101000a8154906fffffffffffffffffffffffffffffffff02191690556001820160106101000a8154906fffffffffffffffffffffffffffffffff02191690556002820160006101000a81549067ffffffffffffffff02191690556002820160086101000a81549067ffffffffffffffff0219169055505050565b600061271060025483028115156115cd57fe5b049050919050565b60008060008085851015156115ec5786935061160a565b8787039250858584028115156115fe57fe5b05915081880190508093505b505050949350505050565b60a060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff16815250905600a165627a7a723058209512a82347e542708ddfb7341c529368998654489e8b12d849bd429cfb4cb6cb0029", + "deployedBytecode": "0x6060604052600436106100fc576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806327ebe40a146101015780633f4ba83a1461015e578063454a2ab31461018b578063484eccb4146101a35780635c975abb146101da5780635fd8c7101461020757806378bd79351461021c57806383b5ff8b1461029b5780638456cb59146102c457806385b86188146102f1578063878eb3681461031e5780638a98a9cc146103415780638da5cb5b1461036a57806396b5a755146103bf578063c55d0f56146103e2578063dd1b7a0f14610419578063eac9d94c1461046e578063f2fde38b14610497575b600080fd5b341561010c57600080fd5b61015c600480803590602001909190803590602001909190803590602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506104d0565b005b341561016957600080fd5b610171610620565b604051808215151515815260200191505060405180910390f35b6101a160048080359060200190919050506106e5565b005b34156101ae57600080fd5b6101c460048080359060200190919050506107c7565b6040518082815260200191505060405180910390f35b34156101e557600080fd5b6101ed6107e1565b604051808215151515815260200191505060405180910390f35b341561021257600080fd5b61021a6107f4565b005b341561022757600080fd5b61023d60048080359060200190919050506108ff565b604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b34156102a657600080fd5b6102ae610a22565b6040518082815260200191505060405180910390f35b34156102cf57600080fd5b6102d7610a28565b604051808215151515815260200191505060405180910390f35b34156102fc57600080fd5b610304610aef565b604051808215151515815260200191505060405180910390f35b341561032957600080fd5b61033f6004808035906020019091905050610b02565b005b341561034c57600080fd5b610354610bd4565b6040518082815260200191505060405180910390f35b341561037557600080fd5b61037d610bda565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103ca57600080fd5b6103e06004808035906020019091905050610bff565b005b34156103ed57600080fd5b6104036004808035906020019091905050610c9b565b6040518082815260200191505060405180910390f35b341561042457600080fd5b61042c610cd8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561047957600080fd5b610481610cfe565b6040518082815260200191505060405180910390f35b34156104a257600080fd5b6104ce600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610d4a565b005b6104d8611615565b846fffffffffffffffffffffffffffffffff16851415156104f857600080fd5b836fffffffffffffffffffffffffffffffff168414151561051857600080fd5b8267ffffffffffffffff168314151561053057600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561058c57600080fd5b6105968287610e1f565b60a0604051908101604052808373ffffffffffffffffffffffffffffffffffffffff168152602001866fffffffffffffffffffffffffffffffff168152602001856fffffffffffffffffffffffffffffffff1681526020018467ffffffffffffffff1681526020014267ffffffffffffffff1681525090506106188682610f2f565b505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561067d57600080fd5b600060149054906101000a900460ff16151561069857600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a16001905090565b6000806003600084815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915061072b8334611114565b905061073733846112b3565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156107c2578060066005805481151561079d57fe5b066005811015156107aa57fe5b01819055506005600081548092919060010191905055505b505050565b6006816005811015156107d657fe5b016000915090505481565b600060149054906101000a900460ff1681565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806108a257508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156108ad57600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505090505050565b6000806000806000806003600088815260200190815260200160002090506109268161138f565b151561093157600080fd5b8060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a90046fffffffffffffffffffffffffffffffff168260010160109054906101000a90046fffffffffffffffffffffffffffffffff168360020160009054906101000a900467ffffffffffffffff168460020160089054906101000a900467ffffffffffffffff16836fffffffffffffffffffffffffffffffff169350826fffffffffffffffffffffffffffffffff1692508167ffffffffffffffff1691508067ffffffffffffffff169050955095509550955095505091939590929450565b60025481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a8557600080fd5b600060149054906101000a900460ff16151515610aa157600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a16001905090565b600460009054906101000a900460ff1681565b60008060149054906101000a900460ff161515610b1e57600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610b7957600080fd5b600360008381526020019081526020016000209050610b978161138f565b1515610ba257600080fd5b610bd0828260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166113bd565b5050565b60055481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600360008481526020019081526020016000209150610c208261138f565b1515610c2b57600080fd5b8160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610c8c57600080fd5b610c9683826113bd565b505050565b600080600360008481526020019081526020016000209050610cbc8161138f565b1515610cc757600080fd5b610cd08161140b565b915050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000809150600090505b6005811015610d3657600681600581101515610d2357fe5b0154820191508080600101915050610d0b565b600582811515610d4257fe5b049250505090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610da557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515610e1c57806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8330846040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1515610f1757600080fd5b6102c65a03f11515610f2857600080fd5b5050505050565b603c816060015167ffffffffffffffff1610151515610f4d57600080fd5b806003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060408201518160010160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160020160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050507fa9c8dfcda5664a5a124c713e386da27de87432d5b668e79458501eb296389ba78282602001516fffffffffffffffffffffffffffffffff1683604001516fffffffffffffffffffffffffffffffff16846060015167ffffffffffffffff166040518085815260200184815260200183815260200182815260200194505050505060405180910390a15050565b6000806000806000806000600360008a8152602001908152602001600020955061113d8661138f565b151561114857600080fd5b6111518661140b565b945084881015151561116257600080fd5b8560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169350611192896114fe565b60008511156111ec576111a4856115ba565b925082850391508373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015156111eb57600080fd5b5b84880390503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050151561123157600080fd5b7f4fcc30d90a842164dd58501ab874a101a3749c3d4747139cefe7c876f4ccebd2898633604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a184965050505050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b151561137757600080fd5b6102c65a03f1151561138857600080fd5b5050505050565b6000808260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16119050919050565b6113c6826114fe565b6113d081836112b3565b7f2809c7e17bf978fbc7194c0a694b638c4215e9140cacc6c38ca36010b45697df826040518082815260200191505060405180910390a15050565b600080600090508260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16421115611464578260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16420390505b6114f68360010160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168460010160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168560020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff16846115d5565b915050919050565b60036000828152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160006101000a8154906fffffffffffffffffffffffffffffffff02191690556001820160106101000a8154906fffffffffffffffffffffffffffffffff02191690556002820160006101000a81549067ffffffffffffffff02191690556002820160086101000a81549067ffffffffffffffff0219169055505050565b600061271060025483028115156115cd57fe5b049050919050565b60008060008085851015156115ec5786935061160a565b8787039250858584028115156115fe57fe5b05915081880190508093505b505050949350505050565b60a060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff16815250905600a165627a7a723058209512a82347e542708ddfb7341c529368998654489e8b12d849bd429cfb4cb6cb0029", "sourceMap": "63192:2571:18:-;;;54337:5;54316:26;;;;;;;;;;;;;;;;;;;;63411:4;63378:37;;;;;;;;;;;;;;;;;;;;63579:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63661:8;63671:4;55996:31;816:10;808:5;;:18;;;;;;;;;;;;;;;;;;55954:5;55946:4;:13;;55938:22;;;;;;;;55981:4;55970:8;:15;;;;56044:11;55996:60;;56074:17;:35;;;55501:10;55494:18;;56074:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56066:71;;;;;;;;56169:17;56147:19;;:39;;;;;;;;;;;;;;;;;;55864:329;;;63579:100;;63192:2571;;;;;;", "deployedSourceMap": "63192:2571:18:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64074:850;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54943:126;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65052:488;;;;;;;;;;;;;;;;;;63508:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54316:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56458:352;;;;;;;;;;;;;;59705:493;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45099:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54735:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63378:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59338:256;;;;;;;;;;;;;;;;;;;;;;;;;;63474:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;622:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58796:289;;;;;;;;;;;;;;;;;;;;;;;;;;60323:239;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44927:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65546:214;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1156:140;;;;;;;;;;;;;;;;;;;;;;;;;;;;64074:850;64686:22;;:::i;:::-;64438:14;64422:32;;64404:14;:50;64396:59;;;;;;;;64505:12;64489:30;;64473:12;:46;64465:55;;;;;;;;64566:9;64551:26;;64538:9;:39;64530:48;;;;;;;;64619:19;;;;;;;;;;;64597:42;;:10;:42;;;64589:51;;;;;;;;64650:26;64658:7;64667:8;64650:7;:26::i;:::-;64711:166;;;;;;;;;64732:7;64711:166;;;;;;64761:14;64711:166;;;;;;64798:12;64711:166;;;;;;64832:9;64711:166;;;;;;64863:3;64711:166;;;;;64686:191;;64887:30;64899:8;64909:7;64887:11;:30::i;:::-;64074:850;;;;;;:::o;54943:126::-;54992:4;969:5;;;;;;;;;;;955:19;;:10;:19;;;947:28;;;;;;;;54629:6;;;;;;;;;;;54621:15;;;;;;;;55017:5;55008:6;;:14;;;;;;;;;;;;;;;;;;55032:9;;;;;;;;;;55058:4;55051:11;;54943:126;:::o;65052:488::-;65161:14;65221:13;65178:16;:26;65195:8;65178:26;;;;;;;;;;;:33;;;;;;;;;;;;65161:50;;65237:25;65242:8;65252:9;65237:4;:25::i;:::-;65221:41;;65272:31;65282:10;65294:8;65272:9;:31::i;:::-;65375:19;;;;;;;;;;;65357:38;;:6;:38;;;65353:181;;;65489:5;65449:18;65484:1;65468:13;;:17;;;;;;;;65449:37;;;;;;;;;;:45;;;;65508:13;;:15;;;;;;;;;;;;;65353:181;65052:488;;;:::o;63508:36::-;;;;;;;;;;;;;;;;;;;;:::o;54316:26::-;;;;;;;;;;;;;:::o;56458:352::-;56504:18;56763:8;56533:19;;;;;;;;;;;56504:49;;56599:5;;;;;;;;;;;56585:19;;:10;:19;;;:59;;;;56634:10;56620:24;;:10;:24;;;56585:59;56564:90;;;;;;;;56774:10;:15;;:29;56790:4;:12;;;56774:29;;;;;;;;;;;;;;;;;;;;;;;56763:40;;56458:352;;:::o;59705:493::-;59791:14;59815:21;59846:19;59875:16;59901:17;59935:23;59961:16;:26;59978:8;59961:26;;;;;;;;;;;59935:52;;60005:21;60018:7;60005:12;:21::i;:::-;59997:30;;;;;;;;60054:7;:14;;;;;;;;;;;;60078:7;:21;;;;;;;;;;;;60109:7;:19;;;;;;;;;;;;60138:7;:16;;;;;;;;;;;;60164:7;:17;;;;;;;;;;;;60037:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59705:493;;;;;;;;:::o;45099:23::-;;;;:::o;54735:124::-;54785:4;969:5;;;;;;;;;;;955:19;;:10;:19;;;947:28;;;;;;;;54475:6;;;;;;;;;;;54474:7;54466:16;;;;;;;;54810:4;54801:6;;:13;;;;;;;;;;;;;;;;;;54824:7;;;;;;;;;;54848:4;54841:11;;54735:124;:::o;63378:37::-;;;;;;;;;;;;;:::o;59338:256::-;59445:23;54629:6;;;;;;;;;;;54621:15;;;;;;;;969:5;;;;;;;;;;;955:19;;:10;:19;;;947:28;;;;;;;;59471:16;:26;59488:8;59471:26;;;;;;;;;;;59445:52;;59515:21;59528:7;59515:12;:21::i;:::-;59507:30;;;;;;;;59547:40;59562:8;59572:7;:14;;;;;;;;;;;;59547;:40::i;:::-;59338:256;;:::o;63474:28::-;;;;:::o;622:20::-;;;;;;;;;;;;;:::o;58796:289::-;58864:23;58966:14;58890:16;:26;58907:8;58890:26;;;;;;;;;;;58864:52;;58934:21;58947:7;58934:12;:21::i;:::-;58926:30;;;;;;;;58983:7;:14;;;;;;;;;;;;58966:31;;59029:6;59015:20;;:10;:20;;;59007:29;;;;;;;;59046:32;59061:8;59071:6;59046:14;:32::i;:::-;58796:289;;;:::o;60323:239::-;60401:7;60424:23;60450:16;:26;60467:8;60450:26;;;;;;;;;;;60424:52;;60494:21;60507:7;60494:12;:21::i;:::-;60486:30;;;;;;;;60533:22;60547:7;60533:13;:22::i;:::-;60526:29;;60323:239;;;;:::o;44927:40::-;;;;;;;;;;;;;:::o;65546:214::-;65601:7;65620:11;65650:9;65634:1;65620:15;;65662:1;65650:13;;65645:85;65669:1;65665;:5;65645:85;;;65698:18;65717:1;65698:21;;;;;;;;;;;65691:28;;;;65672:3;;;;;;;65645:85;;;65752:1;65746:3;:7;;;;;;;;65739:14;;65546:214;;;:::o;1156:140::-;969:5;;;;;;;;;;;955:19;;:10;:19;;;947:28;;;;;;;;1245:1;1225:22;;:8;:22;;;;1221:69;;;1271:8;1263:5;;:16;;;;;;;;;;;;;;;;;;1221:69;1156:140;:::o;46053:176::-;46166:19;;;;;;;;;;;:32;;;46199:6;46207:4;46213:8;46166:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46053:176;;:::o;46852:489::-;47082:9;47061:8;:17;;;:30;;;;47053:39;;;;;;;;47132:8;47103:16;:26;47120:8;47103:26;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47151:183;47187:8;47218;:22;;;47210:31;;47263:8;:20;;;47255:29;;47306:8;:17;;;47298:26;;47151:183;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46852:489;;:::o;47687:2629::-;47765:7;47837:23;48279:13;48459:14;48938:21;48994:22;49934:17;47863:16;:26;47880:8;47863:26;;;;;;;;;;;47837:52;;48170:21;48183:7;48170:12;:21::i;:::-;48162:30;;;;;;;;48295:22;48309:7;48295:13;:22::i;:::-;48279:38;;48349:5;48335:10;:19;;48327:28;;;;;;;;48476:7;:14;;;;;;;;;;;;48459:31;;48635:24;48650:8;48635:14;:24::i;:::-;48741:1;48733:5;:9;48729:918;;;48962:18;48974:5;48962:11;:18::i;:::-;48938:42;;49027:13;49019:5;:21;48994:46;;49605:6;:15;;:31;49621:14;49605:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48729:918;49967:5;49954:10;:18;49934:38;;50172:10;:19;;:30;50192:9;50172:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50240:46;50258:8;50268:5;50275:10;50240:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50304:5;50297:12;;47687:2629;;;;;;;;;;:::o;46461:174::-;46579:19;;;;;;;;;;;:28;;;46608:9;46619:8;46579:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46461:174;;:::o;50637:125::-;50708:4;50753:1;50732:8;:18;;;;;;;;;;;;:22;;;50724:31;;50637:125;;;:::o;47396:183::-;47474:24;47489:8;47474:14;:24::i;:::-;47508:28;47518:7;47527:8;47508:9;:28::i;:::-;47546:26;47563:8;47546:26;;;;;;;;;;;;;;;;;;47396:183;;:::o;51057:613::-;51141:7;51164:21;51188:1;51164:25;;51403:8;:18;;;;;;;;;;;;51397:24;;:3;:24;51393:95;;;51459:8;:18;;;;;;;;;;;;51453:24;;:3;:24;51437:40;;51393:95;51505:158;51539:8;:22;;;;;;;;;;;;51505:158;;51575:8;:20;;;;;;;;;;;;51505:158;;51609:8;:17;;;;;;;;;;;;51505:158;;51640:13;51505:20;:158::i;:::-;51498:165;;51057:613;;;;:::o;50434:101::-;50502:16;:26;50519:8;50502:26;;;;;;;;;;;;50495:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50434:101;:::o;53613:482::-;53673:7;54083:5;54072:8;;54063:6;:17;:25;;;;;;;;54056:32;;53613:482;;;:::o;51918:1601::-;52110:7;52803:23;53118:25;53394:19;52477:9;52459:14;:27;;52455:1058;;;52635:12;52628:19;;;;52455:1058;52859:14;52836:12;52829:45;52803:71;;53197:9;53172:14;53146:16;:41;:61;;;;;;;;53118:89;;53441:18;53423:14;53416:43;53394:65;;53489:12;53474:28;;51918:1601;;;;;;;;;;:::o;63192:2571::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", "source": "pragma solidity 0.4.18;\n\n/**\n The following contract code, titled KittyCore, was written by Cryptokitties and published\n and retrieved from https://etherscan.io/address/0x06012c8cf97bead5deae237070f9587f8e7a266d#code.\n\n It is included in the current project for test purposes, to ensure that our collateralizer can\n handle ERC721 tokens created by the KittyCore contract.\n*/\n\n/**\n * @title KittiesOwnable\n * @dev The KittiesOwnable contract has an owner address, and provides basic authorization control\n * functions, this simplifies the implementation of \"user permissions\".\n */\ncontract KittiesOwnable {\n address public owner;\n\n\n /**\n\t * @dev The KittiesOwnable constructor sets the original `owner` of the contract to the sender\n\t * account.\n\t */\n function KittiesOwnable() {\n owner = msg.sender;\n }\n\n\n /**\n\t * @dev Throws if called by any account other than the owner.\n\t */\n modifier onlyOwner() {\n require(msg.sender == owner);\n _;\n }\n\n\n /**\n\t * @dev Allows the current owner to transfer control of the contract to a newOwner.\n\t * @param newOwner The address to transfer ownership to.\n\t */\n function transferOwnership(address newOwner) onlyOwner {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n\n}\n\n\n\n/// @title Interface for contracts conforming to ERC-721: Non-Fungible Tokens\n/// @author Dieter Shirley (https://github.com/dete)\ncontract KittiesERC721 {\n // Required methods\n function totalSupply() public view returns (uint256 total);\n function balanceOf(address _owner) public view returns (uint256 balance);\n function ownerOf(uint256 _tokenId) external view returns (address owner);\n function approve(address _to, uint256 _tokenId) external;\n function transfer(address _to, uint256 _tokenId) external;\n function transferFrom(address _from, address _to, uint256 _tokenId) external;\n\n // Events\n event Transfer(address from, address to, uint256 tokenId);\n event Approval(address owner, address approved, uint256 tokenId);\n\n // Optional\n // function name() public view returns (string name);\n // function symbol() public view returns (string symbol);\n // function tokensOfOwner(address _owner) external view returns (uint256[] tokenIds);\n // function tokenMetadata(uint256 _tokenId, string _preferredTransport) public view returns (string infoUrl);\n\n // ERC-165 Compatibility (https://github.com/ethereum/EIPs/issues/165)\n function supportsInterface(bytes4 _interfaceID) external view returns (bool);\n}\n\n\n// // Auction wrapper functions\n\n\n// Auction wrapper functions\n\n\n\n\n\n\n\n/// @title SEKRETOOOO\ncontract GeneScienceInterface {\n /// @dev simply a boolean to indicate this is the contract we expect to be\n function isGeneScience() public pure returns (bool);\n\n /// @dev given genes of kitten 1 & 2, return a genetic combination - may have a random factor\n /// @param genes1 genes of mom\n /// @param genes2 genes of sire\n /// @return the genes that are supposed to be passed down the child\n function mixGenes(uint256 genes1, uint256 genes2, uint256 targetBlock) public returns (uint256);\n}\n\n\n\n\n\n\n\n/// @title A facet of KittyCore that manages special access privileges.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyAccessControl {\n // This facet controls access control for CryptoKitties. There are four roles managed here:\n //\n // - The CEO: The CEO can reassign other roles and change the addresses of our dependent smart\n // contracts. It is also the only role that can unpause the smart contract. It is initially\n // set to the address that created the smart contract in the KittyCore constructor.\n //\n // - The CFO: The CFO can withdraw funds from KittyCore and its auction contracts.\n //\n // - The COO: The COO can release gen0 kitties to auction, and mint promo cats.\n //\n // It should be noted that these roles are distinct without overlap in their access abilities, the\n // abilities listed for each role above are exhaustive. In particular, while the CEO can assign any\n // address to any role, the CEO address itself doesn't have the ability to act in those roles. This\n // restriction is intentional so that we aren't tempted to use the CEO address frequently out of\n // convenience. The less we use an address, the less likely it is that we somehow compromise the\n // account.\n\n /// @dev Emited when contract is upgraded - See README.md for updgrade plan\n event ContractUpgrade(address newContract);\n\n // The addresses of the accounts (or contracts) that can execute actions within each roles.\n address public ceoAddress;\n address public cfoAddress;\n address public cooAddress;\n\n // @dev Keeps track whether the contract is paused. When that is true, most actions are blocked\n bool public paused = false;\n\n /// @dev Access modifier for CEO-only functionality\n modifier onlyCEO() {\n require(msg.sender == ceoAddress);\n _;\n }\n\n /// @dev Access modifier for CFO-only functionality\n modifier onlyCFO() {\n require(msg.sender == cfoAddress);\n _;\n }\n\n /// @dev Access modifier for COO-only functionality\n modifier onlyCOO() {\n require(msg.sender == cooAddress);\n _;\n }\n\n modifier onlyCLevel() {\n require(\n msg.sender == cooAddress ||\n msg.sender == ceoAddress ||\n msg.sender == cfoAddress\n );\n _;\n }\n\n /// @dev Assigns a new address to act as the CEO. Only available to the current CEO.\n /// @param _newCEO The address of the new CEO\n function setCEO(address _newCEO) external onlyCEO {\n require(_newCEO != address(0));\n\n ceoAddress = _newCEO;\n }\n\n /// @dev Assigns a new address to act as the CFO. Only available to the current CEO.\n /// @param _newCFO The address of the new CFO\n function setCFO(address _newCFO) external onlyCEO {\n require(_newCFO != address(0));\n\n cfoAddress = _newCFO;\n }\n\n /// @dev Assigns a new address to act as the COO. Only available to the current CEO.\n /// @param _newCOO The address of the new COO\n function setCOO(address _newCOO) external onlyCEO {\n require(_newCOO != address(0));\n\n cooAddress = _newCOO;\n }\n\n /*** KittiesPausable functionality adapted from OpenZeppelin ***/\n\n /// @dev Modifier to allow actions only when the contract IS NOT paused\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /// @dev Modifier to allow actions only when the contract IS paused\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /// @dev Called by any \"C-level\" role to pause the contract. Used only when\n /// a bug or exploit is detected and we need to limit damage.\n function pause() external onlyCLevel whenNotPaused {\n paused = true;\n }\n\n /// @dev Unpauses the smart contract. Can only be called by the CEO, since\n /// one reason we may pause the contract is when CFO or COO accounts are\n /// compromised.\n /// @notice This is public rather than external so it can be called by\n /// derived contracts.\n function unpause() public onlyCEO whenPaused {\n // can't unpause if contract was upgraded\n paused = false;\n }\n}\n\n\n\n\n/// @title Base contract for CryptoKitties. Holds all common structs, events and base variables.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBase is KittyAccessControl {\n /*** EVENTS ***/\n\n /// @dev The Birth event is fired whenever a new kitten comes into existence. This obviously\n /// includes any time a cat is created through the giveBirth method, but it is also called\n /// when a new gen0 cat is created.\n event Birth(address owner, uint256 kittyId, uint256 matronId, uint256 sireId, uint256 genes);\n\n /// @dev Transfer event as defined in current draft of ERC721. Emitted every time a kitten\n /// ownership is assigned, including births.\n event Transfer(address from, address to, uint256 tokenId);\n\n /*** DATA TYPES ***/\n\n /// @dev The main Kitty struct. Every cat in CryptoKitties is represented by a copy\n /// of this structure, so great care was taken to ensure that it fits neatly into\n /// exactly two 256-bit words. Note that the order of the members in this structure\n /// is important because of the byte-packing rules used by Ethereum.\n /// Ref: http://solidity.readthedocs.io/en/develop/miscellaneous.html\n struct Kitty {\n // The Kitty's genetic code is packed into these 256-bits, the format is\n // sooper-sekret! A cat's genes never change.\n uint256 genes;\n\n // The timestamp from the block when this cat came into existence.\n uint64 birthTime;\n\n // The minimum timestamp after which this cat can engage in breeding\n // activities again. This same timestamp is used for the pregnancy\n // timer (for matrons) as well as the siring cooldown.\n uint64 cooldownEndBlock;\n\n // The ID of the parents of this kitty, set to 0 for gen0 cats.\n // Note that using 32-bit unsigned integers limits us to a \"mere\"\n // 4 billion cats. This number might seem small until you realize\n // that Ethereum currently has a limit of about 500 million\n // transactions per year! So, this definitely won't be a problem\n // for several years (even as Ethereum learns to scale).\n uint32 matronId;\n uint32 sireId;\n\n // Set to the ID of the sire cat for matrons that are pregnant,\n // zero otherwise. A non-zero value here is how we know a cat\n // is pregnant. Used to retrieve the genetic material for the new\n // kitten when the birth transpires.\n uint32 siringWithId;\n\n // Set to the index in the cooldown array (see below) that represents\n // the current cooldown duration for this Kitty. This starts at zero\n // for gen0 cats, and is initialized to floor(generation/2) for others.\n // Incremented by one for each successful breeding action, regardless\n // of whether this cat is acting as matron or sire.\n uint16 cooldownIndex;\n\n // The \"generation number\" of this cat. Cats minted by the CK contract\n // for sale are called \"gen0\" and have a generation number of 0. The\n // generation number of all other cats is the larger of the two generation\n // numbers of their parents, plus one.\n // (i.e. max(matron.generation, sire.generation) + 1)\n uint16 generation;\n }\n\n /*** CONSTANTS ***/\n\n /// @dev A lookup table indicating the cooldown duration after any successful\n /// breeding action, called \"pregnancy time\" for matrons and \"siring cooldown\"\n /// for sires. Designed such that the cooldown roughly doubles each time a cat\n /// is bred, encouraging owners not to just keep breeding the same cat over\n /// and over again. Caps out at one week (a cat can breed an unbounded number\n /// of times, and the maximum cooldown is always seven days).\n uint32[14] public cooldowns = [\n uint32(1 minutes),\n uint32(2 minutes),\n uint32(5 minutes),\n uint32(10 minutes),\n uint32(30 minutes),\n uint32(1 hours),\n uint32(2 hours),\n uint32(4 hours),\n uint32(8 hours),\n uint32(16 hours),\n uint32(1 days),\n uint32(2 days),\n uint32(4 days),\n uint32(7 days)\n ];\n\n // An approximation of currently how many seconds are in between blocks.\n uint256 public secondsPerBlock = 15;\n\n /*** STORAGE ***/\n\n /// @dev An array containing the Kitty struct for all Kitties in existence. The ID\n /// of each cat is actually an index into this array. Note that ID 0 is a negacat,\n /// the unKitty, the mythical beast that is the parent of all gen0 cats. A bizarre\n /// creature that is both matron and sire... to itself! Has an invalid genetic code.\n /// In other words, cat ID 0 is invalid... ;-)\n Kitty[] kitties;\n\n /// @dev A mapping from cat IDs to the address that owns them. All cats have\n /// some valid owner address, even gen0 cats are created with a non-zero owner.\n mapping (uint256 => address) public kittyIndexToOwner;\n\n // @dev A mapping from owner address to count of tokens that address owns.\n // Used internally inside balanceOf() to resolve ownership count.\n mapping (address => uint256) ownershipTokenCount;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to call\n /// transferFrom(). Each Kitty can only have one approved address for transfer\n /// at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public kittyIndexToApproved;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to use\n /// this Kitty for siring via breedWith(). Each Kitty can only have one approved\n /// address for siring at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public sireAllowedToAddress;\n\n /// @dev The address of the ClockAuction contract that handles sales of Kitties. This\n /// same contract handles both peer-to-peer sales as well as the gen0 sales which are\n /// initiated every 15 minutes.\n SaleClockAuction public saleAuction;\n\n /// @dev The address of a custom ClockAuction subclassed contract that handles siring\n /// auctions. Needs to be separate from saleAuction because the actions taken on success\n /// after a sales and siring auction are quite different.\n SiringClockAuction public siringAuction;\n\n /// @dev Assigns ownership of a specific Kitty to an address.\n function _transfer(address _from, address _to, uint256 _tokenId) internal {\n // Since the number of kittens is capped to 2^32 we can't overflow this\n ownershipTokenCount[_to]++;\n // transfer ownership\n kittyIndexToOwner[_tokenId] = _to;\n // When creating new kittens _from is 0x0, but we can't account that address.\n if (_from != address(0)) {\n ownershipTokenCount[_from]--;\n // once the kitten is transferred also clear sire allowances\n delete sireAllowedToAddress[_tokenId];\n // clear any previously approved ownership exchange\n delete kittyIndexToApproved[_tokenId];\n }\n // Emit the transfer event.\n Transfer(_from, _to, _tokenId);\n }\n\n /// @dev An internal method that creates a new kitty and stores it. This\n /// method doesn't do any checking and should only be called when the\n /// input data is known to be valid. Will generate both a Birth event\n /// and a Transfer event.\n /// @param _matronId The kitty ID of the matron of this cat (zero for gen0)\n /// @param _sireId The kitty ID of the sire of this cat (zero for gen0)\n /// @param _generation The generation number of this cat, must be computed by caller.\n /// @param _genes The kitty's genetic code.\n /// @param _owner The inital owner of this cat, must be non-zero (except for the unKitty, ID 0)\n function _createKitty(\n uint256 _matronId,\n uint256 _sireId,\n uint256 _generation,\n uint256 _genes,\n address _owner\n )\n internal\n returns (uint)\n {\n // These requires are not strictly necessary, our calling code should make\n // sure that these conditions are never broken. However! _createKitty() is already\n // an expensive call (for storage), and it doesn't hurt to be especially careful\n // to ensure our data structures are always valid.\n require(_matronId == uint256(uint32(_matronId)));\n require(_sireId == uint256(uint32(_sireId)));\n require(_generation == uint256(uint16(_generation)));\n\n // New kitty starts with the same cooldown as parent gen/2\n uint16 cooldownIndex = uint16(_generation / 2);\n if (cooldownIndex > 13) {\n cooldownIndex = 13;\n }\n\n Kitty memory _kitty = Kitty({\n genes: _genes,\n birthTime: uint64(now),\n cooldownEndBlock: 0,\n matronId: uint32(_matronId),\n sireId: uint32(_sireId),\n siringWithId: 0,\n cooldownIndex: cooldownIndex,\n generation: uint16(_generation)\n });\n uint256 newKittenId = kitties.push(_kitty) - 1;\n\n // It's probably never going to happen, 4 billion cats is A LOT, but\n // let's just be 100% sure we never let this happen.\n require(newKittenId == uint256(uint32(newKittenId)));\n\n // emit the birth event\n Birth(\n _owner,\n newKittenId,\n uint256(_kitty.matronId),\n uint256(_kitty.sireId),\n _kitty.genes\n );\n\n // This will assign ownership, and also emit the Transfer event as\n // per ERC721 draft\n _transfer(0, _owner, newKittenId);\n\n return newKittenId;\n }\n\n // Any C-level can fix how many seconds per blocks are currently observed.\n function setSecondsPerBlock(uint256 secs) external onlyCLevel {\n require(secs < cooldowns[0]);\n secondsPerBlock = secs;\n }\n}\n\n\n\n\n\n/// @title The external contract that is responsible for generating metadata for the kitties,\n/// it has one function that will return the data as bytes.\ncontract KittiesERC721Metadata {\n /// @dev Given a token Id, returns a byte array that is supposed to be converted into string.\n function getMetadata(uint256 _tokenId, string) public view returns (bytes32[4] buffer, uint256 count) {\n if (_tokenId == 1) {\n buffer[0] = \"Hello World! :D\";\n count = 15;\n } else if (_tokenId == 2) {\n buffer[0] = \"I would definitely choose a medi\";\n buffer[1] = \"um length string.\";\n count = 49;\n } else if (_tokenId == 3) {\n buffer[0] = \"Lorem ipsum dolor sit amet, mi e\";\n buffer[1] = \"st accumsan dapibus augue lorem,\";\n buffer[2] = \" tristique vestibulum id, libero\";\n buffer[3] = \" suscipit varius sapien aliquam.\";\n count = 128;\n }\n }\n}\n\n\n/// @title The facet of the CryptoKitties core contract that manages ownership, ERC-721 (draft) compliant.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev Ref: https://github.com/ethereum/EIPs/issues/721\n/// See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyOwnership is KittyBase, KittiesERC721 {\n\n /// @notice Name and symbol of the non fungible token, as defined in ERC721.\n string public constant name = \"CryptoKitties\";\n string public constant symbol = \"CK\";\n\n // The contract that will return kitty metadata\n KittiesERC721Metadata public erc721Metadata;\n\n bytes4 constant InterfaceSignature_ERC165 =\n bytes4(keccak256('supportsInterface(bytes4)'));\n\n bytes4 constant InterfaceSignature_ERC721 =\n bytes4(keccak256('name()')) ^\n bytes4(keccak256('symbol()')) ^\n bytes4(keccak256('totalSupply()')) ^\n bytes4(keccak256('balanceOf(address)')) ^\n bytes4(keccak256('ownerOf(uint256)')) ^\n bytes4(keccak256('approve(address,uint256)')) ^\n bytes4(keccak256('transfer(address,uint256)')) ^\n bytes4(keccak256('transferFrom(address,address,uint256)')) ^\n bytes4(keccak256('tokensOfOwner(address)')) ^\n bytes4(keccak256('tokenMetadata(uint256,string)'));\n\n /// @notice Introspection interface as per ERC-165 (https://github.com/ethereum/EIPs/issues/165).\n /// Returns true for any standardized interfaces implemented by this contract. We implement\n /// ERC-165 (obviously!) and ERC-721.\n function supportsInterface(bytes4 _interfaceID) external view returns (bool)\n {\n // DEBUG ONLY\n //require((InterfaceSignature_ERC165 == 0x01ffc9a7) && (InterfaceSignature_ERC721 == 0x9a20483d));\n\n return ((_interfaceID == InterfaceSignature_ERC165) || (_interfaceID == InterfaceSignature_ERC721));\n }\n\n /// @dev Set the address of the sibling contract that tracks metadata.\n /// CEO only.\n function setMetadataAddress(address _contractAddress) public onlyCEO {\n erc721Metadata = KittiesERC721Metadata(_contractAddress);\n }\n\n // Internal utility functions: These functions all assume that their input arguments\n // are valid. We leave it to public methods to sanitize their inputs and follow\n // the required logic.\n\n /// @dev Checks if a given address is the current owner of a particular Kitty.\n /// @param _claimant the address we are validating against.\n /// @param _tokenId kitten id, only valid when > 0\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToOwner[_tokenId] == _claimant;\n }\n\n /// @dev Checks if a given address currently has transferApproval for a particular Kitty.\n /// @param _claimant the address we are confirming kitten is approved for.\n /// @param _tokenId kitten id, only valid when > 0\n function _approvedFor(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToApproved[_tokenId] == _claimant;\n }\n\n /// @dev Marks an address as being approved for transferFrom(), overwriting any previous\n /// approval. Setting _approved to address(0) clears all transfer approval.\n /// NOTE: _approve() does NOT send the Approval event. This is intentional because\n /// _approve() and transferFrom() are used together for putting Kitties on auction, and\n /// there is no value in spamming the log with Approval events in that case.\n function _approve(uint256 _tokenId, address _approved) internal {\n kittyIndexToApproved[_tokenId] = _approved;\n }\n\n /// @notice Returns the number of Kitties owned by a specific address.\n /// @param _owner The owner address to check.\n /// @dev Required for ERC-721 compliance\n function balanceOf(address _owner) public view returns (uint256 count) {\n return ownershipTokenCount[_owner];\n }\n\n /// @notice Transfers a Kitty to another address. If transferring to a smart\n /// contract be VERY CAREFUL to ensure that it is aware of ERC-721 (or\n /// CryptoKitties specifically) or your Kitty may be lost forever. Seriously.\n /// @param _to The address of the recipient, can be a user or contract.\n /// @param _tokenId The ID of the Kitty to transfer.\n /// @dev Required for ERC-721 compliance.\n function transfer(\n address _to,\n uint256 _tokenId\n )\n external\n whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Disallow transfers to the auction contracts to prevent accidental\n // misuse. Auction contracts should only take ownership of kitties\n // through the allow + transferFrom flow.\n require(_to != address(saleAuction));\n require(_to != address(siringAuction));\n\n // You can only send your own cat.\n require(_owns(msg.sender, _tokenId));\n\n // Reassign ownership, clear pending approvals, emit Transfer event.\n _transfer(msg.sender, _to, _tokenId);\n }\n\n /// @notice Grant another address the right to transfer a specific Kitty via\n /// transferFrom(). This is the preferred flow for transfering NFTs to contracts.\n /// @param _to The address to be granted transfer approval. Pass address(0) to\n /// clear all approvals.\n /// @param _tokenId The ID of the Kitty that can be transferred if this call succeeds.\n /// @dev Required for ERC-721 compliance.\n function approve(\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Only an owner can grant transfer approval.\n require(_owns(msg.sender, _tokenId));\n\n // Register the approval (replacing any previous approval).\n _approve(_tokenId, _to);\n\n // Emit approval event.\n Approval(msg.sender, _to, _tokenId);\n }\n\n /// @notice Transfer a Kitty owned by another address, for which the calling address\n /// has previously been granted transfer approval by the owner.\n /// @param _from The address that owns the Kitty to be transfered.\n /// @param _to The address that should take ownership of the Kitty. Can be any address,\n /// including the caller.\n /// @param _tokenId The ID of the Kitty to be transferred.\n /// @dev Required for ERC-721 compliance.\n function transferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Check for approval and valid ownership\n require(_approvedFor(msg.sender, _tokenId));\n require(_owns(_from, _tokenId));\n\n // Reassign ownership (also clears pending approvals and emits Transfer event).\n _transfer(_from, _to, _tokenId);\n }\n\n /// @notice Returns the total number of Kitties currently in existence.\n /// @dev Required for ERC-721 compliance.\n function totalSupply() public view returns (uint) {\n return kitties.length - 1;\n }\n\n /// @notice Returns the address currently assigned ownership of a given Kitty.\n /// @dev Required for ERC-721 compliance.\n function ownerOf(uint256 _tokenId)\n external\n view\n returns (address owner)\n {\n owner = kittyIndexToOwner[_tokenId];\n\n require(owner != address(0));\n }\n\n /// @notice Returns a list of all Kitty IDs assigned to an address.\n /// @param _owner The owner whose Kitties we are interested in.\n /// @dev This method MUST NEVER be called by smart contract code. First, it's fairly\n /// expensive (it walks the entire Kitty array looking for cats belonging to owner),\n /// but it also returns a dynamic array, which is only supported for web3 calls, and\n /// not contract-to-contract calls.\n function tokensOfOwner(address _owner) external view returns(uint256[] ownerTokens) {\n uint256 tokenCount = balanceOf(_owner);\n\n if (tokenCount == 0) {\n // Return an empty array\n return new uint256[](0);\n } else {\n uint256[] memory result = new uint256[](tokenCount);\n uint256 totalCats = totalSupply();\n uint256 resultIndex = 0;\n\n // We count on the fact that all cats have IDs starting at 1 and increasing\n // sequentially up to the totalCat count.\n uint256 catId;\n\n for (catId = 1; catId <= totalCats; catId++) {\n if (kittyIndexToOwner[catId] == _owner) {\n result[resultIndex] = catId;\n resultIndex++;\n }\n }\n\n return result;\n }\n }\n\n /// @dev Adapted from memcpy() by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _memcpy(uint _dest, uint _src, uint _len) private view {\n // Copy word-length chunks while possible\n for(; _len >= 32; _len -= 32) {\n assembly {\n mstore(_dest, mload(_src))\n }\n _dest += 32;\n _src += 32;\n }\n\n // Copy remaining bytes\n uint256 mask = 256 ** (32 - _len) - 1;\n assembly {\n let srcpart := and(mload(_src), not(mask))\n let destpart := and(mload(_dest), mask)\n mstore(_dest, or(destpart, srcpart))\n }\n }\n\n /// @dev Adapted from toString(slice) by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _toString(bytes32[4] _rawBytes, uint256 _stringLength) private view returns (string) {\n var outputString = new string(_stringLength);\n uint256 outputPtr;\n uint256 bytesPtr;\n\n assembly {\n outputPtr := add(outputString, 32)\n bytesPtr := _rawBytes\n }\n\n _memcpy(outputPtr, bytesPtr, _stringLength);\n\n return outputString;\n }\n\n /// @notice Returns a URI pointing to a metadata package for this token conforming to\n /// ERC-721 (https://github.com/ethereum/EIPs/issues/721)\n /// @param _tokenId The ID number of the Kitty whose metadata should be returned.\n function tokenMetadata(uint256 _tokenId, string _preferredTransport) external view returns (string infoUrl) {\n require(erc721Metadata != address(0));\n bytes32[4] memory buffer;\n uint256 count;\n (buffer, count) = erc721Metadata.getMetadata(_tokenId, _preferredTransport);\n\n return _toString(buffer, count);\n }\n}\n\n\n\n/// @title A facet of KittyCore that manages Kitty siring, gestation, and birth.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBreeding is KittyOwnership {\n\n /// @dev The Pregnant event is fired when two cats successfully breed and the pregnancy\n /// timer begins for the matron.\n event Pregnant(address owner, uint256 matronId, uint256 sireId, uint256 cooldownEndBlock);\n\n /// @notice The minimum payment required to use breedWithAuto(). This fee goes towards\n /// the gas cost paid by whatever calls giveBirth(), and can be dynamically updated by\n /// the COO role as the gas price changes.\n uint256 public autoBirthFee = 2 finney;\n\n // Keeps track of number of pregnant kitties.\n uint256 public pregnantKitties;\n\n /// @dev The address of the sibling contract that is used to implement the sooper-sekret\n /// genetic combination algorithm.\n GeneScienceInterface public geneScience;\n\n /// @dev Update the address of the genetic contract, can only be called by the CEO.\n /// @param _address An address of a GeneScience contract instance to be used from this point forward.\n function setGeneScienceAddress(address _address) external onlyCEO {\n GeneScienceInterface candidateContract = GeneScienceInterface(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isGeneScience());\n\n // Set the new contract address\n geneScience = candidateContract;\n }\n\n /// @dev Checks that a given kitten is able to breed. Requires that the\n /// current cooldown is finished (for sires) and also checks that there is\n /// no pending pregnancy.\n function _isReadyToBreed(Kitty _kit) internal view returns (bool) {\n // In addition to checking the cooldownEndBlock, we also need to check to see if\n // the cat has a pending birth; there can be some period of time between the end\n // of the pregnacy timer and the birth event.\n return (_kit.siringWithId == 0) && (_kit.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @dev Check if a sire has authorized breeding with this matron. True if both sire\n /// and matron have the same owner, or if the sire has given siring permission to\n /// the matron's owner (via approveSiring()).\n function _isSiringPermitted(uint256 _sireId, uint256 _matronId) internal view returns (bool) {\n address matronOwner = kittyIndexToOwner[_matronId];\n address sireOwner = kittyIndexToOwner[_sireId];\n\n // Siring is okay if they have same owner, or if the matron's owner was given\n // permission to breed with this sire.\n return (matronOwner == sireOwner || sireAllowedToAddress[_sireId] == matronOwner);\n }\n\n /// @dev Set the cooldownEndTime for the given Kitty, based on its current cooldownIndex.\n /// Also increments the cooldownIndex (unless it has hit the cap).\n /// @param _kitten A reference to the Kitty in storage which needs its timer started.\n function _triggerCooldown(Kitty storage _kitten) internal {\n // Compute an estimation of the cooldown time in blocks (based on current cooldownIndex).\n _kitten.cooldownEndBlock = uint64((cooldowns[_kitten.cooldownIndex]/secondsPerBlock) + block.number);\n\n // Increment the breeding count, clamping it at 13, which is the length of the\n // cooldowns array. We could check the array size dynamically, but hard-coding\n // this as a constant saves gas. Yay, Solidity!\n if (_kitten.cooldownIndex < 13) {\n _kitten.cooldownIndex += 1;\n }\n }\n\n /// @notice Grants approval to another user to sire with one of your Kitties.\n /// @param _addr The address that will be able to sire with your Kitty. Set to\n /// address(0) to clear all siring approvals for this Kitty.\n /// @param _sireId A Kitty that you own that _addr will now be able to sire with.\n function approveSiring(address _addr, uint256 _sireId)\n external\n whenNotPaused\n {\n require(_owns(msg.sender, _sireId));\n sireAllowedToAddress[_sireId] = _addr;\n }\n\n /// @dev Updates the minimum payment required for calling giveBirthAuto(). Can only\n /// be called by the COO address. (This fee is used to offset the gas cost incurred\n /// by the autobirth daemon).\n function setAutoBirthFee(uint256 val) external onlyCOO {\n autoBirthFee = val;\n }\n\n /// @dev Checks to see if a given Kitty is pregnant and (if so) if the gestation\n /// period has passed.\n function _isReadyToGiveBirth(Kitty _matron) private view returns (bool) {\n return (_matron.siringWithId != 0) && (_matron.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @notice Checks that a given kitten is able to breed (i.e. it is not pregnant or\n /// in the middle of a siring cooldown).\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isReadyToBreed(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n Kitty storage kit = kitties[_kittyId];\n return _isReadyToBreed(kit);\n }\n\n /// @dev Checks whether a kitty is currently pregnant.\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isPregnant(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n // A kitty is pregnant if and only if this field is set\n return kitties[_kittyId].siringWithId != 0;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair. DOES NOT\n /// check ownership permissions (that is up to the caller).\n /// @param _matron A reference to the Kitty struct of the potential matron.\n /// @param _matronId The matron's ID.\n /// @param _sire A reference to the Kitty struct of the potential sire.\n /// @param _sireId The sire's ID\n function _isValidMatingPair(\n Kitty storage _matron,\n uint256 _matronId,\n Kitty storage _sire,\n uint256 _sireId\n )\n private\n view\n returns(bool)\n {\n // A Kitty can't breed with itself!\n if (_matronId == _sireId) {\n return false;\n }\n\n // Kitties can't breed with their parents.\n if (_matron.matronId == _sireId || _matron.sireId == _sireId) {\n return false;\n }\n if (_sire.matronId == _matronId || _sire.sireId == _matronId) {\n return false;\n }\n\n // We can short circuit the sibling check (below) if either cat is\n // gen zero (has a matron ID of zero).\n if (_sire.matronId == 0 || _matron.matronId == 0) {\n return true;\n }\n\n // Kitties can't breed with full or half siblings.\n if (_sire.matronId == _matron.matronId || _sire.matronId == _matron.sireId) {\n return false;\n }\n if (_sire.sireId == _matron.matronId || _sire.sireId == _matron.sireId) {\n return false;\n }\n\n // Everything seems cool! Let's get DTF.\n return true;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair for\n /// breeding via auction (i.e. skips ownership and siring approval checks).\n function _canBreedWithViaAuction(uint256 _matronId, uint256 _sireId)\n internal\n view\n returns (bool)\n {\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId);\n }\n\n /// @notice Checks to see if two cats can breed together, including checks for\n /// ownership and siring approvals. Does NOT check that both cats are ready for\n /// breeding (i.e. breedWith could still fail until the cooldowns are finished).\n /// TODO: Shouldn't this check pregnancy and cooldowns?!?\n /// @param _matronId The ID of the proposed matron.\n /// @param _sireId The ID of the proposed sire.\n function canBreedWith(uint256 _matronId, uint256 _sireId)\n external\n view\n returns(bool)\n {\n require(_matronId > 0);\n require(_sireId > 0);\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId) &&\n _isSiringPermitted(_sireId, _matronId);\n }\n\n /// @dev Internal utility function to initiate breeding, assumes that all breeding\n /// requirements have been checked.\n function _breedWith(uint256 _matronId, uint256 _sireId) internal {\n // Grab a reference to the Kitties from storage.\n Kitty storage sire = kitties[_sireId];\n Kitty storage matron = kitties[_matronId];\n\n // Mark the matron as pregnant, keeping track of who the sire is.\n matron.siringWithId = uint32(_sireId);\n\n // Trigger the cooldown for both parents.\n _triggerCooldown(sire);\n _triggerCooldown(matron);\n\n // Clear siring permission for both parents. This may not be strictly necessary\n // but it's likely to avoid confusion!\n delete sireAllowedToAddress[_matronId];\n delete sireAllowedToAddress[_sireId];\n\n // Every time a kitty gets pregnant, counter is incremented.\n pregnantKitties++;\n\n // Emit the pregnancy event.\n Pregnant(kittyIndexToOwner[_matronId], _matronId, _sireId, matron.cooldownEndBlock);\n }\n\n /// @notice Breed a Kitty you own (as matron) with a sire that you own, or for which you\n /// have previously been given Siring approval. Will either make your cat pregnant, or will\n /// fail entirely. Requires a pre-payment of the fee given out to the first caller of giveBirth()\n /// @param _matronId The ID of the Kitty acting as matron (will end up pregnant if successful)\n /// @param _sireId The ID of the Kitty acting as sire (will begin its siring cooldown if successful)\n function breedWithAuto(uint256 _matronId, uint256 _sireId)\n external\n payable\n whenNotPaused\n {\n // Checks for payment.\n require(msg.value >= autoBirthFee);\n\n // Caller must own the matron.\n require(_owns(msg.sender, _matronId));\n\n // Neither sire nor matron are allowed to be on auction during a normal\n // breeding operation, but we don't need to check that explicitly.\n // For matron: The caller of this function can't be the owner of the matron\n // because the owner of a Kitty on auction is the auction house, and the\n // auction house will never call breedWith().\n // For sire: Similarly, a sire on auction will be owned by the auction house\n // and the act of transferring ownership will have cleared any oustanding\n // siring approval.\n // Thus we don't need to spend gas explicitly checking to see if either cat\n // is on auction.\n\n // Check that matron and sire are both owned by caller, or that the sire\n // has given siring permission to caller (i.e. matron's owner).\n // Will fail for _sireId = 0\n require(_isSiringPermitted(_sireId, _matronId));\n\n // Grab a reference to the potential matron\n Kitty storage matron = kitties[_matronId];\n\n // Make sure matron isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(matron));\n\n // Grab a reference to the potential sire\n Kitty storage sire = kitties[_sireId];\n\n // Make sure sire isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(sire));\n\n // Test that these cats are a valid mating pair.\n require(_isValidMatingPair(\n matron,\n _matronId,\n sire,\n _sireId\n ));\n\n // All checks passed, kitty gets pregnant!\n _breedWith(_matronId, _sireId);\n }\n\n /// @notice Have a pregnant Kitty give birth!\n /// @param _matronId A Kitty ready to give birth.\n /// @return The Kitty ID of the new kitten.\n /// @dev Looks at a given Kitty and, if pregnant and if the gestation period has passed,\n /// combines the genes of the two parents to create a new kitten. The new Kitty is assigned\n /// to the current owner of the matron. Upon successful completion, both the matron and the\n /// new kitten will be ready to breed again. Note that anyone can call this function (if they\n /// are willing to pay the gas!), but the new kitten always goes to the mother's owner.\n function giveBirth(uint256 _matronId)\n external\n whenNotPaused\n returns(uint256)\n {\n // Grab a reference to the matron in storage.\n Kitty storage matron = kitties[_matronId];\n\n // Check that the matron is a valid cat.\n require(matron.birthTime != 0);\n\n // Check that the matron is pregnant, and that its time has come!\n require(_isReadyToGiveBirth(matron));\n\n // Grab a reference to the sire in storage.\n uint256 sireId = matron.siringWithId;\n Kitty storage sire = kitties[sireId];\n\n // Determine the higher generation number of the two parents\n uint16 parentGen = matron.generation;\n if (sire.generation > matron.generation) {\n parentGen = sire.generation;\n }\n\n // Call the sooper-sekret gene mixing operation.\n uint256 childGenes = geneScience.mixGenes(matron.genes, sire.genes, matron.cooldownEndBlock - 1);\n\n // Make the new kitten!\n address owner = kittyIndexToOwner[_matronId];\n uint256 kittenId = _createKitty(_matronId, matron.siringWithId, parentGen + 1, childGenes, owner);\n\n // Clear the reference to sire from the matron (REQUIRED! Having siringWithId\n // set is what marks a matron as being pregnant.)\n delete matron.siringWithId;\n\n // Every time a kitty gives birth counter is decremented.\n pregnantKitties--;\n\n // Send the balance fee to the person who made birth happen.\n msg.sender.send(autoBirthFee);\n\n // return the new kitten's ID\n return kittenId;\n }\n}\n\n\n\n\n\n\n\n\n\n\n/// @title Auction Core\n/// @dev Contains models, variables, and internal methods for the auction.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuctionBase {\n\n // Represents an auction on an NFT\n struct Auction {\n // Current owner of NFT\n address seller;\n // Price (in wei) at beginning of auction\n uint128 startingPrice;\n // Price (in wei) at end of auction\n uint128 endingPrice;\n // Duration (in seconds) of auction\n uint64 duration;\n // Time when auction started\n // NOTE: 0 if this auction has been concluded\n uint64 startedAt;\n }\n\n // Reference to contract tracking NFT ownership\n KittiesERC721 public nonFungibleContract;\n\n // Cut owner takes on each auction, measured in basis points (1/100 of a percent).\n // Values 0-10,000 map to 0%-100%\n uint256 public ownerCut;\n\n // Map from token ID to their corresponding auction.\n mapping (uint256 => Auction) tokenIdToAuction;\n\n event AuctionCreated(uint256 tokenId, uint256 startingPrice, uint256 endingPrice, uint256 duration);\n event AuctionSuccessful(uint256 tokenId, uint256 totalPrice, address winner);\n event AuctionCancelled(uint256 tokenId);\n\n /// @dev Returns true if the claimant owns the token.\n /// @param _claimant - Address claiming to own the token.\n /// @param _tokenId - ID of token whose ownership to verify.\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return (nonFungibleContract.ownerOf(_tokenId) == _claimant);\n }\n\n /// @dev Escrows the NFT, assigning ownership to this contract.\n /// Throws if the escrow fails.\n /// @param _owner - Current owner address of token to escrow.\n /// @param _tokenId - ID of token whose approval to verify.\n function _escrow(address _owner, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transferFrom(_owner, this, _tokenId);\n }\n\n /// @dev Transfers an NFT owned by this contract to another address.\n /// Returns true if the transfer succeeds.\n /// @param _receiver - Address to transfer NFT to.\n /// @param _tokenId - ID of token to transfer.\n function _transfer(address _receiver, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transfer(_receiver, _tokenId);\n }\n\n /// @dev Adds an auction to the list of open auctions. Also fires the\n /// AuctionCreated event.\n /// @param _tokenId The ID of the token to be put on auction.\n /// @param _auction Auction to add.\n function _addAuction(uint256 _tokenId, Auction _auction) internal {\n // Require that all auctions have a duration of\n // at least one minute. (Keeps our math from getting hairy!)\n require(_auction.duration >= 1 minutes);\n\n tokenIdToAuction[_tokenId] = _auction;\n\n AuctionCreated(\n uint256(_tokenId),\n uint256(_auction.startingPrice),\n uint256(_auction.endingPrice),\n uint256(_auction.duration)\n );\n }\n\n /// @dev Cancels an auction unconditionally.\n function _cancelAuction(uint256 _tokenId, address _seller) internal {\n _removeAuction(_tokenId);\n _transfer(_seller, _tokenId);\n AuctionCancelled(_tokenId);\n }\n\n /// @dev Computes the price and transfers winnings.\n /// Does NOT transfer ownership of token.\n function _bid(uint256 _tokenId, uint256 _bidAmount)\n internal\n returns (uint256)\n {\n // Get a reference to the auction struct\n Auction storage auction = tokenIdToAuction[_tokenId];\n\n // Explicitly check that this auction is currently live.\n // (Because of how Ethereum mappings work, we can't just count\n // on the lookup above failing. An invalid _tokenId will just\n // return an auction object that is all zeros.)\n require(_isOnAuction(auction));\n\n // Check that the bid is greater than or equal to the current price\n uint256 price = _currentPrice(auction);\n require(_bidAmount >= price);\n\n // Grab a reference to the seller before the auction struct\n // gets deleted.\n address seller = auction.seller;\n\n // The bid is good! Remove the auction before sending the fees\n // to the sender so we can't have a reentrancy attack.\n _removeAuction(_tokenId);\n\n // Transfer proceeds to seller (if there are any!)\n if (price > 0) {\n // Calculate the auctioneer's cut.\n // (NOTE: _computeCut() is guaranteed to return a\n // value <= price, so this subtraction can't go negative.)\n uint256 auctioneerCut = _computeCut(price);\n uint256 sellerProceeds = price - auctioneerCut;\n\n // NOTE: Doing a transfer() in the middle of a complex\n // method like this is generally discouraged because of\n // reentrancy attacks and DoS attacks if the seller is\n // a contract with an invalid fallback function. We explicitly\n // guard against reentrancy attacks by removing the auction\n // before calling transfer(), and the only thing the seller\n // can DoS is the sale of their own asset! (And if it's an\n // accident, they can call cancelAuction(). )\n seller.transfer(sellerProceeds);\n }\n\n // Calculate any excess funds included with the bid. If the excess\n // is anything worth worrying about, transfer it back to bidder.\n // NOTE: We checked above that the bid amount is greater than or\n // equal to the price so this cannot underflow.\n uint256 bidExcess = _bidAmount - price;\n\n // Return the funds. Similar to the previous transfer, this is\n // not susceptible to a re-entry attack because the auction is\n // removed before any transfers occur.\n msg.sender.transfer(bidExcess);\n\n // Tell the world!\n AuctionSuccessful(_tokenId, price, msg.sender);\n\n return price;\n }\n\n /// @dev Removes an auction from the list of open auctions.\n /// @param _tokenId - ID of NFT on auction.\n function _removeAuction(uint256 _tokenId) internal {\n delete tokenIdToAuction[_tokenId];\n }\n\n /// @dev Returns true if the NFT is on auction.\n /// @param _auction - Auction to check.\n function _isOnAuction(Auction storage _auction) internal view returns (bool) {\n return (_auction.startedAt > 0);\n }\n\n /// @dev Returns current price of an NFT on auction. Broken into two\n /// functions (this one, that computes the duration from the auction\n /// structure, and the other that does the price computation) so we\n /// can easily test that the price computation works correctly.\n function _currentPrice(Auction storage _auction)\n internal\n view\n returns (uint256)\n {\n uint256 secondsPassed = 0;\n\n // A bit of insurance against negative values (or wraparound).\n // Probably not necessary (since Ethereum guarnatees that the\n // now variable doesn't ever go backwards).\n if (now > _auction.startedAt) {\n secondsPassed = now - _auction.startedAt;\n }\n\n return _computeCurrentPrice(\n _auction.startingPrice,\n _auction.endingPrice,\n _auction.duration,\n secondsPassed\n );\n }\n\n /// @dev Computes the current price of an auction. Factored out\n /// from _currentPrice so we can run extensive unit tests.\n /// When testing, make this function public and turn on\n /// `Current price computation` test suite.\n function _computeCurrentPrice(\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n uint256 _secondsPassed\n )\n internal\n pure\n returns (uint256)\n {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our public functions carefully cap the maximum values for\n // time (at 64-bits) and currency (at 128-bits). _duration is\n // also known to be non-zero (see the require() statement in\n // _addAuction())\n if (_secondsPassed >= _duration) {\n // We've reached the end of the dynamic pricing portion\n // of the auction, just return the end price.\n return _endingPrice;\n } else {\n // Starting price can be higher than ending price (and often is!), so\n // this delta can be negative.\n int256 totalPriceChange = int256(_endingPrice) - int256(_startingPrice);\n\n // This multiplication can't overflow, _secondsPassed will easily fit within\n // 64-bits, and totalPriceChange will easily fit within 128-bits, their product\n // will always fit within 256-bits.\n int256 currentPriceChange = totalPriceChange * int256(_secondsPassed) / int256(_duration);\n\n // currentPriceChange can be negative, but if so, will have a magnitude\n // less that _startingPrice. Thus, this result will always end up positive.\n int256 currentPrice = int256(_startingPrice) + currentPriceChange;\n\n return uint256(currentPrice);\n }\n }\n\n /// @dev Computes owner's cut of a sale.\n /// @param _price - Sale price of NFT.\n function _computeCut(uint256 _price) internal view returns (uint256) {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our entry functions carefully cap the maximum values for\n // currency (at 128-bits), and ownerCut <= 10000 (see the require()\n // statement in the ClockAuction constructor). The result of this\n // function is always guaranteed to be <= _price.\n return _price * ownerCut / 10000;\n }\n\n}\n\n\n\n\n\n\n\n/**\n * @title KittiesPausable\n * @dev Base contract which allows children to implement an emergency stop mechanism.\n */\ncontract KittiesPausable is KittiesOwnable {\n event Pause();\n event Unpause();\n\n bool public paused = false;\n\n\n /**\n\t * @dev modifier to allow actions only when the contract IS paused\n\t */\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /**\n\t * @dev modifier to allow actions only when the contract IS NOT paused\n\t */\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /**\n\t * @dev called by the owner to pause, triggers stopped state\n\t */\n function pause() onlyOwner whenNotPaused returns (bool) {\n paused = true;\n Pause();\n return true;\n }\n\n /**\n\t * @dev called by the owner to unpause, returns to normal state\n\t */\n function unpause() onlyOwner whenPaused returns (bool) {\n paused = false;\n Unpause();\n return true;\n }\n}\n\n\n/// @title Clock auction for non-fungible tokens.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuction is KittiesPausable, ClockAuctionBase {\n\n /// @dev The ERC-165 interface signature for ERC-721.\n /// Ref: https://github.com/ethereum/EIPs/issues/165\n /// Ref: https://github.com/ethereum/EIPs/issues/721\n bytes4 constant InterfaceSignature_ERC721 = bytes4(0x9a20483d);\n\n /// @dev Constructor creates a reference to the NFT ownership contract\n /// and verifies the owner cut is in the valid range.\n /// @param _nftAddress - address of a deployed contract implementing\n /// the Nonfungible Interface.\n /// @param _cut - percent cut the owner takes on each auction, must be\n /// between 0-10,000.\n function ClockAuction(address _nftAddress, uint256 _cut) public {\n require(_cut <= 10000);\n ownerCut = _cut;\n\n KittiesERC721 candidateContract = KittiesERC721(_nftAddress);\n require(candidateContract.supportsInterface(InterfaceSignature_ERC721));\n nonFungibleContract = candidateContract;\n }\n\n /// @dev Remove all Ether from the contract, which is the owner's cuts\n /// as well as any Ether sent directly to the contract address.\n /// Always transfers to the NFT contract, but can be called either by\n /// the owner or the NFT contract.\n function withdrawBalance() external {\n address nftAddress = address(nonFungibleContract);\n\n require(\n msg.sender == owner ||\n msg.sender == nftAddress\n );\n // We are using this boolean method to make sure that even if one fails it will still work\n bool res = nftAddress.send(this.balance);\n }\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of time to move between starting\n /// price and ending price (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n whenNotPaused\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(_owns(msg.sender, _tokenId));\n _escrow(msg.sender, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Bids on an open auction, completing the auction and transferring\n /// ownership of the NFT if enough Ether is supplied.\n /// @param _tokenId - ID of token to bid on.\n function bid(uint256 _tokenId)\n external\n payable\n whenNotPaused\n {\n // _bid will throw if the bid or funds transfer fails\n _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n }\n\n /// @dev Cancels an auction that hasn't been won yet.\n /// Returns the NFT to original owner.\n /// @notice This is a state-modifying function that can\n /// be called while the contract is paused.\n /// @param _tokenId - ID of token on auction\n function cancelAuction(uint256 _tokenId)\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n address seller = auction.seller;\n require(msg.sender == seller);\n _cancelAuction(_tokenId, seller);\n }\n\n /// @dev Cancels an auction when the contract is paused.\n /// Only the owner may do this, and NFTs are returned to\n /// the seller. This should only be used in emergencies.\n /// @param _tokenId - ID of the NFT on auction to cancel.\n function cancelAuctionWhenPaused(uint256 _tokenId)\n whenPaused\n onlyOwner\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n _cancelAuction(_tokenId, auction.seller);\n }\n\n /// @dev Returns auction info for an NFT on auction.\n /// @param _tokenId - ID of NFT on auction.\n function getAuction(uint256 _tokenId)\n external\n view\n returns\n (\n address seller,\n uint256 startingPrice,\n uint256 endingPrice,\n uint256 duration,\n uint256 startedAt\n ) {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return (\n auction.seller,\n auction.startingPrice,\n auction.endingPrice,\n auction.duration,\n auction.startedAt\n );\n }\n\n /// @dev Returns the current price of an auction.\n /// @param _tokenId - ID of the token price we are checking.\n function getCurrentPrice(uint256 _tokenId)\n external\n view\n returns (uint256)\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return _currentPrice(auction);\n }\n\n}\n\n\n/// @title Reverse auction modified for siring\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SiringClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSiringAuctionAddress() call.\n bool public isSiringClockAuction = true;\n\n // Delegate constructor\n function SiringClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction. Since this function is wrapped,\n /// require sender to be KittyCore contract.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Places a bid for siring. Requires the sender\n /// is the KittyCore contract because all bid methods\n /// should be wrapped. Also returns the kitty to the\n /// seller rather than the winner.\n function bid(uint256 _tokenId)\n external\n payable\n {\n require(msg.sender == address(nonFungibleContract));\n address seller = tokenIdToAuction[_tokenId].seller;\n // _bid checks that token ID is valid and will throw if bid fails\n _bid(_tokenId, msg.value);\n // We transfer the kitty back to the seller, the winner will get\n // the offspring\n _transfer(seller, _tokenId);\n }\n\n}\n\n\n\n\n\n/// @title Clock auction modified for sale of kitties\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SaleClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSaleAuctionAddress() call.\n bool public isSaleClockAuction = true;\n\n // Tracks last 5 sale price of gen0 kitty sales\n uint256 public gen0SaleCount;\n uint256[5] public lastGen0SalePrices;\n\n // Delegate constructor\n function SaleClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Updates lastSalePrice if seller is the nft contract\n /// Otherwise, works the same as default bid method.\n function bid(uint256 _tokenId)\n external\n payable\n {\n // _bid verifies token ID size\n address seller = tokenIdToAuction[_tokenId].seller;\n uint256 price = _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n\n // If not a gen0 auction, exit\n if (seller == address(nonFungibleContract)) {\n // Track gen0 sale prices\n lastGen0SalePrices[gen0SaleCount % 5] = price;\n gen0SaleCount++;\n }\n }\n\n function averageGen0SalePrice() external view returns (uint256) {\n uint256 sum = 0;\n for (uint256 i = 0; i < 5; i++) {\n sum += lastGen0SalePrices[i];\n }\n return sum / 5;\n }\n\n}\n\n\n/// @title Handles creating auctions for sale and siring of kitties.\n/// This wrapper of ReverseAuction exists only so that users can create\n/// auctions with only one transaction.\ncontract KittyAuction is KittyBreeding {\n\n // @notice The auction contract variables are defined in KittyBase to allow\n // us to refer to them in KittyOwnership to prevent accidental transfers.\n // `saleAuction` refers to the auction for gen0 and p2p sale of kitties.\n // `siringAuction` refers to the auction for siring rights of kitties.\n\n /// @dev Sets the reference to the sale auction.\n /// @param _address - Address of sale contract.\n function setSaleAuctionAddress(address _address) external onlyCEO {\n SaleClockAuction candidateContract = SaleClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSaleClockAuction());\n\n // Set the new contract address\n saleAuction = candidateContract;\n }\n\n /// @dev Sets the reference to the siring auction.\n /// @param _address - Address of siring contract.\n function setSiringAuctionAddress(address _address) external onlyCEO {\n SiringClockAuction candidateContract = SiringClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSiringClockAuction());\n\n // Set the new contract address\n siringAuction = candidateContract;\n }\n\n /// @dev Put a kitty up for auction.\n /// Does some ownership trickery to create auctions in one tx.\n function createSaleAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n // Ensure the kitty is not pregnant to prevent the auction\n // contract accidentally receiving ownership of the child.\n // NOTE: the kitty IS allowed to be in a cooldown.\n require(!isPregnant(_kittyId));\n _approve(_kittyId, saleAuction);\n // Sale auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n saleAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Put a kitty up for auction to be sire.\n /// Performs checks to ensure the kitty can be sired, then\n /// delegates to reverse auction.\n function createSiringAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n require(isReadyToBreed(_kittyId));\n _approve(_kittyId, siringAuction);\n // Siring auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n siringAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Completes a siring auction by bidding.\n /// Immediately breeds the winning matron with the sire on auction.\n /// @param _sireId - ID of the sire on auction.\n /// @param _matronId - ID of the matron owned by the bidder.\n function bidOnSiringAuction(\n uint256 _sireId,\n uint256 _matronId\n )\n external\n payable\n whenNotPaused\n {\n // Auction contract checks input sizes\n require(_owns(msg.sender, _matronId));\n require(isReadyToBreed(_matronId));\n require(_canBreedWithViaAuction(_matronId, _sireId));\n\n // Define the current price of the auction.\n uint256 currentPrice = siringAuction.getCurrentPrice(_sireId);\n require(msg.value >= currentPrice + autoBirthFee);\n\n // Siring auction will throw if the bid fails.\n siringAuction.bid.value(msg.value - autoBirthFee)(_sireId);\n _breedWith(uint32(_matronId), uint32(_sireId));\n }\n\n /// @dev Transfers the balance of the sale auction contract\n /// to the KittyCore contract. We use two-step withdrawal to\n /// prevent two transfer calls in the auction bid function.\n function withdrawAuctionBalances() external onlyCLevel {\n saleAuction.withdrawBalance();\n siringAuction.withdrawBalance();\n }\n}\n\n\n/// @title all functions related to creating kittens\ncontract KittyMinting is KittyAuction {\n\n // Limits the number of cats the contract owner can ever create.\n uint256 public constant PROMO_CREATION_LIMIT = 5000;\n uint256 public constant GEN0_CREATION_LIMIT = 45000;\n\n // Constants for gen0 auctions.\n uint256 public constant GEN0_STARTING_PRICE = 10 finney;\n uint256 public constant GEN0_AUCTION_DURATION = 1 days;\n\n // Counts the number of cats the contract owner has created.\n uint256 public promoCreatedCount;\n uint256 public gen0CreatedCount;\n\n /// @dev we can create promo kittens, up to a limit. Only callable by COO\n /// @param _genes the encoded genes of the kitten to be created, any value is accepted\n /// @param _owner the future owner of the created kittens. Default to contract COO\n function createPromoKitty(uint256 _genes, address _owner) external onlyCOO {\n address kittyOwner = _owner;\n if (kittyOwner == address(0)) {\n kittyOwner = cooAddress;\n }\n require(promoCreatedCount < PROMO_CREATION_LIMIT);\n\n promoCreatedCount++;\n _createKitty(0, 0, 0, _genes, kittyOwner);\n }\n\n /// @dev Creates a new gen0 kitty with the given genes and\n /// creates an auction for it.\n function createGen0Auction(uint256 _genes) external onlyCOO {\n require(gen0CreatedCount < GEN0_CREATION_LIMIT);\n\n uint256 kittyId = _createKitty(0, 0, 0, _genes, address(this));\n _approve(kittyId, saleAuction);\n\n saleAuction.createAuction(\n kittyId,\n _computeNextGen0Price(),\n 0,\n GEN0_AUCTION_DURATION,\n address(this)\n );\n\n gen0CreatedCount++;\n }\n\n /// @dev Computes the next gen0 auction starting price, given\n /// the average of the past 5 prices + 50%.\n function _computeNextGen0Price() internal view returns (uint256) {\n uint256 avePrice = saleAuction.averageGen0SalePrice();\n\n // Sanity check to ensure we don't overflow arithmetic\n require(avePrice == uint256(uint128(avePrice)));\n\n uint256 nextPrice = avePrice + (avePrice / 2);\n\n // We never auction for less than starting price\n if (nextPrice < GEN0_STARTING_PRICE) {\n nextPrice = GEN0_STARTING_PRICE;\n }\n\n return nextPrice;\n }\n}\n\n\n/// @title CryptoKitties: Collectible, breedable, and oh-so-adorable cats on the Ethereum blockchain.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev The main CryptoKitties contract, keeps track of kittens so they don't wander around and get lost.\ncontract KittyCore is KittyMinting {\n\n // This is the main CryptoKitties contract. In order to keep our code seperated into logical sections,\n // we've broken it up in two ways. First, we have several seperately-instantiated sibling contracts\n // that handle auctions and our super-top-secret genetic combination algorithm. The auctions are\n // seperate since their logic is somewhat complex and there's always a risk of subtle bugs. By keeping\n // them in their own contracts, we can upgrade them without disrupting the main contract that tracks\n // kitty ownership. The genetic combination algorithm is kept seperate so we can open-source all of\n // the rest of our code without making it _too_ easy for folks to figure out how the genetics work.\n // Don't worry, I'm sure someone will reverse engineer it soon enough!\n //\n // Secondly, we break the core contract into multiple files using inheritence, one for each major\n // facet of functionality of CK. This allows us to keep related code bundled together while still\n // avoiding a single giant file with everything in it. The breakdown is as follows:\n //\n // - KittyBase: This is where we define the most fundamental code shared throughout the core\n // functionality. This includes our main data storage, constants and data types, plus\n // internal functions for managing these items.\n //\n // - KittyAccessControl: This contract manages the various addresses and constraints for operations\n // that can be executed only by specific roles. Namely CEO, CFO and COO.\n //\n // - KittyOwnership: This provides the methods required for basic non-fungible token\n // transactions, following the draft ERC-721 spec (https://github.com/ethereum/EIPs/issues/721).\n //\n // - KittyBreeding: This file contains the methods necessary to breed cats together, including\n // keeping track of siring offers, and relies on an external genetic combination contract.\n //\n // - KittyAuctions: Here we have the public methods for auctioning or bidding on cats or siring\n // services. The actual auction functionality is handled in two sibling contracts (one\n // for sales and one for siring), while auction creation and bidding is mostly mediated\n // through this facet of the core contract.\n //\n // - KittyMinting: This final facet contains the functionality we use for creating new gen0 cats.\n // We can make up to 5000 \"promo\" cats that can be given away (especially important when\n // the community is new), and all others can only be created and then immediately put up\n // for auction via an algorithmically determined starting price. Regardless of how they\n // are created, there is a hard limit of 50k gen0 cats. After that, it's all up to the\n // community to breed, breed, breed!\n\n // Set in case the core contract is broken and an upgrade is required\n address public newContractAddress;\n\n /// @notice Creates the main CryptoKitties smart contract instance.\n function KittyCore() public {\n // Starts paused.\n paused = true;\n\n // the creator of the contract is the initial CEO\n ceoAddress = msg.sender;\n\n // the creator of the contract is also the initial COO\n cooAddress = msg.sender;\n\n // start with the mythical kitten 0 - so we don't have generation-0 parent issues\n _createKitty(0, 0, 0, uint256(-1), address(0));\n }\n\n /// @dev Used to mark the smart contract as upgraded, in case there is a serious\n /// breaking bug. This method does nothing but keep track of the new contract and\n /// emit a message indicating that the new address is set. It's up to clients of this\n /// contract to update to the new contract address in that case. (This contract will\n /// be paused indefinitely if such an upgrade takes place.)\n /// @param _v2Address new address\n function setNewAddress(address _v2Address) external onlyCEO whenPaused {\n // See README.md for updgrade plan\n newContractAddress = _v2Address;\n ContractUpgrade(_v2Address);\n }\n\n /// @notice No tipping!\n /// @dev Reject all Ether from being sent here, unless it's from one of the\n /// two auction contracts. (Hopefully, we can prevent user accidents.)\n function() external payable {\n require(\n msg.sender == address(saleAuction) ||\n msg.sender == address(siringAuction)\n );\n }\n\n /// @notice Returns all the relevant information about a specific kitty.\n /// @param _id The ID of the kitty of interest.\n function getKitty(uint256 _id)\n external\n view\n returns (\n bool isGestating,\n bool isReady,\n uint256 cooldownIndex,\n uint256 nextActionAt,\n uint256 siringWithId,\n uint256 birthTime,\n uint256 matronId,\n uint256 sireId,\n uint256 generation,\n uint256 genes\n ) {\n Kitty storage kit = kitties[_id];\n\n // if this variable is 0 then it's not gestating\n isGestating = (kit.siringWithId != 0);\n isReady = (kit.cooldownEndBlock <= block.number);\n cooldownIndex = uint256(kit.cooldownIndex);\n nextActionAt = uint256(kit.cooldownEndBlock);\n siringWithId = uint256(kit.siringWithId);\n birthTime = uint256(kit.birthTime);\n matronId = uint256(kit.matronId);\n sireId = uint256(kit.sireId);\n generation = uint256(kit.generation);\n genes = kit.genes;\n }\n\n /// @dev Override unpause so it requires all external contract addresses\n /// to be set before contract can be unpaused. Also, we can't have\n /// newContractAddress set either, because then the contract was upgraded.\n /// @notice This is public rather than external so we can call super.unpause\n /// without using an expensive CALL.\n function unpause() public onlyCEO whenPaused {\n require(saleAuction != address(0));\n require(siringAuction != address(0));\n require(geneScience != address(0));\n require(newContractAddress == address(0));\n\n // Actually unpause the contract.\n super.unpause();\n }\n\n // @dev Allows the CFO to capture the balance available to the contract.\n function withdrawBalance() external onlyCFO {\n uint256 balance = this.balance;\n // Subtract all the currently pregnant kittens we have, plus 1 of margin.\n uint256 subtractFees = (pregnantKitties + 1) * autoBirthFee;\n\n if (balance > subtractFees) {\n cfoAddress.send(balance - subtractFees);\n }\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "exportedSymbols": { "ClockAuction": [ 8872 @@ -52025,5 +52025,5 @@ export const SaleClockAuction = }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:48.006Z" + "updatedAt": "2018-10-09T17:45:36.391Z" } \ No newline at end of file diff --git a/artifacts/ts/SimpleInterestTermsContract.ts b/artifacts/ts/SimpleInterestTermsContract.ts index 784c8907..13ded17f 100644 --- a/artifacts/ts/SimpleInterestTermsContract.ts +++ b/artifacts/ts/SimpleInterestTermsContract.ts @@ -382,15 +382,15 @@ export const SimpleInterestTermsContract = "type": "event" } ], - "bytecode": "0x6060604052341561000f57600080fd5b6040516020806117e78339810160405280805190602001909190505080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505061176b8061007c6000396000f3006060604052600436106100e6576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a896a1146100eb5780630776298214610126578063208638941461014f5780632762dd8c1461017857806340018a0d146101b35780635f0280ba146101dc5780636f69c96f146102815780638b47e58a146102aa57806393529cdf146102d3578063977a5e64146102fc57806399114d841461035a578063abf410e51461039e578063de53a13c146103f3578063ed8907d71461041c578063fd127a4114610473578063fd40d52e1461049c575b600080fd5b34156100f657600080fd5b6101106004808035600019169060200190919050506104d7565b6040518082815260200191505060405180910390f35b341561013157600080fd5b6101396104fb565b6040518082815260200191505060405180910390f35b341561015a57600080fd5b610162610504565b6040518082815260200191505060405180910390f35b341561018357600080fd5b61019d600480803560001916906020019091905050610510565b6040518082815260200191505060405180910390f35b34156101be57600080fd5b6101c6610532565b6040518082815260200191505060405180910390f35b34156101e757600080fd5b61026760048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061053e565b604051808215151515815260200191505060405180910390f35b341561028c57600080fd5b6102946107b3565b6040518082815260200191505060405180910390f35b34156102b557600080fd5b6102bd6107b9565b6040518082815260200191505060405180910390f35b34156102de57600080fd5b6102e66107be565b6040518082815260200191505060405180910390f35b341561030757600080fd5b61034060048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506107c4565b604051808215151515815260200191505060405180910390f35b341561036557600080fd5b610388600480803560001916906020019091908035906020019091905050610c55565b6040518082815260200191505060405180910390f35b34156103a957600080fd5b6103b1610e61565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103fe57600080fd5b610406610e87565b6040518082815260200191505060405180910390f35b341561042757600080fd5b610441600480803560001916906020019091905050610e90565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b341561047e57600080fd5b610486610f88565b6040518082815260200191505060405180910390f35b34156104a757600080fd5b6104c1600480803560001916906020019091905050610f95565b6040518082815260200191505060405180910390f35b60008060008360001916600019168152602001908152602001600020549050919050565b6018610e100281565b601e6018610e10020281565b600061051a6116e0565b61052383610fad565b90508060600151915050919050565b60076018610e10020281565b60006105486116e0565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636fa9d0566000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156105d657600080fd5b6102c65a03f115156105e757600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561062a57600080fd5b61063387610fad565b9050806000015173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107a45761069a846000808a60001916600019168152602001908152602001600020546114a990919063ffffffff16565b6000808960001916600019168152602001908152602001600020819055507ff1a888d220228f843ac3044ef257c80642e6434d1ddc7ebee0a2813cced3406c87878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405180910390a1600191506107a9565b600091505b5095945050505050565b610e1081565b600581565b61271081565b6000806000806000806000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663079dd4b76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561086057600080fd5b6102c65a03f1151561087157600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108b457600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561094257600080fd5b6102c65a03f1151561095357600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16636be39bda8c6000604051604001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082600019166000191681526020019150506040805180830381600087803b15156109da57600080fd5b6102c65a03f115156109eb57600080fd5b505050604051805190602001805190508098508199505050610a0c87610e90565b809650819750829850839950849a505050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d23c4c76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610aae57600080fd5b6102c65a03f11515610abf57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16635715c5b7876000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515610b3f57600080fd5b6102c65a03f11515610b5057600080fd5b505050604051805190509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015610b995750600583105b8015610bd057503073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b15610c4257828173ffffffffffffffffffffffffffffffffffffffff168c600019167f2c500aaec6833a053693d8c2a18a3ed5649a4609699abaf7778c3d389cc40c0588888760405180848152602001838152602001828152602001935050505060405180910390a460019850610c47565b600098505b505050505050505092915050565b6000610c5f6116e0565b60008085600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610cf157600080fd5b6102c65a03f11515610d0257600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663f6f494c9826000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610d8a57600080fd5b6102c65a03f11515610d9b57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16141515610dde57600080fd5b610de787610fad565b9350610df2846114c7565b9250836040015186111515610e0a5760009450610e57565b836060015186101515610e1f57829450610e57565b610e29868561151d565b9150610e548460a00151610e46848661156790919063ffffffff16565b6115a290919063ffffffff16565b94505b5050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60646127100281565b6000806000806000806000806000807fff000000000000000000000000000000000000000000000000000000000000006001028b1694507effffffffffffffffffffffff000000000000000000000000000000000000006001028b16935072ffffff000000000000000000000000000000006001028b1692506ff00000000000000000000000000000006001028b1691506f0ffff0000000000000000000000000006001028b169050610f448560f86115bd565b610f4f8560986115bd565b610f5a8560806115bd565b610f6585607c6115bd565b610f7085606c6115bd565b99509950995099509950505050505091939590929450565b61016d6018610e10020281565b60006020528060005260406000206000915090505481565b610fb56116e0565b600080600080600080600080600080600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561105557600080fd5b6102c65a03f1151561106657600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663314a522e8f6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156110ee57600080fd5b6102c65a03f115156110ff57600080fd5b505050604051805190509b506111148c610e90565b809b50819c50829d50839e50849f505050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d23c4c76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156111b657600080fd5b6102c65a03f115156111c757600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16635715c5b78c6000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561124757600080fd5b6102c65a03f1151561125857600080fd5b505050604051805190509550600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16141515156112a057600080fd5b6004808111156112ac57fe5b88111515156112ba57600080fd5b8760048111156112c657fe5b94506112d1856115da565b9350600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561136157600080fd5b6102c65a03f1151561137257600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663d69dbf638f6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156113fa57600080fd5b6102c65a03f1151561140b57600080fd5b50505060405180519050925061142a848861156790919063ffffffff16565b915061143f83836114a990919063ffffffff16565b905060e0604051908101604052808773ffffffffffffffffffffffffffffffffffffffff1681526020018b815260200184815260200182815260200186600481111561148757fe5b81526020018881526020018a8152509c50505050505050505050505050919050565b60008082840190508381101515156114bd57fe5b8091505092915050565b6000806114fc6064612710026114ee8560c00151866020015161156790919063ffffffff16565b6115a290919063ffffffff16565b90506115158184602001516114a990919063ffffffff16565b915050919050565b60008060006115398460400151866116c790919063ffffffff16565b915061154884608001516115da565b905061155d81836115a290919063ffffffff16565b9250505092915050565b600080600084141561157c576000915061159b565b828402905082848281151561158d57fe5b0414151561159757fe5b8091505b5092915050565b60008082848115156115b057fe5b0490508091505092915050565b60008160020a83600190048115156115d157fe5b04905092915050565b60008060048111156115e857fe5b8260048111156115f457fe5b141561160457610e1090506116c2565b6001600481111561161157fe5b82600481111561161d57fe5b1415611630576018610e100290506116c2565b6002600481111561163d57fe5b82600481111561164957fe5b141561165f5760076018610e10020290506116c2565b6003600481111561166c57fe5b82600481111561167857fe5b141561168e57601e6018610e10020290506116c2565b60048081111561169a57fe5b8260048111156116a657fe5b14156116bd5761016d6018610e10020290506116c2565b600080fd5b919050565b60008282111515156116d557fe5b818303905092915050565b60e060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600081526020016000600481111561172b57fe5b8152602001600081526020016000815250905600a165627a7a7230582040cb6bb30b94ef3877a45b4fb18801bd9f1d591eb0fcf6008d2a3ed54eaf48db0029", - "deployedBytecode": "0x6060604052600436106100e6576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a896a1146100eb5780630776298214610126578063208638941461014f5780632762dd8c1461017857806340018a0d146101b35780635f0280ba146101dc5780636f69c96f146102815780638b47e58a146102aa57806393529cdf146102d3578063977a5e64146102fc57806399114d841461035a578063abf410e51461039e578063de53a13c146103f3578063ed8907d71461041c578063fd127a4114610473578063fd40d52e1461049c575b600080fd5b34156100f657600080fd5b6101106004808035600019169060200190919050506104d7565b6040518082815260200191505060405180910390f35b341561013157600080fd5b6101396104fb565b6040518082815260200191505060405180910390f35b341561015a57600080fd5b610162610504565b6040518082815260200191505060405180910390f35b341561018357600080fd5b61019d600480803560001916906020019091905050610510565b6040518082815260200191505060405180910390f35b34156101be57600080fd5b6101c6610532565b6040518082815260200191505060405180910390f35b34156101e757600080fd5b61026760048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061053e565b604051808215151515815260200191505060405180910390f35b341561028c57600080fd5b6102946107b3565b6040518082815260200191505060405180910390f35b34156102b557600080fd5b6102bd6107b9565b6040518082815260200191505060405180910390f35b34156102de57600080fd5b6102e66107be565b6040518082815260200191505060405180910390f35b341561030757600080fd5b61034060048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506107c4565b604051808215151515815260200191505060405180910390f35b341561036557600080fd5b610388600480803560001916906020019091908035906020019091905050610c55565b6040518082815260200191505060405180910390f35b34156103a957600080fd5b6103b1610e61565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103fe57600080fd5b610406610e87565b6040518082815260200191505060405180910390f35b341561042757600080fd5b610441600480803560001916906020019091905050610e90565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b341561047e57600080fd5b610486610f88565b6040518082815260200191505060405180910390f35b34156104a757600080fd5b6104c1600480803560001916906020019091905050610f95565b6040518082815260200191505060405180910390f35b60008060008360001916600019168152602001908152602001600020549050919050565b6018610e100281565b601e6018610e10020281565b600061051a6116e0565b61052383610fad565b90508060600151915050919050565b60076018610e10020281565b60006105486116e0565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636fa9d0566000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156105d657600080fd5b6102c65a03f115156105e757600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561062a57600080fd5b61063387610fad565b9050806000015173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107a45761069a846000808a60001916600019168152602001908152602001600020546114a990919063ffffffff16565b6000808960001916600019168152602001908152602001600020819055507ff1a888d220228f843ac3044ef257c80642e6434d1ddc7ebee0a2813cced3406c87878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405180910390a1600191506107a9565b600091505b5095945050505050565b610e1081565b600581565b61271081565b6000806000806000806000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663079dd4b76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561086057600080fd5b6102c65a03f1151561087157600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108b457600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561094257600080fd5b6102c65a03f1151561095357600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16636be39bda8c6000604051604001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082600019166000191681526020019150506040805180830381600087803b15156109da57600080fd5b6102c65a03f115156109eb57600080fd5b505050604051805190602001805190508098508199505050610a0c87610e90565b809650819750829850839950849a505050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d23c4c76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610aae57600080fd5b6102c65a03f11515610abf57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16635715c5b7876000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515610b3f57600080fd5b6102c65a03f11515610b5057600080fd5b505050604051805190509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015610b995750600583105b8015610bd057503073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b15610c4257828173ffffffffffffffffffffffffffffffffffffffff168c600019167f2c500aaec6833a053693d8c2a18a3ed5649a4609699abaf7778c3d389cc40c0588888760405180848152602001838152602001828152602001935050505060405180910390a460019850610c47565b600098505b505050505050505092915050565b6000610c5f6116e0565b60008085600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610cf157600080fd5b6102c65a03f11515610d0257600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663f6f494c9826000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610d8a57600080fd5b6102c65a03f11515610d9b57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16141515610dde57600080fd5b610de787610fad565b9350610df2846114c7565b9250836040015186111515610e0a5760009450610e57565b836060015186101515610e1f57829450610e57565b610e29868561151d565b9150610e548460a00151610e46848661156790919063ffffffff16565b6115a290919063ffffffff16565b94505b5050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60646127100281565b6000806000806000806000806000807fff000000000000000000000000000000000000000000000000000000000000006001028b1694507effffffffffffffffffffffff000000000000000000000000000000000000006001028b16935072ffffff000000000000000000000000000000006001028b1692506ff00000000000000000000000000000006001028b1691506f0ffff0000000000000000000000000006001028b169050610f448560f86115bd565b610f4f8560986115bd565b610f5a8560806115bd565b610f6585607c6115bd565b610f7085606c6115bd565b99509950995099509950505050505091939590929450565b61016d6018610e10020281565b60006020528060005260406000206000915090505481565b610fb56116e0565b600080600080600080600080600080600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561105557600080fd5b6102c65a03f1151561106657600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663314a522e8f6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156110ee57600080fd5b6102c65a03f115156110ff57600080fd5b505050604051805190509b506111148c610e90565b809b50819c50829d50839e50849f505050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d23c4c76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156111b657600080fd5b6102c65a03f115156111c757600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16635715c5b78c6000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561124757600080fd5b6102c65a03f1151561125857600080fd5b505050604051805190509550600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16141515156112a057600080fd5b6004808111156112ac57fe5b88111515156112ba57600080fd5b8760048111156112c657fe5b94506112d1856115da565b9350600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561136157600080fd5b6102c65a03f1151561137257600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663d69dbf638f6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156113fa57600080fd5b6102c65a03f1151561140b57600080fd5b50505060405180519050925061142a848861156790919063ffffffff16565b915061143f83836114a990919063ffffffff16565b905060e0604051908101604052808773ffffffffffffffffffffffffffffffffffffffff1681526020018b815260200184815260200182815260200186600481111561148757fe5b81526020018881526020018a8152509c50505050505050505050505050919050565b60008082840190508381101515156114bd57fe5b8091505092915050565b6000806114fc6064612710026114ee8560c00151866020015161156790919063ffffffff16565b6115a290919063ffffffff16565b90506115158184602001516114a990919063ffffffff16565b915050919050565b60008060006115398460400151866116c790919063ffffffff16565b915061154884608001516115da565b905061155d81836115a290919063ffffffff16565b9250505092915050565b600080600084141561157c576000915061159b565b828402905082848281151561158d57fe5b0414151561159757fe5b8091505b5092915050565b60008082848115156115b057fe5b0490508091505092915050565b60008160020a83600190048115156115d157fe5b04905092915050565b60008060048111156115e857fe5b8260048111156115f457fe5b141561160457610e1090506116c2565b6001600481111561161157fe5b82600481111561161d57fe5b1415611630576018610e100290506116c2565b6002600481111561163d57fe5b82600481111561164957fe5b141561165f5760076018610e10020290506116c2565b6003600481111561166c57fe5b82600481111561167857fe5b141561168e57601e6018610e10020290506116c2565b60048081111561169a57fe5b8260048111156116a657fe5b14156116bd5761016d6018610e10020290506116c2565b600080fd5b919050565b60008282111515156116d557fe5b818303905092915050565b60e060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600081526020016000600481111561172b57fe5b8152602001600081526020016000815250905600a165627a7a7230582040cb6bb30b94ef3877a45b4fb18801bd9f1d591eb0fcf6008d2a3ed54eaf48db0029", + "bytecode": "0x6060604052341561000f57600080fd5b6040516020806117e78339810160405280805190602001909190505080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505061176b8061007c6000396000f3006060604052600436106100e6576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a896a1146100eb5780630776298214610126578063208638941461014f5780632762dd8c1461017857806340018a0d146101b35780635f0280ba146101dc5780636f69c96f146102815780638b47e58a146102aa57806393529cdf146102d3578063977a5e64146102fc57806399114d841461035a578063abf410e51461039e578063de53a13c146103f3578063ed8907d71461041c578063fd127a4114610473578063fd40d52e1461049c575b600080fd5b34156100f657600080fd5b6101106004808035600019169060200190919050506104d7565b6040518082815260200191505060405180910390f35b341561013157600080fd5b6101396104fb565b6040518082815260200191505060405180910390f35b341561015a57600080fd5b610162610504565b6040518082815260200191505060405180910390f35b341561018357600080fd5b61019d600480803560001916906020019091905050610510565b6040518082815260200191505060405180910390f35b34156101be57600080fd5b6101c6610532565b6040518082815260200191505060405180910390f35b34156101e757600080fd5b61026760048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061053e565b604051808215151515815260200191505060405180910390f35b341561028c57600080fd5b6102946107b3565b6040518082815260200191505060405180910390f35b34156102b557600080fd5b6102bd6107b9565b6040518082815260200191505060405180910390f35b34156102de57600080fd5b6102e66107be565b6040518082815260200191505060405180910390f35b341561030757600080fd5b61034060048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506107c4565b604051808215151515815260200191505060405180910390f35b341561036557600080fd5b610388600480803560001916906020019091908035906020019091905050610c55565b6040518082815260200191505060405180910390f35b34156103a957600080fd5b6103b1610e61565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103fe57600080fd5b610406610e87565b6040518082815260200191505060405180910390f35b341561042757600080fd5b610441600480803560001916906020019091905050610e90565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b341561047e57600080fd5b610486610f88565b6040518082815260200191505060405180910390f35b34156104a757600080fd5b6104c1600480803560001916906020019091905050610f95565b6040518082815260200191505060405180910390f35b60008060008360001916600019168152602001908152602001600020549050919050565b6018610e100281565b601e6018610e10020281565b600061051a6116e0565b61052383610fad565b90508060600151915050919050565b60076018610e10020281565b60006105486116e0565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636fa9d0566000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156105d657600080fd5b6102c65a03f115156105e757600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561062a57600080fd5b61063387610fad565b9050806000015173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107a45761069a846000808a60001916600019168152602001908152602001600020546114a990919063ffffffff16565b6000808960001916600019168152602001908152602001600020819055507ff1a888d220228f843ac3044ef257c80642e6434d1ddc7ebee0a2813cced3406c87878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405180910390a1600191506107a9565b600091505b5095945050505050565b610e1081565b600581565b61271081565b6000806000806000806000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663079dd4b76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561086057600080fd5b6102c65a03f1151561087157600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108b457600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561094257600080fd5b6102c65a03f1151561095357600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16636be39bda8c6000604051604001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082600019166000191681526020019150506040805180830381600087803b15156109da57600080fd5b6102c65a03f115156109eb57600080fd5b505050604051805190602001805190508098508199505050610a0c87610e90565b809650819750829850839950849a505050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d23c4c76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610aae57600080fd5b6102c65a03f11515610abf57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16635715c5b7876000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515610b3f57600080fd5b6102c65a03f11515610b5057600080fd5b505050604051805190509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015610b995750600583105b8015610bd057503073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b15610c4257828173ffffffffffffffffffffffffffffffffffffffff168c600019167f2c500aaec6833a053693d8c2a18a3ed5649a4609699abaf7778c3d389cc40c0588888760405180848152602001838152602001828152602001935050505060405180910390a460019850610c47565b600098505b505050505050505092915050565b6000610c5f6116e0565b60008085600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610cf157600080fd5b6102c65a03f11515610d0257600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663f6f494c9826000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610d8a57600080fd5b6102c65a03f11515610d9b57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16141515610dde57600080fd5b610de787610fad565b9350610df2846114c7565b9250836040015186111515610e0a5760009450610e57565b836060015186101515610e1f57829450610e57565b610e29868561151d565b9150610e548460a00151610e46848661156790919063ffffffff16565b6115a290919063ffffffff16565b94505b5050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60646127100281565b6000806000806000806000806000807fff000000000000000000000000000000000000000000000000000000000000006001028b1694507effffffffffffffffffffffff000000000000000000000000000000000000006001028b16935072ffffff000000000000000000000000000000006001028b1692506ff00000000000000000000000000000006001028b1691506f0ffff0000000000000000000000000006001028b169050610f448560f86115bd565b610f4f8560986115bd565b610f5a8560806115bd565b610f6585607c6115bd565b610f7085606c6115bd565b99509950995099509950505050505091939590929450565b61016d6018610e10020281565b60006020528060005260406000206000915090505481565b610fb56116e0565b600080600080600080600080600080600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561105557600080fd5b6102c65a03f1151561106657600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663314a522e8f6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156110ee57600080fd5b6102c65a03f115156110ff57600080fd5b505050604051805190509b506111148c610e90565b809b50819c50829d50839e50849f505050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d23c4c76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156111b657600080fd5b6102c65a03f115156111c757600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16635715c5b78c6000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561124757600080fd5b6102c65a03f1151561125857600080fd5b505050604051805190509550600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16141515156112a057600080fd5b6004808111156112ac57fe5b88111515156112ba57600080fd5b8760048111156112c657fe5b94506112d1856115da565b9350600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561136157600080fd5b6102c65a03f1151561137257600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663d69dbf638f6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156113fa57600080fd5b6102c65a03f1151561140b57600080fd5b50505060405180519050925061142a848861156790919063ffffffff16565b915061143f83836114a990919063ffffffff16565b905060e0604051908101604052808773ffffffffffffffffffffffffffffffffffffffff1681526020018b815260200184815260200182815260200186600481111561148757fe5b81526020018881526020018a8152509c50505050505050505050505050919050565b60008082840190508381101515156114bd57fe5b8091505092915050565b6000806114fc6064612710026114ee8560c00151866020015161156790919063ffffffff16565b6115a290919063ffffffff16565b90506115158184602001516114a990919063ffffffff16565b915050919050565b60008060006115398460400151866116c790919063ffffffff16565b915061154884608001516115da565b905061155d81836115a290919063ffffffff16565b9250505092915050565b600080600084141561157c576000915061159b565b828402905082848281151561158d57fe5b0414151561159757fe5b8091505b5092915050565b60008082848115156115b057fe5b0490508091505092915050565b60008160020a83600190048115156115d157fe5b04905092915050565b60008060048111156115e857fe5b8260048111156115f457fe5b141561160457610e1090506116c2565b6001600481111561161157fe5b82600481111561161d57fe5b1415611630576018610e100290506116c2565b6002600481111561163d57fe5b82600481111561164957fe5b141561165f5760076018610e10020290506116c2565b6003600481111561166c57fe5b82600481111561167857fe5b141561168e57601e6018610e10020290506116c2565b60048081111561169a57fe5b8260048111156116a657fe5b14156116bd5761016d6018610e10020290506116c2565b600080fd5b919050565b60008282111515156116d557fe5b818303905092915050565b60e060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600081526020016000600481111561172b57fe5b8152602001600081526020016000815250905600a165627a7a7230582015d8c2fa565deace648d986e19b0648d2d92ea39ca6a9f59110808654cfeb02e0029", + "deployedBytecode": "0x6060604052600436106100e6576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a896a1146100eb5780630776298214610126578063208638941461014f5780632762dd8c1461017857806340018a0d146101b35780635f0280ba146101dc5780636f69c96f146102815780638b47e58a146102aa57806393529cdf146102d3578063977a5e64146102fc57806399114d841461035a578063abf410e51461039e578063de53a13c146103f3578063ed8907d71461041c578063fd127a4114610473578063fd40d52e1461049c575b600080fd5b34156100f657600080fd5b6101106004808035600019169060200190919050506104d7565b6040518082815260200191505060405180910390f35b341561013157600080fd5b6101396104fb565b6040518082815260200191505060405180910390f35b341561015a57600080fd5b610162610504565b6040518082815260200191505060405180910390f35b341561018357600080fd5b61019d600480803560001916906020019091905050610510565b6040518082815260200191505060405180910390f35b34156101be57600080fd5b6101c6610532565b6040518082815260200191505060405180910390f35b34156101e757600080fd5b61026760048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061053e565b604051808215151515815260200191505060405180910390f35b341561028c57600080fd5b6102946107b3565b6040518082815260200191505060405180910390f35b34156102b557600080fd5b6102bd6107b9565b6040518082815260200191505060405180910390f35b34156102de57600080fd5b6102e66107be565b6040518082815260200191505060405180910390f35b341561030757600080fd5b61034060048080356000191690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506107c4565b604051808215151515815260200191505060405180910390f35b341561036557600080fd5b610388600480803560001916906020019091908035906020019091905050610c55565b6040518082815260200191505060405180910390f35b34156103a957600080fd5b6103b1610e61565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103fe57600080fd5b610406610e87565b6040518082815260200191505060405180910390f35b341561042757600080fd5b610441600480803560001916906020019091905050610e90565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b341561047e57600080fd5b610486610f88565b6040518082815260200191505060405180910390f35b34156104a757600080fd5b6104c1600480803560001916906020019091905050610f95565b6040518082815260200191505060405180910390f35b60008060008360001916600019168152602001908152602001600020549050919050565b6018610e100281565b601e6018610e10020281565b600061051a6116e0565b61052383610fad565b90508060600151915050919050565b60076018610e10020281565b60006105486116e0565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636fa9d0566000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156105d657600080fd5b6102c65a03f115156105e757600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561062a57600080fd5b61063387610fad565b9050806000015173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107a45761069a846000808a60001916600019168152602001908152602001600020546114a990919063ffffffff16565b6000808960001916600019168152602001908152602001600020819055507ff1a888d220228f843ac3044ef257c80642e6434d1ddc7ebee0a2813cced3406c87878787876040518086600019166000191681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019550505050505060405180910390a1600191506107a9565b600091505b5095945050505050565b610e1081565b600581565b61271081565b6000806000806000806000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663079dd4b76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561086057600080fd5b6102c65a03f1151561087157600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108b457600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561094257600080fd5b6102c65a03f1151561095357600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16636be39bda8c6000604051604001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082600019166000191681526020019150506040805180830381600087803b15156109da57600080fd5b6102c65a03f115156109eb57600080fd5b505050604051805190602001805190508098508199505050610a0c87610e90565b809650819750829850839950849a505050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d23c4c76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610aae57600080fd5b6102c65a03f11515610abf57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16635715c5b7876000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1515610b3f57600080fd5b6102c65a03f11515610b5057600080fd5b505050604051805190509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015610b995750600583105b8015610bd057503073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16145b15610c4257828173ffffffffffffffffffffffffffffffffffffffff168c600019167f2c500aaec6833a053693d8c2a18a3ed5649a4609699abaf7778c3d389cc40c0588888760405180848152602001838152602001828152602001935050505060405180910390a460019850610c47565b600098505b505050505050505092915050565b6000610c5f6116e0565b60008085600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610cf157600080fd5b6102c65a03f11515610d0257600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663f6f494c9826000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b1515610d8a57600080fd5b6102c65a03f11515610d9b57600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16141515610dde57600080fd5b610de787610fad565b9350610df2846114c7565b9250836040015186111515610e0a5760009450610e57565b836060015186101515610e1f57829450610e57565b610e29868561151d565b9150610e548460a00151610e46848661156790919063ffffffff16565b6115a290919063ffffffff16565b94505b5050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60646127100281565b6000806000806000806000806000807fff000000000000000000000000000000000000000000000000000000000000006001028b1694507effffffffffffffffffffffff000000000000000000000000000000000000006001028b16935072ffffff000000000000000000000000000000006001028b1692506ff00000000000000000000000000000006001028b1691506f0ffff0000000000000000000000000006001028b169050610f448560f86115bd565b610f4f8560986115bd565b610f5a8560806115bd565b610f6585607c6115bd565b610f7085606c6115bd565b99509950995099509950505050505091939590929450565b61016d6018610e10020281565b60006020528060005260406000206000915090505481565b610fb56116e0565b600080600080600080600080600080600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561105557600080fd5b6102c65a03f1151561106657600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663314a522e8f6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156110ee57600080fd5b6102c65a03f115156110ff57600080fd5b505050604051805190509b506111148c610e90565b809b50819c50829d50839e50849f505050505050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d23c4c76000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156111b657600080fd5b6102c65a03f115156111c757600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff16635715c5b78c6000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b151561124757600080fd5b6102c65a03f1151561125857600080fd5b505050604051805190509550600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16141515156112a057600080fd5b6004808111156112ac57fe5b88111515156112ba57600080fd5b8760048111156112c657fe5b94506112d1856115da565b9350600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f866f736000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561136157600080fd5b6102c65a03f1151561137257600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff1663d69dbf638f6000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156113fa57600080fd5b6102c65a03f1151561140b57600080fd5b50505060405180519050925061142a848861156790919063ffffffff16565b915061143f83836114a990919063ffffffff16565b905060e0604051908101604052808773ffffffffffffffffffffffffffffffffffffffff1681526020018b815260200184815260200182815260200186600481111561148757fe5b81526020018881526020018a8152509c50505050505050505050505050919050565b60008082840190508381101515156114bd57fe5b8091505092915050565b6000806114fc6064612710026114ee8560c00151866020015161156790919063ffffffff16565b6115a290919063ffffffff16565b90506115158184602001516114a990919063ffffffff16565b915050919050565b60008060006115398460400151866116c790919063ffffffff16565b915061154884608001516115da565b905061155d81836115a290919063ffffffff16565b9250505092915050565b600080600084141561157c576000915061159b565b828402905082848281151561158d57fe5b0414151561159757fe5b8091505b5092915050565b60008082848115156115b057fe5b0490508091505092915050565b60008160020a83600190048115156115d157fe5b04905092915050565b60008060048111156115e857fe5b8260048111156115f457fe5b141561160457610e1090506116c2565b6001600481111561161157fe5b82600481111561161d57fe5b1415611630576018610e100290506116c2565b6002600481111561163d57fe5b82600481111561164957fe5b141561165f5760076018610e10020290506116c2565b6003600481111561166c57fe5b82600481111561167857fe5b141561168e57601e6018610e10020290506116c2565b60048081111561169a57fe5b8260048111156116a657fe5b14156116bd5761016d6018610e10020290506116c2565b600080fd5b919050565b60008282111515156116d557fe5b818303905092915050565b60e060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600081526020016000600481111561172b57fe5b8152602001600081526020016000815250905600a165627a7a7230582015d8c2fa565deace648d986e19b0648d2d92ea39ca6a9f59110808654cfeb02e0029", "sourceMap": "702:16668:16:-;;;3408:168;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3551:17;3515:16;;:54;;;;;;;;;;;;;;;;;;3408:168;702:16668;;;;;;", "deployedSourceMap": "702:16668:16:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9334:167;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1532:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1687:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12303:235;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1610:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6636:742;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1473:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;860:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2025:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4229:1696;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7987:1066;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2492:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2329:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9507:2790;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1766:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2441:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9334:167;9430:17;9470:11;:24;9482:11;9470:24;;;;;;;;;;;;;;;;;;9463:31;;9334:167;;;:::o;1532:72::-;1602:2;1519:7;1577:27;1532:72;:::o;1687:73::-;1758:2;1602;1519:7;1577:27;1734:26;1687:73;:::o;12303:235::-;12389:4;12409:34;;:::i;:::-;12446:40;12473:12;12446:26;:40::i;:::-;12409:77;;12504:6;:27;;;12497:34;;12303:235;;;;:::o;1610:71::-;1680:1;1602:2;1519:7;1577:27;1656:25;1610:71;:::o;6636:742::-;6865:13;6894:34;;:::i;:::-;3051:16;;;;;;;;;;;:32;;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3029:57;;:10;:57;;;3021:66;;;;;;;;6931:39;6958:11;6931:26;:39::i;:::-;6894:76;;7001:6;:28;;;6985:44;;:12;:44;;;6981:368;;;7072:46;7101:16;7072:11;:24;7084:11;7072:24;;;;;;;;;;;;;;;;;;:28;;:46;;;;:::i;:::-;7045:11;:24;7057:11;7045:24;;;;;;;;;;;;;;;;;:73;;;;7133:179;7171:11;7200:5;7223:11;7252:16;7286:12;7133:179;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7334:4;7327:11;;;;6981:368;7366:5;7359:12;;3097:1;6636:742;;;;;;;;:::o;1473:53::-;1519:7;1473:53;:::o;860:52::-;911:1;860:52;:::o;2025:67::-;2085:7;2025:67;:::o;4229:1696::-;4370:13;4399:21;4430:31;4579:24;4613:20;4643:17;4670:25;4705:34;4931:29;3353:16;;;;;;;;;;;:27;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3331:52;;:10;:52;;;3323:61;;;;;;;;4515:16;;;;;;;;;;;:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:40;;;4556:11;4515:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4472:96;;;;;;;;4870:50;4896:23;4870:25;:50::i;:::-;4750:170;;;;;;;;;;;;;;;;;;;;4975:16;;;;;;;;;;;:30;;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:55;;;5031:19;4975:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4931:120;;5473:1;5440:35;;:21;:35;;;;:101;;;;;911:1;5491:20;:50;5440:101;:147;;;;;5582:4;5557:30;;:13;:30;;;5440:147;5436:460;;;5778:20;5676:21;5603:256;;5647:11;5603:256;;;;5715:15;5748:12;5816:29;5603:256;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5881:4;5874:11;;;;5436:460;5913:5;5906:12;;3394:1;4229:1696;;;;;;;;;;;;:::o;7987:1066::-;8175:28;8219:34;;:::i;:::-;8305:26;8871:13;8145:11;3201:16;;;;;;;;;;;:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:48;;;3250:11;3201:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3184:78;;3192:4;3184:78;;;3176:87;;;;;;;;8256:39;8283:11;8256:26;:39::i;:::-;8219:76;;8334:43;8370:6;8334:35;:43::i;:::-;8305:72;;8405:6;:29;;;8392:9;:42;;8388:659;;;8587:1;8580:8;;;;8388:659;8622:6;:27;;;8609:9;:40;;8605:442;;;8819:21;8812:28;;;;8605:442;8887:51;8920:9;8931:6;8887:32;:51::i;:::-;8871:67;;8959:77;8999:6;:36;;;8959:35;8985:8;8959:21;:25;;:35;;;;:::i;:::-;:39;;:77;;;;:::i;:::-;8952:84;;3273:1;7987:1066;;;;;;;;:::o;2492:40::-;;;;;;;;;;;;;:::o;2329:105::-;2431:3;2085:7;2392:42;2329:105;:::o;9507:2790::-;9620:25;9659:21;9694:18;9726:26;9766:35;9940:34;10160:30;10372:27;10588:35;10845:44;10002:66;9989:79;;:10;:79;9940:128;;10218:66;10205:79;;:10;:79;10160:124;;10427:66;10414:79;;:10;:79;10372:121;;10651:66;10638:79;;:10;:79;10588:129;;10917:66;10904:79;;:10;:79;10845:138;;11994:46;12008:26;12036:3;11994:13;:46::i;:::-;12054:42;12068:22;12092:3;12054:13;:42::i;:::-;12110:39;12124:19;12145:3;12110:13;:39::i;:::-;12163:47;12177:27;12206:3;12163:13;:47::i;:::-;12224:56;12238:36;12276:3;12224:13;:56::i;:::-;11973:317;;;;;;;;;;9507:2790;;;;;;;;;;;;:::o;1766:73::-;1836:3;1602:2;1519:7;1577:27;1812;1766:73;:::o;2441:44::-;;;;;;;;;;;;;;;;;:::o;14136:2420::-;14241:27;;:::i;:::-;14284:18;14467:24;14574:20;14664:17;14782:28;14917:34;15133:29;15568:41;15668:36;15785:27;15907:24;16022:25;14305:16;;;;;;;;;;;:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:58;;;14364:11;14305:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14284:92;;15085:37;15111:10;15085:25;:37::i;:::-;14962:160;;;;;;;;;;;;;;;;;;;;15177:16;;;;;;;;;;;:30;;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:55;;;15233:19;15177:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15133:120;;15373:1;15340:35;;:21;:35;;;;15332:44;;;;;;;;15529:26;15524:32;;;;;;;;15497:23;:59;;15489:68;;;;;;;;15633:23;15612:45;;;;;;;;15568:89;;15719:56;15754:20;15719:34;:56::i;:::-;15668:107;;15827:16;;;;;;;;;;;:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:57;;;15885:11;15827:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15785:112;;15946:66;15980:31;15946:29;:33;;:66;;;;:::i;:::-;15907:105;;16062:47;16086:22;16062:19;:23;;:47;;;;:::i;:::-;16022:87;;16127:422;;;;;;;;;16185:21;16127:422;;;;;;16237:15;16127:422;;;;16330:22;16127:422;;;;16388:20;16127:422;;;;16444:20;16127:422;;;;;;;;;;;;16509:29;16127:422;;;;16280:12;16127:422;;;16120:429;;14136:2420;;;;;;;;;;;;;;;:::o;1007:129:38:-;1065:7;1080:9;1096:1;1092;:5;1080:17;;1115:1;1110;:6;;1103:14;;;;;;1130:1;1123:8;;1007:129;;;;;:::o;13492:638:16:-;13614:27;13925:18;13946:118;2431:3;2085:7;2392:42;13946:60;13986:6;:19;;;13946:6;:22;;;:39;;:60;;;;:::i;:::-;:77;;:118;;;;:::i;:::-;13925:139;;14082:41;14109:13;14082:6;:22;;;:26;;:41;;;;:::i;:::-;14075:48;;13492:638;;;;:::o;12707:404::-;12850:10;12876;12943:36;12889:44;12903:6;:29;;;12889:9;:13;;:44;;;;:::i;:::-;12876:57;;12982:63;13017:6;:27;;;12982:34;:63::i;:::-;12943:102;;13062:42;13072:31;13062:5;:9;;:42;;;;:::i;:::-;13055:49;;12707:404;;;;;;:::o;203:173:38:-;261:7;316:9;285:1;280;:6;276:35;;;303:1;296:8;;;;276:35;332:1;328;:5;316:17;;355:1;350;346;:5;;;;;;;;:10;339:18;;;;;;370:1;363:8;;203:173;;;;;;:::o;458:265::-;516:7;605:9;621:1;617;:5;;;;;;;;605:17;;717:1;710:8;;458:265;;;;;:::o;12544:157:16:-;12642:4;12688:6;12683:1;:11;12674:5;12669:11;;;:25;;;;;;;;12662:32;;12544:157;;;;:::o;16562:806::-;16696:37;16777:26;16753:50;;;;;;;;:20;:50;;;;;;;;;16749:613;;;1519:7;16819:29;;;;16749:613;16893:25;16869:49;;;;;;;;:20;:49;;;;;;;;;16865:497;;;1602:2;1519:7;1577:27;16934:28;;;;16865:497;17007:26;16983:50;;;;;;;;:20;:50;;;;;;;;;16979:383;;;1680:1;1602:2;1519:7;1577:27;1656:25;17049:29;;;;16979:383;17123:27;17099:51;;;;;;;;:20;:51;;;;;;;;;17095:267;;;1758:2;1602;1519:7;1577:27;1734:26;17166:30;;;;17095:267;17241:26;17217:50;;;;;;;;:20;:50;;;;;;;;;17213:149;;;1836:3;1602:2;1519:7;1577:27;1812;17283:29;;;;17213:149;17343:8;;;16562:806;;;;:::o;835:110:38:-;893:7;920:1;915;:6;;908:14;;;;;;939:1;935;:5;928:12;;835:110;;;;:::o;702:16668:16:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\nimport \"zeppelin-solidity/contracts/math/SafeMath.sol\";\n\nimport \"../ContractRegistry.sol\";\n\n\ncontract SimpleInterestTermsContract is TermsContract {\n using SafeMath for uint;\n\n enum AmortizationUnitType { HOURS, DAYS, WEEKS, MONTHS, YEARS }\n uint public constant NUM_AMORTIZATION_UNIT_TYPES = 5;\n\n struct SimpleInterestParams {\n address principalTokenAddress;\n uint principalAmount;\n uint termStartUnixTimestamp;\n uint termEndUnixTimestamp;\n AmortizationUnitType amortizationUnitType;\n uint termLengthInAmortizationUnits;\n\n // Given that Solidity does not support floating points, we encode\n // interest rates as percentages scaled up by a factor of 10,000\n // As such, interest rates can, at a maximum, have 4 decimal places\n // of precision.\n uint interestRate;\n }\n\n uint public constant HOUR_LENGTH_IN_SECONDS = 60 * 60;\n uint public constant DAY_LENGTH_IN_SECONDS = HOUR_LENGTH_IN_SECONDS * 24;\n uint public constant WEEK_LENGTH_IN_SECONDS = DAY_LENGTH_IN_SECONDS * 7;\n uint public constant MONTH_LENGTH_IN_SECONDS = DAY_LENGTH_IN_SECONDS * 30;\n uint public constant YEAR_LENGTH_IN_SECONDS = DAY_LENGTH_IN_SECONDS * 365;\n\n // To convert an encoded interest rate into its equivalent in percents,\n // divide it by INTEREST_RATE_SCALING_FACTOR_PERCENT -- e.g.\n // 10,000 => 1% interest rate\n uint public constant INTEREST_RATE_SCALING_FACTOR_PERCENT = 10 ** 4;\n // To convert an encoded interest rate into its equivalent multiplier\n // (for purposes of calculating total interest), divide it by INTEREST_RATE_SCALING_FACTOR_PERCENT -- e.g.\n // 10,000 => 0.01 interest multiplier\n uint public constant INTEREST_RATE_SCALING_FACTOR_MULTIPLIER = INTEREST_RATE_SCALING_FACTOR_PERCENT * 100;\n\n mapping (bytes32 => uint) public valueRepaid;\n\n ContractRegistry public contractRegistry;\n\n event LogSimpleInterestTermStart(\n bytes32 indexed agreementId,\n address indexed principalToken,\n uint principalAmount,\n uint interestRate,\n uint indexed amortizationUnitType,\n uint termLengthInAmortizationUnits\n );\n\n event LogRegisterRepayment(\n bytes32 agreementId,\n address payer,\n address beneficiary,\n uint256 unitsOfRepayment,\n address tokenAddress\n );\n\n modifier onlyRouter() {\n require(msg.sender == address(contractRegistry.repaymentRouter()));\n _;\n }\n\n modifier onlyMappedToThisContract(bytes32 agreementId) {\n require(address(this) == contractRegistry.debtRegistry().getTermsContract(agreementId));\n _;\n }\n\n modifier onlyDebtKernel() {\n require(msg.sender == address(contractRegistry.debtKernel()));\n _;\n }\n\n function SimpleInterestTermsContract(\n address _contractRegistry\n )\n public\n {\n contractRegistry = ContractRegistry(_contractRegistry);\n }\n\n /// When called, the registerTermStart function registers the fact that\n /// the debt agreement has begun. Given that the SimpleInterestTermsContract\n /// doesn't rely on taking any sorts of actions when the loan term begins,\n /// we simply validate DebtKernel is the transaction sender, and return\n /// `true` if the debt agreement is associated with this terms contract.\n /// @param agreementId bytes32. The agreement id (issuance hash) of the debt agreement to which this pertains.\n /// @param debtor address. The debtor in this particular issuance.\n /// @return _success bool. Acknowledgment of whether\n function registerTermStart(\n bytes32 agreementId,\n address debtor\n )\n public\n onlyDebtKernel\n returns (bool _success)\n {\n address termsContract;\n bytes32 termsContractParameters;\n\n (termsContract, termsContractParameters) = contractRegistry.debtRegistry().getTerms(agreementId);\n\n uint principalTokenIndex;\n uint principalAmount;\n uint interestRate;\n uint amortizationUnitType;\n uint termLengthInAmortizationUnits;\n\n (principalTokenIndex, principalAmount, interestRate, amortizationUnitType, termLengthInAmortizationUnits) =\n unpackParametersFromBytes(termsContractParameters);\n\n address principalTokenAddress =\n contractRegistry.tokenRegistry().getTokenAddressByIndex(principalTokenIndex);\n\n // Returns true (i.e. valid) if the specified principal token is valid,\n // the specified amortization unit type is valid, and the terms contract\n // associated with the agreement is this one. We need not check\n // if any of the other simple interest parameters are valid, because\n // it is impossible to encode invalid values for them.\n if (principalTokenAddress != address(0) &&\n amortizationUnitType < NUM_AMORTIZATION_UNIT_TYPES &&\n termsContract == address(this)) {\n LogSimpleInterestTermStart(\n agreementId,\n principalTokenAddress,\n principalAmount,\n interestRate,\n amortizationUnitType,\n termLengthInAmortizationUnits\n );\n\n return true;\n }\n\n return false;\n }\n\n /// When called, the registerRepayment function records the debtor's\n /// repayment, as well as any auxiliary metadata needed by the contract\n /// to determine ex post facto the value repaid (e.g. current USD\n /// exchange rate)\n /// @param agreementId bytes32. The agreement id (issuance hash) of the debt agreement to which this pertains.\n /// @param payer address. The address of the payer.\n /// @param beneficiary address. The address of the payment's beneficiary.\n /// @param unitsOfRepayment uint. The units-of-value repaid in the transaction.\n /// @param tokenAddress address. The address of the token with which the repayment transaction was executed.\n function registerRepayment(\n bytes32 agreementId,\n address payer,\n address beneficiary,\n uint256 unitsOfRepayment,\n address tokenAddress\n )\n public\n onlyRouter\n returns (bool _success)\n {\n SimpleInterestParams memory params = unpackParamsForAgreementID(agreementId);\n\n if (tokenAddress == params.principalTokenAddress) {\n valueRepaid[agreementId] = valueRepaid[agreementId].add(unitsOfRepayment);\n\n LogRegisterRepayment(\n agreementId,\n payer,\n beneficiary,\n unitsOfRepayment,\n tokenAddress\n );\n\n return true;\n }\n\n return false;\n }\n\n /// Returns the cumulative units-of-value expected to be repaid given a block's timestamp.\n /// Note this is not a constant function -- this value can vary on basis of any number of\n /// conditions (e.g. interest rates can be renegotiated if repayments are delinquent).\n /// @param agreementId bytes32. The agreement id (issuance hash) of the debt agreement to which this pertains.\n /// @param timestamp uint. The timestamp for which repayment expectation is being queried.\n /// @return uint256 The cumulative units-of-value expected to be repaid given a block's timestamp.\n function getExpectedRepaymentValue(\n bytes32 agreementId,\n uint256 timestamp\n )\n public\n view\n onlyMappedToThisContract(agreementId)\n returns (uint _expectedRepaymentValue)\n {\n SimpleInterestParams memory params = unpackParamsForAgreementID(agreementId);\n uint principalPlusInterest = calculateTotalPrincipalPlusInterest(params);\n\n if (timestamp <= params.termStartUnixTimestamp) {\n /* The query occurs before the contract was even initialized so the\n expected value of repayments is 0. */\n return 0;\n } else if (timestamp >= params.termEndUnixTimestamp) {\n /* the query occurs beyond the contract's term, so the expected\n value of repayment is the full principal plus interest. */\n return principalPlusInterest;\n } else {\n uint numUnits = numAmortizationUnitsForTimestamp(timestamp, params);\n return principalPlusInterest.mul(numUnits).div(params.termLengthInAmortizationUnits);\n }\n }\n\n /// Returns the cumulative units-of-value repaid to date.\n /// @param agreementId bytes32. The agreement id (issuance hash) of the debt agreement to which this pertains.\n /// @return uint256 The cumulative units-of-value repaid by the specified block timestamp.\n function getValueRepaidToDate(bytes32 agreementId)\n public\n view\n returns (uint _valueRepaid)\n {\n return valueRepaid[agreementId];\n }\n\n function unpackParametersFromBytes(bytes32 parameters)\n public\n pure\n returns (\n uint _principalTokenIndex,\n uint _principalAmount,\n uint _interestRate,\n uint _amortizationUnitType,\n uint _termLengthInAmortizationUnits\n )\n {\n // The first byte of the parameters encodes the principal token's index in the\n // token registry.\n bytes32 principalTokenIndexShifted =\n parameters & 0xff00000000000000000000000000000000000000000000000000000000000000;\n // The subsequent 12 bytes of the parameters encode the principal amount.\n bytes32 principalAmountShifted =\n parameters & 0x00ffffffffffffffffffffffff00000000000000000000000000000000000000;\n // The subsequent 3 bytes of the parameters encode the interest rate.\n bytes32 interestRateShifted =\n parameters & 0x00000000000000000000000000ffffff00000000000000000000000000000000;\n // The subsequent 4 bits (half byte) encode the amortization unit type code.\n bytes32 amortizationUnitTypeShifted =\n parameters & 0x00000000000000000000000000000000f0000000000000000000000000000000;\n // The subsequent 2 bytes encode the term length, as denominated in\n // the encoded amortization unit.\n bytes32 termLengthInAmortizationUnitsShifted =\n parameters & 0x000000000000000000000000000000000ffff000000000000000000000000000;\n\n // Note that the remaining 108 bits are reserved for any parameters relevant to a\n // collateralized terms contracts.\n\n /*\n We then bit shift left each of these values so that the 32-byte uint\n counterpart correctly represents the value that was originally packed\n into the 32 byte string.\n\n The below chart summarizes where in the 32 byte string each value\n terminates -- which indicates the extent to which each value must be bit\n shifted left.\n\n Location (bytes)\tLocation (bits)\n 32 256\n principalTokenIndex\t 31\t 248\n principalAmount\t 19 152\n interestRate 16 128\n amortizationUnitType 15.5 124\n termLengthInAmortizationUnits 13.5 108\n */\n return (\n bitShiftRight(principalTokenIndexShifted, 248),\n bitShiftRight(principalAmountShifted, 152),\n bitShiftRight(interestRateShifted, 128),\n bitShiftRight(amortizationUnitTypeShifted, 124),\n bitShiftRight(termLengthInAmortizationUnitsShifted, 108)\n );\n }\n\n function getTermEndTimestamp(\n bytes32 _agreementId\n ) public view returns (uint)\n {\n SimpleInterestParams memory params = unpackParamsForAgreementID(_agreementId);\n\n return params.termEndUnixTimestamp;\n }\n\n function bitShiftRight(bytes32 value, uint amount)\n internal\n pure\n returns (uint)\n {\n return uint(value) / 2 ** amount;\n }\n\n function numAmortizationUnitsForTimestamp(\n uint timestamp,\n SimpleInterestParams params\n )\n internal\n returns (uint units)\n {\n uint delta = timestamp.sub(params.termStartUnixTimestamp);\n uint amortizationUnitLengthInSeconds = getAmortizationUnitLengthInSeconds(params.amortizationUnitType);\n return delta.div(amortizationUnitLengthInSeconds);\n }\n\n /**\n * Calculates the total repayment value expected at the end of the loan's term.\n *\n * This computation assumes that interest is paid per amortization period.\n *\n * @param params SimpleInterestParams. The parameters that define the simple interest loan.\n * @return uint The total repayment value expected at the end of the loan's term.\n */\n function calculateTotalPrincipalPlusInterest(\n SimpleInterestParams params\n )\n internal\n returns (uint _principalPlusInterest)\n {\n // Since we represent decimal interest rates using their\n // scaled-up, fixed point representation, we have to\n // downscale the result of the interest payment computation\n // by the multiplier scaling factor we choose for interest rates.\n uint totalInterest = params.principalAmount\n .mul(params.interestRate)\n .div(INTEREST_RATE_SCALING_FACTOR_MULTIPLIER);\n\n return params.principalAmount.add(totalInterest);\n }\n\n function unpackParamsForAgreementID(\n bytes32 agreementId\n )\n internal\n returns (SimpleInterestParams params)\n {\n bytes32 parameters = contractRegistry.debtRegistry().getTermsContractParameters(agreementId);\n\n // Index of the token used for principal payments in the Token Registry\n uint principalTokenIndex;\n // The principal amount denominated in the aforementioned token.\n uint principalAmount;\n // The interest rate accrued per amortization unit.\n uint interestRate;\n // The amortization unit in which the repayments installments schedule is defined.\n uint rawAmortizationUnitType;\n // The debt's entire term's length, denominated in the aforementioned amortization units\n uint termLengthInAmortizationUnits;\n\n (principalTokenIndex, principalAmount, interestRate, rawAmortizationUnitType, termLengthInAmortizationUnits) =\n unpackParametersFromBytes(parameters);\n\n address principalTokenAddress =\n contractRegistry.tokenRegistry().getTokenAddressByIndex(principalTokenIndex);\n\n // Ensure that the encoded principal token address is valid\n require(principalTokenAddress != address(0));\n\n // Before we cast to `AmortizationUnitType`, ensure that the raw value being stored is valid.\n require(rawAmortizationUnitType <= uint(AmortizationUnitType.YEARS));\n\n AmortizationUnitType amortizationUnitType = AmortizationUnitType(rawAmortizationUnitType);\n\n uint amortizationUnitLengthInSeconds =\n getAmortizationUnitLengthInSeconds(amortizationUnitType);\n uint issuanceBlockTimestamp =\n contractRegistry.debtRegistry().getIssuanceBlockTimestamp(agreementId);\n uint termLengthInSeconds =\n termLengthInAmortizationUnits.mul(amortizationUnitLengthInSeconds);\n uint termEndUnixTimestamp =\n termLengthInSeconds.add(issuanceBlockTimestamp);\n\n return SimpleInterestParams({\n principalTokenAddress: principalTokenAddress,\n principalAmount: principalAmount,\n interestRate: interestRate,\n termStartUnixTimestamp: issuanceBlockTimestamp,\n termEndUnixTimestamp: termEndUnixTimestamp,\n amortizationUnitType: amortizationUnitType,\n termLengthInAmortizationUnits: termLengthInAmortizationUnits\n });\n }\n\n function getAmortizationUnitLengthInSeconds(AmortizationUnitType amortizationUnitType)\n internal\n pure\n returns (uint _amortizationUnitLengthInSeconds)\n {\n if (amortizationUnitType == AmortizationUnitType.HOURS) {\n return HOUR_LENGTH_IN_SECONDS;\n } else if (amortizationUnitType == AmortizationUnitType.DAYS) {\n return DAY_LENGTH_IN_SECONDS;\n } else if (amortizationUnitType == AmortizationUnitType.WEEKS) {\n return WEEK_LENGTH_IN_SECONDS;\n } else if (amortizationUnitType == AmortizationUnitType.MONTHS) {\n return MONTH_LENGTH_IN_SECONDS;\n } else if (amortizationUnitType == AmortizationUnitType.YEARS) {\n return YEAR_LENGTH_IN_SECONDS;\n } else {\n revert();\n }\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/examples/SimpleInterestTermsContract.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/examples/SimpleInterestTermsContract.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/examples/SimpleInterestTermsContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/examples/SimpleInterestTermsContract.sol", "exportedSymbols": { "SimpleInterestTermsContract": [ 6052 @@ -428,7 +428,7 @@ export const SimpleInterestTermsContract = { "attributes": { "SourceUnit": 924, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/ContractRegistry.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/ContractRegistry.sol", "file": "../ContractRegistry.sol", "scope": 6053, "symbolAliases": [ @@ -10513,7 +10513,7 @@ export const SimpleInterestTermsContract = "42": { "events": {}, "links": {}, - "address": "0xe929d2b2fdd53531b8e11d85a4c249e504dd5868" + "address": "0x1cde816b6e0437f5b1b49edb58c4a8bf1dbda2d3" }, "70": { "events": {}, @@ -10522,5 +10522,5 @@ export const SimpleInterestTermsContract = } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:13:36.862Z" + "updatedAt": "2018-10-09T17:50:25.381Z" } \ No newline at end of file diff --git a/artifacts/ts/SiringClockAuction.ts b/artifacts/ts/SiringClockAuction.ts index b5d27f58..3e4bac03 100644 --- a/artifacts/ts/SiringClockAuction.ts +++ b/artifacts/ts/SiringClockAuction.ts @@ -338,15 +338,15 @@ export const SiringClockAuction = "type": "event" } ], - "bytecode": "0x606060405260008060146101000a81548160ff0219169083151502179055506001600460006101000a81548160ff021916908315150217905550341561004457600080fd5b6040516040806117928339810160405280805190602001909190805190602001909190505081816000336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061271082111515156100be57600080fd5b816002819055508290508073ffffffffffffffffffffffffffffffffffffffff166301ffc9a7639a20483d7c0100000000000000000000000000000000000000000000000000000000026000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001915050602060405180830381600087803b15156101a057600080fd5b6102c65a03f115156101b157600080fd5b5050506040518051905015156101c657600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050506115778061021b6000396000f3006060604052600436106100db576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806327ebe40a146100e05780633f4ba83a1461013d578063454a2ab31461016a5780635c975abb146101825780635fd8c710146101af57806376190f8f146101c457806378bd7935146101f157806383b5ff8b146102705780638456cb5914610299578063878eb368146102c65780638da5cb5b146102e957806396b5a7551461033e578063c55d0f5614610361578063dd1b7a0f14610398578063f2fde38b146103ed575b600080fd5b34156100eb57600080fd5b61013b600480803590602001909190803590602001909190803590602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610426565b005b341561014857600080fd5b610150610576565b604051808215151515815260200191505060405180910390f35b610180600480803590602001909190505061063b565b005b341561018d57600080fd5b6101956106eb565b604051808215151515815260200191505060405180910390f35b34156101ba57600080fd5b6101c26106fe565b005b34156101cf57600080fd5b6101d7610809565b604051808215151515815260200191505060405180910390f35b34156101fc57600080fd5b610212600480803590602001909190505061081c565b604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b341561027b57600080fd5b61028361093f565b6040518082815260200191505060405180910390f35b34156102a457600080fd5b6102ac610945565b604051808215151515815260200191505060405180910390f35b34156102d157600080fd5b6102e76004808035906020019091905050610a0c565b005b34156102f457600080fd5b6102fc610ade565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561034957600080fd5b61035f6004808035906020019091905050610b03565b005b341561036c57600080fd5b6103826004808035906020019091905050610b9f565b6040518082815260200191505060405180910390f35b34156103a357600080fd5b6103ab610bdc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103f857600080fd5b610424600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610c02565b005b61042e6114cd565b846fffffffffffffffffffffffffffffffff168514151561044e57600080fd5b836fffffffffffffffffffffffffffffffff168414151561046e57600080fd5b8267ffffffffffffffff168314151561048657600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156104e257600080fd5b6104ec8287610cd7565b60a0604051908101604052808373ffffffffffffffffffffffffffffffffffffffff168152602001866fffffffffffffffffffffffffffffffff168152602001856fffffffffffffffffffffffffffffffff1681526020018467ffffffffffffffff1681526020014267ffffffffffffffff16815250905061056e8682610de7565b505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156105d357600080fd5b600060149054906101000a900460ff1615156105ee57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a16001905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561069957600080fd5b6003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506106dc8234610fcc565b506106e7818361116b565b5050565b600060149054906101000a900460ff1681565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806107ac57508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156107b757600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505090505050565b600460009054906101000a900460ff1681565b60008060008060008060036000888152602001908152602001600020905061084381611247565b151561084e57600080fd5b8060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a90046fffffffffffffffffffffffffffffffff168260010160109054906101000a90046fffffffffffffffffffffffffffffffff168360020160009054906101000a900467ffffffffffffffff168460020160089054906101000a900467ffffffffffffffff16836fffffffffffffffffffffffffffffffff169350826fffffffffffffffffffffffffffffffff1692508167ffffffffffffffff1691508067ffffffffffffffff169050955095509550955095505091939590929450565b60025481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156109a257600080fd5b600060149054906101000a900460ff161515156109be57600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a16001905090565b60008060149054906101000a900460ff161515610a2857600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a8357600080fd5b600360008381526020019081526020016000209050610aa181611247565b1515610aac57600080fd5b610ada828260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611275565b5050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600360008481526020019081526020016000209150610b2482611247565b1515610b2f57600080fd5b8160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610b9057600080fd5b610b9a8382611275565b505050565b600080600360008481526020019081526020016000209050610bc081611247565b1515610bcb57600080fd5b610bd4816112c3565b915050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610c5d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515610cd457806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8330846040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1515610dcf57600080fd5b6102c65a03f11515610de057600080fd5b5050505050565b603c816060015167ffffffffffffffff1610151515610e0557600080fd5b806003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060408201518160010160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160020160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050507fa9c8dfcda5664a5a124c713e386da27de87432d5b668e79458501eb296389ba78282602001516fffffffffffffffffffffffffffffffff1683604001516fffffffffffffffffffffffffffffffff16846060015167ffffffffffffffff166040518085815260200184815260200183815260200182815260200194505050505060405180910390a15050565b6000806000806000806000600360008a81526020019081526020016000209550610ff586611247565b151561100057600080fd5b611009866112c3565b945084881015151561101a57600080fd5b8560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16935061104a896113b6565b60008511156110a45761105c85611472565b925082850391508373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015156110a357600080fd5b5b84880390503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015156110e957600080fd5b7f4fcc30d90a842164dd58501ab874a101a3749c3d4747139cefe7c876f4ccebd2898633604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a184965050505050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b151561122f57600080fd5b6102c65a03f1151561124057600080fd5b5050505050565b6000808260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16119050919050565b61127e826113b6565b611288818361116b565b7f2809c7e17bf978fbc7194c0a694b638c4215e9140cacc6c38ca36010b45697df826040518082815260200191505060405180910390a15050565b600080600090508260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1642111561131c578260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16420390505b6113ae8360010160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168460010160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168560020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff168461148d565b915050919050565b60036000828152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160006101000a8154906fffffffffffffffffffffffffffffffff02191690556001820160106101000a8154906fffffffffffffffffffffffffffffffff02191690556002820160006101000a81549067ffffffffffffffff02191690556002820160086101000a81549067ffffffffffffffff0219169055505050565b6000612710600254830281151561148557fe5b049050919050565b60008060008085851015156114a4578693506114c2565b8787039250858584028115156114b657fe5b05915081880190508093505b505050949350505050565b60a060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff16815250905600a165627a7a7230582077092e47a5e90d456efea39c135a00d579d263816be12c8845ca68968b6feb610029", - "deployedBytecode": "0x6060604052600436106100db576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806327ebe40a146100e05780633f4ba83a1461013d578063454a2ab31461016a5780635c975abb146101825780635fd8c710146101af57806376190f8f146101c457806378bd7935146101f157806383b5ff8b146102705780638456cb5914610299578063878eb368146102c65780638da5cb5b146102e957806396b5a7551461033e578063c55d0f5614610361578063dd1b7a0f14610398578063f2fde38b146103ed575b600080fd5b34156100eb57600080fd5b61013b600480803590602001909190803590602001909190803590602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610426565b005b341561014857600080fd5b610150610576565b604051808215151515815260200191505060405180910390f35b610180600480803590602001909190505061063b565b005b341561018d57600080fd5b6101956106eb565b604051808215151515815260200191505060405180910390f35b34156101ba57600080fd5b6101c26106fe565b005b34156101cf57600080fd5b6101d7610809565b604051808215151515815260200191505060405180910390f35b34156101fc57600080fd5b610212600480803590602001909190505061081c565b604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b341561027b57600080fd5b61028361093f565b6040518082815260200191505060405180910390f35b34156102a457600080fd5b6102ac610945565b604051808215151515815260200191505060405180910390f35b34156102d157600080fd5b6102e76004808035906020019091905050610a0c565b005b34156102f457600080fd5b6102fc610ade565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561034957600080fd5b61035f6004808035906020019091905050610b03565b005b341561036c57600080fd5b6103826004808035906020019091905050610b9f565b6040518082815260200191505060405180910390f35b34156103a357600080fd5b6103ab610bdc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103f857600080fd5b610424600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610c02565b005b61042e6114cd565b846fffffffffffffffffffffffffffffffff168514151561044e57600080fd5b836fffffffffffffffffffffffffffffffff168414151561046e57600080fd5b8267ffffffffffffffff168314151561048657600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156104e257600080fd5b6104ec8287610cd7565b60a0604051908101604052808373ffffffffffffffffffffffffffffffffffffffff168152602001866fffffffffffffffffffffffffffffffff168152602001856fffffffffffffffffffffffffffffffff1681526020018467ffffffffffffffff1681526020014267ffffffffffffffff16815250905061056e8682610de7565b505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156105d357600080fd5b600060149054906101000a900460ff1615156105ee57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a16001905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561069957600080fd5b6003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506106dc8234610fcc565b506106e7818361116b565b5050565b600060149054906101000a900460ff1681565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806107ac57508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156107b757600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505090505050565b600460009054906101000a900460ff1681565b60008060008060008060036000888152602001908152602001600020905061084381611247565b151561084e57600080fd5b8060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a90046fffffffffffffffffffffffffffffffff168260010160109054906101000a90046fffffffffffffffffffffffffffffffff168360020160009054906101000a900467ffffffffffffffff168460020160089054906101000a900467ffffffffffffffff16836fffffffffffffffffffffffffffffffff169350826fffffffffffffffffffffffffffffffff1692508167ffffffffffffffff1691508067ffffffffffffffff169050955095509550955095505091939590929450565b60025481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156109a257600080fd5b600060149054906101000a900460ff161515156109be57600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a16001905090565b60008060149054906101000a900460ff161515610a2857600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a8357600080fd5b600360008381526020019081526020016000209050610aa181611247565b1515610aac57600080fd5b610ada828260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611275565b5050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600360008481526020019081526020016000209150610b2482611247565b1515610b2f57600080fd5b8160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610b9057600080fd5b610b9a8382611275565b505050565b600080600360008481526020019081526020016000209050610bc081611247565b1515610bcb57600080fd5b610bd4816112c3565b915050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610c5d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515610cd457806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8330846040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1515610dcf57600080fd5b6102c65a03f11515610de057600080fd5b5050505050565b603c816060015167ffffffffffffffff1610151515610e0557600080fd5b806003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060408201518160010160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160020160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050507fa9c8dfcda5664a5a124c713e386da27de87432d5b668e79458501eb296389ba78282602001516fffffffffffffffffffffffffffffffff1683604001516fffffffffffffffffffffffffffffffff16846060015167ffffffffffffffff166040518085815260200184815260200183815260200182815260200194505050505060405180910390a15050565b6000806000806000806000600360008a81526020019081526020016000209550610ff586611247565b151561100057600080fd5b611009866112c3565b945084881015151561101a57600080fd5b8560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16935061104a896113b6565b60008511156110a45761105c85611472565b925082850391508373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015156110a357600080fd5b5b84880390503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015156110e957600080fd5b7f4fcc30d90a842164dd58501ab874a101a3749c3d4747139cefe7c876f4ccebd2898633604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a184965050505050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b151561122f57600080fd5b6102c65a03f1151561124057600080fd5b5050505050565b6000808260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16119050919050565b61127e826113b6565b611288818361116b565b7f2809c7e17bf978fbc7194c0a694b638c4215e9140cacc6c38ca36010b45697df826040518082815260200191505060405180910390a15050565b600080600090508260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1642111561131c578260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16420390505b6113ae8360010160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168460010160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168560020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff168461148d565b915050919050565b60036000828152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160006101000a8154906fffffffffffffffffffffffffffffffff02191690556001820160106101000a8154906fffffffffffffffffffffffffffffffff02191690556002820160006101000a81549067ffffffffffffffff02191690556002820160086101000a81549067ffffffffffffffff0219169055505050565b6000612710600254830281151561148557fe5b049050919050565b60008060008085851015156114a4578693506114c2565b8787039250858584028115156114b657fe5b05915081880190508093505b505050949350505050565b60a060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff16815250905600a165627a7a7230582077092e47a5e90d456efea39c135a00d579d263816be12c8845ca68968b6feb610029", + "bytecode": "0x606060405260008060146101000a81548160ff0219169083151502179055506001600460006101000a81548160ff021916908315150217905550341561004457600080fd5b6040516040806117928339810160405280805190602001909190805190602001909190505081816000336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061271082111515156100be57600080fd5b816002819055508290508073ffffffffffffffffffffffffffffffffffffffff166301ffc9a7639a20483d7c0100000000000000000000000000000000000000000000000000000000026000604051602001526040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001915050602060405180830381600087803b15156101a057600080fd5b6102c65a03f115156101b157600080fd5b5050506040518051905015156101c657600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050506115778061021b6000396000f3006060604052600436106100db576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806327ebe40a146100e05780633f4ba83a1461013d578063454a2ab31461016a5780635c975abb146101825780635fd8c710146101af57806376190f8f146101c457806378bd7935146101f157806383b5ff8b146102705780638456cb5914610299578063878eb368146102c65780638da5cb5b146102e957806396b5a7551461033e578063c55d0f5614610361578063dd1b7a0f14610398578063f2fde38b146103ed575b600080fd5b34156100eb57600080fd5b61013b600480803590602001909190803590602001909190803590602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610426565b005b341561014857600080fd5b610150610576565b604051808215151515815260200191505060405180910390f35b610180600480803590602001909190505061063b565b005b341561018d57600080fd5b6101956106eb565b604051808215151515815260200191505060405180910390f35b34156101ba57600080fd5b6101c26106fe565b005b34156101cf57600080fd5b6101d7610809565b604051808215151515815260200191505060405180910390f35b34156101fc57600080fd5b610212600480803590602001909190505061081c565b604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b341561027b57600080fd5b61028361093f565b6040518082815260200191505060405180910390f35b34156102a457600080fd5b6102ac610945565b604051808215151515815260200191505060405180910390f35b34156102d157600080fd5b6102e76004808035906020019091905050610a0c565b005b34156102f457600080fd5b6102fc610ade565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561034957600080fd5b61035f6004808035906020019091905050610b03565b005b341561036c57600080fd5b6103826004808035906020019091905050610b9f565b6040518082815260200191505060405180910390f35b34156103a357600080fd5b6103ab610bdc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103f857600080fd5b610424600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610c02565b005b61042e6114cd565b846fffffffffffffffffffffffffffffffff168514151561044e57600080fd5b836fffffffffffffffffffffffffffffffff168414151561046e57600080fd5b8267ffffffffffffffff168314151561048657600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156104e257600080fd5b6104ec8287610cd7565b60a0604051908101604052808373ffffffffffffffffffffffffffffffffffffffff168152602001866fffffffffffffffffffffffffffffffff168152602001856fffffffffffffffffffffffffffffffff1681526020018467ffffffffffffffff1681526020014267ffffffffffffffff16815250905061056e8682610de7565b505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156105d357600080fd5b600060149054906101000a900460ff1615156105ee57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a16001905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561069957600080fd5b6003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506106dc8234610fcc565b506106e7818361116b565b5050565b600060149054906101000a900460ff1681565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806107ac57508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156107b757600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505090505050565b600460009054906101000a900460ff1681565b60008060008060008060036000888152602001908152602001600020905061084381611247565b151561084e57600080fd5b8060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a90046fffffffffffffffffffffffffffffffff168260010160109054906101000a90046fffffffffffffffffffffffffffffffff168360020160009054906101000a900467ffffffffffffffff168460020160089054906101000a900467ffffffffffffffff16836fffffffffffffffffffffffffffffffff169350826fffffffffffffffffffffffffffffffff1692508167ffffffffffffffff1691508067ffffffffffffffff169050955095509550955095505091939590929450565b60025481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156109a257600080fd5b600060149054906101000a900460ff161515156109be57600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a16001905090565b60008060149054906101000a900460ff161515610a2857600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a8357600080fd5b600360008381526020019081526020016000209050610aa181611247565b1515610aac57600080fd5b610ada828260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611275565b5050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600360008481526020019081526020016000209150610b2482611247565b1515610b2f57600080fd5b8160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610b9057600080fd5b610b9a8382611275565b505050565b600080600360008481526020019081526020016000209050610bc081611247565b1515610bcb57600080fd5b610bd4816112c3565b915050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610c5d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515610cd457806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8330846040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1515610dcf57600080fd5b6102c65a03f11515610de057600080fd5b5050505050565b603c816060015167ffffffffffffffff1610151515610e0557600080fd5b806003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060408201518160010160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160020160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050507fa9c8dfcda5664a5a124c713e386da27de87432d5b668e79458501eb296389ba78282602001516fffffffffffffffffffffffffffffffff1683604001516fffffffffffffffffffffffffffffffff16846060015167ffffffffffffffff166040518085815260200184815260200183815260200182815260200194505050505060405180910390a15050565b6000806000806000806000600360008a81526020019081526020016000209550610ff586611247565b151561100057600080fd5b611009866112c3565b945084881015151561101a57600080fd5b8560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16935061104a896113b6565b60008511156110a45761105c85611472565b925082850391508373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015156110a357600080fd5b5b84880390503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015156110e957600080fd5b7f4fcc30d90a842164dd58501ab874a101a3749c3d4747139cefe7c876f4ccebd2898633604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a184965050505050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b151561122f57600080fd5b6102c65a03f1151561124057600080fd5b5050505050565b6000808260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16119050919050565b61127e826113b6565b611288818361116b565b7f2809c7e17bf978fbc7194c0a694b638c4215e9140cacc6c38ca36010b45697df826040518082815260200191505060405180910390a15050565b600080600090508260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1642111561131c578260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16420390505b6113ae8360010160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168460010160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168560020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff168461148d565b915050919050565b60036000828152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160006101000a8154906fffffffffffffffffffffffffffffffff02191690556001820160106101000a8154906fffffffffffffffffffffffffffffffff02191690556002820160006101000a81549067ffffffffffffffff02191690556002820160086101000a81549067ffffffffffffffff0219169055505050565b6000612710600254830281151561148557fe5b049050919050565b60008060008085851015156114a4578693506114c2565b8787039250858584028115156114b657fe5b05915081880190508093505b505050949350505050565b60a060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff16815250905600a165627a7a7230582088346814195bef8734c8500f678baa663ba91a4f22f3a8eca9142aaf4263986b0029", + "deployedBytecode": "0x6060604052600436106100db576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806327ebe40a146100e05780633f4ba83a1461013d578063454a2ab31461016a5780635c975abb146101825780635fd8c710146101af57806376190f8f146101c457806378bd7935146101f157806383b5ff8b146102705780638456cb5914610299578063878eb368146102c65780638da5cb5b146102e957806396b5a7551461033e578063c55d0f5614610361578063dd1b7a0f14610398578063f2fde38b146103ed575b600080fd5b34156100eb57600080fd5b61013b600480803590602001909190803590602001909190803590602001909190803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610426565b005b341561014857600080fd5b610150610576565b604051808215151515815260200191505060405180910390f35b610180600480803590602001909190505061063b565b005b341561018d57600080fd5b6101956106eb565b604051808215151515815260200191505060405180910390f35b34156101ba57600080fd5b6101c26106fe565b005b34156101cf57600080fd5b6101d7610809565b604051808215151515815260200191505060405180910390f35b34156101fc57600080fd5b610212600480803590602001909190505061081c565b604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b341561027b57600080fd5b61028361093f565b6040518082815260200191505060405180910390f35b34156102a457600080fd5b6102ac610945565b604051808215151515815260200191505060405180910390f35b34156102d157600080fd5b6102e76004808035906020019091905050610a0c565b005b34156102f457600080fd5b6102fc610ade565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561034957600080fd5b61035f6004808035906020019091905050610b03565b005b341561036c57600080fd5b6103826004808035906020019091905050610b9f565b6040518082815260200191505060405180910390f35b34156103a357600080fd5b6103ab610bdc565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156103f857600080fd5b610424600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610c02565b005b61042e6114cd565b846fffffffffffffffffffffffffffffffff168514151561044e57600080fd5b836fffffffffffffffffffffffffffffffff168414151561046e57600080fd5b8267ffffffffffffffff168314151561048657600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156104e257600080fd5b6104ec8287610cd7565b60a0604051908101604052808373ffffffffffffffffffffffffffffffffffffffff168152602001866fffffffffffffffffffffffffffffffff168152602001856fffffffffffffffffffffffffffffffff1681526020018467ffffffffffffffff1681526020014267ffffffffffffffff16815250905061056e8682610de7565b505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156105d357600080fd5b600060149054906101000a900460ff1615156105ee57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a16001905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561069957600080fd5b6003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506106dc8234610fcc565b506106e7818361116b565b5050565b600060149054906101000a900460ff1681565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806107ac57508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156107b757600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505090505050565b600460009054906101000a900460ff1681565b60008060008060008060036000888152602001908152602001600020905061084381611247565b151561084e57600080fd5b8060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a90046fffffffffffffffffffffffffffffffff168260010160109054906101000a90046fffffffffffffffffffffffffffffffff168360020160009054906101000a900467ffffffffffffffff168460020160089054906101000a900467ffffffffffffffff16836fffffffffffffffffffffffffffffffff169350826fffffffffffffffffffffffffffffffff1692508167ffffffffffffffff1691508067ffffffffffffffff169050955095509550955095505091939590929450565b60025481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156109a257600080fd5b600060149054906101000a900460ff161515156109be57600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a16001905090565b60008060149054906101000a900460ff161515610a2857600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610a8357600080fd5b600360008381526020019081526020016000209050610aa181611247565b1515610aac57600080fd5b610ada828260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611275565b5050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600360008481526020019081526020016000209150610b2482611247565b1515610b2f57600080fd5b8160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610b9057600080fd5b610b9a8382611275565b505050565b600080600360008481526020019081526020016000209050610bc081611247565b1515610bcb57600080fd5b610bd4816112c3565b915050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610c5d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515610cd457806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd8330846040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1515610dcf57600080fd5b6102c65a03f11515610de057600080fd5b5050505050565b603c816060015167ffffffffffffffff1610151515610e0557600080fd5b806003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060408201518160010160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060608201518160020160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060808201518160020160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050507fa9c8dfcda5664a5a124c713e386da27de87432d5b668e79458501eb296389ba78282602001516fffffffffffffffffffffffffffffffff1683604001516fffffffffffffffffffffffffffffffff16846060015167ffffffffffffffff166040518085815260200184815260200183815260200182815260200194505050505060405180910390a15050565b6000806000806000806000600360008a81526020019081526020016000209550610ff586611247565b151561100057600080fd5b611009866112c3565b945084881015151561101a57600080fd5b8560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16935061104a896113b6565b60008511156110a45761105c85611472565b925082850391508373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015156110a357600080fd5b5b84880390503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015156110e957600080fd5b7f4fcc30d90a842164dd58501ab874a101a3749c3d4747139cefe7c876f4ccebd2898633604051808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a184965050505050505092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b151561122f57600080fd5b6102c65a03f1151561124057600080fd5b5050505050565b6000808260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16119050919050565b61127e826113b6565b611288818361116b565b7f2809c7e17bf978fbc7194c0a694b638c4215e9140cacc6c38ca36010b45697df826040518082815260200191505060405180910390a15050565b600080600090508260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1642111561131c578260020160089054906101000a900467ffffffffffffffff1667ffffffffffffffff16420390505b6113ae8360010160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168460010160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168560020160009054906101000a900467ffffffffffffffff1667ffffffffffffffff168461148d565b915050919050565b60036000828152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160006101000a8154906fffffffffffffffffffffffffffffffff02191690556001820160106101000a8154906fffffffffffffffffffffffffffffffff02191690556002820160006101000a81549067ffffffffffffffff02191690556002820160086101000a81549067ffffffffffffffff0219169055505050565b6000612710600254830281151561148557fe5b049050919050565b60008060008085851015156114a4578693506114c2565b8787039250858584028115156114b657fe5b05915081880190508093505b505050949350505050565b60a060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600067ffffffffffffffff16815250905600a165627a7a7230582088346814195bef8734c8500f678baa663ba91a4f22f3a8eca9142aaf4263986b0029", "sourceMap": "60701:2345:18:-;;;54337:5;54316:26;;;;;;;;;;;;;;;;;;;;60926:4;60891:39;;;;;;;;;;;;;;;;;;;;60965:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61049:8;61059:4;55996:31;816:10;808:5;;:18;;;;;;;;;;;;;;;;;;55954:5;55946:4;:13;;55938:22;;;;;;;;55981:4;55970:8;:15;;;;56044:11;55996:60;;56074:17;:35;;;55501:10;55494:18;;56074:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56066:71;;;;;;;;56169:17;56147:19;;:39;;;;;;;;;;;;;;;;;;55864:329;;;60965:102;;60701:2345;;;;;;", "deployedSourceMap": "60701:2345:18:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61543:850;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54943:126;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62611:432;;;;;;;;;;;;;;;;;;54316:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56458:352;;;;;;;;;;;;;;60891:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59705:493;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45099:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54735:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59338:256;;;;;;;;;;;;;;;;;;;;;;;;;;622:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58796:289;;;;;;;;;;;;;;;;;;;;;;;;;;60323:239;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44927:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1156:140;;;;;;;;;;;;;;;;;;;;;;;;;;;;61543:850;62155:22;;:::i;:::-;61907:14;61891:32;;61873:14;:50;61865:59;;;;;;;;61974:12;61958:30;;61942:12;:46;61934:55;;;;;;;;62035:9;62020:26;;62007:9;:39;61999:48;;;;;;;;62088:19;;;;;;;;;;;62066:42;;:10;:42;;;62058:51;;;;;;;;62119:26;62127:7;62136:8;62119:7;:26::i;:::-;62180:166;;;;;;;;;62201:7;62180:166;;;;;;62230:14;62180:166;;;;;;62267:12;62180:166;;;;;;62301:9;62180:166;;;;;;62332:3;62180:166;;;;;62155:191;;62356:30;62368:8;62378:7;62356:11;:30::i;:::-;61543:850;;;;;;:::o;54943:126::-;54992:4;969:5;;;;;;;;;;;955:19;;:10;:19;;;947:28;;;;;;;;54629:6;;;;;;;;;;;54621:15;;;;;;;;55017:5;55008:6;;:14;;;;;;;;;;;;;;;;;;55032:9;;;;;;;;;;55058:4;55051:11;;54943:126;:::o;62611:432::-;62742:14;62711:19;;;;;;;;;;;62689:42;;:10;:42;;;62681:51;;;;;;;;62759:16;:26;62776:8;62759:26;;;;;;;;;;;:33;;;;;;;;;;;;62742:50;;62876:25;62881:8;62891:9;62876:4;:25::i;:::-;;63009:27;63019:6;63027:8;63009:9;:27::i;:::-;62611:432;;:::o;54316:26::-;;;;;;;;;;;;;:::o;56458:352::-;56504:18;56763:8;56533:19;;;;;;;;;;;56504:49;;56599:5;;;;;;;;;;;56585:19;;:10;:19;;;:59;;;;56634:10;56620:24;;:10;:24;;;56585:59;56564:90;;;;;;;;56774:10;:15;;:29;56790:4;:12;;;56774:29;;;;;;;;;;;;;;;;;;;;;;;56763:40;;56458:352;;:::o;60891:39::-;;;;;;;;;;;;;:::o;59705:493::-;59791:14;59815:21;59846:19;59875:16;59901:17;59935:23;59961:16;:26;59978:8;59961:26;;;;;;;;;;;59935:52;;60005:21;60018:7;60005:12;:21::i;:::-;59997:30;;;;;;;;60054:7;:14;;;;;;;;;;;;60078:7;:21;;;;;;;;;;;;60109:7;:19;;;;;;;;;;;;60138:7;:16;;;;;;;;;;;;60164:7;:17;;;;;;;;;;;;60037:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59705:493;;;;;;;;:::o;45099:23::-;;;;:::o;54735:124::-;54785:4;969:5;;;;;;;;;;;955:19;;:10;:19;;;947:28;;;;;;;;54475:6;;;;;;;;;;;54474:7;54466:16;;;;;;;;54810:4;54801:6;;:13;;;;;;;;;;;;;;;;;;54824:7;;;;;;;;;;54848:4;54841:11;;54735:124;:::o;59338:256::-;59445:23;54629:6;;;;;;;;;;;54621:15;;;;;;;;969:5;;;;;;;;;;;955:19;;:10;:19;;;947:28;;;;;;;;59471:16;:26;59488:8;59471:26;;;;;;;;;;;59445:52;;59515:21;59528:7;59515:12;:21::i;:::-;59507:30;;;;;;;;59547:40;59562:8;59572:7;:14;;;;;;;;;;;;59547;:40::i;:::-;59338:256;;:::o;622:20::-;;;;;;;;;;;;;:::o;58796:289::-;58864:23;58966:14;58890:16;:26;58907:8;58890:26;;;;;;;;;;;58864:52;;58934:21;58947:7;58934:12;:21::i;:::-;58926:30;;;;;;;;58983:7;:14;;;;;;;;;;;;58966:31;;59029:6;59015:20;;:10;:20;;;59007:29;;;;;;;;59046:32;59061:8;59071:6;59046:14;:32::i;:::-;58796:289;;;:::o;60323:239::-;60401:7;60424:23;60450:16;:26;60467:8;60450:26;;;;;;;;;;;60424:52;;60494:21;60507:7;60494:12;:21::i;:::-;60486:30;;;;;;;;60533:22;60547:7;60533:13;:22::i;:::-;60526:29;;60323:239;;;;:::o;44927:40::-;;;;;;;;;;;;;:::o;1156:140::-;969:5;;;;;;;;;;;955:19;;:10;:19;;;947:28;;;;;;;;1245:1;1225:22;;:8;:22;;;;1221:69;;;1271:8;1263:5;;:16;;;;;;;;;;;;;;;;;;1221:69;1156:140;:::o;46053:176::-;46166:19;;;;;;;;;;;:32;;;46199:6;46207:4;46213:8;46166:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46053:176;;:::o;46852:489::-;47082:9;47061:8;:17;;;:30;;;;47053:39;;;;;;;;47132:8;47103:16;:26;47120:8;47103:26;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47151:183;47187:8;47218;:22;;;47210:31;;47263:8;:20;;;47255:29;;47306:8;:17;;;47298:26;;47151:183;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46852:489;;:::o;47687:2629::-;47765:7;47837:23;48279:13;48459:14;48938:21;48994:22;49934:17;47863:16;:26;47880:8;47863:26;;;;;;;;;;;47837:52;;48170:21;48183:7;48170:12;:21::i;:::-;48162:30;;;;;;;;48295:22;48309:7;48295:13;:22::i;:::-;48279:38;;48349:5;48335:10;:19;;48327:28;;;;;;;;48476:7;:14;;;;;;;;;;;;48459:31;;48635:24;48650:8;48635:14;:24::i;:::-;48741:1;48733:5;:9;48729:918;;;48962:18;48974:5;48962:11;:18::i;:::-;48938:42;;49027:13;49019:5;:21;48994:46;;49605:6;:15;;:31;49621:14;49605:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48729:918;49967:5;49954:10;:18;49934:38;;50172:10;:19;;:30;50192:9;50172:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50240:46;50258:8;50268:5;50275:10;50240:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50304:5;50297:12;;47687:2629;;;;;;;;;;:::o;46461:174::-;46579:19;;;;;;;;;;;:28;;;46608:9;46619:8;46579:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46461:174;;:::o;50637:125::-;50708:4;50753:1;50732:8;:18;;;;;;;;;;;;:22;;;50724:31;;50637:125;;;:::o;47396:183::-;47474:24;47489:8;47474:14;:24::i;:::-;47508:28;47518:7;47527:8;47508:9;:28::i;:::-;47546:26;47563:8;47546:26;;;;;;;;;;;;;;;;;;47396:183;;:::o;51057:613::-;51141:7;51164:21;51188:1;51164:25;;51403:8;:18;;;;;;;;;;;;51397:24;;:3;:24;51393:95;;;51459:8;:18;;;;;;;;;;;;51453:24;;:3;:24;51437:40;;51393:95;51505:158;51539:8;:22;;;;;;;;;;;;51505:158;;51575:8;:20;;;;;;;;;;;;51505:158;;51609:8;:17;;;;;;;;;;;;51505:158;;51640:13;51505:20;:158::i;:::-;51498:165;;51057:613;;;;:::o;50434:101::-;50502:16;:26;50519:8;50502:26;;;;;;;;;;;;50495:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50434:101;:::o;53613:482::-;53673:7;54083:5;54072:8;;54063:6;:17;:25;;;;;;;;54056:32;;53613:482;;;:::o;51918:1601::-;52110:7;52803:23;53118:25;53394:19;52477:9;52459:14;:27;;52455:1058;;;52635:12;52628:19;;;;52455:1058;52859:14;52836:12;52829:45;52803:71;;53197:9;53172:14;53146:16;:41;:61;;;;;;;;53118:89;;53441:18;53423:14;53416:43;53394:65;;53489:12;53474:28;;51918:1601;;;;;;;;;;:::o;60701:2345::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", "source": "pragma solidity 0.4.18;\n\n/**\n The following contract code, titled KittyCore, was written by Cryptokitties and published\n and retrieved from https://etherscan.io/address/0x06012c8cf97bead5deae237070f9587f8e7a266d#code.\n\n It is included in the current project for test purposes, to ensure that our collateralizer can\n handle ERC721 tokens created by the KittyCore contract.\n*/\n\n/**\n * @title KittiesOwnable\n * @dev The KittiesOwnable contract has an owner address, and provides basic authorization control\n * functions, this simplifies the implementation of \"user permissions\".\n */\ncontract KittiesOwnable {\n address public owner;\n\n\n /**\n\t * @dev The KittiesOwnable constructor sets the original `owner` of the contract to the sender\n\t * account.\n\t */\n function KittiesOwnable() {\n owner = msg.sender;\n }\n\n\n /**\n\t * @dev Throws if called by any account other than the owner.\n\t */\n modifier onlyOwner() {\n require(msg.sender == owner);\n _;\n }\n\n\n /**\n\t * @dev Allows the current owner to transfer control of the contract to a newOwner.\n\t * @param newOwner The address to transfer ownership to.\n\t */\n function transferOwnership(address newOwner) onlyOwner {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n\n}\n\n\n\n/// @title Interface for contracts conforming to ERC-721: Non-Fungible Tokens\n/// @author Dieter Shirley (https://github.com/dete)\ncontract KittiesERC721 {\n // Required methods\n function totalSupply() public view returns (uint256 total);\n function balanceOf(address _owner) public view returns (uint256 balance);\n function ownerOf(uint256 _tokenId) external view returns (address owner);\n function approve(address _to, uint256 _tokenId) external;\n function transfer(address _to, uint256 _tokenId) external;\n function transferFrom(address _from, address _to, uint256 _tokenId) external;\n\n // Events\n event Transfer(address from, address to, uint256 tokenId);\n event Approval(address owner, address approved, uint256 tokenId);\n\n // Optional\n // function name() public view returns (string name);\n // function symbol() public view returns (string symbol);\n // function tokensOfOwner(address _owner) external view returns (uint256[] tokenIds);\n // function tokenMetadata(uint256 _tokenId, string _preferredTransport) public view returns (string infoUrl);\n\n // ERC-165 Compatibility (https://github.com/ethereum/EIPs/issues/165)\n function supportsInterface(bytes4 _interfaceID) external view returns (bool);\n}\n\n\n// // Auction wrapper functions\n\n\n// Auction wrapper functions\n\n\n\n\n\n\n\n/// @title SEKRETOOOO\ncontract GeneScienceInterface {\n /// @dev simply a boolean to indicate this is the contract we expect to be\n function isGeneScience() public pure returns (bool);\n\n /// @dev given genes of kitten 1 & 2, return a genetic combination - may have a random factor\n /// @param genes1 genes of mom\n /// @param genes2 genes of sire\n /// @return the genes that are supposed to be passed down the child\n function mixGenes(uint256 genes1, uint256 genes2, uint256 targetBlock) public returns (uint256);\n}\n\n\n\n\n\n\n\n/// @title A facet of KittyCore that manages special access privileges.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyAccessControl {\n // This facet controls access control for CryptoKitties. There are four roles managed here:\n //\n // - The CEO: The CEO can reassign other roles and change the addresses of our dependent smart\n // contracts. It is also the only role that can unpause the smart contract. It is initially\n // set to the address that created the smart contract in the KittyCore constructor.\n //\n // - The CFO: The CFO can withdraw funds from KittyCore and its auction contracts.\n //\n // - The COO: The COO can release gen0 kitties to auction, and mint promo cats.\n //\n // It should be noted that these roles are distinct without overlap in their access abilities, the\n // abilities listed for each role above are exhaustive. In particular, while the CEO can assign any\n // address to any role, the CEO address itself doesn't have the ability to act in those roles. This\n // restriction is intentional so that we aren't tempted to use the CEO address frequently out of\n // convenience. The less we use an address, the less likely it is that we somehow compromise the\n // account.\n\n /// @dev Emited when contract is upgraded - See README.md for updgrade plan\n event ContractUpgrade(address newContract);\n\n // The addresses of the accounts (or contracts) that can execute actions within each roles.\n address public ceoAddress;\n address public cfoAddress;\n address public cooAddress;\n\n // @dev Keeps track whether the contract is paused. When that is true, most actions are blocked\n bool public paused = false;\n\n /// @dev Access modifier for CEO-only functionality\n modifier onlyCEO() {\n require(msg.sender == ceoAddress);\n _;\n }\n\n /// @dev Access modifier for CFO-only functionality\n modifier onlyCFO() {\n require(msg.sender == cfoAddress);\n _;\n }\n\n /// @dev Access modifier for COO-only functionality\n modifier onlyCOO() {\n require(msg.sender == cooAddress);\n _;\n }\n\n modifier onlyCLevel() {\n require(\n msg.sender == cooAddress ||\n msg.sender == ceoAddress ||\n msg.sender == cfoAddress\n );\n _;\n }\n\n /// @dev Assigns a new address to act as the CEO. Only available to the current CEO.\n /// @param _newCEO The address of the new CEO\n function setCEO(address _newCEO) external onlyCEO {\n require(_newCEO != address(0));\n\n ceoAddress = _newCEO;\n }\n\n /// @dev Assigns a new address to act as the CFO. Only available to the current CEO.\n /// @param _newCFO The address of the new CFO\n function setCFO(address _newCFO) external onlyCEO {\n require(_newCFO != address(0));\n\n cfoAddress = _newCFO;\n }\n\n /// @dev Assigns a new address to act as the COO. Only available to the current CEO.\n /// @param _newCOO The address of the new COO\n function setCOO(address _newCOO) external onlyCEO {\n require(_newCOO != address(0));\n\n cooAddress = _newCOO;\n }\n\n /*** KittiesPausable functionality adapted from OpenZeppelin ***/\n\n /// @dev Modifier to allow actions only when the contract IS NOT paused\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /// @dev Modifier to allow actions only when the contract IS paused\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /// @dev Called by any \"C-level\" role to pause the contract. Used only when\n /// a bug or exploit is detected and we need to limit damage.\n function pause() external onlyCLevel whenNotPaused {\n paused = true;\n }\n\n /// @dev Unpauses the smart contract. Can only be called by the CEO, since\n /// one reason we may pause the contract is when CFO or COO accounts are\n /// compromised.\n /// @notice This is public rather than external so it can be called by\n /// derived contracts.\n function unpause() public onlyCEO whenPaused {\n // can't unpause if contract was upgraded\n paused = false;\n }\n}\n\n\n\n\n/// @title Base contract for CryptoKitties. Holds all common structs, events and base variables.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBase is KittyAccessControl {\n /*** EVENTS ***/\n\n /// @dev The Birth event is fired whenever a new kitten comes into existence. This obviously\n /// includes any time a cat is created through the giveBirth method, but it is also called\n /// when a new gen0 cat is created.\n event Birth(address owner, uint256 kittyId, uint256 matronId, uint256 sireId, uint256 genes);\n\n /// @dev Transfer event as defined in current draft of ERC721. Emitted every time a kitten\n /// ownership is assigned, including births.\n event Transfer(address from, address to, uint256 tokenId);\n\n /*** DATA TYPES ***/\n\n /// @dev The main Kitty struct. Every cat in CryptoKitties is represented by a copy\n /// of this structure, so great care was taken to ensure that it fits neatly into\n /// exactly two 256-bit words. Note that the order of the members in this structure\n /// is important because of the byte-packing rules used by Ethereum.\n /// Ref: http://solidity.readthedocs.io/en/develop/miscellaneous.html\n struct Kitty {\n // The Kitty's genetic code is packed into these 256-bits, the format is\n // sooper-sekret! A cat's genes never change.\n uint256 genes;\n\n // The timestamp from the block when this cat came into existence.\n uint64 birthTime;\n\n // The minimum timestamp after which this cat can engage in breeding\n // activities again. This same timestamp is used for the pregnancy\n // timer (for matrons) as well as the siring cooldown.\n uint64 cooldownEndBlock;\n\n // The ID of the parents of this kitty, set to 0 for gen0 cats.\n // Note that using 32-bit unsigned integers limits us to a \"mere\"\n // 4 billion cats. This number might seem small until you realize\n // that Ethereum currently has a limit of about 500 million\n // transactions per year! So, this definitely won't be a problem\n // for several years (even as Ethereum learns to scale).\n uint32 matronId;\n uint32 sireId;\n\n // Set to the ID of the sire cat for matrons that are pregnant,\n // zero otherwise. A non-zero value here is how we know a cat\n // is pregnant. Used to retrieve the genetic material for the new\n // kitten when the birth transpires.\n uint32 siringWithId;\n\n // Set to the index in the cooldown array (see below) that represents\n // the current cooldown duration for this Kitty. This starts at zero\n // for gen0 cats, and is initialized to floor(generation/2) for others.\n // Incremented by one for each successful breeding action, regardless\n // of whether this cat is acting as matron or sire.\n uint16 cooldownIndex;\n\n // The \"generation number\" of this cat. Cats minted by the CK contract\n // for sale are called \"gen0\" and have a generation number of 0. The\n // generation number of all other cats is the larger of the two generation\n // numbers of their parents, plus one.\n // (i.e. max(matron.generation, sire.generation) + 1)\n uint16 generation;\n }\n\n /*** CONSTANTS ***/\n\n /// @dev A lookup table indicating the cooldown duration after any successful\n /// breeding action, called \"pregnancy time\" for matrons and \"siring cooldown\"\n /// for sires. Designed such that the cooldown roughly doubles each time a cat\n /// is bred, encouraging owners not to just keep breeding the same cat over\n /// and over again. Caps out at one week (a cat can breed an unbounded number\n /// of times, and the maximum cooldown is always seven days).\n uint32[14] public cooldowns = [\n uint32(1 minutes),\n uint32(2 minutes),\n uint32(5 minutes),\n uint32(10 minutes),\n uint32(30 minutes),\n uint32(1 hours),\n uint32(2 hours),\n uint32(4 hours),\n uint32(8 hours),\n uint32(16 hours),\n uint32(1 days),\n uint32(2 days),\n uint32(4 days),\n uint32(7 days)\n ];\n\n // An approximation of currently how many seconds are in between blocks.\n uint256 public secondsPerBlock = 15;\n\n /*** STORAGE ***/\n\n /// @dev An array containing the Kitty struct for all Kitties in existence. The ID\n /// of each cat is actually an index into this array. Note that ID 0 is a negacat,\n /// the unKitty, the mythical beast that is the parent of all gen0 cats. A bizarre\n /// creature that is both matron and sire... to itself! Has an invalid genetic code.\n /// In other words, cat ID 0 is invalid... ;-)\n Kitty[] kitties;\n\n /// @dev A mapping from cat IDs to the address that owns them. All cats have\n /// some valid owner address, even gen0 cats are created with a non-zero owner.\n mapping (uint256 => address) public kittyIndexToOwner;\n\n // @dev A mapping from owner address to count of tokens that address owns.\n // Used internally inside balanceOf() to resolve ownership count.\n mapping (address => uint256) ownershipTokenCount;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to call\n /// transferFrom(). Each Kitty can only have one approved address for transfer\n /// at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public kittyIndexToApproved;\n\n /// @dev A mapping from KittyIDs to an address that has been approved to use\n /// this Kitty for siring via breedWith(). Each Kitty can only have one approved\n /// address for siring at any time. A zero value means no approval is outstanding.\n mapping (uint256 => address) public sireAllowedToAddress;\n\n /// @dev The address of the ClockAuction contract that handles sales of Kitties. This\n /// same contract handles both peer-to-peer sales as well as the gen0 sales which are\n /// initiated every 15 minutes.\n SaleClockAuction public saleAuction;\n\n /// @dev The address of a custom ClockAuction subclassed contract that handles siring\n /// auctions. Needs to be separate from saleAuction because the actions taken on success\n /// after a sales and siring auction are quite different.\n SiringClockAuction public siringAuction;\n\n /// @dev Assigns ownership of a specific Kitty to an address.\n function _transfer(address _from, address _to, uint256 _tokenId) internal {\n // Since the number of kittens is capped to 2^32 we can't overflow this\n ownershipTokenCount[_to]++;\n // transfer ownership\n kittyIndexToOwner[_tokenId] = _to;\n // When creating new kittens _from is 0x0, but we can't account that address.\n if (_from != address(0)) {\n ownershipTokenCount[_from]--;\n // once the kitten is transferred also clear sire allowances\n delete sireAllowedToAddress[_tokenId];\n // clear any previously approved ownership exchange\n delete kittyIndexToApproved[_tokenId];\n }\n // Emit the transfer event.\n Transfer(_from, _to, _tokenId);\n }\n\n /// @dev An internal method that creates a new kitty and stores it. This\n /// method doesn't do any checking and should only be called when the\n /// input data is known to be valid. Will generate both a Birth event\n /// and a Transfer event.\n /// @param _matronId The kitty ID of the matron of this cat (zero for gen0)\n /// @param _sireId The kitty ID of the sire of this cat (zero for gen0)\n /// @param _generation The generation number of this cat, must be computed by caller.\n /// @param _genes The kitty's genetic code.\n /// @param _owner The inital owner of this cat, must be non-zero (except for the unKitty, ID 0)\n function _createKitty(\n uint256 _matronId,\n uint256 _sireId,\n uint256 _generation,\n uint256 _genes,\n address _owner\n )\n internal\n returns (uint)\n {\n // These requires are not strictly necessary, our calling code should make\n // sure that these conditions are never broken. However! _createKitty() is already\n // an expensive call (for storage), and it doesn't hurt to be especially careful\n // to ensure our data structures are always valid.\n require(_matronId == uint256(uint32(_matronId)));\n require(_sireId == uint256(uint32(_sireId)));\n require(_generation == uint256(uint16(_generation)));\n\n // New kitty starts with the same cooldown as parent gen/2\n uint16 cooldownIndex = uint16(_generation / 2);\n if (cooldownIndex > 13) {\n cooldownIndex = 13;\n }\n\n Kitty memory _kitty = Kitty({\n genes: _genes,\n birthTime: uint64(now),\n cooldownEndBlock: 0,\n matronId: uint32(_matronId),\n sireId: uint32(_sireId),\n siringWithId: 0,\n cooldownIndex: cooldownIndex,\n generation: uint16(_generation)\n });\n uint256 newKittenId = kitties.push(_kitty) - 1;\n\n // It's probably never going to happen, 4 billion cats is A LOT, but\n // let's just be 100% sure we never let this happen.\n require(newKittenId == uint256(uint32(newKittenId)));\n\n // emit the birth event\n Birth(\n _owner,\n newKittenId,\n uint256(_kitty.matronId),\n uint256(_kitty.sireId),\n _kitty.genes\n );\n\n // This will assign ownership, and also emit the Transfer event as\n // per ERC721 draft\n _transfer(0, _owner, newKittenId);\n\n return newKittenId;\n }\n\n // Any C-level can fix how many seconds per blocks are currently observed.\n function setSecondsPerBlock(uint256 secs) external onlyCLevel {\n require(secs < cooldowns[0]);\n secondsPerBlock = secs;\n }\n}\n\n\n\n\n\n/// @title The external contract that is responsible for generating metadata for the kitties,\n/// it has one function that will return the data as bytes.\ncontract KittiesERC721Metadata {\n /// @dev Given a token Id, returns a byte array that is supposed to be converted into string.\n function getMetadata(uint256 _tokenId, string) public view returns (bytes32[4] buffer, uint256 count) {\n if (_tokenId == 1) {\n buffer[0] = \"Hello World! :D\";\n count = 15;\n } else if (_tokenId == 2) {\n buffer[0] = \"I would definitely choose a medi\";\n buffer[1] = \"um length string.\";\n count = 49;\n } else if (_tokenId == 3) {\n buffer[0] = \"Lorem ipsum dolor sit amet, mi e\";\n buffer[1] = \"st accumsan dapibus augue lorem,\";\n buffer[2] = \" tristique vestibulum id, libero\";\n buffer[3] = \" suscipit varius sapien aliquam.\";\n count = 128;\n }\n }\n}\n\n\n/// @title The facet of the CryptoKitties core contract that manages ownership, ERC-721 (draft) compliant.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev Ref: https://github.com/ethereum/EIPs/issues/721\n/// See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyOwnership is KittyBase, KittiesERC721 {\n\n /// @notice Name and symbol of the non fungible token, as defined in ERC721.\n string public constant name = \"CryptoKitties\";\n string public constant symbol = \"CK\";\n\n // The contract that will return kitty metadata\n KittiesERC721Metadata public erc721Metadata;\n\n bytes4 constant InterfaceSignature_ERC165 =\n bytes4(keccak256('supportsInterface(bytes4)'));\n\n bytes4 constant InterfaceSignature_ERC721 =\n bytes4(keccak256('name()')) ^\n bytes4(keccak256('symbol()')) ^\n bytes4(keccak256('totalSupply()')) ^\n bytes4(keccak256('balanceOf(address)')) ^\n bytes4(keccak256('ownerOf(uint256)')) ^\n bytes4(keccak256('approve(address,uint256)')) ^\n bytes4(keccak256('transfer(address,uint256)')) ^\n bytes4(keccak256('transferFrom(address,address,uint256)')) ^\n bytes4(keccak256('tokensOfOwner(address)')) ^\n bytes4(keccak256('tokenMetadata(uint256,string)'));\n\n /// @notice Introspection interface as per ERC-165 (https://github.com/ethereum/EIPs/issues/165).\n /// Returns true for any standardized interfaces implemented by this contract. We implement\n /// ERC-165 (obviously!) and ERC-721.\n function supportsInterface(bytes4 _interfaceID) external view returns (bool)\n {\n // DEBUG ONLY\n //require((InterfaceSignature_ERC165 == 0x01ffc9a7) && (InterfaceSignature_ERC721 == 0x9a20483d));\n\n return ((_interfaceID == InterfaceSignature_ERC165) || (_interfaceID == InterfaceSignature_ERC721));\n }\n\n /// @dev Set the address of the sibling contract that tracks metadata.\n /// CEO only.\n function setMetadataAddress(address _contractAddress) public onlyCEO {\n erc721Metadata = KittiesERC721Metadata(_contractAddress);\n }\n\n // Internal utility functions: These functions all assume that their input arguments\n // are valid. We leave it to public methods to sanitize their inputs and follow\n // the required logic.\n\n /// @dev Checks if a given address is the current owner of a particular Kitty.\n /// @param _claimant the address we are validating against.\n /// @param _tokenId kitten id, only valid when > 0\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToOwner[_tokenId] == _claimant;\n }\n\n /// @dev Checks if a given address currently has transferApproval for a particular Kitty.\n /// @param _claimant the address we are confirming kitten is approved for.\n /// @param _tokenId kitten id, only valid when > 0\n function _approvedFor(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return kittyIndexToApproved[_tokenId] == _claimant;\n }\n\n /// @dev Marks an address as being approved for transferFrom(), overwriting any previous\n /// approval. Setting _approved to address(0) clears all transfer approval.\n /// NOTE: _approve() does NOT send the Approval event. This is intentional because\n /// _approve() and transferFrom() are used together for putting Kitties on auction, and\n /// there is no value in spamming the log with Approval events in that case.\n function _approve(uint256 _tokenId, address _approved) internal {\n kittyIndexToApproved[_tokenId] = _approved;\n }\n\n /// @notice Returns the number of Kitties owned by a specific address.\n /// @param _owner The owner address to check.\n /// @dev Required for ERC-721 compliance\n function balanceOf(address _owner) public view returns (uint256 count) {\n return ownershipTokenCount[_owner];\n }\n\n /// @notice Transfers a Kitty to another address. If transferring to a smart\n /// contract be VERY CAREFUL to ensure that it is aware of ERC-721 (or\n /// CryptoKitties specifically) or your Kitty may be lost forever. Seriously.\n /// @param _to The address of the recipient, can be a user or contract.\n /// @param _tokenId The ID of the Kitty to transfer.\n /// @dev Required for ERC-721 compliance.\n function transfer(\n address _to,\n uint256 _tokenId\n )\n external\n whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Disallow transfers to the auction contracts to prevent accidental\n // misuse. Auction contracts should only take ownership of kitties\n // through the allow + transferFrom flow.\n require(_to != address(saleAuction));\n require(_to != address(siringAuction));\n\n // You can only send your own cat.\n require(_owns(msg.sender, _tokenId));\n\n // Reassign ownership, clear pending approvals, emit Transfer event.\n _transfer(msg.sender, _to, _tokenId);\n }\n\n /// @notice Grant another address the right to transfer a specific Kitty via\n /// transferFrom(). This is the preferred flow for transfering NFTs to contracts.\n /// @param _to The address to be granted transfer approval. Pass address(0) to\n /// clear all approvals.\n /// @param _tokenId The ID of the Kitty that can be transferred if this call succeeds.\n /// @dev Required for ERC-721 compliance.\n function approve(\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Only an owner can grant transfer approval.\n require(_owns(msg.sender, _tokenId));\n\n // Register the approval (replacing any previous approval).\n _approve(_tokenId, _to);\n\n // Emit approval event.\n Approval(msg.sender, _to, _tokenId);\n }\n\n /// @notice Transfer a Kitty owned by another address, for which the calling address\n /// has previously been granted transfer approval by the owner.\n /// @param _from The address that owns the Kitty to be transfered.\n /// @param _to The address that should take ownership of the Kitty. Can be any address,\n /// including the caller.\n /// @param _tokenId The ID of the Kitty to be transferred.\n /// @dev Required for ERC-721 compliance.\n function transferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n external\n // whenNotPaused\n {\n // Safety check to prevent against an unexpected 0x0 default.\n require(_to != address(0));\n // Disallow transfers to this contract to prevent accidental misuse.\n // The contract should never own any kitties (except very briefly\n // after a gen0 cat is created and before it goes on auction).\n require(_to != address(this));\n // Check for approval and valid ownership\n require(_approvedFor(msg.sender, _tokenId));\n require(_owns(_from, _tokenId));\n\n // Reassign ownership (also clears pending approvals and emits Transfer event).\n _transfer(_from, _to, _tokenId);\n }\n\n /// @notice Returns the total number of Kitties currently in existence.\n /// @dev Required for ERC-721 compliance.\n function totalSupply() public view returns (uint) {\n return kitties.length - 1;\n }\n\n /// @notice Returns the address currently assigned ownership of a given Kitty.\n /// @dev Required for ERC-721 compliance.\n function ownerOf(uint256 _tokenId)\n external\n view\n returns (address owner)\n {\n owner = kittyIndexToOwner[_tokenId];\n\n require(owner != address(0));\n }\n\n /// @notice Returns a list of all Kitty IDs assigned to an address.\n /// @param _owner The owner whose Kitties we are interested in.\n /// @dev This method MUST NEVER be called by smart contract code. First, it's fairly\n /// expensive (it walks the entire Kitty array looking for cats belonging to owner),\n /// but it also returns a dynamic array, which is only supported for web3 calls, and\n /// not contract-to-contract calls.\n function tokensOfOwner(address _owner) external view returns(uint256[] ownerTokens) {\n uint256 tokenCount = balanceOf(_owner);\n\n if (tokenCount == 0) {\n // Return an empty array\n return new uint256[](0);\n } else {\n uint256[] memory result = new uint256[](tokenCount);\n uint256 totalCats = totalSupply();\n uint256 resultIndex = 0;\n\n // We count on the fact that all cats have IDs starting at 1 and increasing\n // sequentially up to the totalCat count.\n uint256 catId;\n\n for (catId = 1; catId <= totalCats; catId++) {\n if (kittyIndexToOwner[catId] == _owner) {\n result[resultIndex] = catId;\n resultIndex++;\n }\n }\n\n return result;\n }\n }\n\n /// @dev Adapted from memcpy() by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _memcpy(uint _dest, uint _src, uint _len) private view {\n // Copy word-length chunks while possible\n for(; _len >= 32; _len -= 32) {\n assembly {\n mstore(_dest, mload(_src))\n }\n _dest += 32;\n _src += 32;\n }\n\n // Copy remaining bytes\n uint256 mask = 256 ** (32 - _len) - 1;\n assembly {\n let srcpart := and(mload(_src), not(mask))\n let destpart := and(mload(_dest), mask)\n mstore(_dest, or(destpart, srcpart))\n }\n }\n\n /// @dev Adapted from toString(slice) by @arachnid (Nick Johnson )\n /// This method is licenced under the Apache License.\n /// Ref: https://github.com/Arachnid/solidity-stringutils/blob/2f6ca9accb48ae14c66f1437ec50ed19a0616f78/strings.sol\n function _toString(bytes32[4] _rawBytes, uint256 _stringLength) private view returns (string) {\n var outputString = new string(_stringLength);\n uint256 outputPtr;\n uint256 bytesPtr;\n\n assembly {\n outputPtr := add(outputString, 32)\n bytesPtr := _rawBytes\n }\n\n _memcpy(outputPtr, bytesPtr, _stringLength);\n\n return outputString;\n }\n\n /// @notice Returns a URI pointing to a metadata package for this token conforming to\n /// ERC-721 (https://github.com/ethereum/EIPs/issues/721)\n /// @param _tokenId The ID number of the Kitty whose metadata should be returned.\n function tokenMetadata(uint256 _tokenId, string _preferredTransport) external view returns (string infoUrl) {\n require(erc721Metadata != address(0));\n bytes32[4] memory buffer;\n uint256 count;\n (buffer, count) = erc721Metadata.getMetadata(_tokenId, _preferredTransport);\n\n return _toString(buffer, count);\n }\n}\n\n\n\n/// @title A facet of KittyCore that manages Kitty siring, gestation, and birth.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev See the KittyCore contract documentation to understand how the various contract facets are arranged.\ncontract KittyBreeding is KittyOwnership {\n\n /// @dev The Pregnant event is fired when two cats successfully breed and the pregnancy\n /// timer begins for the matron.\n event Pregnant(address owner, uint256 matronId, uint256 sireId, uint256 cooldownEndBlock);\n\n /// @notice The minimum payment required to use breedWithAuto(). This fee goes towards\n /// the gas cost paid by whatever calls giveBirth(), and can be dynamically updated by\n /// the COO role as the gas price changes.\n uint256 public autoBirthFee = 2 finney;\n\n // Keeps track of number of pregnant kitties.\n uint256 public pregnantKitties;\n\n /// @dev The address of the sibling contract that is used to implement the sooper-sekret\n /// genetic combination algorithm.\n GeneScienceInterface public geneScience;\n\n /// @dev Update the address of the genetic contract, can only be called by the CEO.\n /// @param _address An address of a GeneScience contract instance to be used from this point forward.\n function setGeneScienceAddress(address _address) external onlyCEO {\n GeneScienceInterface candidateContract = GeneScienceInterface(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isGeneScience());\n\n // Set the new contract address\n geneScience = candidateContract;\n }\n\n /// @dev Checks that a given kitten is able to breed. Requires that the\n /// current cooldown is finished (for sires) and also checks that there is\n /// no pending pregnancy.\n function _isReadyToBreed(Kitty _kit) internal view returns (bool) {\n // In addition to checking the cooldownEndBlock, we also need to check to see if\n // the cat has a pending birth; there can be some period of time between the end\n // of the pregnacy timer and the birth event.\n return (_kit.siringWithId == 0) && (_kit.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @dev Check if a sire has authorized breeding with this matron. True if both sire\n /// and matron have the same owner, or if the sire has given siring permission to\n /// the matron's owner (via approveSiring()).\n function _isSiringPermitted(uint256 _sireId, uint256 _matronId) internal view returns (bool) {\n address matronOwner = kittyIndexToOwner[_matronId];\n address sireOwner = kittyIndexToOwner[_sireId];\n\n // Siring is okay if they have same owner, or if the matron's owner was given\n // permission to breed with this sire.\n return (matronOwner == sireOwner || sireAllowedToAddress[_sireId] == matronOwner);\n }\n\n /// @dev Set the cooldownEndTime for the given Kitty, based on its current cooldownIndex.\n /// Also increments the cooldownIndex (unless it has hit the cap).\n /// @param _kitten A reference to the Kitty in storage which needs its timer started.\n function _triggerCooldown(Kitty storage _kitten) internal {\n // Compute an estimation of the cooldown time in blocks (based on current cooldownIndex).\n _kitten.cooldownEndBlock = uint64((cooldowns[_kitten.cooldownIndex]/secondsPerBlock) + block.number);\n\n // Increment the breeding count, clamping it at 13, which is the length of the\n // cooldowns array. We could check the array size dynamically, but hard-coding\n // this as a constant saves gas. Yay, Solidity!\n if (_kitten.cooldownIndex < 13) {\n _kitten.cooldownIndex += 1;\n }\n }\n\n /// @notice Grants approval to another user to sire with one of your Kitties.\n /// @param _addr The address that will be able to sire with your Kitty. Set to\n /// address(0) to clear all siring approvals for this Kitty.\n /// @param _sireId A Kitty that you own that _addr will now be able to sire with.\n function approveSiring(address _addr, uint256 _sireId)\n external\n whenNotPaused\n {\n require(_owns(msg.sender, _sireId));\n sireAllowedToAddress[_sireId] = _addr;\n }\n\n /// @dev Updates the minimum payment required for calling giveBirthAuto(). Can only\n /// be called by the COO address. (This fee is used to offset the gas cost incurred\n /// by the autobirth daemon).\n function setAutoBirthFee(uint256 val) external onlyCOO {\n autoBirthFee = val;\n }\n\n /// @dev Checks to see if a given Kitty is pregnant and (if so) if the gestation\n /// period has passed.\n function _isReadyToGiveBirth(Kitty _matron) private view returns (bool) {\n return (_matron.siringWithId != 0) && (_matron.cooldownEndBlock <= uint64(block.number));\n }\n\n /// @notice Checks that a given kitten is able to breed (i.e. it is not pregnant or\n /// in the middle of a siring cooldown).\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isReadyToBreed(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n Kitty storage kit = kitties[_kittyId];\n return _isReadyToBreed(kit);\n }\n\n /// @dev Checks whether a kitty is currently pregnant.\n /// @param _kittyId reference the id of the kitten, any user can inquire about it\n function isPregnant(uint256 _kittyId)\n public\n view\n returns (bool)\n {\n require(_kittyId > 0);\n // A kitty is pregnant if and only if this field is set\n return kitties[_kittyId].siringWithId != 0;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair. DOES NOT\n /// check ownership permissions (that is up to the caller).\n /// @param _matron A reference to the Kitty struct of the potential matron.\n /// @param _matronId The matron's ID.\n /// @param _sire A reference to the Kitty struct of the potential sire.\n /// @param _sireId The sire's ID\n function _isValidMatingPair(\n Kitty storage _matron,\n uint256 _matronId,\n Kitty storage _sire,\n uint256 _sireId\n )\n private\n view\n returns(bool)\n {\n // A Kitty can't breed with itself!\n if (_matronId == _sireId) {\n return false;\n }\n\n // Kitties can't breed with their parents.\n if (_matron.matronId == _sireId || _matron.sireId == _sireId) {\n return false;\n }\n if (_sire.matronId == _matronId || _sire.sireId == _matronId) {\n return false;\n }\n\n // We can short circuit the sibling check (below) if either cat is\n // gen zero (has a matron ID of zero).\n if (_sire.matronId == 0 || _matron.matronId == 0) {\n return true;\n }\n\n // Kitties can't breed with full or half siblings.\n if (_sire.matronId == _matron.matronId || _sire.matronId == _matron.sireId) {\n return false;\n }\n if (_sire.sireId == _matron.matronId || _sire.sireId == _matron.sireId) {\n return false;\n }\n\n // Everything seems cool! Let's get DTF.\n return true;\n }\n\n /// @dev Internal check to see if a given sire and matron are a valid mating pair for\n /// breeding via auction (i.e. skips ownership and siring approval checks).\n function _canBreedWithViaAuction(uint256 _matronId, uint256 _sireId)\n internal\n view\n returns (bool)\n {\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId);\n }\n\n /// @notice Checks to see if two cats can breed together, including checks for\n /// ownership and siring approvals. Does NOT check that both cats are ready for\n /// breeding (i.e. breedWith could still fail until the cooldowns are finished).\n /// TODO: Shouldn't this check pregnancy and cooldowns?!?\n /// @param _matronId The ID of the proposed matron.\n /// @param _sireId The ID of the proposed sire.\n function canBreedWith(uint256 _matronId, uint256 _sireId)\n external\n view\n returns(bool)\n {\n require(_matronId > 0);\n require(_sireId > 0);\n Kitty storage matron = kitties[_matronId];\n Kitty storage sire = kitties[_sireId];\n return _isValidMatingPair(matron, _matronId, sire, _sireId) &&\n _isSiringPermitted(_sireId, _matronId);\n }\n\n /// @dev Internal utility function to initiate breeding, assumes that all breeding\n /// requirements have been checked.\n function _breedWith(uint256 _matronId, uint256 _sireId) internal {\n // Grab a reference to the Kitties from storage.\n Kitty storage sire = kitties[_sireId];\n Kitty storage matron = kitties[_matronId];\n\n // Mark the matron as pregnant, keeping track of who the sire is.\n matron.siringWithId = uint32(_sireId);\n\n // Trigger the cooldown for both parents.\n _triggerCooldown(sire);\n _triggerCooldown(matron);\n\n // Clear siring permission for both parents. This may not be strictly necessary\n // but it's likely to avoid confusion!\n delete sireAllowedToAddress[_matronId];\n delete sireAllowedToAddress[_sireId];\n\n // Every time a kitty gets pregnant, counter is incremented.\n pregnantKitties++;\n\n // Emit the pregnancy event.\n Pregnant(kittyIndexToOwner[_matronId], _matronId, _sireId, matron.cooldownEndBlock);\n }\n\n /// @notice Breed a Kitty you own (as matron) with a sire that you own, or for which you\n /// have previously been given Siring approval. Will either make your cat pregnant, or will\n /// fail entirely. Requires a pre-payment of the fee given out to the first caller of giveBirth()\n /// @param _matronId The ID of the Kitty acting as matron (will end up pregnant if successful)\n /// @param _sireId The ID of the Kitty acting as sire (will begin its siring cooldown if successful)\n function breedWithAuto(uint256 _matronId, uint256 _sireId)\n external\n payable\n whenNotPaused\n {\n // Checks for payment.\n require(msg.value >= autoBirthFee);\n\n // Caller must own the matron.\n require(_owns(msg.sender, _matronId));\n\n // Neither sire nor matron are allowed to be on auction during a normal\n // breeding operation, but we don't need to check that explicitly.\n // For matron: The caller of this function can't be the owner of the matron\n // because the owner of a Kitty on auction is the auction house, and the\n // auction house will never call breedWith().\n // For sire: Similarly, a sire on auction will be owned by the auction house\n // and the act of transferring ownership will have cleared any oustanding\n // siring approval.\n // Thus we don't need to spend gas explicitly checking to see if either cat\n // is on auction.\n\n // Check that matron and sire are both owned by caller, or that the sire\n // has given siring permission to caller (i.e. matron's owner).\n // Will fail for _sireId = 0\n require(_isSiringPermitted(_sireId, _matronId));\n\n // Grab a reference to the potential matron\n Kitty storage matron = kitties[_matronId];\n\n // Make sure matron isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(matron));\n\n // Grab a reference to the potential sire\n Kitty storage sire = kitties[_sireId];\n\n // Make sure sire isn't pregnant, or in the middle of a siring cooldown\n require(_isReadyToBreed(sire));\n\n // Test that these cats are a valid mating pair.\n require(_isValidMatingPair(\n matron,\n _matronId,\n sire,\n _sireId\n ));\n\n // All checks passed, kitty gets pregnant!\n _breedWith(_matronId, _sireId);\n }\n\n /// @notice Have a pregnant Kitty give birth!\n /// @param _matronId A Kitty ready to give birth.\n /// @return The Kitty ID of the new kitten.\n /// @dev Looks at a given Kitty and, if pregnant and if the gestation period has passed,\n /// combines the genes of the two parents to create a new kitten. The new Kitty is assigned\n /// to the current owner of the matron. Upon successful completion, both the matron and the\n /// new kitten will be ready to breed again. Note that anyone can call this function (if they\n /// are willing to pay the gas!), but the new kitten always goes to the mother's owner.\n function giveBirth(uint256 _matronId)\n external\n whenNotPaused\n returns(uint256)\n {\n // Grab a reference to the matron in storage.\n Kitty storage matron = kitties[_matronId];\n\n // Check that the matron is a valid cat.\n require(matron.birthTime != 0);\n\n // Check that the matron is pregnant, and that its time has come!\n require(_isReadyToGiveBirth(matron));\n\n // Grab a reference to the sire in storage.\n uint256 sireId = matron.siringWithId;\n Kitty storage sire = kitties[sireId];\n\n // Determine the higher generation number of the two parents\n uint16 parentGen = matron.generation;\n if (sire.generation > matron.generation) {\n parentGen = sire.generation;\n }\n\n // Call the sooper-sekret gene mixing operation.\n uint256 childGenes = geneScience.mixGenes(matron.genes, sire.genes, matron.cooldownEndBlock - 1);\n\n // Make the new kitten!\n address owner = kittyIndexToOwner[_matronId];\n uint256 kittenId = _createKitty(_matronId, matron.siringWithId, parentGen + 1, childGenes, owner);\n\n // Clear the reference to sire from the matron (REQUIRED! Having siringWithId\n // set is what marks a matron as being pregnant.)\n delete matron.siringWithId;\n\n // Every time a kitty gives birth counter is decremented.\n pregnantKitties--;\n\n // Send the balance fee to the person who made birth happen.\n msg.sender.send(autoBirthFee);\n\n // return the new kitten's ID\n return kittenId;\n }\n}\n\n\n\n\n\n\n\n\n\n\n/// @title Auction Core\n/// @dev Contains models, variables, and internal methods for the auction.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuctionBase {\n\n // Represents an auction on an NFT\n struct Auction {\n // Current owner of NFT\n address seller;\n // Price (in wei) at beginning of auction\n uint128 startingPrice;\n // Price (in wei) at end of auction\n uint128 endingPrice;\n // Duration (in seconds) of auction\n uint64 duration;\n // Time when auction started\n // NOTE: 0 if this auction has been concluded\n uint64 startedAt;\n }\n\n // Reference to contract tracking NFT ownership\n KittiesERC721 public nonFungibleContract;\n\n // Cut owner takes on each auction, measured in basis points (1/100 of a percent).\n // Values 0-10,000 map to 0%-100%\n uint256 public ownerCut;\n\n // Map from token ID to their corresponding auction.\n mapping (uint256 => Auction) tokenIdToAuction;\n\n event AuctionCreated(uint256 tokenId, uint256 startingPrice, uint256 endingPrice, uint256 duration);\n event AuctionSuccessful(uint256 tokenId, uint256 totalPrice, address winner);\n event AuctionCancelled(uint256 tokenId);\n\n /// @dev Returns true if the claimant owns the token.\n /// @param _claimant - Address claiming to own the token.\n /// @param _tokenId - ID of token whose ownership to verify.\n function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {\n return (nonFungibleContract.ownerOf(_tokenId) == _claimant);\n }\n\n /// @dev Escrows the NFT, assigning ownership to this contract.\n /// Throws if the escrow fails.\n /// @param _owner - Current owner address of token to escrow.\n /// @param _tokenId - ID of token whose approval to verify.\n function _escrow(address _owner, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transferFrom(_owner, this, _tokenId);\n }\n\n /// @dev Transfers an NFT owned by this contract to another address.\n /// Returns true if the transfer succeeds.\n /// @param _receiver - Address to transfer NFT to.\n /// @param _tokenId - ID of token to transfer.\n function _transfer(address _receiver, uint256 _tokenId) internal {\n // it will throw if transfer fails\n nonFungibleContract.transfer(_receiver, _tokenId);\n }\n\n /// @dev Adds an auction to the list of open auctions. Also fires the\n /// AuctionCreated event.\n /// @param _tokenId The ID of the token to be put on auction.\n /// @param _auction Auction to add.\n function _addAuction(uint256 _tokenId, Auction _auction) internal {\n // Require that all auctions have a duration of\n // at least one minute. (Keeps our math from getting hairy!)\n require(_auction.duration >= 1 minutes);\n\n tokenIdToAuction[_tokenId] = _auction;\n\n AuctionCreated(\n uint256(_tokenId),\n uint256(_auction.startingPrice),\n uint256(_auction.endingPrice),\n uint256(_auction.duration)\n );\n }\n\n /// @dev Cancels an auction unconditionally.\n function _cancelAuction(uint256 _tokenId, address _seller) internal {\n _removeAuction(_tokenId);\n _transfer(_seller, _tokenId);\n AuctionCancelled(_tokenId);\n }\n\n /// @dev Computes the price and transfers winnings.\n /// Does NOT transfer ownership of token.\n function _bid(uint256 _tokenId, uint256 _bidAmount)\n internal\n returns (uint256)\n {\n // Get a reference to the auction struct\n Auction storage auction = tokenIdToAuction[_tokenId];\n\n // Explicitly check that this auction is currently live.\n // (Because of how Ethereum mappings work, we can't just count\n // on the lookup above failing. An invalid _tokenId will just\n // return an auction object that is all zeros.)\n require(_isOnAuction(auction));\n\n // Check that the bid is greater than or equal to the current price\n uint256 price = _currentPrice(auction);\n require(_bidAmount >= price);\n\n // Grab a reference to the seller before the auction struct\n // gets deleted.\n address seller = auction.seller;\n\n // The bid is good! Remove the auction before sending the fees\n // to the sender so we can't have a reentrancy attack.\n _removeAuction(_tokenId);\n\n // Transfer proceeds to seller (if there are any!)\n if (price > 0) {\n // Calculate the auctioneer's cut.\n // (NOTE: _computeCut() is guaranteed to return a\n // value <= price, so this subtraction can't go negative.)\n uint256 auctioneerCut = _computeCut(price);\n uint256 sellerProceeds = price - auctioneerCut;\n\n // NOTE: Doing a transfer() in the middle of a complex\n // method like this is generally discouraged because of\n // reentrancy attacks and DoS attacks if the seller is\n // a contract with an invalid fallback function. We explicitly\n // guard against reentrancy attacks by removing the auction\n // before calling transfer(), and the only thing the seller\n // can DoS is the sale of their own asset! (And if it's an\n // accident, they can call cancelAuction(). )\n seller.transfer(sellerProceeds);\n }\n\n // Calculate any excess funds included with the bid. If the excess\n // is anything worth worrying about, transfer it back to bidder.\n // NOTE: We checked above that the bid amount is greater than or\n // equal to the price so this cannot underflow.\n uint256 bidExcess = _bidAmount - price;\n\n // Return the funds. Similar to the previous transfer, this is\n // not susceptible to a re-entry attack because the auction is\n // removed before any transfers occur.\n msg.sender.transfer(bidExcess);\n\n // Tell the world!\n AuctionSuccessful(_tokenId, price, msg.sender);\n\n return price;\n }\n\n /// @dev Removes an auction from the list of open auctions.\n /// @param _tokenId - ID of NFT on auction.\n function _removeAuction(uint256 _tokenId) internal {\n delete tokenIdToAuction[_tokenId];\n }\n\n /// @dev Returns true if the NFT is on auction.\n /// @param _auction - Auction to check.\n function _isOnAuction(Auction storage _auction) internal view returns (bool) {\n return (_auction.startedAt > 0);\n }\n\n /// @dev Returns current price of an NFT on auction. Broken into two\n /// functions (this one, that computes the duration from the auction\n /// structure, and the other that does the price computation) so we\n /// can easily test that the price computation works correctly.\n function _currentPrice(Auction storage _auction)\n internal\n view\n returns (uint256)\n {\n uint256 secondsPassed = 0;\n\n // A bit of insurance against negative values (or wraparound).\n // Probably not necessary (since Ethereum guarnatees that the\n // now variable doesn't ever go backwards).\n if (now > _auction.startedAt) {\n secondsPassed = now - _auction.startedAt;\n }\n\n return _computeCurrentPrice(\n _auction.startingPrice,\n _auction.endingPrice,\n _auction.duration,\n secondsPassed\n );\n }\n\n /// @dev Computes the current price of an auction. Factored out\n /// from _currentPrice so we can run extensive unit tests.\n /// When testing, make this function public and turn on\n /// `Current price computation` test suite.\n function _computeCurrentPrice(\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n uint256 _secondsPassed\n )\n internal\n pure\n returns (uint256)\n {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our public functions carefully cap the maximum values for\n // time (at 64-bits) and currency (at 128-bits). _duration is\n // also known to be non-zero (see the require() statement in\n // _addAuction())\n if (_secondsPassed >= _duration) {\n // We've reached the end of the dynamic pricing portion\n // of the auction, just return the end price.\n return _endingPrice;\n } else {\n // Starting price can be higher than ending price (and often is!), so\n // this delta can be negative.\n int256 totalPriceChange = int256(_endingPrice) - int256(_startingPrice);\n\n // This multiplication can't overflow, _secondsPassed will easily fit within\n // 64-bits, and totalPriceChange will easily fit within 128-bits, their product\n // will always fit within 256-bits.\n int256 currentPriceChange = totalPriceChange * int256(_secondsPassed) / int256(_duration);\n\n // currentPriceChange can be negative, but if so, will have a magnitude\n // less that _startingPrice. Thus, this result will always end up positive.\n int256 currentPrice = int256(_startingPrice) + currentPriceChange;\n\n return uint256(currentPrice);\n }\n }\n\n /// @dev Computes owner's cut of a sale.\n /// @param _price - Sale price of NFT.\n function _computeCut(uint256 _price) internal view returns (uint256) {\n // NOTE: We don't use SafeMath (or similar) in this function because\n // all of our entry functions carefully cap the maximum values for\n // currency (at 128-bits), and ownerCut <= 10000 (see the require()\n // statement in the ClockAuction constructor). The result of this\n // function is always guaranteed to be <= _price.\n return _price * ownerCut / 10000;\n }\n\n}\n\n\n\n\n\n\n\n/**\n * @title KittiesPausable\n * @dev Base contract which allows children to implement an emergency stop mechanism.\n */\ncontract KittiesPausable is KittiesOwnable {\n event Pause();\n event Unpause();\n\n bool public paused = false;\n\n\n /**\n\t * @dev modifier to allow actions only when the contract IS paused\n\t */\n modifier whenNotPaused() {\n require(!paused);\n _;\n }\n\n /**\n\t * @dev modifier to allow actions only when the contract IS NOT paused\n\t */\n modifier whenPaused {\n require(paused);\n _;\n }\n\n /**\n\t * @dev called by the owner to pause, triggers stopped state\n\t */\n function pause() onlyOwner whenNotPaused returns (bool) {\n paused = true;\n Pause();\n return true;\n }\n\n /**\n\t * @dev called by the owner to unpause, returns to normal state\n\t */\n function unpause() onlyOwner whenPaused returns (bool) {\n paused = false;\n Unpause();\n return true;\n }\n}\n\n\n/// @title Clock auction for non-fungible tokens.\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract ClockAuction is KittiesPausable, ClockAuctionBase {\n\n /// @dev The ERC-165 interface signature for ERC-721.\n /// Ref: https://github.com/ethereum/EIPs/issues/165\n /// Ref: https://github.com/ethereum/EIPs/issues/721\n bytes4 constant InterfaceSignature_ERC721 = bytes4(0x9a20483d);\n\n /// @dev Constructor creates a reference to the NFT ownership contract\n /// and verifies the owner cut is in the valid range.\n /// @param _nftAddress - address of a deployed contract implementing\n /// the Nonfungible Interface.\n /// @param _cut - percent cut the owner takes on each auction, must be\n /// between 0-10,000.\n function ClockAuction(address _nftAddress, uint256 _cut) public {\n require(_cut <= 10000);\n ownerCut = _cut;\n\n KittiesERC721 candidateContract = KittiesERC721(_nftAddress);\n require(candidateContract.supportsInterface(InterfaceSignature_ERC721));\n nonFungibleContract = candidateContract;\n }\n\n /// @dev Remove all Ether from the contract, which is the owner's cuts\n /// as well as any Ether sent directly to the contract address.\n /// Always transfers to the NFT contract, but can be called either by\n /// the owner or the NFT contract.\n function withdrawBalance() external {\n address nftAddress = address(nonFungibleContract);\n\n require(\n msg.sender == owner ||\n msg.sender == nftAddress\n );\n // We are using this boolean method to make sure that even if one fails it will still work\n bool res = nftAddress.send(this.balance);\n }\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of time to move between starting\n /// price and ending price (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n whenNotPaused\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(_owns(msg.sender, _tokenId));\n _escrow(msg.sender, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Bids on an open auction, completing the auction and transferring\n /// ownership of the NFT if enough Ether is supplied.\n /// @param _tokenId - ID of token to bid on.\n function bid(uint256 _tokenId)\n external\n payable\n whenNotPaused\n {\n // _bid will throw if the bid or funds transfer fails\n _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n }\n\n /// @dev Cancels an auction that hasn't been won yet.\n /// Returns the NFT to original owner.\n /// @notice This is a state-modifying function that can\n /// be called while the contract is paused.\n /// @param _tokenId - ID of token on auction\n function cancelAuction(uint256 _tokenId)\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n address seller = auction.seller;\n require(msg.sender == seller);\n _cancelAuction(_tokenId, seller);\n }\n\n /// @dev Cancels an auction when the contract is paused.\n /// Only the owner may do this, and NFTs are returned to\n /// the seller. This should only be used in emergencies.\n /// @param _tokenId - ID of the NFT on auction to cancel.\n function cancelAuctionWhenPaused(uint256 _tokenId)\n whenPaused\n onlyOwner\n external\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n _cancelAuction(_tokenId, auction.seller);\n }\n\n /// @dev Returns auction info for an NFT on auction.\n /// @param _tokenId - ID of NFT on auction.\n function getAuction(uint256 _tokenId)\n external\n view\n returns\n (\n address seller,\n uint256 startingPrice,\n uint256 endingPrice,\n uint256 duration,\n uint256 startedAt\n ) {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return (\n auction.seller,\n auction.startingPrice,\n auction.endingPrice,\n auction.duration,\n auction.startedAt\n );\n }\n\n /// @dev Returns the current price of an auction.\n /// @param _tokenId - ID of the token price we are checking.\n function getCurrentPrice(uint256 _tokenId)\n external\n view\n returns (uint256)\n {\n Auction storage auction = tokenIdToAuction[_tokenId];\n require(_isOnAuction(auction));\n return _currentPrice(auction);\n }\n\n}\n\n\n/// @title Reverse auction modified for siring\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SiringClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSiringAuctionAddress() call.\n bool public isSiringClockAuction = true;\n\n // Delegate constructor\n function SiringClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction. Since this function is wrapped,\n /// require sender to be KittyCore contract.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Places a bid for siring. Requires the sender\n /// is the KittyCore contract because all bid methods\n /// should be wrapped. Also returns the kitty to the\n /// seller rather than the winner.\n function bid(uint256 _tokenId)\n external\n payable\n {\n require(msg.sender == address(nonFungibleContract));\n address seller = tokenIdToAuction[_tokenId].seller;\n // _bid checks that token ID is valid and will throw if bid fails\n _bid(_tokenId, msg.value);\n // We transfer the kitty back to the seller, the winner will get\n // the offspring\n _transfer(seller, _tokenId);\n }\n\n}\n\n\n\n\n\n/// @title Clock auction modified for sale of kitties\n/// @notice We omit a fallback function to prevent accidental sends to this contract.\ncontract SaleClockAuction is ClockAuction {\n\n // @dev Sanity check that allows us to ensure that we are pointing to the\n // right auction in our setSaleAuctionAddress() call.\n bool public isSaleClockAuction = true;\n\n // Tracks last 5 sale price of gen0 kitty sales\n uint256 public gen0SaleCount;\n uint256[5] public lastGen0SalePrices;\n\n // Delegate constructor\n function SaleClockAuction(address _nftAddr, uint256 _cut) public\n ClockAuction(_nftAddr, _cut) {}\n\n /// @dev Creates and begins a new auction.\n /// @param _tokenId - ID of token to auction, sender must be owner.\n /// @param _startingPrice - Price of item (in wei) at beginning of auction.\n /// @param _endingPrice - Price of item (in wei) at end of auction.\n /// @param _duration - Length of auction (in seconds).\n /// @param _seller - Seller, if not the message sender\n function createAuction(\n uint256 _tokenId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration,\n address _seller\n )\n external\n {\n // Sanity check that no inputs overflow how many bits we've allocated\n // to store them in the auction struct.\n require(_startingPrice == uint256(uint128(_startingPrice)));\n require(_endingPrice == uint256(uint128(_endingPrice)));\n require(_duration == uint256(uint64(_duration)));\n\n require(msg.sender == address(nonFungibleContract));\n _escrow(_seller, _tokenId);\n Auction memory auction = Auction(\n _seller,\n uint128(_startingPrice),\n uint128(_endingPrice),\n uint64(_duration),\n uint64(now)\n );\n _addAuction(_tokenId, auction);\n }\n\n /// @dev Updates lastSalePrice if seller is the nft contract\n /// Otherwise, works the same as default bid method.\n function bid(uint256 _tokenId)\n external\n payable\n {\n // _bid verifies token ID size\n address seller = tokenIdToAuction[_tokenId].seller;\n uint256 price = _bid(_tokenId, msg.value);\n _transfer(msg.sender, _tokenId);\n\n // If not a gen0 auction, exit\n if (seller == address(nonFungibleContract)) {\n // Track gen0 sale prices\n lastGen0SalePrices[gen0SaleCount % 5] = price;\n gen0SaleCount++;\n }\n }\n\n function averageGen0SalePrice() external view returns (uint256) {\n uint256 sum = 0;\n for (uint256 i = 0; i < 5; i++) {\n sum += lastGen0SalePrices[i];\n }\n return sum / 5;\n }\n\n}\n\n\n/// @title Handles creating auctions for sale and siring of kitties.\n/// This wrapper of ReverseAuction exists only so that users can create\n/// auctions with only one transaction.\ncontract KittyAuction is KittyBreeding {\n\n // @notice The auction contract variables are defined in KittyBase to allow\n // us to refer to them in KittyOwnership to prevent accidental transfers.\n // `saleAuction` refers to the auction for gen0 and p2p sale of kitties.\n // `siringAuction` refers to the auction for siring rights of kitties.\n\n /// @dev Sets the reference to the sale auction.\n /// @param _address - Address of sale contract.\n function setSaleAuctionAddress(address _address) external onlyCEO {\n SaleClockAuction candidateContract = SaleClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSaleClockAuction());\n\n // Set the new contract address\n saleAuction = candidateContract;\n }\n\n /// @dev Sets the reference to the siring auction.\n /// @param _address - Address of siring contract.\n function setSiringAuctionAddress(address _address) external onlyCEO {\n SiringClockAuction candidateContract = SiringClockAuction(_address);\n\n // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117\n require(candidateContract.isSiringClockAuction());\n\n // Set the new contract address\n siringAuction = candidateContract;\n }\n\n /// @dev Put a kitty up for auction.\n /// Does some ownership trickery to create auctions in one tx.\n function createSaleAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n // Ensure the kitty is not pregnant to prevent the auction\n // contract accidentally receiving ownership of the child.\n // NOTE: the kitty IS allowed to be in a cooldown.\n require(!isPregnant(_kittyId));\n _approve(_kittyId, saleAuction);\n // Sale auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n saleAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Put a kitty up for auction to be sire.\n /// Performs checks to ensure the kitty can be sired, then\n /// delegates to reverse auction.\n function createSiringAuction(\n uint256 _kittyId,\n uint256 _startingPrice,\n uint256 _endingPrice,\n uint256 _duration\n )\n external\n whenNotPaused\n {\n // Auction contract checks input sizes\n // If kitty is already on any auction, this will throw\n // because it will be owned by the auction contract.\n require(_owns(msg.sender, _kittyId));\n require(isReadyToBreed(_kittyId));\n _approve(_kittyId, siringAuction);\n // Siring auction throws if inputs are invalid and clears\n // transfer and sire approval after escrowing the kitty.\n siringAuction.createAuction(\n _kittyId,\n _startingPrice,\n _endingPrice,\n _duration,\n msg.sender\n );\n }\n\n /// @dev Completes a siring auction by bidding.\n /// Immediately breeds the winning matron with the sire on auction.\n /// @param _sireId - ID of the sire on auction.\n /// @param _matronId - ID of the matron owned by the bidder.\n function bidOnSiringAuction(\n uint256 _sireId,\n uint256 _matronId\n )\n external\n payable\n whenNotPaused\n {\n // Auction contract checks input sizes\n require(_owns(msg.sender, _matronId));\n require(isReadyToBreed(_matronId));\n require(_canBreedWithViaAuction(_matronId, _sireId));\n\n // Define the current price of the auction.\n uint256 currentPrice = siringAuction.getCurrentPrice(_sireId);\n require(msg.value >= currentPrice + autoBirthFee);\n\n // Siring auction will throw if the bid fails.\n siringAuction.bid.value(msg.value - autoBirthFee)(_sireId);\n _breedWith(uint32(_matronId), uint32(_sireId));\n }\n\n /// @dev Transfers the balance of the sale auction contract\n /// to the KittyCore contract. We use two-step withdrawal to\n /// prevent two transfer calls in the auction bid function.\n function withdrawAuctionBalances() external onlyCLevel {\n saleAuction.withdrawBalance();\n siringAuction.withdrawBalance();\n }\n}\n\n\n/// @title all functions related to creating kittens\ncontract KittyMinting is KittyAuction {\n\n // Limits the number of cats the contract owner can ever create.\n uint256 public constant PROMO_CREATION_LIMIT = 5000;\n uint256 public constant GEN0_CREATION_LIMIT = 45000;\n\n // Constants for gen0 auctions.\n uint256 public constant GEN0_STARTING_PRICE = 10 finney;\n uint256 public constant GEN0_AUCTION_DURATION = 1 days;\n\n // Counts the number of cats the contract owner has created.\n uint256 public promoCreatedCount;\n uint256 public gen0CreatedCount;\n\n /// @dev we can create promo kittens, up to a limit. Only callable by COO\n /// @param _genes the encoded genes of the kitten to be created, any value is accepted\n /// @param _owner the future owner of the created kittens. Default to contract COO\n function createPromoKitty(uint256 _genes, address _owner) external onlyCOO {\n address kittyOwner = _owner;\n if (kittyOwner == address(0)) {\n kittyOwner = cooAddress;\n }\n require(promoCreatedCount < PROMO_CREATION_LIMIT);\n\n promoCreatedCount++;\n _createKitty(0, 0, 0, _genes, kittyOwner);\n }\n\n /// @dev Creates a new gen0 kitty with the given genes and\n /// creates an auction for it.\n function createGen0Auction(uint256 _genes) external onlyCOO {\n require(gen0CreatedCount < GEN0_CREATION_LIMIT);\n\n uint256 kittyId = _createKitty(0, 0, 0, _genes, address(this));\n _approve(kittyId, saleAuction);\n\n saleAuction.createAuction(\n kittyId,\n _computeNextGen0Price(),\n 0,\n GEN0_AUCTION_DURATION,\n address(this)\n );\n\n gen0CreatedCount++;\n }\n\n /// @dev Computes the next gen0 auction starting price, given\n /// the average of the past 5 prices + 50%.\n function _computeNextGen0Price() internal view returns (uint256) {\n uint256 avePrice = saleAuction.averageGen0SalePrice();\n\n // Sanity check to ensure we don't overflow arithmetic\n require(avePrice == uint256(uint128(avePrice)));\n\n uint256 nextPrice = avePrice + (avePrice / 2);\n\n // We never auction for less than starting price\n if (nextPrice < GEN0_STARTING_PRICE) {\n nextPrice = GEN0_STARTING_PRICE;\n }\n\n return nextPrice;\n }\n}\n\n\n/// @title CryptoKitties: Collectible, breedable, and oh-so-adorable cats on the Ethereum blockchain.\n/// @author Axiom Zen (https://www.axiomzen.co)\n/// @dev The main CryptoKitties contract, keeps track of kittens so they don't wander around and get lost.\ncontract KittyCore is KittyMinting {\n\n // This is the main CryptoKitties contract. In order to keep our code seperated into logical sections,\n // we've broken it up in two ways. First, we have several seperately-instantiated sibling contracts\n // that handle auctions and our super-top-secret genetic combination algorithm. The auctions are\n // seperate since their logic is somewhat complex and there's always a risk of subtle bugs. By keeping\n // them in their own contracts, we can upgrade them without disrupting the main contract that tracks\n // kitty ownership. The genetic combination algorithm is kept seperate so we can open-source all of\n // the rest of our code without making it _too_ easy for folks to figure out how the genetics work.\n // Don't worry, I'm sure someone will reverse engineer it soon enough!\n //\n // Secondly, we break the core contract into multiple files using inheritence, one for each major\n // facet of functionality of CK. This allows us to keep related code bundled together while still\n // avoiding a single giant file with everything in it. The breakdown is as follows:\n //\n // - KittyBase: This is where we define the most fundamental code shared throughout the core\n // functionality. This includes our main data storage, constants and data types, plus\n // internal functions for managing these items.\n //\n // - KittyAccessControl: This contract manages the various addresses and constraints for operations\n // that can be executed only by specific roles. Namely CEO, CFO and COO.\n //\n // - KittyOwnership: This provides the methods required for basic non-fungible token\n // transactions, following the draft ERC-721 spec (https://github.com/ethereum/EIPs/issues/721).\n //\n // - KittyBreeding: This file contains the methods necessary to breed cats together, including\n // keeping track of siring offers, and relies on an external genetic combination contract.\n //\n // - KittyAuctions: Here we have the public methods for auctioning or bidding on cats or siring\n // services. The actual auction functionality is handled in two sibling contracts (one\n // for sales and one for siring), while auction creation and bidding is mostly mediated\n // through this facet of the core contract.\n //\n // - KittyMinting: This final facet contains the functionality we use for creating new gen0 cats.\n // We can make up to 5000 \"promo\" cats that can be given away (especially important when\n // the community is new), and all others can only be created and then immediately put up\n // for auction via an algorithmically determined starting price. Regardless of how they\n // are created, there is a hard limit of 50k gen0 cats. After that, it's all up to the\n // community to breed, breed, breed!\n\n // Set in case the core contract is broken and an upgrade is required\n address public newContractAddress;\n\n /// @notice Creates the main CryptoKitties smart contract instance.\n function KittyCore() public {\n // Starts paused.\n paused = true;\n\n // the creator of the contract is the initial CEO\n ceoAddress = msg.sender;\n\n // the creator of the contract is also the initial COO\n cooAddress = msg.sender;\n\n // start with the mythical kitten 0 - so we don't have generation-0 parent issues\n _createKitty(0, 0, 0, uint256(-1), address(0));\n }\n\n /// @dev Used to mark the smart contract as upgraded, in case there is a serious\n /// breaking bug. This method does nothing but keep track of the new contract and\n /// emit a message indicating that the new address is set. It's up to clients of this\n /// contract to update to the new contract address in that case. (This contract will\n /// be paused indefinitely if such an upgrade takes place.)\n /// @param _v2Address new address\n function setNewAddress(address _v2Address) external onlyCEO whenPaused {\n // See README.md for updgrade plan\n newContractAddress = _v2Address;\n ContractUpgrade(_v2Address);\n }\n\n /// @notice No tipping!\n /// @dev Reject all Ether from being sent here, unless it's from one of the\n /// two auction contracts. (Hopefully, we can prevent user accidents.)\n function() external payable {\n require(\n msg.sender == address(saleAuction) ||\n msg.sender == address(siringAuction)\n );\n }\n\n /// @notice Returns all the relevant information about a specific kitty.\n /// @param _id The ID of the kitty of interest.\n function getKitty(uint256 _id)\n external\n view\n returns (\n bool isGestating,\n bool isReady,\n uint256 cooldownIndex,\n uint256 nextActionAt,\n uint256 siringWithId,\n uint256 birthTime,\n uint256 matronId,\n uint256 sireId,\n uint256 generation,\n uint256 genes\n ) {\n Kitty storage kit = kitties[_id];\n\n // if this variable is 0 then it's not gestating\n isGestating = (kit.siringWithId != 0);\n isReady = (kit.cooldownEndBlock <= block.number);\n cooldownIndex = uint256(kit.cooldownIndex);\n nextActionAt = uint256(kit.cooldownEndBlock);\n siringWithId = uint256(kit.siringWithId);\n birthTime = uint256(kit.birthTime);\n matronId = uint256(kit.matronId);\n sireId = uint256(kit.sireId);\n generation = uint256(kit.generation);\n genes = kit.genes;\n }\n\n /// @dev Override unpause so it requires all external contract addresses\n /// to be set before contract can be unpaused. Also, we can't have\n /// newContractAddress set either, because then the contract was upgraded.\n /// @notice This is public rather than external so we can call super.unpause\n /// without using an expensive CALL.\n function unpause() public onlyCEO whenPaused {\n require(saleAuction != address(0));\n require(siringAuction != address(0));\n require(geneScience != address(0));\n require(newContractAddress == address(0));\n\n // Actually unpause the contract.\n super.unpause();\n }\n\n // @dev Allows the CFO to capture the balance available to the contract.\n function withdrawBalance() external onlyCFO {\n uint256 balance = this.balance;\n // Subtract all the currently pregnant kittens we have, plus 1 of margin.\n uint256 subtractFees = (pregnantKitties + 1) * autoBirthFee;\n\n if (balance > subtractFees) {\n cfoAddress.send(balance - subtractFees);\n }\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/test/CryptokittiesERC721.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/test/CryptokittiesERC721.sol", "exportedSymbols": { "ClockAuction": [ 8872 @@ -51978,5 +51978,5 @@ export const SiringClockAuction = }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:47.968Z" + "updatedAt": "2018-10-09T17:45:36.126Z" } \ No newline at end of file diff --git a/artifacts/ts/StandardToken.ts b/artifacts/ts/StandardToken.ts index 980a6cff..500aafe8 100644 --- a/artifacts/ts/StandardToken.ts +++ b/artifacts/ts/StandardToken.ts @@ -3733,5 +3733,5 @@ export const StandardToken = }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:48.051Z" + "updatedAt": "2018-10-09T17:45:35.529Z" } \ No newline at end of file diff --git a/artifacts/ts/TermsContract.ts b/artifacts/ts/TermsContract.ts index e723f3e6..e28f7863 100644 --- a/artifacts/ts/TermsContract.ts +++ b/artifacts/ts/TermsContract.ts @@ -127,10 +127,10 @@ export const TermsContract = "sourceMap": "", "deployedSourceMap": "", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\n\ninterface TermsContract {\n /// When called, the registerTermStart function registers the fact that\n /// the debt agreement has begun. This method is called as a hook by the\n /// DebtKernel when a debt order associated with `agreementId` is filled.\n /// Method is not required to make any sort of internal state change\n /// upon the debt agreement's start, but MUST return `true` in order to\n /// acknowledge receipt of the transaction. If, for any reason, the\n /// debt agreement stored at `agreementId` is incompatible with this contract,\n /// MUST return `false`, which will cause the pertinent order fill to fail.\n /// If this method is called for a debt agreement whose term has already begun,\n /// must THROW. Similarly, if this method is called by any contract other\n /// than the current DebtKernel, must THROW.\n /// @param agreementId bytes32. The agreement id (issuance hash) of the debt agreement to which this pertains.\n /// @param debtor address. The debtor in this particular issuance.\n /// @return _success bool. Acknowledgment of whether\n function registerTermStart(\n bytes32 agreementId,\n address debtor\n ) public returns (bool _success);\n\n /// When called, the registerRepayment function records the debtor's\n /// repayment, as well as any auxiliary metadata needed by the contract\n /// to determine ex post facto the value repaid (e.g. current USD\n /// exchange rate)\n /// @param agreementId bytes32. The agreement id (issuance hash) of the debt agreement to which this pertains.\n /// @param payer address. The address of the payer.\n /// @param beneficiary address. The address of the payment's beneficiary.\n /// @param unitsOfRepayment uint. The units-of-value repaid in the transaction.\n /// @param tokenAddress address. The address of the token with which the repayment transaction was executed.\n function registerRepayment(\n bytes32 agreementId,\n address payer,\n address beneficiary,\n uint256 unitsOfRepayment,\n address tokenAddress\n ) public returns (bool _success);\n\n /// Returns the cumulative units-of-value expected to be repaid by a given block timestamp.\n /// Note this is not a constant function -- this value can vary on basis of any number of\n /// conditions (e.g. interest rates can be renegotiated if repayments are delinquent).\n /// @param agreementId bytes32. The agreement id (issuance hash) of the debt agreement to which this pertains.\n /// @param timestamp uint. The timestamp of the block for which repayment expectation is being queried.\n /// @return uint256 The cumulative units-of-value expected to be repaid by the time the given timestamp lapses.\n function getExpectedRepaymentValue(\n bytes32 agreementId,\n uint256 timestamp\n ) public view returns (uint256);\n\n /// Returns the cumulative units-of-value repaid by the point at which this method is called.\n /// @param agreementId bytes32. The agreement id (issuance hash) of the debt agreement to which this pertains.\n /// @return uint256 The cumulative units-of-value repaid up until now.\n function getValueRepaidToDate(\n bytes32 agreementId\n ) public view returns (uint256);\n\n /**\n * A method that returns a Unix timestamp representing the end of the debt agreement's term.\n * contract.\n */\n function getTermEndTimestamp(\n bytes32 _agreementId\n ) public view returns (uint);\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/TermsContract.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/TermsContract.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/TermsContract.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/TermsContract.sol", "exportedSymbols": { "TermsContract": [ 4757 @@ -780,5 +780,5 @@ export const TermsContract = }, "networks": {}, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:02:47.591Z" + "updatedAt": "2018-10-09T17:45:35.436Z" } \ No newline at end of file diff --git a/artifacts/ts/TokenRegistry.ts b/artifacts/ts/TokenRegistry.ts index 986b21cc..ab5930f8 100644 --- a/artifacts/ts/TokenRegistry.ts +++ b/artifacts/ts/TokenRegistry.ts @@ -352,15 +352,15 @@ export const TokenRegistry = "type": "event" } ], - "bytecode": "0x6060604052336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611b4a806100536000396000f3006060604052600436106100e6576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680631e71f8d1146100eb5780632e1e1bb3146102335780633550b6d9146102a45780633dbe284a1461034157806351d658d2146104455780635715c5b7146105105780636e7cbb0d146105735780638052348b1461060f57806380ec85871461072657806382f694301461079d5780638da5cb5b146107da57806395f121bf1461082f578063bd7b564d146108cb578063c51ccb40146109a1578063f2fde38b146109d0578063fa7f369714610a09575b600080fd5b34156100f657600080fd5b61010c6004808035906020019091905050610aa5565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001806020018460ff1660ff168152602001838103835286818151815260200191508051906020019080838360005b8381101561018e578082015181840152602081019050610173565b50505050905090810190601f1680156101bb5780820380516001836020036101000a031916815260200191505b50838103825285818151815260200191508051906020019080838360005b838110156101f45780820151818401526020810190506101d9565b50505050905090810190601f1680156102215780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390f35b341561023e57600080fd5b61028e600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610c3b565b6040518082815260200191505060405180910390f35b34156102af57600080fd5b6102ff600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610cd0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561034c57600080fd5b610366600480803560001916906020019091905050610d85565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018360ff1660ff1681526020018281038252848181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156104335780601f1061040857610100808354040283529160200191610433565b820191906000526020600020905b81548152906001019060200180831161041657829003601f168201915b50509550505050505060405180910390f35b341561045057600080fd5b61050e600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560ff16906020019091905050610de1565b005b341561051b57600080fd5b6105316004808035906020019091905050611217565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561057e57600080fd5b61059460048080359060200190919050506112d7565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156105d45780820151818401526020810190506105b9565b50505050905090810190601f1680156106015780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561061a57600080fd5b61066a600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611390565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200184815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156106e85780820151818401526020810190506106cd565b50505050905090810190601f1680156107155780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b341561073157600080fd5b610781600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611515565b604051808260ff1660ff16815260200191505060405180910390f35b34156107a857600080fd5b6107be60048080359060200190919050506115b7565b604051808260ff1660ff16815260200191505060405180910390f35b34156107e557600080fd5b6107ed6115dd565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561083a57600080fd5b6108506004808035906020019091905050611602565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610890578082015181840152602081019050610875565b50505050905090810190601f1680156108bd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156108d657600080fd5b610926600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506116b5565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561096657808201518184015260208101905061094b565b50505050905090810190601f1680156109935780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156109ac57600080fd5b6109b46117e8565b604051808260ff1660ff16815260200191505060405180910390f35b34156109db57600080fd5b610a07600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506117fc565b005b3415610a1457600080fd5b610a2a6004808035906020019091905050611951565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610a6a578082015181840152602081019050610a4f565b50505050905090810190601f168015610a975780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000610aaf611989565b610ab7611989565b6000610ac1611989565b600080610acd886112d7565b9250826040518082805190602001908083835b602083101515610b055780518252602082019150602081019050602083039250610ae0565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683826002018360030160009054906101000a900460ff16818054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610c225780601f10610bf757610100808354040283529160200191610c22565b820191906000526020600020905b815481529060010190602001808311610c0557829003601f168201915b5050505050915096509650965096505050509193509193565b6000806000836040518082805190602001908083835b602083101515610c765780518252602082019150602081019050602083039250610c51565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902091506001600083600019166000191681526020019081526020016000209050806001015492505050919050565b6000806000836040518082805190602001908083835b602083101515610d0b5780518252602082019150602081019050602083039250610ce6565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692505050919050565b60016020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201908060030160009054906101000a900460ff16905084565b6000610deb61199d565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610e4657600080fd5b856040518082805190602001908083835b602083101515610e7c5780518252602082019150602081019050602083039250610e57565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209150600160008360001916600019168152602001908152602001600020608060405190810160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610fcb5780601f10610fa057610100808354040283529160200191610fcb565b820191906000526020600020905b815481529060010190602001808311610fae57829003601f168201915b505050505081526020016003820160009054906101000a900460ff1660ff1660ff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16141561110d5784816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505082816060019060ff16908160ff168152505083816040018190525061010260009054906101000a900460ff1660ff1681602001818152505085600261010260009054906101000a900460ff1660ff16610100811015156110c057fe5b0190805190602001906110d49291906119e5565b50610102600081819054906101000a900460ff168092919060010191906101000a81548160ff021916908360ff16021790555050611161565b84816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505082816060019060ff16908160ff16815250508381604001819052505b8060016000846000191660001916815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020190805190602001906111ea929190611a65565b5060608201518160030160006101000a81548160ff021916908360ff160217905550905050505050505050565b6000806002836101008110151561122a57fe5b0190506112cf818054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156112c55780601f1061129a576101008083540402835291602001916112c5565b820191906000526020600020905b8154815290600101906020018083116112a857829003601f168201915b5050505050610cd0565b915050919050565b6112df611989565b600282610100811015156112ef57fe5b018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113845780601f1061135957610100808354040283529160200191611384565b820191906000526020600020905b81548152906001019060200180831161136757829003601f168201915b50505050509050919050565b60008061139b611989565b6000806000866040518082805190602001908083835b6020831015156113d657805182526020820191506020810190506020830392506113b1565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160010154826002018360030160009054906101000a900460ff16818054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114f75780601f106114cc576101008083540402835291602001916114f7565b820191906000526020600020905b8154815290600101906020018083116114da57829003601f168201915b505050505091508060ff169050955095509550955050509193509193565b6000806000836040518082805190602001908083835b602083101515611550578051825260208201915060208101905060208303925061152b565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060030160009054906101000a900460ff1692505050919050565b60006115c1611989565b6115ca836112d7565b90506115d581611515565b915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6002816101008110151561161257fe5b016000915090508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116ad5780601f10611682576101008083540402835291602001916116ad565b820191906000526020600020905b81548152906001019060200180831161169057829003601f168201915b505050505081565b6116bd611989565b600080836040518082805190602001908083835b6020831015156116f657805182526020820191506020810190506020830392506116d1565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902091506001600083600019166000191681526020019081526020016000209050806002018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156117da5780601f106117af576101008083540402835291602001916117da565b820191906000526020600020905b8154815290600101906020018083116117bd57829003601f168201915b505050505092505050919050565b61010260009054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561185757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561189357600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611959611989565b611961611989565b611969611989565b611972846112d7565b915061197d826116b5565b90508092505050919050565b602060405190810160405280600081525090565b608060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016119d5611ae5565b8152602001600060ff1681525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611a2657805160ff1916838001178555611a54565b82800160010185558215611a54579182015b82811115611a53578251825591602001919060010190611a38565b5b509050611a619190611af9565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611aa657805160ff1916838001178555611ad4565b82800160010185558215611ad4579182015b82811115611ad3578251825591602001919060010190611ab8565b5b509050611ae19190611af9565b5090565b602060405190810160405280600081525090565b611b1b91905b80821115611b17576000816000905550600101611aff565b5090565b905600a165627a7a723058204d982a9c1a4b043f378126db2a600bd5789bdcacb95f71450120c3e1ca13995f0029", - "deployedBytecode": "0x6060604052600436106100e6576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680631e71f8d1146100eb5780632e1e1bb3146102335780633550b6d9146102a45780633dbe284a1461034157806351d658d2146104455780635715c5b7146105105780636e7cbb0d146105735780638052348b1461060f57806380ec85871461072657806382f694301461079d5780638da5cb5b146107da57806395f121bf1461082f578063bd7b564d146108cb578063c51ccb40146109a1578063f2fde38b146109d0578063fa7f369714610a09575b600080fd5b34156100f657600080fd5b61010c6004808035906020019091905050610aa5565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001806020018460ff1660ff168152602001838103835286818151815260200191508051906020019080838360005b8381101561018e578082015181840152602081019050610173565b50505050905090810190601f1680156101bb5780820380516001836020036101000a031916815260200191505b50838103825285818151815260200191508051906020019080838360005b838110156101f45780820151818401526020810190506101d9565b50505050905090810190601f1680156102215780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390f35b341561023e57600080fd5b61028e600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610c3b565b6040518082815260200191505060405180910390f35b34156102af57600080fd5b6102ff600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610cd0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561034c57600080fd5b610366600480803560001916906020019091905050610d85565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018360ff1660ff1681526020018281038252848181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156104335780601f1061040857610100808354040283529160200191610433565b820191906000526020600020905b81548152906001019060200180831161041657829003601f168201915b50509550505050505060405180910390f35b341561045057600080fd5b61050e600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560ff16906020019091905050610de1565b005b341561051b57600080fd5b6105316004808035906020019091905050611217565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561057e57600080fd5b61059460048080359060200190919050506112d7565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156105d45780820151818401526020810190506105b9565b50505050905090810190601f1680156106015780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561061a57600080fd5b61066a600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611390565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200184815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156106e85780820151818401526020810190506106cd565b50505050905090810190601f1680156107155780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b341561073157600080fd5b610781600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611515565b604051808260ff1660ff16815260200191505060405180910390f35b34156107a857600080fd5b6107be60048080359060200190919050506115b7565b604051808260ff1660ff16815260200191505060405180910390f35b34156107e557600080fd5b6107ed6115dd565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561083a57600080fd5b6108506004808035906020019091905050611602565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610890578082015181840152602081019050610875565b50505050905090810190601f1680156108bd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156108d657600080fd5b610926600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506116b5565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561096657808201518184015260208101905061094b565b50505050905090810190601f1680156109935780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156109ac57600080fd5b6109b46117e8565b604051808260ff1660ff16815260200191505060405180910390f35b34156109db57600080fd5b610a07600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506117fc565b005b3415610a1457600080fd5b610a2a6004808035906020019091905050611951565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610a6a578082015181840152602081019050610a4f565b50505050905090810190601f168015610a975780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000610aaf611989565b610ab7611989565b6000610ac1611989565b600080610acd886112d7565b9250826040518082805190602001908083835b602083101515610b055780518252602082019150602081019050602083039250610ae0565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683826002018360030160009054906101000a900460ff16818054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610c225780601f10610bf757610100808354040283529160200191610c22565b820191906000526020600020905b815481529060010190602001808311610c0557829003601f168201915b5050505050915096509650965096505050509193509193565b6000806000836040518082805190602001908083835b602083101515610c765780518252602082019150602081019050602083039250610c51565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902091506001600083600019166000191681526020019081526020016000209050806001015492505050919050565b6000806000836040518082805190602001908083835b602083101515610d0b5780518252602082019150602081019050602083039250610ce6565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692505050919050565b60016020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201908060030160009054906101000a900460ff16905084565b6000610deb61199d565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610e4657600080fd5b856040518082805190602001908083835b602083101515610e7c5780518252602082019150602081019050602083039250610e57565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209150600160008360001916600019168152602001908152602001600020608060405190810160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610fcb5780601f10610fa057610100808354040283529160200191610fcb565b820191906000526020600020905b815481529060010190602001808311610fae57829003601f168201915b505050505081526020016003820160009054906101000a900460ff1660ff1660ff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16141561110d5784816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505082816060019060ff16908160ff168152505083816040018190525061010260009054906101000a900460ff1660ff1681602001818152505085600261010260009054906101000a900460ff1660ff16610100811015156110c057fe5b0190805190602001906110d49291906119e5565b50610102600081819054906101000a900460ff168092919060010191906101000a81548160ff021916908360ff16021790555050611161565b84816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505082816060019060ff16908160ff16815250508381604001819052505b8060016000846000191660001916815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020190805190602001906111ea929190611a65565b5060608201518160030160006101000a81548160ff021916908360ff160217905550905050505050505050565b6000806002836101008110151561122a57fe5b0190506112cf818054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156112c55780601f1061129a576101008083540402835291602001916112c5565b820191906000526020600020905b8154815290600101906020018083116112a857829003601f168201915b5050505050610cd0565b915050919050565b6112df611989565b600282610100811015156112ef57fe5b018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113845780601f1061135957610100808354040283529160200191611384565b820191906000526020600020905b81548152906001019060200180831161136757829003601f168201915b50505050509050919050565b60008061139b611989565b6000806000866040518082805190602001908083835b6020831015156113d657805182526020820191506020810190506020830392506113b1565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160010154826002018360030160009054906101000a900460ff16818054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114f75780601f106114cc576101008083540402835291602001916114f7565b820191906000526020600020905b8154815290600101906020018083116114da57829003601f168201915b505050505091508060ff169050955095509550955050509193509193565b6000806000836040518082805190602001908083835b602083101515611550578051825260208201915060208101905060208303925061152b565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060030160009054906101000a900460ff1692505050919050565b60006115c1611989565b6115ca836112d7565b90506115d581611515565b915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6002816101008110151561161257fe5b016000915090508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116ad5780601f10611682576101008083540402835291602001916116ad565b820191906000526020600020905b81548152906001019060200180831161169057829003601f168201915b505050505081565b6116bd611989565b600080836040518082805190602001908083835b6020831015156116f657805182526020820191506020810190506020830392506116d1565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902091506001600083600019166000191681526020019081526020016000209050806002018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156117da5780601f106117af576101008083540402835291602001916117da565b820191906000526020600020905b8154815290600101906020018083116117bd57829003601f168201915b505050505092505050919050565b61010260009054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561185757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561189357600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611959611989565b611961611989565b611969611989565b611972846112d7565b915061197d826116b5565b90508092505050919050565b602060405190810160405280600081525090565b608060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016119d5611ae5565b8152602001600060ff1681525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611a2657805160ff1916838001178555611a54565b82800160010185558215611a54579182015b82811115611a53578251825591602001919060010190611a38565b5b509050611a619190611af9565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611aa657805160ff1916838001178555611ad4565b82800160010185558215611ad4579182015b82811115611ad3578251825591602001919060010190611ab8565b5b509050611ae19190611af9565b5090565b602060405190810160405280600081525090565b611b1b91905b80821115611b17576000816000905550600101611aff565b5090565b905600a165627a7a723058204d982a9c1a4b043f378126db2a600bd5789bdcacb95f71450120c3e1ca13995f0029", + "bytecode": "0x6060604052336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611b4a806100536000396000f3006060604052600436106100e6576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680631e71f8d1146100eb5780632e1e1bb3146102335780633550b6d9146102a45780633dbe284a1461034157806351d658d2146104455780635715c5b7146105105780636e7cbb0d146105735780638052348b1461060f57806380ec85871461072657806382f694301461079d5780638da5cb5b146107da57806395f121bf1461082f578063bd7b564d146108cb578063c51ccb40146109a1578063f2fde38b146109d0578063fa7f369714610a09575b600080fd5b34156100f657600080fd5b61010c6004808035906020019091905050610aa5565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001806020018460ff1660ff168152602001838103835286818151815260200191508051906020019080838360005b8381101561018e578082015181840152602081019050610173565b50505050905090810190601f1680156101bb5780820380516001836020036101000a031916815260200191505b50838103825285818151815260200191508051906020019080838360005b838110156101f45780820151818401526020810190506101d9565b50505050905090810190601f1680156102215780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390f35b341561023e57600080fd5b61028e600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610c3b565b6040518082815260200191505060405180910390f35b34156102af57600080fd5b6102ff600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610cd0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561034c57600080fd5b610366600480803560001916906020019091905050610d85565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018360ff1660ff1681526020018281038252848181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156104335780601f1061040857610100808354040283529160200191610433565b820191906000526020600020905b81548152906001019060200180831161041657829003601f168201915b50509550505050505060405180910390f35b341561045057600080fd5b61050e600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560ff16906020019091905050610de1565b005b341561051b57600080fd5b6105316004808035906020019091905050611217565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561057e57600080fd5b61059460048080359060200190919050506112d7565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156105d45780820151818401526020810190506105b9565b50505050905090810190601f1680156106015780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561061a57600080fd5b61066a600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611390565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200184815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156106e85780820151818401526020810190506106cd565b50505050905090810190601f1680156107155780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b341561073157600080fd5b610781600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611515565b604051808260ff1660ff16815260200191505060405180910390f35b34156107a857600080fd5b6107be60048080359060200190919050506115b7565b604051808260ff1660ff16815260200191505060405180910390f35b34156107e557600080fd5b6107ed6115dd565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561083a57600080fd5b6108506004808035906020019091905050611602565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610890578082015181840152602081019050610875565b50505050905090810190601f1680156108bd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156108d657600080fd5b610926600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506116b5565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561096657808201518184015260208101905061094b565b50505050905090810190601f1680156109935780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156109ac57600080fd5b6109b46117e8565b604051808260ff1660ff16815260200191505060405180910390f35b34156109db57600080fd5b610a07600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506117fc565b005b3415610a1457600080fd5b610a2a6004808035906020019091905050611951565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610a6a578082015181840152602081019050610a4f565b50505050905090810190601f168015610a975780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000610aaf611989565b610ab7611989565b6000610ac1611989565b600080610acd886112d7565b9250826040518082805190602001908083835b602083101515610b055780518252602082019150602081019050602083039250610ae0565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683826002018360030160009054906101000a900460ff16818054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610c225780601f10610bf757610100808354040283529160200191610c22565b820191906000526020600020905b815481529060010190602001808311610c0557829003601f168201915b5050505050915096509650965096505050509193509193565b6000806000836040518082805190602001908083835b602083101515610c765780518252602082019150602081019050602083039250610c51565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902091506001600083600019166000191681526020019081526020016000209050806001015492505050919050565b6000806000836040518082805190602001908083835b602083101515610d0b5780518252602082019150602081019050602083039250610ce6565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692505050919050565b60016020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201908060030160009054906101000a900460ff16905084565b6000610deb61199d565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610e4657600080fd5b856040518082805190602001908083835b602083101515610e7c5780518252602082019150602081019050602083039250610e57565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209150600160008360001916600019168152602001908152602001600020608060405190810160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610fcb5780601f10610fa057610100808354040283529160200191610fcb565b820191906000526020600020905b815481529060010190602001808311610fae57829003601f168201915b505050505081526020016003820160009054906101000a900460ff1660ff1660ff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16141561110d5784816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505082816060019060ff16908160ff168152505083816040018190525061010260009054906101000a900460ff1660ff1681602001818152505085600261010260009054906101000a900460ff1660ff16610100811015156110c057fe5b0190805190602001906110d49291906119e5565b50610102600081819054906101000a900460ff168092919060010191906101000a81548160ff021916908360ff16021790555050611161565b84816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505082816060019060ff16908160ff16815250508381604001819052505b8060016000846000191660001916815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020190805190602001906111ea929190611a65565b5060608201518160030160006101000a81548160ff021916908360ff160217905550905050505050505050565b6000806002836101008110151561122a57fe5b0190506112cf818054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156112c55780601f1061129a576101008083540402835291602001916112c5565b820191906000526020600020905b8154815290600101906020018083116112a857829003601f168201915b5050505050610cd0565b915050919050565b6112df611989565b600282610100811015156112ef57fe5b018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113845780601f1061135957610100808354040283529160200191611384565b820191906000526020600020905b81548152906001019060200180831161136757829003601f168201915b50505050509050919050565b60008061139b611989565b6000806000866040518082805190602001908083835b6020831015156113d657805182526020820191506020810190506020830392506113b1565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160010154826002018360030160009054906101000a900460ff16818054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114f75780601f106114cc576101008083540402835291602001916114f7565b820191906000526020600020905b8154815290600101906020018083116114da57829003601f168201915b505050505091508060ff169050955095509550955050509193509193565b6000806000836040518082805190602001908083835b602083101515611550578051825260208201915060208101905060208303925061152b565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060030160009054906101000a900460ff1692505050919050565b60006115c1611989565b6115ca836112d7565b90506115d581611515565b915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6002816101008110151561161257fe5b016000915090508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116ad5780601f10611682576101008083540402835291602001916116ad565b820191906000526020600020905b81548152906001019060200180831161169057829003601f168201915b505050505081565b6116bd611989565b600080836040518082805190602001908083835b6020831015156116f657805182526020820191506020810190506020830392506116d1565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902091506001600083600019166000191681526020019081526020016000209050806002018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156117da5780601f106117af576101008083540402835291602001916117da565b820191906000526020600020905b8154815290600101906020018083116117bd57829003601f168201915b505050505092505050919050565b61010260009054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561185757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561189357600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611959611989565b611961611989565b611969611989565b611972846112d7565b915061197d826116b5565b90508092505050919050565b602060405190810160405280600081525090565b608060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016119d5611ae5565b8152602001600060ff1681525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611a2657805160ff1916838001178555611a54565b82800160010185558215611a54579182015b82811115611a53578251825591602001919060010190611a38565b5b509050611a619190611af9565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611aa657805160ff1916838001178555611ad4565b82800160010185558215611ad4579182015b82811115611ad3578251825591602001919060010190611ab8565b5b509050611ae19190611af9565b5090565b602060405190810160405280600081525090565b611b1b91905b80821115611b17576000816000905550600101611aff565b5090565b905600a165627a7a723058204dac033c7dcd66d826eb4b13efc993d432221f481a8b4ec8dc82bdf92095dec70029", + "deployedBytecode": "0x6060604052600436106100e6576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680631e71f8d1146100eb5780632e1e1bb3146102335780633550b6d9146102a45780633dbe284a1461034157806351d658d2146104455780635715c5b7146105105780636e7cbb0d146105735780638052348b1461060f57806380ec85871461072657806382f694301461079d5780638da5cb5b146107da57806395f121bf1461082f578063bd7b564d146108cb578063c51ccb40146109a1578063f2fde38b146109d0578063fa7f369714610a09575b600080fd5b34156100f657600080fd5b61010c6004808035906020019091905050610aa5565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001806020018460ff1660ff168152602001838103835286818151815260200191508051906020019080838360005b8381101561018e578082015181840152602081019050610173565b50505050905090810190601f1680156101bb5780820380516001836020036101000a031916815260200191505b50838103825285818151815260200191508051906020019080838360005b838110156101f45780820151818401526020810190506101d9565b50505050905090810190601f1680156102215780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390f35b341561023e57600080fd5b61028e600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610c3b565b6040518082815260200191505060405180910390f35b34156102af57600080fd5b6102ff600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610cd0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561034c57600080fd5b610366600480803560001916906020019091905050610d85565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018360ff1660ff1681526020018281038252848181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156104335780601f1061040857610100808354040283529160200191610433565b820191906000526020600020905b81548152906001019060200180831161041657829003601f168201915b50509550505050505060405180910390f35b341561045057600080fd5b61050e600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803560ff16906020019091905050610de1565b005b341561051b57600080fd5b6105316004808035906020019091905050611217565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561057e57600080fd5b61059460048080359060200190919050506112d7565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156105d45780820151818401526020810190506105b9565b50505050905090810190601f1680156106015780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561061a57600080fd5b61066a600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611390565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200184815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156106e85780820151818401526020810190506106cd565b50505050905090810190601f1680156107155780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b341561073157600080fd5b610781600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611515565b604051808260ff1660ff16815260200191505060405180910390f35b34156107a857600080fd5b6107be60048080359060200190919050506115b7565b604051808260ff1660ff16815260200191505060405180910390f35b34156107e557600080fd5b6107ed6115dd565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b341561083a57600080fd5b6108506004808035906020019091905050611602565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610890578082015181840152602081019050610875565b50505050905090810190601f1680156108bd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156108d657600080fd5b610926600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506116b5565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561096657808201518184015260208101905061094b565b50505050905090810190601f1680156109935780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156109ac57600080fd5b6109b46117e8565b604051808260ff1660ff16815260200191505060405180910390f35b34156109db57600080fd5b610a07600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506117fc565b005b3415610a1457600080fd5b610a2a6004808035906020019091905050611951565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610a6a578082015181840152602081019050610a4f565b50505050905090810190601f168015610a975780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000610aaf611989565b610ab7611989565b6000610ac1611989565b600080610acd886112d7565b9250826040518082805190602001908083835b602083101515610b055780518252602082019150602081019050602083039250610ae0565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683826002018360030160009054906101000a900460ff16818054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610c225780601f10610bf757610100808354040283529160200191610c22565b820191906000526020600020905b815481529060010190602001808311610c0557829003601f168201915b5050505050915096509650965096505050509193509193565b6000806000836040518082805190602001908083835b602083101515610c765780518252602082019150602081019050602083039250610c51565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902091506001600083600019166000191681526020019081526020016000209050806001015492505050919050565b6000806000836040518082805190602001908083835b602083101515610d0b5780518252602082019150602081019050602083039250610ce6565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692505050919050565b60016020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201908060030160009054906101000a900460ff16905084565b6000610deb61199d565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610e4657600080fd5b856040518082805190602001908083835b602083101515610e7c5780518252602082019150602081019050602083039250610e57565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209150600160008360001916600019168152602001908152602001600020608060405190810160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160018201548152602001600282018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610fcb5780601f10610fa057610100808354040283529160200191610fcb565b820191906000526020600020905b815481529060010190602001808311610fae57829003601f168201915b505050505081526020016003820160009054906101000a900460ff1660ff1660ff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16141561110d5784816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505082816060019060ff16908160ff168152505083816040018190525061010260009054906101000a900460ff1660ff1681602001818152505085600261010260009054906101000a900460ff1660ff16610100811015156110c057fe5b0190805190602001906110d49291906119e5565b50610102600081819054906101000a900460ff168092919060010191906101000a81548160ff021916908360ff16021790555050611161565b84816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505082816060019060ff16908160ff16815250508381604001819052505b8060016000846000191660001916815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020190805190602001906111ea929190611a65565b5060608201518160030160006101000a81548160ff021916908360ff160217905550905050505050505050565b6000806002836101008110151561122a57fe5b0190506112cf818054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156112c55780601f1061129a576101008083540402835291602001916112c5565b820191906000526020600020905b8154815290600101906020018083116112a857829003601f168201915b5050505050610cd0565b915050919050565b6112df611989565b600282610100811015156112ef57fe5b018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113845780601f1061135957610100808354040283529160200191611384565b820191906000526020600020905b81548152906001019060200180831161136757829003601f168201915b50505050509050919050565b60008061139b611989565b6000806000866040518082805190602001908083835b6020831015156113d657805182526020820191506020810190506020830392506113b1565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160010154826002018360030160009054906101000a900460ff16818054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114f75780601f106114cc576101008083540402835291602001916114f7565b820191906000526020600020905b8154815290600101906020018083116114da57829003601f168201915b505050505091508060ff169050955095509550955050509193509193565b6000806000836040518082805190602001908083835b602083101515611550578051825260208201915060208101905060208303925061152b565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020915060016000836000191660001916815260200190815260200160002090508060030160009054906101000a900460ff1692505050919050565b60006115c1611989565b6115ca836112d7565b90506115d581611515565b915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6002816101008110151561161257fe5b016000915090508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116ad5780601f10611682576101008083540402835291602001916116ad565b820191906000526020600020905b81548152906001019060200180831161169057829003601f168201915b505050505081565b6116bd611989565b600080836040518082805190602001908083835b6020831015156116f657805182526020820191506020810190506020830392506116d1565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902091506001600083600019166000191681526020019081526020016000209050806002018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156117da5780601f106117af576101008083540402835291602001916117da565b820191906000526020600020905b8154815290600101906020018083116117bd57829003601f168201915b505050505092505050919050565b61010260009054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561185757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561189357600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611959611989565b611961611989565b611969611989565b611972846112d7565b915061197d826116b5565b90508092505050919050565b602060405190810160405280600081525090565b608060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016119d5611ae5565b8152602001600060ff1681525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611a2657805160ff1916838001178555611a54565b82800160010185558215611a54579182015b82811115611a53578251825591602001919060010190611a38565b5b509050611a619190611af9565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611aa657805160ff1916838001178555611ad4565b82800160010185558215611ad4579182015b82811115611ad3578251825591602001919060010190611ab8565b5b509050611ae19190611af9565b5090565b602060405190810160405280600081525090565b611b1b91905b80821115611b17576000816000905550600101611aff565b5090565b905600a165627a7a723058204dac033c7dcd66d826eb4b13efc993d432221f481a8b4ec8dc82bdf92095dec70029", "sourceMap": "717:7105:12:-;;;509:10:39;501:5;;:18;;;;;;;;;;;;;;;;;;717:7105:12;;;;;;", "deployedSourceMap": "717:7105:12:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7278:542;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3738:256:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2703:263;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;757:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1416:1175;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3407:188;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4130:120;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6427:496:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4873:261:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5373:191;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;238:20:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;834:34:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4391:251:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;874:34:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;832:169:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;5823:232:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7278:542:12;7384:7;7405:6;;:::i;:::-;7425;;:::i;:::-;7445:5;7475:20;;:::i;:::-;7538:18;7587:34;7498:29;7520:6;7498:21;:29::i;:::-;7475:52;;7569:6;7559:17;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;7538:38:12;;7624:27;:39;7652:10;7624:39;;;;;;;;;;;;;;;;;7587:76;;7695:10;:23;;;;;;;;;;;;7732:6;7752:10;:15;;7781:10;:22;;;;;;;;;;;;7674:139;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7278:542;;;;;;;;:::o;3738:256::-;3806:4;3822:18;3872:34;3853:7;3843:18;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;3822:39:12;;3909:27;:39;3937:10;3909:39;;;;;;;;;;;;;;;;;3872:76;;3966:10;:21;;;3959:28;;3738:256;;;;;:::o;2703:263::-;2773:7;2792:18;2842:34;2823:7;2813:18;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;2792:39:12;;2879:27;:39;2907:10;2879:39;;;;;;;;;;;;;;;;;2842:76;;2936:10;:23;;;;;;;;;;;;2929:30;;2703:263;;;;;:::o;757:71::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1416:1175::-;1599:18;1722:33;;:::i;:::-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;1630:7:12;1620:18;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;1599:39:12;;1758:27;:39;1786:10;1758:39;;;;;;;;;;;;;;;;;1722:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1847:1;1812:37;;:10;:23;;;:37;;;1808:671;;;1956:13;1930:10;:23;;:39;;;;;;;;;;;2008:12;1983:10;:22;;:37;;;;;;;;;;;2052:10;2034;:15;;:28;;;;2100:21;;;;;;;;;;;2076:45;;:10;:21;;:45;;;;;2177:7;2136:15;2152:21;;;;;;;;;;;2136:38;;;;;;;;;;;;:48;;;;;;;;;;;;:::i;:::-;;2198:21;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1808:671;;;2362:13;2336:10;:23;;:39;;;;;;;;;;;2414:12;2389:10;:22;;:37;;;;;;;;;;;2458:10;2440;:15;;:28;;;;1808:671;2574:10;2532:27;:39;2560:10;2532:39;;;;;;;;;;;;;;;;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1416:1175;;;;;;:::o;3407:188::-;3473:7;3492:21;3516:15;3532:6;3516:23;;;;;;;;;;3492:47;;3557:31;3581:6;3557:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:23;:31::i;:::-;3550:38;;3407:188;;;;:::o;4130:120::-;4195:6;;:::i;:::-;4220:15;4236:6;4220:23;;;;;;;;;;4213:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4130:120;;;:::o;6427:496::-;6537:7;6558:4;6576:6;;:::i;:::-;6596:4;6625:18;6675:34;6656:7;6646:18;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;6625:39:12;;6712:27;:39;6740:10;6712:39;;;;;;;;;;;;;;;;;6675:76;;6783:10;:23;;;;;;;;;;;;6820:10;:21;;;6855:10;:15;;6884:10;:22;;;;;;;;;;;;6762:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6427:496;;;;;;;:::o;4873:261::-;4944:5;4961:18;5011:34;4992:7;4982:18;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;4961:39:12;;5048:27;:39;5076:10;5048:39;;;;;;;;;;;;;;;;;5011:76;;5105:10;:22;;;;;;;;;;;;5098:29;;4873:261;;;;;:::o;5373:191::-;5438:5;5455:20;;:::i;:::-;5478:29;5500:6;5478:21;:29::i;:::-;5455:52;;5525:32;5550:6;5525:24;:32::i;:::-;5518:39;;5373:191;;;;:::o;238:20:39:-;;;;;;;;;;;;;:::o;834:34:12:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4391:251::-;4458:6;;:::i;:::-;4476:18;4526:34;4507:7;4497:18;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:2;51:6;36:153;;;182:3;176:5;171:3;164:6;98:2;93:3;89;82:19;;123:2;118:3;114;107:19;;148:2;143:3;139;132:19;;36:153;;;274:1;267:3;263:2;259:3;254;250;246;315:4;311:3;305;299:5;295:3;356:4;350:3;344:5;340:3;389:7;380;377:2;372:3;365:6;3:399;;;;;;;;;;;;;;;;;;;4476:39:12;;4563:27;:39;4591:10;4563:39;;;;;;;;;;;;;;;;;4526:76;;4620:10;:15;;4613:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4391:251;;;;;:::o;874:34::-;;;;;;;;;;;;;:::o;832:169:39:-;653:5;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;928:1;908:22;;:8;:22;;;;900:31;;;;;;;;965:8;937:37;;958:5;;;;;;;;;;;937:37;;;;;;;;;;;;988:8;980:5;;:16;;;;;;;;;;;;;;;;;;832:169;:::o;5823:232:12:-;5886:6;;:::i;:::-;5904:20;;:::i;:::-;5967:23;;:::i;:::-;5927:29;5949:6;5927:21;:29::i;:::-;5904:52;;5993:28;6014:6;5993:20;:28::i;:::-;5967:54;;6039:9;6032:16;;5823:232;;;;;:::o;717:7105::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", "source": "pragma solidity 0.4.18;\n\nimport \"zeppelin-solidity/contracts/ownership/Ownable.sol\";\n\n\n/**\n * The TokenRegistry is a basic registry mapping token symbols\n * to their known, deployed addresses on the current blockchain.\n *\n * Note that the TokenRegistry does *not* mediate any of the\n * core protocol's business logic, but, rather, is a helpful\n * utility for Terms Contracts to use in encoding, decoding, and\n * resolving the addresses of currently deployed tokens.\n *\n * At this point in time, administration of the Token Registry is\n * under Dharma Labs' control. With more sophisticated decentralized\n * governance mechanisms, we intend to shift ownership of this utility\n * contract to the Dharma community.\n */\ncontract TokenRegistry is Ownable {\n mapping (bytes32 => TokenAttributes) public symbolHashToTokenAttributes;\n string[256] public tokenSymbolList;\n uint8 public tokenSymbolListLength;\n\n struct TokenAttributes {\n // The ERC20 contract address.\n address tokenAddress;\n // The index in `tokenSymbolList` where the token's symbol can be found.\n uint tokenIndex;\n // The name of the given token, e.g. \"Canonical Wrapped Ether\"\n string name;\n // The number of digits that come after the decimal place when displaying token value.\n uint8 numDecimals;\n }\n\n /**\n * Maps the given symbol to the given token attributes.\n */\n function setTokenAttributes(\n string _symbol,\n address _tokenAddress,\n string _tokenName,\n uint8 _numDecimals\n )\n public onlyOwner\n {\n bytes32 symbolHash = keccak256(_symbol);\n\n // Attempt to retrieve the token's attributes from the registry.\n TokenAttributes memory attributes = symbolHashToTokenAttributes[symbolHash];\n\n if (attributes.tokenAddress == address(0)) {\n // The token has not yet been added to the registry.\n attributes.tokenAddress = _tokenAddress;\n attributes.numDecimals = _numDecimals;\n attributes.name = _tokenName;\n attributes.tokenIndex = tokenSymbolListLength;\n\n tokenSymbolList[tokenSymbolListLength] = _symbol;\n tokenSymbolListLength++;\n } else {\n // The token has already been added to the registry; update attributes.\n attributes.tokenAddress = _tokenAddress;\n attributes.numDecimals = _numDecimals;\n attributes.name = _tokenName;\n }\n\n // Update this contract's storage.\n symbolHashToTokenAttributes[symbolHash] = attributes;\n }\n\n /**\n * Given a symbol, resolves the current address of the token the symbol is mapped to.\n */\n function getTokenAddressBySymbol(string _symbol) public view returns (address) {\n bytes32 symbolHash = keccak256(_symbol);\n\n TokenAttributes storage attributes = symbolHashToTokenAttributes[symbolHash];\n\n return attributes.tokenAddress;\n }\n\n /**\n * Given the known index of a token within the registry's symbol list,\n * returns the address of the token mapped to the symbol at that index.\n *\n * This is a useful utility for compactly encoding the address of a token into a\n * TermsContractParameters string -- by encoding a token by its index in a\n * a 256 slot array, we can represent a token by a 1 byte uint instead of a 20 byte address.\n */\n function getTokenAddressByIndex(uint _index) public view returns (address) {\n string storage symbol = tokenSymbolList[_index];\n\n return getTokenAddressBySymbol(symbol);\n }\n\n /**\n * Given a symbol, resolves the index of the token the symbol is mapped to within the registry's\n * symbol list.\n */\n function getTokenIndexBySymbol(string _symbol) public view returns (uint) {\n bytes32 symbolHash = keccak256(_symbol);\n\n TokenAttributes storage attributes = symbolHashToTokenAttributes[symbolHash];\n\n return attributes.tokenIndex;\n }\n\n /**\n * Given an index, resolves the symbol of the token at that index in the registry's\n * token symbol list.\n */\n function getTokenSymbolByIndex(uint _index) public view returns (string) {\n return tokenSymbolList[_index];\n }\n\n /**\n * Given a symbol, returns the name of the token the symbol is mapped to within the registry's\n * symbol list.\n */\n function getTokenNameBySymbol(string _symbol) public view returns (string) {\n bytes32 symbolHash = keccak256(_symbol);\n\n TokenAttributes storage attributes = symbolHashToTokenAttributes[symbolHash];\n\n return attributes.name;\n }\n\n /**\n * Given the symbol for a token, returns the number of decimals as provided in\n * the associated TokensAttribute struct.\n *\n * Example:\n * getNumDecimalsFromSymbol(\"REP\");\n * => 18\n */\n function getNumDecimalsFromSymbol(string _symbol) public view returns (uint8) {\n bytes32 symbolHash = keccak256(_symbol);\n\n TokenAttributes storage attributes = symbolHashToTokenAttributes[symbolHash];\n\n return attributes.numDecimals;\n }\n\n /**\n * Given the index for a token in the registry, returns the number of decimals as provided in\n * the associated TokensAttribute struct.\n *\n * Example:\n * getNumDecimalsByIndex(1);\n * => 18\n */\n function getNumDecimalsByIndex(uint _index) public view returns (uint8) {\n string memory symbol = getTokenSymbolByIndex(_index);\n\n return getNumDecimalsFromSymbol(symbol);\n }\n\n /**\n * Given the index for a token in the registry, returns the name of the token as provided in\n * the associated TokensAttribute struct.\n *\n * Example:\n * getTokenNameByIndex(1);\n * => \"Canonical Wrapped Ether\"\n */\n function getTokenNameByIndex(uint _index) public view returns (string) {\n string memory symbol = getTokenSymbolByIndex(_index);\n\n string memory tokenName = getTokenNameBySymbol(symbol);\n\n return tokenName;\n }\n\n /**\n * Given the symbol for a token in the registry, returns a tuple containing the token's address,\n * the token's index in the registry, the token's name, and the number of decimals.\n *\n * Example:\n * getTokenAttributesBySymbol(\"WETH\");\n * => [\"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2\", 1, \"Canonical Wrapped Ether\", 18]\n */\n function getTokenAttributesBySymbol(string _symbol)\n public\n view\n returns (\n address,\n uint,\n string,\n uint\n )\n {\n bytes32 symbolHash = keccak256(_symbol);\n\n TokenAttributes storage attributes = symbolHashToTokenAttributes[symbolHash];\n\n return (\n attributes.tokenAddress,\n attributes.tokenIndex,\n attributes.name,\n attributes.numDecimals\n );\n }\n\n /**\n * Given the index for a token in the registry, returns a tuple containing the token's address,\n * the token's symbol, the token's name, and the number of decimals.\n *\n * Example:\n * getTokenAttributesByIndex(1);\n * => [\"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2\", \"WETH\", \"Canonical Wrapped Ether\", 18]\n */\n function getTokenAttributesByIndex(uint _index)\n public\n view\n returns (\n address,\n string,\n string,\n uint8\n )\n {\n string memory symbol = getTokenSymbolByIndex(_index);\n\n bytes32 symbolHash = keccak256(symbol);\n\n TokenAttributes storage attributes = symbolHashToTokenAttributes[symbolHash];\n\n return (\n attributes.tokenAddress,\n symbol,\n attributes.name,\n attributes.numDecimals\n );\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/TokenRegistry.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/TokenRegistry.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/TokenRegistry.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/TokenRegistry.sol", "exportedSymbols": { "TokenRegistry": [ 5113 @@ -5120,7 +5120,7 @@ export const TokenRegistry = } }, "links": {}, - "address": "0xa6d8c45bbd164f0b1aacbd24cb18f8b19de9648a" + "address": "0xb6cf5855a7598441e02e7cd4ffffb6e0426984ff" }, "70": { "events": { @@ -5147,5 +5147,5 @@ export const TokenRegistry = } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:15:01.336Z" + "updatedAt": "2018-10-09T17:51:53.143Z" } \ No newline at end of file diff --git a/artifacts/ts/TokenTransferProxy.ts b/artifacts/ts/TokenTransferProxy.ts index 2f168ca0..b91aa283 100644 --- a/artifacts/ts/TokenTransferProxy.ts +++ b/artifacts/ts/TokenTransferProxy.ts @@ -213,15 +213,15 @@ export const TokenTransferProxy = "type": "event" } ], - "bytecode": "0x606060405260008060146101000a81548160ff021916908315150217905550336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610ff78061006d6000396000f3006060604052600436106100a4576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630a8f7b52146100a957806315dacbea146100e25780632e667c4e1461017a5780633f4ba83a146102085780635c975abb1461021d5780638456cb591461024a5780638da5cb5b1461025f57806394ae6e71146102b45780639c200302146102ed578063f2fde38b14610357575b600080fd5b34156100b457600080fd5b6100e0600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610390565b005b34156100ed57600080fd5b610160600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610439565b604051808215151515815260200191505060405180910390f35b341561018557600080fd5b61018d61055e565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101cd5780820151818401526020810190506101b2565b50505050905090810190601f1680156101fa5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561021357600080fd5b61021b610597565b005b341561022857600080fd5b610230610655565b604051808215151515815260200191505060405180910390f35b341561025557600080fd5b61025d610668565b005b341561026a57600080fd5b610272610728565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102bf57600080fd5b6102eb600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061074d565b005b34156102f857600080fd5b6103006107f6565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610343578082015181840152602081019050610328565b505050509050019250505060405180910390f35b341561036257600080fd5b61038e600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061080d565b005b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156103eb57600080fd5b610436816040805190810160405280601481526020017f746f6b656e2d7472616e736665722d70726f787900000000000000000000000081525060016109629092919063ffffffff16565b50565b600061044f336001610b3e90919063ffffffff16565b151561045a57600080fd5b8473ffffffffffffffffffffffffffffffffffffffff166323b872dd8585856000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b151561053957600080fd5b6102c65a03f1151561054a57600080fd5b505050604051805190509050949350505050565b6040805190810160405280601481526020017f746f6b656e2d7472616e736665722d70726f787900000000000000000000000081525081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156105f257600080fd5b600060149054906101000a900460ff16151561060d57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b600060149054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156106c357600080fd5b600060149054906101000a900460ff161515156106df57600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156107a857600080fd5b6107f3816040805190810160405280601481526020017f746f6b656e2d7472616e736665722d70726f78790000000000000000000000008152506001610b979092919063ffffffff16565b50565b6107fe610f3a565b6108086001610e8d565b905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561086857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156108a457600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61096c8383610f25565b151561097757600080fd5b60018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508260020180548060010182816109e79190610f4e565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060018360020180549050038360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f571925c699f9072cec76b6c6c000571cc8d0bb5c47e5819202e2e9496c6508b5826040518080602001828103825283818151815260200191508051906020019080838360005b83811015610aff578082015181840152602081019050610ae4565b50505050905090810190601f168015610b2c5780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000806000610ba68686610b3e565b1515610bb157600080fd5b8560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600186600201805490500391508560020182815481101515610c1357fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055808660020184815481101515610ca457fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090558560020182815481101515610d8957fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018660020181818054905003915081610dd19190610f7a565b508473ffffffffffffffffffffffffffffffffffffffff167f0814e4ee85854cea446b4a27a460e5ffb41516230dbc02f226c07907e432241c856040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e4b578082015181840152602081019050610e30565b50505050905090810190601f168015610e785780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050505050565b610e95610f3a565b81600201805480602002602001604051908101604052809291908181526020018280548015610f1957602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610ecf575b50505050509050919050565b6000610f318383610b3e565b15905092915050565b602060405190810160405280600081525090565b815481835581811511610f7557818360005260206000209182019101610f749190610fa6565b5b505050565b815481835581811511610fa157818360005260206000209182019101610fa09190610fa6565b5b505050565b610fc891905b80821115610fc4576000816000905550600101610fac565b5090565b905600a165627a7a72305820383d85b95b8eb7fcd8d360f3a320d02a110cad60dc66987b14a9756d2c5bcc610029", - "deployedBytecode": "0x6060604052600436106100a4576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630a8f7b52146100a957806315dacbea146100e25780632e667c4e1461017a5780633f4ba83a146102085780635c975abb1461021d5780638456cb591461024a5780638da5cb5b1461025f57806394ae6e71146102b45780639c200302146102ed578063f2fde38b14610357575b600080fd5b34156100b457600080fd5b6100e0600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610390565b005b34156100ed57600080fd5b610160600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610439565b604051808215151515815260200191505060405180910390f35b341561018557600080fd5b61018d61055e565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101cd5780820151818401526020810190506101b2565b50505050905090810190601f1680156101fa5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561021357600080fd5b61021b610597565b005b341561022857600080fd5b610230610655565b604051808215151515815260200191505060405180910390f35b341561025557600080fd5b61025d610668565b005b341561026a57600080fd5b610272610728565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102bf57600080fd5b6102eb600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061074d565b005b34156102f857600080fd5b6103006107f6565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610343578082015181840152602081019050610328565b505050509050019250505060405180910390f35b341561036257600080fd5b61038e600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061080d565b005b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156103eb57600080fd5b610436816040805190810160405280601481526020017f746f6b656e2d7472616e736665722d70726f787900000000000000000000000081525060016109629092919063ffffffff16565b50565b600061044f336001610b3e90919063ffffffff16565b151561045a57600080fd5b8473ffffffffffffffffffffffffffffffffffffffff166323b872dd8585856000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b151561053957600080fd5b6102c65a03f1151561054a57600080fd5b505050604051805190509050949350505050565b6040805190810160405280601481526020017f746f6b656e2d7472616e736665722d70726f787900000000000000000000000081525081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156105f257600080fd5b600060149054906101000a900460ff16151561060d57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b600060149054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156106c357600080fd5b600060149054906101000a900460ff161515156106df57600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156107a857600080fd5b6107f3816040805190810160405280601481526020017f746f6b656e2d7472616e736665722d70726f78790000000000000000000000008152506001610b979092919063ffffffff16565b50565b6107fe610f3a565b6108086001610e8d565b905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561086857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156108a457600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61096c8383610f25565b151561097757600080fd5b60018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508260020180548060010182816109e79190610f4e565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060018360020180549050038360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f571925c699f9072cec76b6c6c000571cc8d0bb5c47e5819202e2e9496c6508b5826040518080602001828103825283818151815260200191508051906020019080838360005b83811015610aff578082015181840152602081019050610ae4565b50505050905090810190601f168015610b2c5780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000806000610ba68686610b3e565b1515610bb157600080fd5b8560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600186600201805490500391508560020182815481101515610c1357fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055808660020184815481101515610ca457fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090558560020182815481101515610d8957fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018660020181818054905003915081610dd19190610f7a565b508473ffffffffffffffffffffffffffffffffffffffff167f0814e4ee85854cea446b4a27a460e5ffb41516230dbc02f226c07907e432241c856040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e4b578082015181840152602081019050610e30565b50505050905090810190601f168015610e785780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050505050565b610e95610f3a565b81600201805480602002602001604051908101604052809291908181526020018280548015610f1957602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610ecf575b50505050509050919050565b6000610f318383610b3e565b15905092915050565b602060405190810160405280600081525090565b815481835581811511610f7557818360005260206000209182019101610f749190610fa6565b5b505050565b815481835581811511610fa157818360005260206000209182019101610fa09190610fa6565b5b505050565b610fc891905b80821115610fc4576000816000905550600101610fac565b5090565b905600a165627a7a72305820383d85b95b8eb7fcd8d360f3a320d02a110cad60dc66987b14a9756d2c5bcc610029", + "bytecode": "0x606060405260008060146101000a81548160ff021916908315150217905550336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610ff78061006d6000396000f3006060604052600436106100a4576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630a8f7b52146100a957806315dacbea146100e25780632e667c4e1461017a5780633f4ba83a146102085780635c975abb1461021d5780638456cb591461024a5780638da5cb5b1461025f57806394ae6e71146102b45780639c200302146102ed578063f2fde38b14610357575b600080fd5b34156100b457600080fd5b6100e0600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610390565b005b34156100ed57600080fd5b610160600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610439565b604051808215151515815260200191505060405180910390f35b341561018557600080fd5b61018d61055e565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101cd5780820151818401526020810190506101b2565b50505050905090810190601f1680156101fa5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561021357600080fd5b61021b610597565b005b341561022857600080fd5b610230610655565b604051808215151515815260200191505060405180910390f35b341561025557600080fd5b61025d610668565b005b341561026a57600080fd5b610272610728565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102bf57600080fd5b6102eb600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061074d565b005b34156102f857600080fd5b6103006107f6565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610343578082015181840152602081019050610328565b505050509050019250505060405180910390f35b341561036257600080fd5b61038e600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061080d565b005b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156103eb57600080fd5b610436816040805190810160405280601481526020017f746f6b656e2d7472616e736665722d70726f787900000000000000000000000081525060016109629092919063ffffffff16565b50565b600061044f336001610b3e90919063ffffffff16565b151561045a57600080fd5b8473ffffffffffffffffffffffffffffffffffffffff166323b872dd8585856000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b151561053957600080fd5b6102c65a03f1151561054a57600080fd5b505050604051805190509050949350505050565b6040805190810160405280601481526020017f746f6b656e2d7472616e736665722d70726f787900000000000000000000000081525081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156105f257600080fd5b600060149054906101000a900460ff16151561060d57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b600060149054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156106c357600080fd5b600060149054906101000a900460ff161515156106df57600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156107a857600080fd5b6107f3816040805190810160405280601481526020017f746f6b656e2d7472616e736665722d70726f78790000000000000000000000008152506001610b979092919063ffffffff16565b50565b6107fe610f3a565b6108086001610e8d565b905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561086857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156108a457600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61096c8383610f25565b151561097757600080fd5b60018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508260020180548060010182816109e79190610f4e565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060018360020180549050038360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f571925c699f9072cec76b6c6c000571cc8d0bb5c47e5819202e2e9496c6508b5826040518080602001828103825283818151815260200191508051906020019080838360005b83811015610aff578082015181840152602081019050610ae4565b50505050905090810190601f168015610b2c5780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000806000610ba68686610b3e565b1515610bb157600080fd5b8560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600186600201805490500391508560020182815481101515610c1357fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055808660020184815481101515610ca457fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090558560020182815481101515610d8957fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018660020181818054905003915081610dd19190610f7a565b508473ffffffffffffffffffffffffffffffffffffffff167f0814e4ee85854cea446b4a27a460e5ffb41516230dbc02f226c07907e432241c856040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e4b578082015181840152602081019050610e30565b50505050905090810190601f168015610e785780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050505050565b610e95610f3a565b81600201805480602002602001604051908101604052809291908181526020018280548015610f1957602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610ecf575b50505050509050919050565b6000610f318383610b3e565b15905092915050565b602060405190810160405280600081525090565b815481835581811511610f7557818360005260206000209182019101610f749190610fa6565b5b505050565b815481835581811511610fa157818360005260206000209182019101610fa09190610fa6565b5b505050565b610fc891905b80821115610fc4576000816000905550600101610fac565b5090565b905600a165627a7a72305820255eb165e17ad9b32f7f35dee0d551e1201b7d032a506235ce86cb342e7ca1560029", + "deployedBytecode": "0x6060604052600436106100a4576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630a8f7b52146100a957806315dacbea146100e25780632e667c4e1461017a5780633f4ba83a146102085780635c975abb1461021d5780638456cb591461024a5780638da5cb5b1461025f57806394ae6e71146102b45780639c200302146102ed578063f2fde38b14610357575b600080fd5b34156100b457600080fd5b6100e0600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610390565b005b34156100ed57600080fd5b610160600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610439565b604051808215151515815260200191505060405180910390f35b341561018557600080fd5b61018d61055e565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101cd5780820151818401526020810190506101b2565b50505050905090810190601f1680156101fa5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561021357600080fd5b61021b610597565b005b341561022857600080fd5b610230610655565b604051808215151515815260200191505060405180910390f35b341561025557600080fd5b61025d610668565b005b341561026a57600080fd5b610272610728565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156102bf57600080fd5b6102eb600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061074d565b005b34156102f857600080fd5b6103006107f6565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610343578082015181840152602081019050610328565b505050509050019250505060405180910390f35b341561036257600080fd5b61038e600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061080d565b005b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156103eb57600080fd5b610436816040805190810160405280601481526020017f746f6b656e2d7472616e736665722d70726f787900000000000000000000000081525060016109629092919063ffffffff16565b50565b600061044f336001610b3e90919063ffffffff16565b151561045a57600080fd5b8473ffffffffffffffffffffffffffffffffffffffff166323b872dd8585856000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b151561053957600080fd5b6102c65a03f1151561054a57600080fd5b505050604051805190509050949350505050565b6040805190810160405280601481526020017f746f6b656e2d7472616e736665722d70726f787900000000000000000000000081525081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156105f257600080fd5b600060149054906101000a900460ff16151561060d57600080fd5b60008060146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b600060149054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156106c357600080fd5b600060149054906101000a900460ff161515156106df57600080fd5b6001600060146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156107a857600080fd5b6107f3816040805190810160405280601481526020017f746f6b656e2d7472616e736665722d70726f78790000000000000000000000008152506001610b979092919063ffffffff16565b50565b6107fe610f3a565b6108086001610e8d565b905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561086857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156108a457600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61096c8383610f25565b151561097757600080fd5b60018360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508260020180548060010182816109e79190610f4e565b9160005260206000209001600084909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505060018360020180549050038360010160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f571925c699f9072cec76b6c6c000571cc8d0bb5c47e5819202e2e9496c6508b5826040518080602001828103825283818151815260200191508051906020019080838360005b83811015610aff578082015181840152602081019050610ae4565b50505050905090810190601f168015610b2c5780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000806000610ba68686610b3e565b1515610bb157600080fd5b8560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549250600186600201805490500391508560020182815481101515610c1357fe5b906000526020600020900160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055808660020184815481101515610ca457fe5b906000526020600020900160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828660010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090558560020182815481101515610d8957fe5b906000526020600020900160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018660020181818054905003915081610dd19190610f7a565b508473ffffffffffffffffffffffffffffffffffffffff167f0814e4ee85854cea446b4a27a460e5ffb41516230dbc02f226c07907e432241c856040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e4b578082015181840152602081019050610e30565b50505050905090810190601f168015610e785780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050505050565b610e95610f3a565b81600201805480602002602001604051908101604052809291908181526020018280548015610f1957602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610ecf575b50505050509050919050565b6000610f318383610b3e565b15905092915050565b602060405190810160405280600081525090565b815481835581811511610f7557818360005260206000209182019101610f749190610fa6565b5b505050565b815481835581811511610fa157818360005260206000209182019101610fa09190610fa6565b5b505050565b610fc891905b80821115610fc4576000816000905550600101610fac565b5090565b905600a165627a7a72305820255eb165e17ad9b32f7f35dee0d551e1201b7d032a506235ce86cb342e7ca1560029", "sourceMap": "1330:1487:13:-;;;268:5:37;247:26;;;;;;;;;;;;;;;;;;;;509:10:39;501:5;;:18;;;;;;;;;;;;;;;;;;1330:1487:13;;;;;;", "deployedSourceMap": "1330:1487:13:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1678:157;;;;;;;;;;;;;;;;;;;;;;;;;;;;2506:309;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1519:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;833:87:37;;;;;;;;;;;;;;247:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;666:85;;;;;;;;;;;;;;238:20:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1943:173:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;2211:186;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;832:169:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;1678:157:13;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;1777:51:13;1812:6;1820:7;;;;;;;;;;;;;;;;;;1777:24;:34;;:51;;;;;:::i;:::-;1678:157;:::o;2506:309::-;2656:13;2693:49;2731:10;2693:24;:37;;:49;;;;:::i;:::-;2685:58;;;;;;;;2767:6;2761:26;;;2788:5;2795:3;2800:7;2761:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2754:54;;2506:309;;;;;;:::o;1519:55::-;;;;;;;;;;;;;;;;;;;;:::o;833:87:37:-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;568:6:37;;;;;;;;;;;560:15;;;;;;;;895:5;886:6;;:14;;;;;;;;;;;;;;;;;;906:9;;;;;;;;;;833:87::o;247:26::-;;;;;;;;;;;;;:::o;666:85::-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;416:6:37;;;;;;;;;;;415:7;407:16;;;;;;;;729:4;720:6;;:13;;;;;;;;;;;;;;;;;;739:7;;;;;;;;;;666:85::o;238:20:39:-;;;;;;;;;;;;;:::o;1943:173:13:-;653:5:39;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;2048:61:13;2093:6;2101:7;;;;;;;;;;;;;;;;;;2048:24;:44;;:61;;;;;:::i;:::-;1943:173;:::o;2211:186::-;2295:26;;:::i;:::-;2344:46;:24;:44;:46::i;:::-;2337:53;;2211:186;:::o;832:169:39:-;653:5;;;;;;;;;;;639:19;;:10;:19;;;631:28;;;;;;;;928:1;908:22;;:8;:22;;;;900:31;;;;;;;;965:8;937:37;;958:5;;;;;;;;;;;937:37;;;;;;;;;;;;988:8;980:5;;:16;;;;;;;;;;;;;;;;;;832:169;:::o;1732:383:17:-;1884:28;1900:4;1906:5;1884:15;:28::i;:::-;1876:37;;;;;;;;1949:4;1924;:15;;:22;1940:5;1924:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;1963:4;:21;;:33;;;;;;;;;;;:::i;:::-;;;;;;;;;;1990:5;1963:33;;;;;;;;;;;;;;;;;;;;;;;2064:1;2033:4;:21;;:28;;;;:32;2006:4;:17;;:24;2024:5;2006:24;;;;;;;;;;;;;;;:59;;;;2086:5;2075:33;;;2093:14;2075:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1732:383:17;;;:::o;3295:166::-;3405:4;3432;:15;;:22;3448:5;3432:22;;;;;;;;;;;;;;;;;;;;;;;;;3425:29;;3295:166;;;;:::o;2121:1168::-;2489:25;2551:23;2619:19;2452:25;2465:4;2471:5;2452:12;:25::i;:::-;2444:34;;;;;;;;2517:4;:17;;:24;2535:5;2517:24;;;;;;;;;;;;;;;;2489:52;;2608:1;2577:4;:21;;:28;;;;:32;2551:58;;2641:4;:21;;2663:18;2641:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;2619:63;;2745:4;:15;;:22;2761:5;2745:22;;;;;;;;;;;;;;;;2738:29;;;;;;;;;;;2894:11;2848:4;:21;;2870:20;2848:43;;;;;;;;;;;;;;;;;;;:57;;;;;;;;;;;;;;;;;;3009:20;2976:4;:17;;:30;2994:11;2976:30;;;;;;;;;;;;;;;:53;;;;3046:4;:17;;:24;3064:5;3046:24;;;;;;;;;;;;;;;3039:31;;;3144:4;:21;;3166:18;3144:41;;;;;;;;;;;;;;;;;;;3137:48;;;;;;;;;;;3227:1;3195:4;:21;;:33;;;;;;;;;;;;;;:::i;:::-;;3260:5;3239:43;;;3267:14;3239:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;80:1;75:3;71;64:6;52:2;49:1;45:3;40:15;;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2121:1168:17;;;;;;:::o;3646:162::-;3748:9;;:::i;:::-;3780:4;:21;;3773:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3646:162;;;:::o;3467:173::-;3580:4;3608:25;3621:4;3627:5;3608:12;:25::i;:::-;3607:26;3600:33;;3467:173;;;;:::o;1330:1487:13:-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o", "source": "/*\n\n Copyright 2017 Dharma Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\npragma solidity 0.4.18;\n\nimport \"./DebtRegistry.sol\";\nimport { PermissionsLib, PermissionEvents } from \"./libraries/PermissionsLib.sol\";\nimport \"zeppelin-solidity/contracts/lifecycle/Pausable.sol\";\nimport \"zeppelin-solidity/contracts/token/ERC20/ERC20.sol\";\n\n\n/**\n * The TokenTransferProxy is a proxy contract for transfering principal\n * and fee payments and repayments between agents and keepers in the Dharma\n * ecosystem. It is decoupled from the DebtKernel in order to make upgrades to the\n * protocol contracts smoother -- if the DebtKernel or RepyamentRouter is upgraded to a new contract,\n * creditors will not have to grant new transfer approvals to a new contract's address.\n *\n * Author: Nadav Hollander -- Github: nadavhollander\n */\ncontract TokenTransferProxy is Pausable, PermissionEvents {\n using PermissionsLib for PermissionsLib.Permissions;\n\n PermissionsLib.Permissions internal tokenTransferPermissions;\n\n string public constant CONTEXT = \"token-transfer-proxy\";\n\n /**\n * Add address to list of agents authorized to initiate `transferFrom` calls\n */\n function addAuthorizedTransferAgent(address _agent)\n public\n onlyOwner\n {\n tokenTransferPermissions.authorize(_agent, CONTEXT);\n }\n\n /**\n * Remove address from list of agents authorized to initiate `transferFrom` calls\n */\n function revokeTransferAgentAuthorization(address _agent)\n public\n onlyOwner\n {\n tokenTransferPermissions.revokeAuthorization(_agent, CONTEXT);\n }\n\n /**\n * Return list of agents authorized to initiate `transferFrom` calls\n */\n function getAuthorizedTransferAgents()\n public\n view\n returns (address[] authorizedAgents)\n {\n return tokenTransferPermissions.getAuthorizedAgents();\n }\n\n /**\n * Transfer specified token amount from _from address to _to address on give token\n */\n function transferFrom(\n address _token,\n address _from,\n address _to,\n uint _amount\n )\n public\n returns (bool _success)\n {\n require(tokenTransferPermissions.isAuthorized(msg.sender));\n\n return ERC20(_token).transferFrom(_from, _to, _amount);\n }\n}\n", - "sourcePath": "/Users/graemeboy/Dharma/charta/contracts/TokenTransferProxy.sol", + "sourcePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/TokenTransferProxy.sol", "ast": { "attributes": { - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/TokenTransferProxy.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/TokenTransferProxy.sol", "exportedSymbols": { "TokenTransferProxy": [ 5206 @@ -244,7 +244,7 @@ export const TokenTransferProxy = { "attributes": { "SourceUnit": 3159, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/DebtRegistry.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/DebtRegistry.sol", "file": "./DebtRegistry.sol", "scope": 5207, "symbolAliases": [ @@ -259,7 +259,7 @@ export const TokenTransferProxy = { "attributes": { "SourceUnit": 6272, - "absolutePath": "/Users/graemeboy/Dharma/charta/contracts/libraries/PermissionsLib.sol", + "absolutePath": "/Users/chrismin/Documents/dev/dharma/charta/contracts/libraries/PermissionsLib.sol", "file": "./libraries/PermissionsLib.sol", "scope": 5207, "symbolAliases": [ @@ -1613,7 +1613,7 @@ export const TokenTransferProxy = } }, "links": {}, - "address": "0xf302f9e270458b4242e7d0cba2f0816ed2193240" + "address": "0xf8181406f844d5c947481ec67c835b1384013c7e" }, "70": { "events": { @@ -1686,5 +1686,5 @@ export const TokenTransferProxy = } }, "schemaVersion": "1.0.1", - "updatedAt": "2018-10-02T22:15:01.329Z" + "updatedAt": "2018-10-09T17:51:53.131Z" } \ No newline at end of file